diff options
author | keni7385 <andrea@andreacorsini.xyz> | 2022-06-04 00:09:16 +0300 |
---|---|---|
committer | keni7385 <andrea@andreacorsini.xyz> | 2022-06-04 00:09:16 +0300 |
commit | aa547f522941c9ba3c60dd0083305c59f717cedd (patch) | |
tree | e8ba86747892a89162288ec9be4eed738311190d |
Initial commit
-rwxr-xr-x | README.md | 12 | ||||
-rwxr-xr-x | _assets/andreacorsini-pubkey.txt | 52 | ||||
-rwxr-xr-x | _assets/css/style.css | 87 | ||||
-rwxr-xr-x | _assets/favicon.ico | bin | 0 -> 15406 bytes | |||
-rwxr-xr-x | _assets/images/camera-2-icon.png | bin | 0 -> 2756 bytes | |||
-rw-r--r-- | _assets/images/email.svg | 121 | ||||
-rwxr-xr-x | _assets/images/feed.svg | 137 | ||||
-rwxr-xr-x | _assets/images/me.jpg | bin | 0 -> 71380 bytes | |||
-rwxr-xr-x | _assets/images/profile-cut.jpg | bin | 0 -> 15943 bytes | |||
-rwxr-xr-x | _assets/images/under_construction.gif | bin | 0 -> 7298 bytes | |||
-rwxr-xr-x | _assets/rss.xml | 15 | ||||
-rwxr-xr-x | _footer.t.html | 9 | ||||
-rw-r--r-- | _header.t.html | 42 | ||||
-rwxr-xr-x | _pages/computing.html | 98 | ||||
-rwxr-xr-x | _pages/email.html | 10 | ||||
-rw-r--r-- | _pages/index.html | 21 | ||||
-rw-r--r-- | _pages/notes/a-simple-static-website-generator.html | 307 | ||||
-rwxr-xr-x | _pages/notes/index.html | 14 | ||||
-rw-r--r-- | _pages/privacy-policy.html | 18 | ||||
-rwxr-xr-x | _pages/travels/index.html | 65 | ||||
-rwxr-xr-x | _pages/travels/pictures/index.html | 27 | ||||
-rwxr-xr-x | sswg.sh | 50 |
22 files changed, 1085 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100755 index 0000000..634efbb --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Website + +## Generate static content +``` sh +./sswg.sh +``` + +## Run locally +``` sh +cd _static +python -m http.server +``` diff --git a/_assets/andreacorsini-pubkey.txt b/_assets/andreacorsini-pubkey.txt new file mode 100755 index 0000000..f6b0858 --- /dev/null +++ b/_assets/andreacorsini-pubkey.txt @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +P9Y/V1CBCw== +=iuKW +-----END PGP PUBLIC KEY BLOCK----- diff --git a/_assets/css/style.css b/_assets/css/style.css new file mode 100755 index 0000000..d5ca676 --- /dev/null +++ b/_assets/css/style.css @@ -0,0 +1,87 @@ +body { + margin: 2em auto; + max-width: 650px; + line-height: 1.6; + font-size: 18px; + color: #f0efd1; + background-color: rgba(10,10,10); + padding: 0 10px; +} + +h1, h2, h3, a, dt { + color: #cfba58; +} + +h1, h2, h3 { + line-height: 1.2; +} + +dt { + line-height: 2; +} + + +h1 { + text-align: center; +} + +a { + text-decoration: underline; + font-style: italic; +} + +a:hover, a:active { + color: #f2e091; +} + +a:active { + text-decoration: none; +} + +small { + font-size: 13px; +} + +header { + text-align: center; +} + +header nav { + text-align: center; +} + +img#profile { + float: left; +} + +main { + margin-top: 5px; + background-color: rgba(20,20,20); + padding: 0.5em 1em; + border-radius: 5px 5px 0px 0px; + border: 1px solid rgb(40, 40, 40); +} + +footer { + border: 1px solid rgb(40, 40, 40); + border-top: 1px solid #cfba58; + font-size: 13px; + padding: 0.5em 1em; + background-color: rgba(15, 15, 15); +} + +pre, samp { + padding: 0.25rem 1rem; + max-width: 100%; + overflow-x: auto; + font-family: monospace; + font-size: 14px; +} + +pre { + background-color: rgb(40, 40, 40); +} +samp { + display: block; + line-height: 115%; +} diff --git a/_assets/favicon.ico b/_assets/favicon.ico Binary files differnew file mode 100755 index 0000000..90afb7f --- /dev/null +++ b/_assets/favicon.ico diff --git a/_assets/images/camera-2-icon.png b/_assets/images/camera-2-icon.png Binary files differnew file mode 100755 index 0000000..f88cabd --- /dev/null +++ b/_assets/images/camera-2-icon.png diff --git a/_assets/images/email.svg b/_assets/images/email.svg new file mode 100644 index 0000000..41e5c93 --- /dev/null +++ b/_assets/images/email.svg @@ -0,0 +1,121 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + version="1.1" + width="16" + height="16" + id="RSSicon" + viewBox="0 0 32 32" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <metadata + id="metadata34"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs17"> + <linearGradient + x1="30.059999" + y1="30.059999" + x2="225.94" + y2="225.94" + id="RSSg" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(0.125)"> + <stop + offset="0.0" + stop-color="#E3702D" + id="stop2" + style="stop-color:#000eff;stop-opacity:1" /> + <stop + offset="0.1071" + stop-color="#EA7D31" + id="stop4" + style="stop-color:#0040ff;stop-opacity:1" /> + <stop + offset="0.3503" + stop-color="#F69537" + id="stop6" + style="stop-color:#0095ff;stop-opacity:1" /> + <stop + offset="0.5" + stop-color="#FB9E3A" + id="stop8" + style="stop-color:#00c6ff;stop-opacity:1" /> + <stop + offset="0.7016" + stop-color="#EA7C31" + id="stop10" + style="stop-color:#0095ff;stop-opacity:1" /> + <stop + offset="0.8866" + stop-color="#DE642B" + id="stop12" + style="stop-color:#0040ff;stop-opacity:1" /> + <stop + offset="1.0" + stop-color="#D95B29" + id="stop14" + style="stop-color:#000eff;stop-opacity:1" /> + </linearGradient> + </defs> + <rect + width="32" + height="32" + rx="6.875" + ry="6.875" + x="0" + y="0" + fill="#cc5d15" + id="rect19" + style="stroke-width:0.125;fill:#000eff;fill-opacity:1" /> + <rect + width="30.75" + height="30.75" + rx="6.25" + ry="6.25" + x="0.625" + y="0.625" + fill="#f49c52" + id="rect21" + style="stroke-width:0.125;fill:#00c6ff;fill-opacity:1" /> + <rect + width="29.5" + height="29.5" + rx="5.875" + ry="5.875" + x="1.25" + y="1.25" + fill="url(#RSSg)" + id="rect23" + style="fill:url(#RSSg);stroke-width:0.125" /> + <g + id="g5267" + transform="translate(-1.2291659,-1.0132171)"> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 7.1799193,9.2180961 H 27.175884 l -9.889143,6.9897799 z" + id="path1391" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 6.2291657,10.072429 7.9702233,5.636069 -7.8984483,8.272084 z" + id="path1657" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 28.229166,10.072429 -7.970216,5.636069 7.898537,8.272084 z" + id="path1805" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 7.1167087,24.808338 H 27.453173 l -8.150532,-8.426429 -2.079948,1.390812 -2.028251,-1.431584 z" + id="path1859" /> + </g> +</svg> diff --git a/_assets/images/feed.svg b/_assets/images/feed.svg new file mode 100755 index 0000000..9caf37f --- /dev/null +++ b/_assets/images/feed.svg @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + width="16" + height="16" + id="RSSicon" + viewBox="0 0 32 32" + sodipodi:docname="feed.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"> + <metadata + id="metadata34"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1600" + inkscape:window-height="835" + id="namedview32" + showgrid="false" + inkscape:zoom="5.25" + inkscape:cx="64" + inkscape:cy="58.225126" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="RSSicon" + inkscape:document-rotation="0" /> + <defs + id="defs17"> + <linearGradient + x1="30.059999" + y1="30.059999" + x2="225.94" + y2="225.94" + id="RSSg" + gradientUnits="userSpaceOnUse" + gradientTransform="scale(0.125)"> + <stop + offset="0.0" + stop-color="#E3702D" + id="stop2" /> + <stop + offset="0.1071" + stop-color="#EA7D31" + id="stop4" /> + <stop + offset="0.3503" + stop-color="#F69537" + id="stop6" /> + <stop + offset="0.5" + stop-color="#FB9E3A" + id="stop8" /> + <stop + offset="0.7016" + stop-color="#EA7C31" + id="stop10" /> + <stop + offset="0.8866" + stop-color="#DE642B" + id="stop12" /> + <stop + offset="1.0" + stop-color="#D95B29" + id="stop14" /> + </linearGradient> + </defs> + <rect + width="32" + height="32" + rx="6.875" + ry="6.875" + x="0" + y="0" + fill="#cc5d15" + id="rect19" + style="stroke-width:0.125" /> + <rect + width="30.75" + height="30.75" + rx="6.25" + ry="6.25" + x="0.625" + y="0.625" + fill="#f49c52" + id="rect21" + style="stroke-width:0.125" /> + <rect + width="29.5" + height="29.5" + rx="5.875" + ry="5.875" + x="1.25" + y="1.25" + fill="url(#RSSg)" + id="rect23" + style="fill:url(#RSSg);stroke-width:0.125" /> + <circle + cx="8.5" + cy="23.625" + r="3" + fill="#ffffff" + id="circle25" + style="stroke-width:0.125" /> + <path + d="M 20,26.625 H 15.75 A 10.25,10.25 0 0 0 5.5,16.375 v -4.25 a 14.5,14.5 0 0 1 14.5,14.5 z" + fill="#ffffff" + id="path27" + style="stroke-width:0.125" /> + <path + d="M 23,26.625 A 17.5,17.5 0 0 0 5.5,9.125 V 4.75 a 21.875,21.875 0 0 1 21.875,21.875 z" + fill="#ffffff" + id="path29" + style="stroke-width:0.125" /> +</svg> diff --git a/_assets/images/me.jpg b/_assets/images/me.jpg Binary files differnew file mode 100755 index 0000000..44a766c --- /dev/null +++ b/_assets/images/me.jpg diff --git a/_assets/images/profile-cut.jpg b/_assets/images/profile-cut.jpg Binary files differnew file mode 100755 index 0000000..0e13e88 --- /dev/null +++ b/_assets/images/profile-cut.jpg diff --git a/_assets/images/under_construction.gif b/_assets/images/under_construction.gif Binary files differnew file mode 100755 index 0000000..09bf635 --- /dev/null +++ b/_assets/images/under_construction.gif diff --git a/_assets/rss.xml b/_assets/rss.xml new file mode 100755 index 0000000..d092b9b --- /dev/null +++ b/_assets/rss.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> + <channel> + <title>Updates from Andrea</title> + <description>Latest changes from Andrea Corsini's website.</description> + <link>https://andreacorsini.xyz</link> + <language>en-uk</language> + <image> + <title>Updates from Andrea</title> + <link>https://andreacorsini.xyz</link> + <url>https://andreacorsini.xyz/images/profile-cut.jpg</url> + </image> + <atom:link href="https://andreacorsini.xyz/rss.xml" rel="self" type="application/rss+xml" /> + </channel> +</rss> diff --git a/_footer.t.html b/_footer.t.html new file mode 100755 index 0000000..7a6f0d6 --- /dev/null +++ b/_footer.t.html @@ -0,0 +1,9 @@ + </main> + <footer> + <p><a href="/rss.xml"><img src="/images/feed.svg"> Feed RSS</a> | + <a href="/email.html"><img src="/images/email.svg"> Email</a></p> + <p>Copyright © 2020-2022 Andrea Corsini - + <a href="/privacy-policy.html">Privacy policy</a></p> + </footer> + </body> +</html> diff --git a/_header.t.html b/_header.t.html new file mode 100644 index 0000000..1b4d3bf --- /dev/null +++ b/_header.t.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta http-equiv="content-type" content="text/html; charset=UTF-8"> + <meta charset="utf-8"> + <title>TITLE</title> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="description" content="DESCRIPTION"> + <link rel="stylesheet" type="text/css" href="/css/style.css" media="screen"> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + </head> + + <body> + <header> + <img src="/images/profile-cut.jpg" id="profile"> + <h1><big>Andrea Corsini</big> <small>https://andreacorsini.xyz</small></h1> + + <div> + <aside>I believe in personal digital freedom</aside> + <nav> + <a href="/index.html">Home</a> | + <a href="/notes">My notes</a> | +# <a href="/computing.html">Computing</a> | + <a href="/travels">Travels</a> | + <a href="/email.html">Email</a> + </nav> + </div> + +# <div> +# <hr> +# <h3>WIP - Under Coding</h3> +# <img src="/images/under_construction.gif" style="float:right;width:64px"> +# <p><small>Hey visitor! The whole website is still +# under <strike>construction</strike> coding. Check out the +# <a href="/rss.xml">RSS feed</a> for updates. Currently, I am +# finishing to upload some photos from my +# past <a href="/travels">travels</a>.</small> +# </p> +# <hr> +# </div> + </header> + <main> diff --git a/_pages/computing.html b/_pages/computing.html new file mode 100755 index 0000000..4ed6960 --- /dev/null +++ b/_pages/computing.html @@ -0,0 +1,98 @@ +TITLE="Andrea Corsini's computing" +DESCRIPTION="List and comments about my daily personal computing, softwares and hardware I use." +--- +<h2>My Computing</h2> +<p>You can find a short list of the main softwares I use daily on + my personal drives. My personal daily computing regards browsing + the internet, checking my emails, occasional coding and + writing.</p> + +<p>Although I do nothing fancy and complicated, I do have some + requirements. The main concerns are about <b>control</b> + and <b>lightweightness</b>. I want to be in charge of the + computations that happen on my machine, what is running and what + is not. I want to control which software is using bandwidth. I + want to be able to check the behaviour of any of my software, + and potentially change it to confomr it to my needs. I want to + be the user, not to be used. These thoughts are pretty much what + the <a href="https://www.fsf.org/">Free Software Foundation + (FSF)</a> and the <a href="">GNU project</a> is advocating.</p> + +<p>Not as important as the freedom on computing, I wish, whenever + possible, that the softwares I use are unbloated. I prefer + lightweight over fancy. That is why I don't mind to + use <em>Terminal User Interfaces (TUI)</em> over GUI when is + convinient to do so.</p> + +<dl> + <dt>Operative System</dt> + <dd>I normally run + <a href="https://www.archlinux.org">Arch</a>-based + distributions, because once installed, they contains only + essential softwares to get started, no unwanted bloat and I + can build my personal desktop directly. In particular I + run <a href="">Parabola GNU/Linux-libre</a>, an FSF-approved + 100% free (<a href="https://www.gnu.org/philosophy/free-sw">as + in: freedom</a>) operating system. Not any computer can run a + 100% free distribution, due to nonfree firmware blobs (more + about it in the <a href="#hardware">hardware section</a> + below). So in other secondary laptops that cannot run + Parabola, my fallback is plain Arch Linux.</dd> + <dt>Window Manager/Desktop Environment</dt> + <dd>I don't have a desktop environment, except for the + collection of scripts, softwares and configurations that I have + put together. I run + the <a href="https://suckless.org/">Suckless</a> window + manager + called <a href="https://dwm.suckless.org/">dwm</a> with + several patches applied on it. Apart from the keybings for + main + programs, <a href="https://tools.suckless.org/dmenu/">dmenu</a> + helps me to execute the other software installed. dmenu is + very dynamic and easy to be integrated with other scripts and + utility. For instance, I use it to select wireless + connections, device mounts, integration with the password + manager and so forth.</dd> + <dt>Shell and Terminal</dt> + <dd>I use Zsh as interactive shell. I normally run the shell + interpreter within <a href="https://st.suckless.org/">st - simple + terminal</a>. I applied some reasonable patches from + the <a href="https://st.suckless.org/patches/">Suckless + collection</a>, such as scrolling, transparency, background color + change on focus, solarized dark theme, boxdraw and so forth. If + emacs is already running, I will probably use the integrated + terminal, instead of st.</dd> + <dt>Email</dt> + <dd>I read my emails within emacs throught mu4e, an email client + based on + <a href="https://www.djcbsoftware.nl/code/mu/">mu</a>. Its message + filter is super powerful, it helps me to find any message really + quickly. The account configurations took me time to get it right, + but the effort was worth.</dd> + <dt>Editor</dt> + <dd><a href="https://www.gnu.org/software/emacs/">GNU Emacs</a> + for any task that goes further than 1 minute. Some features that + changed my life are org-mode (org-agenda, org-...), magit, dired, + tramp. I found the out-of-the-box experience really inconvinient, + the configuration tooks me really a lot of time, but now is tailored + to any task I need. For the sake of learning, I still configured + emacs personally, I could have gone with an Emacs distribution + instead? Now I am trying Emacs Doom for curiosity. For small changes + I go for vim. I keep my vim as simple and unpolished as possible, + so I can have a similar experience when I occasionally </dd> + <dt>Writings</dt> + <dd>LaTeX, Libre Office with others</dd> + <dt>Browser</dt> + <dd>IceCat or Firefox based. I like surf but is so slow</dd> + <dt>Passwords</dt> + <dd>The standard Unix pass</dd> + <dt>RSS reader</dt> + <dd>emacs ...</dd> + <dt>PDF reader</dt> + <dd>zathura, which benefits?</dd> + <dt>Screen eye protection</dt> + <dd>redshift</dd> +</dl> + +<h2 id="hardware">Hardware</h2> +<p>TP T60, libreboot, open WiFi card.</p> diff --git a/_pages/email.html b/_pages/email.html new file mode 100755 index 0000000..6b31665 --- /dev/null +++ b/_pages/email.html @@ -0,0 +1,10 @@ +TITLE="Andrea Corsini's email contacts" +DESCRIPTION="Andrea Corsini's email contacts" +--- +<h2>Email</h2> +<p>You can reach me by email:</p> +<ul> + <li><b>andrea</b> <code>at</code> <b>andreacorsini</b> <code>period</code> <b>xyz</b></li> + <li>My GPG key: <a href="andreacorsini-pubkey.txt"><code>F6E3 24C4 BB4E 8C87 9DBE + 463A D998 38F5 E246 2789</code></a></li> +</ul> diff --git a/_pages/index.html b/_pages/index.html new file mode 100644 index 0000000..62ea2dd --- /dev/null +++ b/_pages/index.html @@ -0,0 +1,21 @@ +TITLE="Andrea Corsini's Personal Site" +DESCRIPTION="Andrea Corsini's personal website" +--- +<h2>Welcome to my website</h2> + +<img src="/images/me.jpg" width="100%"> + +<p>Hi, I am Andrea, Italian graduate student, passionate for Linux technologies, + rollerskating and, recently, baking.</p> + +<p>Currently, I am exploring color image + quantization errors, and deep learning methods for signal inverse + problems.</p> + +<p>This website gathers <a href="/notes">my notes</a>, + <a href="/travels/pictures">photos</a>, and personal self-hosted services, + such as email, <a href="https://git.andreacorsini.xyz">git server</a>, + <a href="https://meet.andreacorsini.xyz">Jitsi</a> instance, calendar, Matrix + and others to come.</p> + +<p>Browse it <i>freely</i>!</p> diff --git a/_pages/notes/a-simple-static-website-generator.html b/_pages/notes/a-simple-static-website-generator.html new file mode 100644 index 0000000..e5399a8 --- /dev/null +++ b/_pages/notes/a-simple-static-website-generator.html @@ -0,0 +1,307 @@ +TITLE="Andrea Corsini's Notes - A simple static website generator" +DESCRIPTION="I share and explain my simple static website generator, written in SHell scriptng from scratch." +--- +<article> + <header> + <h2>A simple static website generator (sswg)</h2> + <time>June 3, 2022</time> + </header> + <nav class="toc"> + TOC + </nav> + + <p>Why bother creating another static website generator? There are so many + awesome projects out in the open source community, such as Jekyll, Hugo, + just to name few of them. Well, I wanted to have something dead simple, but + also flexible enough to be easily customized. So I wrote my own simple + static website generator (sswg) using SHell scripting.</p> + + + <p>This is possible because I don't need many features yet. In the future, I + could end up in switching to a proper generator. Anyway, for the time being I + can just use mine and share it here. Hopefully, it could be useful for other + folks that want to practice shell scripting, and/or want to implement their + website generator.</p> + + <p>Here, you will find the original version and its rationale. Most likely, + the generator will change to cope with my website needs. You can find the + current version in my <a href="https://git.andreacorsini.xyz/sswg">git + repository</a>.</p> + + <h3>Features</h3> + <p>At the time of writing, I am a simple person. I just want to: + <ul> + <li>Invoke the content generation with a simple command, such as <code>./sswg.sh</code>.</li> + <li>The generation should be <i>idempotent</i>.</li> + <li>Copy the header and footer templates in every page.</li> + <li>Support some simple macro substitution, to allow different title and description for each page.</li> + <li>Support the insertion of verbatim source code.</li> + </ul> + </p> + + <p>Anything more than that is not necessary at the moment. For example, I + don't need Markdown or other languages to write pages, plain HTML is good + enough. In the future, it would be nice to have some extra features, like + automatic generation of RSS and Table of Content (TOC).</p> + + <h3>Folder structure</h3> + <p>My sswg is just a tiny shell script to include in the website root. In this + way, it can be versioned along all the other website code. The script expect + to find a folder tree similar to</p> + + <samp> + <b>├── _assets</b><br> + │ ├── style.css<br> + │ ├── favicon.ico<br> + │ ├── images<br> + │ │ └── picture.png<br> + │ └── rss.xml<br> + <b>├── _footer.t.html</b><br> + <b>├── _header.t.html</b><br> + <b>├── _pages</b><br> + │ ├── email.html<br> + │ ├── index.html<br> + │ ├── my-notes.html<br> + │ ├── notes<br> + │ │ └── a-simple-static-website-generator.html<br> + │ └── privacy-policy.html<br> + <b>└── sswg.sh</b> + </samp> + + <p>Only the elements in <b>bold</b> are mandatory. The other files and folders + are there to showcase. Once the script is invoked with <code>./sswg.sh</code>, + sswg will regenerate the website to the output folder, named <code>_static</code>. + Any content of the direcorty <code>_asset</code> will be copied to the root + of <code>_static</code>. The content of template + files <code>_header.t.html</code> and <code>_footer.t.html</code> are preposed + and appended to each HTML page, respectively. The sswg will copy to the output + folder all the HTML files contained in <code>_page</code>, as well as + sub-directories and images.</p> + + <p>The output folder <code>_static</code> for this example will result in</p> + + <samp> + ├── style.css<br> + ├── favicon.ico<br> + ├── images<br> + │ └── picture.png<br> + ├── rss.xml<br> + ├── email.html<br> + ├── index.html<br> + ├── my-notes.html<br> + ├── notes<br> + │ └── a-simple-static-website-generator.html<br> + └── privacy-policy.html<br> + </samp> + + + <h3>Add a webpage</h3> + <p>Each HTML page in the directory <code>_page</code> only contains the main + content, while header and footer are shared in every page. Thus we don't need + to copy them every time.</p> + + <p>So, adding a page is very easy. Save every new page within the + folder <code>_page</code>, or in one of its subfolders. Start with the first + two lines by defining the title and description for this page, by using the + macro T‍ITLE and D‍ESCRIPTION from sswg custom syntax. Then + separate the macro from the rest of the page with 3 dashes "<code>---</code>". + For example:</p> + + |<pre> + |T‍ITLE="My new web page" + |D‍ESCRIPTION="This page contains information about..." + |--- + |<h2>TI‍TLE</h2> + |# This is a sswg comment. + |<p>A page can contain whatever valid HTML code.</p> + |</pre> + +# Test comment. + <p>The example also shows comments syntaxt. Every line which starts with a + hash mark # is considered as a source comment. Hence, it won't be copied in + the final static HTML page.</p> + + <h3>Header and Footer templates</h3> + <p>Inside <code>_header.t.html</code> write the page content from the DOCTYPE + tag, to the navigation of your page, until the beginning of your main content. + Use the macros <code>TI‍TLE</code> and <code>D‍ESCRIPTION</code> for HTML title + and meta description. The generator will overwrite them with the value specified + within the HTML page. Here an example of header templete:</p> + + |<pre> + |<!DOCTYPE html> + |<html> + | <head> + | <title>TI‍TLE</title> + | <meta name="description" content="DE‍SCRIPTION"> + | <link rel="stylesheet" type="text/css" href="/css/style.css" media="screen"> + | <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + | </head> + | + | <body> + | <header> + | <h1>Generic website title</h1> + | <div> + | <aside>I believe in personal digital freedom</aside> + | <nav> + | <a href="/index.html">Home</a> | + | <a href="/my-notes.html">My notes</a> | + | <a href="/email.html">Email</a> + | </nav> + | </div> + | </header> + | <main> + |</pre> + + <p>Similarly to the header, <code>_footer.t.html</code> contains all the rest + of the website to be inserted at the end of each page. No macro substitution + is needed in this file. Here an example:</p> + + |<pre> + | </main> + | <footer> + | <p><a href="/rss.xml"><img src="/images/feed.svg">Feed RSS</a>. + | <p>Copyright &copy; 2020-2021 Acme - + | <a href="/privacy-policy.html">Privacy policy</a></p> + | </footer> + | </body> + |</html> + |</pre> + + <h3>Inserting verbatim source code</h3> + <p>I would like the HTML code assembled by sswg to maintain a proper + indentation. Therefore, the script takes care about indenting the page + contents between the header and footer templates. However, this is an issue + for the verbatim source code.</p> + + <p>Indeed, any sort of white-spaces indentation added to the content of the + code block tags (<code><pre>...</pre></code>) is interpreted by + browsers as white-space characters of the verbatim code. Therefore, the + white-space characters will appear in the code blocks, resulting in unwanted + spaces.</p> + + <p>To solve this issue, I decided to prepose every code block with a pipe + character |. The sswg script will take care in removing the pipe and + white-space characters. For example, the code</p> + + |<pre> + | |<pre> + | |cd + | |ls -la + | |</pre> + |</pre> + + <p>will be transformed into the HTML source code</p> + + |<pre> + |<pre> + |cd + |ls -la + |</pre> + |</pre> + + <h3>Code step by step</h3> + <p>By the time you will read this article, the code might have changed. So you + will find the current version in the + repository <a href="https://git.andreacorsini.xyz/sswg">git.andreacorsini.xyz/sswg</a>.</p> + + <p>For what concern the early static website generator script, it starts by + setting constants for folders and template elements:</p> + + |<pre> + |#!/bin/sh + | + |SSWG_OUTPUT_DIR="_static" + |SSWG_ASSETS_DIR="_assets" + |SSWG_PAGES_DIR="_pages" + |SSWG_HEADER_TEMPLATE="_header.t.html" + |SSWG_FOOTER_TEMPLATE="_footer.t.html" + |</pre> + + <p>Second, the output folder <code>_static</code> is cleaned:</p> + + |<pre> + |rm -rf "$SSWG_OUTPUT_DIR" + |mkdir "$SSWG_OUTPUT_DIR" + |</pre> + + <p>So, be careful if you copied something inside it. It is wiser to copy + external files into <code>_assets</code>, as they will be automatically copied + back into <code>_static</code>:</p> + + |<pre> + |cp -r "$SSWG_ASSETS_DIR"/* "$SSWG_OUTPUT_DIR"/. + |</pre> + + <p>Then, we can finally generate each HTML page:</p> + |<pre> + |for page in $(find "$SSWG_PAGES_DIR" -iname '*.html' -o \ + | -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png'); + |do + | filename="$SSWG_OUTPUT_DIR/${page##$SSWG_PAGES_DIR/}" + | mkdir -p "`dirname $filename`" + | + | if [ "${filename##*.}" = "html" ]; then + |</pre> + + <p>Prepose the header template:</p> + |<pre> + | cat "$SSWG_HEADER_TEMPLATE" >> "$filename" + |</pre> + + <p>Indentation in the page content to match the header level:</p> + |<pre> + | cat "$page" | awk ' + | BEGIN {print ""} + | FNR>3 {print " " $0} + | END {print ""}' >> "$filename" + |</pre> + + <p>Append the footer template:</p> + |<pre> + | cat "$SSWG_FOOTER_TEMPLATE" >> "$filename" + |</pre> + + <p>To perform the macro substitution, firstly shell-evaluate the first two + lines of the page. They are supposed to contain a shell-like declaration of the + variables TI‍TLE and DES‍CRIPTION. Secondly, each macro can be + substituted in the whole document.</p> + |<pre> + | eval `cat "$page" | awk 'FNR<3'` + | sed -i'' "s@TI‍TLE@$TIT‍LE@g" "$filename" + | sed -i'' "s@DES‍CRIPTION@$DES‍CRIPTION@g" "$filename" + |</pre> + + <p>We can now remove comments and pipe + white-spaces:</p> + |<pre> + | sed -i'' "/^[ \t]*#/d" "$filename" + | sed -i'' "s/^[ \t]*|//g" "$filename" + |</pre> + + <p>Continue with the rest of the script. If we are not reading an HTML file, + it could be either an image or a folder. Just copy it to its destination + in <code>_static</code>:</p> + + |<pre> + | else + | cp $page $filename + | fi; + |done; + |</pre> + + <hr> + <h3>Conclusion</h3> + <p>Static website generators are valid lightweight alternatives to more + complicate and larger content management systems (CMS), such as Wordpress. + They are normally simple to use, requires no databases, neither complicated + install procedures. Users are in control throught text files.</p> + + <p>This post showed how to write a simple static website generator (sswg) to get our + web pages started. So far, the generator script has only bare-bones + functionalities, but it is simple enough to be extended with additional + features.</p> + + <p>I hope you found this post useful and interesting. Don't hesitate to + contact me for any questions or comments.</p> + +</article> diff --git a/_pages/notes/index.html b/_pages/notes/index.html new file mode 100755 index 0000000..dca7b9f --- /dev/null +++ b/_pages/notes/index.html @@ -0,0 +1,14 @@ +TITLE="Andrea Corsini's Personal Notes" +DESCRIPTION="Posts about anything I want to share, such as ideas, thoughts, learning" +--- +<h2>My Notes</h2> +<p> + <time datetime="2022-06-03">June 3, 2022</time> + <br> + <a href="/notes/a-simple-static-website-generator.html">A simple static website generator (sswg)</a> +</p> + +# <ul> +# <li>Why <em>“I have nothing to hide”</em> is not a reasonable excuse for personal digital freedom</li> +# <li>On the importance of donations to Libre and Open Source software.</li> +# </ul> diff --git a/_pages/privacy-policy.html b/_pages/privacy-policy.html new file mode 100644 index 0000000..2264187 --- /dev/null +++ b/_pages/privacy-policy.html @@ -0,0 +1,18 @@ +TITLE="Privacy policy in andreacorsini.xyz" +DESCRIPTION="A very easy privacy policy: no data is collected in this website." +--- +<h2>Privacy policy</h2> +<p>This website is proud to be free from <q>BloatScripts</q>, advertising, + cookies, tracking/telemtry systems and other nasty non-free garbage that we are + sadly used to experience nowadays on the web. Hence, no data is collected + directly.</p> + +<p>If you use my <a href="/email.html">email</a> to contact me, you + implicitely agree to be contacted back in order to receive an answer.</p> + +<p>Currently, your IP and requests are recorded in the logs of my webserver + for security reasons. Logs are cleared every 5 days. The records are processed only + by free and open source security tools, such as <var>fail2ban</var>. Your IP + might be automatically recorded in the <i>deny list</i> for longer time or + permanently, in case you are conducting malicious activity towards my server + instances.</p> diff --git a/_pages/travels/index.html b/_pages/travels/index.html new file mode 100755 index 0000000..8755893 --- /dev/null +++ b/_pages/travels/index.html @@ -0,0 +1,65 @@ +TITLE="Andrea Corsini's travels" +DESCRIPTION="Andrea Corsini's travels and photos" +--- +<h2>Travels</h2> +<p><a href="/travels/pictures"><img src="/images/camera-2-icon.png" /></a> Browse + my photos in the <a href="/travels/pictures">travel pictures</a> folder. + Although I'm not an expert photographer, I like to share some pictures from my + trips.</p> +<br/> +<p>How I like to travel:</p> +<ul> + <li>Prefer journeys over vacations, backpacks over suitcases, active over + comfy.</li> + <li>Look for something different, seek the unexpected. Don't try to replace what you have elsewhere.</li> + <li>Experience characteristic coucines and trust the locals.</li> + <li>Come back home with your spirit enriched (probably not the wallet).</li> +</ul> + +<h2>Journeys</h2> + +<p>I have recognised the importance of travelling only during my + undergraduate and graduate studies. I was lucky to have the possibility to + combine studies and new cultural experiences.</p> + +<p>Beside the usual good time spent in vacations with my family, I had + experienced three very intense long journeys. I will share more about each of + them in a separate blog post. So far, I summarise them here.</p> + +<h3>Journey to the East</h3> +<p>This chapter of my life started with my exchange in the mainland China. + Between 2015 and 2016, I have spent the second grade of my bachelor's in + Shanghai. For a young western in his 20s, that was quite a shock initially, + but it slowly transitioned to a melting pot of fantastic memories and people. + During the various national holidays, I had the chance to travel around China + and south-east Asia. In 2017/2018, I came back to Shanghai, to experience the + working-life in the metropolis.</p> + +<h3>Balkan flavours</h3> +<p>Two weeks in the middle of 2018's summer. I started this trip by visiting + Hungary and Slovenia in the Central Europe. Then the trip proceeded down to + the Southeastern Europe, passing through Croatia and finally reaching + Sarajevo. The culture in Bosnia and Herzegovina was fascinating, a real + authentic bridge between western and middle-east traditions. I want to explore + more this corner of Europe, since this was just a taste.</p> +<p>Before this trip, I was ignoring most of the countries in this region. Of + course we learnt about them in our education, but you know, names and + geographical position easily fade away when you only experience them in few + hours during classes.</p> + +<h3>Europe Rediscovery</h3> +<p>The long time spent in Asia amazed me, but also made me re-appreciate what we + have here in Europe. For example, it's easy to travel around with a simple ID + card, by trains, ferries and cheap flights.</p> +<p>Because of this and many other reasons, during my master's degree, I enrolled + in the <a href="https://masterschool.eitdigital.eu">EIT Digital master + school</a>. This programme fosters the entrepreneurial spirit of ICT students, + beside their technical major courses. It also lets us studying in two + different University around Europe, to experience different environments. In + my case, I chose Milano (Italy) and Helsinki (Finland). What's more, the + master school organises other side events, such as the + programme <i>kick-off</i> in Paris and a summer school in Stockholm (Sweden). + Thanks to this project, I could join an exciting network of like-minded + students. This is definitely a <i>plus</i>, which enriched the overall + experience. Unfortunately, near the end of my programme, a world-wide pandemic + stroke all over the globe.</p> diff --git a/_pages/travels/pictures/index.html b/_pages/travels/pictures/index.html new file mode 100755 index 0000000..e1cfdc6 --- /dev/null +++ b/_pages/travels/pictures/index.html @@ -0,0 +1,27 @@ +TITLE="Listing of Pictures" +DESCRIPTION="Listing of Pictures" +--- +<h2>Listing of Picture Thumbnails</h2> +<p> +<!-- Generated by thumbnail_page.pl by jcv http://www.netpurgatory.com/ --> +<a href="../">Go back</a><br /><br /> +<a href="./index2.html">./</a> +<br /> +<a href="./china/index.html">china</a> +<br /> +<a href="./estonia/index.html">estonia</a> +<br /> +<a href="./estonia/tallin/index.html">estonia/tallin</a> +<br /> +<a href="./finland/index.html">finland</a> +<br /> +<a href="./finland/porvo/index.html">finland/porvo</a> +<br /> +<a href="./finland/tampere/index.html">finland/tampere</a> +<br /> +<a href="./taiwan/index.html">taiwan</a> +<br /> +<a href="./taiwan/jiufeng/index.html">taiwan/jiufeng</a> +<br /> +<a href="./taiwan/taipei/index.html">taiwan/taipei</a> +<br /> @@ -0,0 +1,50 @@ +# SSWG - Simple Static Website Generator +#!/bin/sh + +SSWG_OUTPUT_DIR="_static" +SSWG_ASSETS_DIR="_assets" +SSWG_PAGES_DIR="_pages" +SSWG_HEADER_TEMPLATE="_header.t.html" +SSWG_FOOTER_TEMPLATE="_footer.t.html" + +rm -rf "$SSWG_OUTPUT_DIR" +mkdir "$SSWG_OUTPUT_DIR" + +# Copy static assets +cp -r "$SSWG_ASSETS_DIR"/* "$SSWG_OUTPUT_DIR"/. + +# Generate HTML pages +for page in $(find "$SSWG_PAGES_DIR" -iname '*.html' -o \ + -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png'); +do + filename="$SSWG_OUTPUT_DIR/${page##$SSWG_PAGES_DIR/}" + mkdir -p "`dirname $filename`" + + if [ "${filename##*.}" = "html" ]; then + # prepose header + cat "$SSWG_HEADER_TEMPLATE" >> "$filename" + + # Fix indentation in the generated source + cat "$page" | awk ' + BEGIN {print ""} + FNR>3 {print " " $0} + END {print ""}' >> "$filename" + + # append footer + cat "$SSWG_FOOTER_TEMPLATE" >> "$filename" + + # macro substitution + eval `cat "$page" | awk 'FNR<3'` + sed -i'' "s@TITLE@$TITLE@g" "$filename" + sed -i'' "s@DESCRIPTION@$DESCRIPTION@g" "$filename" + + # remove comments + sed -i'' "/^[ \t]*#/d" "$filename" + + # remove indentation before whitespaces+pipe + # useful e.g. with <pre> tags + sed -i'' "s/^[ \t]*|//g" "$filename" # remove + else + cp $page $filename + fi; +done; |