blog @main -
refs -
log -
-
https://git.jolheiser.com/blog.git
My nonexistent blog
feat: serve
Signed-off-by: jolheiser <john.olheiser@gmail.com>
Signature
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEgqEQpE3xoo1QwJO/uFOtpdp7v3oFAmXX9zoACgkQuFOtpdp7
v3p/bA//VFbF5+CHhesImBmlHnTLywmYZ0/xbuuwpHRndWAsV2GqfduVwaECsb6v
EXeW+MNAqY7vDNPOGyq+NDXqJ0ArrJg1+2a0RF6HabU12xnhMIsxSjVyTIB8fght
oonRgoMN7I4aIJGFdLDtyaY89q7oFfLZbcrzRBgTnkwWvL67qwzkw5ovdjiem55l
RuQEVRnBv3fQ/i6Ovw8dvGqir0n/Gwpwa2/4VRU2TEmLwpvACarRHaK2snCehNZV
dtiPGX+A3fpgQUwdjju6Kp3Isfcl/RoScjRRHnY76YcTuyINROSafF+8AWQ/8+xy
J5d3R1xcIYplUenRZXoITGrKUseW69SUVucsTF6xe5Q+jJWfIN0x280So2TvA3JT
faUa+TavOOv0nWisAEAd0WXybgNlIvcQVaMhf6RjW2gD5zYOpD66e5ML5BzDi82b
/Gp+DKFwQi4h8aF1iEtCVYORcdUIUnrPEMpMY5EpGnWHLFR8inGZsKhRdsuBrs+y
ktlALXLhiingWEE9H3v6iGL5o7z/e6ZVe5XJwyODn3cTKetKTeU8/R+FutP8qnDf
pFns9stmwP6d4h3Wq0FmR5EYOnx8HpP0yr08W0SdpGkt/CRW2DiVfqp3EeYl9UBB
t6aQ5CfoUXDIuWeUZUna/BWb97qPDA8qaknkU2h4fhaGjYPGQhI=
=zfs0
-----END PGP SIGNATURE-----
4 changed files, 289 additions(+), 5 deletions(-)
diff --git a/main.go b/main.go
index f0c5c9ee09a29fe144c863df27be02a3a1bf7a3e..699fc9c7e531aab231d5297efcfa4f50cdf0d5b5 100644
--- a/main.go
+++ b/main.go
@@ -7,7 +7,9 @@ "context"
"embed"
"flag"
"fmt"
+ "io"
iofs "io/fs"
+ "net/http"
"os"
"path/filepath"
@@ -21,6 +23,8 @@ func maine() error {
fs := flag.NewFlagSet("blog", flag.ExitOnError)
outFlag := fs.String("out", "out", "Output directory")
fs.StringVar(outFlag, "o", *outFlag, "--out")
+ serveFlag := fs.Bool("serve", false, "Serve output dir after generation")
+ fs.BoolVar(serveFlag, "s", *serveFlag, "--serve")
if err := fs.Parse(os.Args[1:]); err != nil {
return err
}
@@ -53,13 +57,28 @@ if err := writeCSS(*outFlag); err != nil {
return err
}
+ sakuraDst := filepath.Join(*outFlag, "sakura.css")
+ if err := copyFile(sakuraDst, "sakura.css"); err != nil {
+ return err
+ }
+
fi, err := os.Create(filepath.Join(*outFlag, "index.html"))
if err != nil {
return err
}
defer fi.Close()
+ "context"
+ return err
+ }
+
+ if *serveFlag {
+ http.Handle("/", http.FileServer(http.Dir("out")))
+ http.ListenAndServe(":8080", nil)
+ }
+
+ return nil
}
func writeArticle(out string, article Article) error {
@@ -91,6 +111,26 @@ if err := CSS.WriteCSS(fi, styles.Get("catppuccin-mocha")); err != nil {
return err
}
fi.WriteString("}")
+ return nil
+}
+
+func copyFile(dst, src string) error {
+ srcFi, err := os.Open(src)
+ if err != nil {
+ return err
+ }
+ defer srcFi.Close()
+
+ dstFi, err := os.Create(dst)
+ if err != nil {
+ return err
+ }
+ defer dstFi.Close()
+
+ if _, err := io.Copy(dstFi, srcFi); err != nil {
+ return err
+ }
+
return nil
}
diff --git a/sakura.css b/sakura.css
new file mode 100644
index 0000000000000000000000000000000000000000..22b5a0a468044f3b8c4e4730e8439938c097c6c1
--- /dev/null
+++ b/sakura.css
@@ -0,0 +1,245 @@
+/* Sakura.css v1.5.0
+ * ================
+ * Minimal css theme.
+ * Project: https://github.com/oxalorg/sakura/
+ */
+
+:root {
+ --blossom: #179299;
+ --fade: #ea76cb;
+ --bg: #eff1f5;
+ --bg-alt: #dce0e8;
+ --text: #4c4f69;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --blossom: #94e2d5;
+ --fade: #f5c2e7;
+ --bg: #1e1e2e;
+ --bg-alt: #11111b;
+ --text: #cdd6f4;
+ }
+}
+
+/* Body */
+html {
+ font-size: 62.5%;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
+}
+
+body {
+ font-size: 1.8rem;
+ line-height: 1.618;
+ max-width: 38em;
+ margin: auto;
+ color: var(--text);
+ background-color: var(--bg);
+ padding: 13px;
+}
+
+@media (max-width: 684px) {
+ body {
+ font-size: 1.53rem;
+ }
+}
+@media (max-width: 382px) {
+ body {
+ font-size: 1.35rem;
+ }
+}
+h1, h2, h3, h4, h5, h6 {
+ line-height: 1.1;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
+ font-weight: 700;
+ margin-top: 3rem;
+ margin-bottom: 1.5rem;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ -ms-word-break: break-all;
+ word-break: break-word;
+}
+
+h1 {
+ font-size: 2.35em;
+}
+
+h2 {
+ font-size: 2em;
+}
+
+h3 {
+ font-size: 1.75em;
+}
+
+h4 {
+ font-size: 1.5em;
+}
+
+h5 {
+ font-size: 1.25em;
+}
+
+h6 {
+ font-size: 1em;
+}
+
+p {
+ margin-top: 0px;
+ margin-bottom: 2.5rem;
+}
+
+small, sub, sup {
+ font-size: 75%;
+}
+
+hr {
+ border-color: var(--blossom);
+}
+
+a {
+ text-decoration: none;
+ color: var(--blossom);
+}
+a:visited {
+ color: #144f5a;
+}
+a:hover {
+ color: var(--fade);
+ border-bottom: 2px solid var(--text);
+}
+
+ul {
+ padding-left: 1.4em;
+ margin-top: 0px;
+ margin-bottom: 2.5rem;
+}
+
+li {
+ margin-bottom: 0.4em;
+}
+
+blockquote {
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-left: 1em;
+ padding-top: 0.8em;
+ padding-bottom: 0.8em;
+ padding-right: 0.8em;
+ border-left: 5px solid var(--blossom);
+ margin-bottom: 2.5rem;
+ background-color: var(--bg-alt);
+}
+
+blockquote p {
+ margin-bottom: 0;
+}
+
+img, video {
+ height: auto;
+ max-width: 100%;
+ margin-top: 0px;
+ margin-bottom: 2.5rem;
+}
+
+/* Pre and Code */
+pre {
+ background-color: var(--bg-alt);
+ display: block;
+ padding: 1em;
+ overflow-x: auto;
+ margin-top: 0px;
+ margin-bottom: 2.5rem;
+ font-size: 0.9em;
+}
+
+code, kbd, samp {
+ font-size: 0.9em;
+ padding: 0 0.5em;
+ background-color: var(--bg-alt);
+ white-space: pre-wrap;
+}
+
+pre > code {
+ padding: 0;
+ background-color: transparent;
+ white-space: pre;
+ font-size: 1em;
+}
+
+/* Tables */
+table {
+ text-align: justify;
+ width: 100%;
+ border-collapse: collapse;
+ margin-bottom: 2rem;
+}
+
+td, th {
+ padding: 0.5em;
+ border-bottom: 1px solid var(--bg-alt);
+}
+
+/* Buttons, forms and input */
+input, textarea {
+ border: 1px solid var(--text);
+}
+input:focus, textarea:focus {
+ border: 1px solid var(--blossom);
+}
+
+textarea {
+ width: 100%;
+}
+
+.button, button, input[type=submit], input[type=reset], input[type=button], input[type=file]::file-selector-button {
+ display: inline-block;
+ padding: 5px 10px;
+ text-align: center;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: var(--blossom);
+ color: var(--bg);
+ border-radius: 1px;
+ border: 1px solid var(--blossom);
+ cursor: pointer;
+ box-sizing: border-box;
+}
+.button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled], input[type=file]::file-selector-button[disabled] {
+ cursor: default;
+ opacity: 0.5;
+}
+.button:hover, button:hover, input[type=submit]:hover, input[type=reset]:hover, input[type=button]:hover, input[type=file]::file-selector-button:hover {
+ background-color: var(--fade);
+ color: var(--bg);
+ outline: 0;
+}
+.button:focus-visible, button:focus-visible, input[type=submit]:focus-visible, input[type=reset]:focus-visible, input[type=button]:focus-visible, input[type=file]::file-selector-button:focus-visible {
+ outline-style: solid;
+ outline-width: 2px;
+}
+
+textarea, select, input {
+ color: var(--text);
+ padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
+ margin-bottom: 10px;
+ background-color: var(--bg-alt);
+ border: 1px solid var(--bg-alt);
+ border-radius: 4px;
+ box-shadow: none;
+ box-sizing: border-box;
+}
+textarea:focus, select:focus, input:focus {
+ border: 1px solid var(--blossom);
+ outline: 0;
+}
+
+input[type=checkbox]:focus {
+ outline: 1px dotted var(--blossom);
+}
+
+label, legend, fieldset {
+ display: block;
+ margin-bottom: 0.5rem;
+ font-weight: 600;
+}
diff --git a/templates.templ b/templates.templ
index daee1e81f364b2c7d571ffe38b7e3eb24d24def0..d974b5833560129812c609934c2a97b293f617fc 100644
--- a/templates.templ
+++ b/templates.templ
@@ -9,7 +9,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>{ title }</title>
<meta property="og:title" content={ title }/>
<meta property="og:description" content={ description }/>
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"/>
+ <link rel="stylesheet" href="/sakura.css"/>
<link rel="stylesheet" href="/chroma.css"/>
</head>
<body>
@@ -37,7 +37,7 @@ templ ArticleTemplate(article Article) {
@baseTemplate(article.Title, article.Summary) {
<header>
<h1>{ article.Title }</h1>
- <h2>{ article.Date.Format("01/02/2006") }</h2>
+ <h3>{ article.Date.Format("01/02/2006") }</h3>
</header>
<main>@templ.Raw(article.Content)</main>
}
diff --git a/templates_templ.go b/templates_templ.go
index eb1a5286ff88f24036184a633dcb98ac78aa66d5..0ee91ec438bb7e3ec1045cac3e9e52db9e72d059 100644
--- a/templates_templ.go
+++ b/templates_templ.go
@@ -48,7 +48,7 @@ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(description))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css\"><link rel=\"stylesheet\" href=\"/chroma.css\"></head><body>")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><link rel=\"stylesheet\" href=\"/sakura.css\"><link rel=\"stylesheet\" href=\"/chroma.css\"></head><body>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -181,7 +181,7 @@ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</h1><h2>")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</h1><h3>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -190,7 +190,7 @@ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</h2></header><main>")
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</h3></header><main>")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}