57 files changed, 1025 insertions(+), 702 deletions(-)
M LICENSE
M README.md
D build.sh
A content/_index.md
A content/aboutme.md
A content/blog/_index.md
A content/blog/coding/_index.md
R src/feeds/coding/functional_programming.org => content/blog/coding/functional_programming.org
R src/feeds/coding/index.org => content/blog/coding/index.org
R src/feeds/coding/nested_intervals.org => content/blog/coding/nested_intervals.org
A content/blog/food/_index.md
R src/feeds/food/index.org => content/blog/food/index.org
R src/feeds/food/vegetarian-fish-bagel.org => content/blog/food/vegetarian-fish-bagel.org
R src/feeds/food/vegetarian-fish-bagel/assembled-bagel-top.jpeg => content/blog/food/vegetarian-fish-bagel/assembled-bagel-top.jpeg
R src/feeds/food/vegetarian-fish-bagel/assembled-bagel.jpeg => content/blog/food/vegetarian-fish-bagel/assembled-bagel.jpeg
R src/feeds/food/vegetarian-fish-bagel/bagel-cut-open.jpeg => content/blog/food/vegetarian-fish-bagel/bagel-cut-open.jpeg
R src/feeds/food/vegetarian-fish-bagel/bagel.jpeg => content/blog/food/vegetarian-fish-bagel/bagel.jpeg
R src/feeds/food/vegetarian-fish-bagel/bagels.jpeg => content/blog/food/vegetarian-fish-bagel/bagels.jpeg
R src/feeds/food/vegetarian-fish-bagel/bagels1.jpeg => content/blog/food/vegetarian-fish-bagel/bagels1.jpeg
R src/feeds/food/vegetarian-fish-bagel/carrot-instructions.png => content/blog/food/vegetarian-fish-bagel/carrot-instructions.png
R src/feeds/food/vegetarian-fish-bagel/carrots.jpeg => content/blog/food/vegetarian-fish-bagel/carrots.jpeg
A content/blog/handhelds/_index.md
R src/feeds/handhelds/formatting-an-ipod.org => content/blog/handhelds/formatting-an-ipod.org
R src/feeds/handhelds/index.org => content/blog/handhelds/index.org
R src/feeds/handhelds/using-linux-mobile-for-1-month.org => content/blog/handhelds/using-linux-mobile-for-1-month.org
R src/feeds/index.org => content/blog/index.org
A content/blog/projects/_index.md
R src/feeds/projects/index.org => content/blog/projects/index.org
R src/feeds/projects/polarplayer-studio.org => content/blog/projects/polarplayer-studio.org
R src/config.org => content/config.org
R src/index.org => content/index.org
R src/license.org => content/license.org
D el/get-feeds.el
D el/get-org-title.el
D el/get-posts.el
A hugo.toml
A layouts/_default/single.html
A layouts/blog/list.html
A layouts/blog/single.html
A layouts/index.html
A layouts/partials/footer.html
A layouts/partials/header.html
A layouts/partials/nav.html
A layouts/shortcodes/vcs.html
A static/authors/blahaj.jpg
R res/base.css => static/base.css
R res/font/COPYRIGHT.TXT => static/font/COPYRIGHT.TXT
R res/font/REF => static/font/REF
R res/font/Vera.ttf => static/font/Vera.ttf
R res/logo.png => static/logo.png
R res/robots.txt => static/robots.txt
A static/syntax.css
D templates/gruvbox.theme
D templates/page.html
D templates/rss-footer.xml
D templates/rss-header.xml
D templates/rss-post.xml
M LICENSE => LICENSE +428 -2
@@ 1,2 1,428 @@
-The source files (./el) are licensed under the MIT license.
-All written content (./src/) is licensed under CC-BY-SA unless stated otherwise
+Attribution-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-ShareAlike 4.0 International Public
+License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. BY-SA Compatible License means a license listed at
+ creativecommons.org/compatiblelicenses, approved by Creative
+ Commons as essentially the equivalent of this Public License.
+
+ d. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ e. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ f. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ g. License Elements means the license attributes listed in the name
+ of a Creative Commons Public License. The License Elements of this
+ Public License are Attribution and ShareAlike.
+
+ h. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ i. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ j. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ k. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ l. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ m. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. Additional offer from the Licensor -- Adapted Material.
+ Every recipient of Adapted Material from You
+ automatically receives an offer from the Licensor to
+ exercise the Licensed Rights in the Adapted Material
+ under the conditions of the Adapter's License You apply.
+
+ c. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ b. ShareAlike.
+
+ In addition to the conditions in Section 3(a), if You Share
+ Adapted Material You produce, the following conditions also apply.
+
+ 1. The Adapter's License You apply must be a Creative Commons
+ license with the same License Elements, this version or
+ later, or a BY-SA Compatible License.
+
+ 2. You must include the text of, or the URI or hyperlink to, the
+ Adapter's License You apply. You may satisfy this condition
+ in any reasonable manner based on the medium, means, and
+ context in which You Share Adapted Material.
+
+ 3. You may not offer or impose any additional or different terms
+ or conditions on, or apply any Effective Technological
+ Measures to, Adapted Material that restrict exercise of the
+ rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material,
+ including for purposes of Section 3(b); and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the “Licensor.” The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+
M README.md => README.md +3 -11
@@ 6,18 6,10 @@ you can visit [ccw.icu](https://ccw.icu).
# Building
## Dependencies
-- `pandoc`
-- `sed`
-- `awk`
-- `bash`
-
+- hugo
## Deploy
-To generate the HTML build output,
-simply execute the `build.sh` file.
-Afterwards the build output can be found in the `build/` folder.
-
-To get a local server running,
-you can use `serve build`
+To build the files, simply run `hugo` and serve the `publish` folder,
+or use `hugo server --buildDrafts` to run a live server
## Hosting
I'm currently serving the files directly from an `s3`-bucket using caddy.
D build.sh => build.sh +0 -162
@@ 1,162 0,0 @@
-#!/bin/bash
-# depends: pandoc, sed, awk
-
-host="${1:-https://example.com}"
-root="$(dirname $0)"
-srcdir="$root/src"
-assetdir="$root/res"
-eldir="$root/el"
-templatedir="$root/templates"
-builddir="$root/build"
-feedsdir="$srcdir/feeds"
-
-# pandoc syntax highlighting theme
-pandocTheme="$templatedir/gruvbox.theme"
-# pandoc export target
-pandocTarget="html5"
-pandocTargetExtension="html"
-
-# function used to convert .org file to target format
-function convertOrg() {
- # read the org file as first argument
- cat "$1" | \
- # pandoc does not support elisp syntax highlighting
- # but it supports commonlisp, so we can just replace it
- sed 's/elisp/commonlisp/' | \
- pandoc \
- -f org \
- -t $pandocTarget \
- -c '/base.css' \
- --toc --toc-depth=1 \
- -V postlink="$3" \
- -M date-meta="$4" \
- --template $2 \
- --highlight-style="$pandocTheme" \
- - |
- # pandoc does not autoreplace the ->.org links,
- # so we need to autodetect them and replace the file extension,
- # with the extension of the format
- sed -r "s/([\.]+\/[A-z\/\.0-9_-]*)\.org/\1\.$pandocTargetExtension/g"
-}
-
-# create new build folder
-mkdir -p $builddir
-# delete old build artifacts
-rm -rf $builddir/*
-
-# ASSETS
-cp $assetdir/* -r $builddir
-
-prefix="s/^$(echo $srcdir | sed 's/\//\\\//')\///"
-# loop through all source files
-find $srcdir -type f | \
- # remove leading $srcdir
- sed "$prefix" | \
- # create a publishing date + path id to sort the posts
- while read file; do
- ts="$(cat $srcdir/$file | \
- grep -E '#\+DATE: <([^<>]+)>' | \
- sed -r 's/#\+DATE: <([^<>]+)>/\1/' | \
- head -n 1)"
- echo "$ts;$file"
- done | \
- # sort the posts by date
- sort -r | \
- while read mark; do
- file="$(echo $mark | awk -F';' '{ print $2 }')"
- ts="$(echo $mark | awk -F';' '{ print $1 }')"
- # initialise builddir path
- mkdir -p "$(dirname "$builddir/$file")"
-
- ext="$(echo $file | awk -F'.' '{ print $NF }')"
- if [ "$ext" = "org" ]; then
- # org files won't be called .org after conversion
- # so we need to rename them
- newName="$(echo $file | sed "s/\.org$/\.$pandocTargetExtension/")"
- echo $newName
- # me need to convert .org files
- convertOrg $srcdir/$file $templatedir/page.html \
- > $builddir/$newName
-
- if [ ! "$(basename $file)" = "index.org" ] && [ ! "$ts" = "" ]; then
- root="$(echo $file | awk -F'/' '{ print $1 }')"
- if [ $root = "feeds" ]; then
- # is a blog post
- # so we have to generate an rss feed compatible version
-
- # id of the subfeed
- feed="$(echo $file | awk -F'/' '{ print $2 }')"
-
- filename=$(basename $file | sed -r 's/org$/html/')
- cont="$(convertOrg \
- $srcdir/$file \
- $templatedir/rss-post.xml \
- $host/feeds/$feed/$filename \
- $ts
- )"
-
- echo "$cont" >> $builddir/feeds/rss
- echo "$cont" >> $builddir/feeds/$feed/rss
- fi
- fi
- else
- # all other files can just be copied to the build dir
- cp $srcdir/$file $builddir/$file
- fi
- done
-
-# RSS FEED
-function read_arg() {
- file=$1
- arg=$2
-
- reg="#\+$arg: ([^\n]+)"
-
- # print file
- cat $1 | \
- # only select lines with a reasonable beginning
- grep -E "$reg" | \
- # only use the first entry
- head -n 1 | \
- # extract the text
- sed -r "s/$reg/\1/"
-}
-function escape() {
- echo $1 | \
- sed -r 's/\//\\\//g' | \
- sed -r 's/\./\\\./g'
-}
-rssheader="$(cat $templatedir/rss-header.xml)"
-rssfooter="$(cat $templatedir/rss-footer.xml)"
-# list all feeds
-find $feedsdir -type d -maxdepth 1 | \
- # remove ugly prefixes
- sed "$prefix" |
- # loop over feeds
- while read feed; do
- rsspath="$builddir/$feed/rss"
- infopath="$srcdir/$feed/index.org"
- webpath="$host/$feed/index.html"
-
- # only publish rss feeds with at least one post
- if [ -f $rsspath ]; then
- rsscont="$(cat $rsspath)"
-
- title="$(read_arg $infopath TITLE)"
- description="$(read_arg $infopath DESCRIPTION)"
-
- # overwrite file with header
- echo "$rssheader" | \
- # replace weblink
- sed -r "s/\\\$host\\\$/$(escape "$webpath")/g" | \
- # replace feed title
- sed -r "s/\\\$title\\\$/$(escape "$title")/g" | \
- # replace feed description
- sed -r "s/\\\$description\\\$/$(escape "$description")/g" \
- > $rsspath
- # add content back to feed
- echo "$rsscont" >> $rsspath
- # close missing tags
- echo "$rssfooter" >> $rsspath
- fi
- done
A content/_index.md => content/_index.md +9 -0
@@ 0,0 1,9 @@
+---
+title: ccw.icu
+---
+
+Hi 👋, \
+I'm Jakob (they/them).
+
+Welcome to my lovely home on the internet. 🏡 \
+Have a look around and see if anything sparks your interest.
A content/aboutme.md => content/aboutme.md +37 -0
@@ 0,0 1,37 @@
+---
+title: About Me
+---
+
+# This is me
+
+Hi, \
+I'm **Jakob**. \
+I love writing software using **rust** and **hare**. \
+Did I mention, that I'm super into **Linux**? \
+— because **I am**.
+
+I identify as trans/non-binary
+and use *they/them* pronouns.
+
+## What I'm up to
+
+I'm currently studying *Computer science* at the
+*Otto von Guericke Universität*.
+
+## What I do
+I self host a bunch of software, although I took down most of the public services - sowy.
+
+I've also been maintaining / packaging a couple of *Alpine Linux* packages since 2023 or something like that.
+
+But most of the time I'm busy doing stuff for uni, listening to music or crocheting.
+
+## Social
+
+{{<vcs>}}
+
+I occasionally post over on the [Fediverse](https://social.ccw.icu/comcloudway) as well.
+
+# Supervisor
+Even though I manage this blog and write all of the blog posts,
+a lot of the planning, brainstorming and writing is done with the help of my Blåhaj.
+![Blahaj sitting in front a laptop, staring at a GitLab repository](/authors/blahaj.jpg)
A content/blog/_index.md => content/blog/_index.md +14 -0
@@ 0,0 1,14 @@
+---
+title: My blog
+---
+Whoooaa you have found my blog-post index.
+
+To keep everything neatly organised 🗂️,
+my blog is split into multiple subcategories.
+
+If you are looking for something specific,
+just check the appropriate category. \
+And if you are just here to spend some time reading,
+pick a category that seems interesting to you \
+\- or toss a coin and choose one at random.
+See below for a list of all of the available categories.
A content/blog/coding/_index.md => content/blog/coding/_index.md +11 -0
@@ 0,0 1,11 @@
+#+TITLE: Coding
+#+DESCRIPTION: Are you up for a coding challenge? You can find some of my weird side projects here
+#+SETUPFILE: ../../config.org
+#+OPTIONS: toc:nil num:nil
+
+There is nothing I can say to explain this,
+sometimes I just feel like writing some lines of code.
+But instead of throwing them away like a normal person,
+I hold onto them.
+
+And this is how they end up here.
R src/feeds/coding/functional_programming.org => content/blog/coding/functional_programming.org +0 -0
R src/feeds/coding/index.org => content/blog/coding/index.org +0 -0
R src/feeds/coding/nested_intervals.org => content/blog/coding/nested_intervals.org +0 -0
A content/blog/food/_index.md => content/blog/food/_index.md +12 -0
@@ 0,0 1,12 @@
+#+TITLE: Food
+#+DESCRIPTION: Mhhhh. Tasty.
+#+SETUPFILE: ../../config.org
+#+OPTIONS: toc:nil num:nil
+
+Besides programming,
+I enjoy cooking and baking.
+
+Here you can find some of my favorite recipes.
+
+You can also follow this topic using it's specific rss feed,
+using your favorite rss reader.
R src/feeds/food/index.org => content/blog/food/index.org +0 -0
R src/feeds/food/vegetarian-fish-bagel.org => content/blog/food/vegetarian-fish-bagel.org +0 -0
R src/feeds/food/vegetarian-fish-bagel/assembled-bagel-top.jpeg => content/blog/food/vegetarian-fish-bagel/assembled-bagel-top.jpeg +0 -0
R src/feeds/food/vegetarian-fish-bagel/assembled-bagel.jpeg => content/blog/food/vegetarian-fish-bagel/assembled-bagel.jpeg +0 -0
R src/feeds/food/vegetarian-fish-bagel/bagel-cut-open.jpeg => content/blog/food/vegetarian-fish-bagel/bagel-cut-open.jpeg +0 -0
R src/feeds/food/vegetarian-fish-bagel/bagel.jpeg => content/blog/food/vegetarian-fish-bagel/bagel.jpeg +0 -0
R src/feeds/food/vegetarian-fish-bagel/bagels.jpeg => content/blog/food/vegetarian-fish-bagel/bagels.jpeg +0 -0
R src/feeds/food/vegetarian-fish-bagel/bagels1.jpeg => content/blog/food/vegetarian-fish-bagel/bagels1.jpeg +0 -0
R src/feeds/food/vegetarian-fish-bagel/carrot-instructions.png => content/blog/food/vegetarian-fish-bagel/carrot-instructions.png +0 -0
R src/feeds/food/vegetarian-fish-bagel/carrots.jpeg => content/blog/food/vegetarian-fish-bagel/carrots.jpeg +0 -0
A content/blog/handhelds/_index.md => content/blog/handhelds/_index.md +28 -0
@@ 0,0 1,28 @@
+#+TITLE: Smartphone related posts
+#+DESCRIPTION: Mostly me aranting about mobile phones
+#+SETUPFILE: ../../config.org
+#+OPTIONS: toc:nil num:nil
+
+I guess either you love it or hate it - right?
+the mobileOS *war*.
+
+Honestly I'm not a fan of either iOS and android,
+but android still has the advantage of installing `.apk` files
+and doing `chroot` stuff.
+
+And no I'm not saying that android is *the best operating system*,
+acctually I think that the opposite is true:
+In fact for years google has been locking down android phones.
+
+I've been using rooted android phones for about 5 years now,
+and bought a pinephone this year.
+
+*You know that android uses a linux kernel!* - I hear you say.
+And yes I know that,
+but it is not a mainlined linux kernel,
+with a lot of elements strip away from it,
+and a lot of binary blobs.
+Additionally most phones are stuck on `4.*` kernels
+
+You can also follow this topic using it's specific rss feed,
+using your favorite rss reader.
R src/feeds/handhelds/formatting-an-ipod.org => content/blog/handhelds/formatting-an-ipod.org +0 -0
R src/feeds/handhelds/index.org => content/blog/handhelds/index.org +0 -0
R src/feeds/handhelds/using-linux-mobile-for-1-month.org => content/blog/handhelds/using-linux-mobile-for-1-month.org +0 -0
R src/feeds/index.org => content/blog/index.org +0 -0
A content/blog/projects/_index.md => content/blog/projects/_index.md +10 -0
@@ 0,0 1,10 @@
+---
+title: Projects
+description: A list of my featured personal projects
+---
+I enjoy building new software in rust
+or writing weird JavaScript libraries.
+But I also work on hardware prototypes,
+i.e *floe*
+
+{{<vcs>}}
R src/feeds/projects/index.org => content/blog/projects/index.org +0 -0
R src/feeds/projects/polarplayer-studio.org => content/blog/projects/polarplayer-studio.org +0 -0
R src/config.org => content/config.org +0 -0
R src/index.org => content/index.org +0 -0
R src/license.org => content/license.org +0 -0
D el/get-feeds.el => el/get-feeds.el +0 -9
@@ 1,9 0,0 @@
-(setq this (file-name-directory load-file-name))
-(load-file
- (format "%s/%s" this "get-org-title.el"))
-
-(defun extract (path)
- (format "[[file:%s/index.org][%s]]" path (get-org-title (format "%s/index.org" path))))
-
-(defun get-feeds (path)
- (mapcar '(lambda (p) (extract (format "%s/%s" path p))) (directory-files path nil "^[^.]*$")))
D el/get-org-title.el => el/get-org-title.el +0 -10
@@ 1,10 0,0 @@
-(defun get-org-title (file)
- (let (title)
- (when file
- (with-temp-buffer
- (insert-file-contents file)
- (pcase (org-collect-keywords '("TITLE"))
- (`(("TITLE" . ,val))
- (setq title (car val)))))
- title)))
-(provide 'get-org-title)
D el/get-posts.el => el/get-posts.el +0 -12
@@ 1,12 0,0 @@
-(setq this (file-name-directory load-file-name))
-(load-file
- (format "%s/%s" this "get-org-title.el"))
-
-(defun extract (path)
- (format "[[file:./%s][%s]]" path (get-org-title (format "%s" path))))
-
-(require 'seq)
-(defun get-posts (path)
- (mapcar
- '(lambda (p) (extract (format "%s/%s" path p)))
- (remove "index.org" (directory-files path nil "[.]org$"))))
A hugo.toml => hugo.toml +10 -0
@@ 0,0 1,10 @@
+baseURL = 'https://ccw.icu'
+languageCode = 'en-us'
+title = 'ccw.icu'
+pygmentsUseClasses = true
+
+[markup.goldmark.renderer]
+unsafe = true
+
+[markup.tableOfContents]
+ordered = true
A layouts/_default/single.html => layouts/_default/single.html +23 -0
@@ 0,0 1,23 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="robots" content="noml">
+ <meta name="gptbot" content="noml">
+ <meta name="bingbot" content="noml">
+ <meta name="googlebot" content="noml">
+ <title>{{.Title}}</title>
+ <link rel="icon" type="image/png" href="/logo.png">
+ <meta property="og:image" content="https://ccw.icu/logo.png">
+ <link rel="stylesheet" href="/base.css">
+ </head>
+ <body>
+ {{ partial "nav.html" }}
+ <main>
+ <h2>{{.Title}}</h2>
+ {{.Content}}
+ </main>
+ {{ partial "footer.html" }}
+ </body>
+</html>
A layouts/blog/list.html => layouts/blog/list.html +38 -0
@@ 0,0 1,38 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <title>My blog posts</title>
+ {{ partial "header.html" }}
+</head>
+{{ partial "nav.html" }}
+<main>
+ {{ .Content }}
+ {{ if .Sections }}
+ <h2>Find out more</h2>
+ <p><a href="index.xml">RSS feed</a></p>
+ {{ range .Sections }}
+ <a href="{{ .RelPermalink }}">
+ <h3>
+ {{ .LinkTitle }} ({{.Pages | len}} posts)
+ </h3>
+ <small>{{ .Description }}</small>
+ </a>
+ {{ end }}
+ {{ else }}
+ <h2>Posts</h2>
+{{ range .Pages }}
+ <div class="stub">
+ <h2>
+ <a href="{{.Permalink}}">
+ {{.Title}}
+ </a>
+ </h2>
+ <small>
+ {{.Date.Format "January 2, 2006"}}
+ (est {{.ReadingTime}} min)
+ </small>
+ </div>
+ {{ end }}
+ {{ end }}
+</main>
+{{ partial "footer.html" }}
A layouts/blog/single.html => layouts/blog/single.html +17 -0
@@ 0,0 1,17 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <title>{{$.Title}}</title>
+ {{ partial "header.html" }}
+</head>
+{{ partial "nav.html" }}
+<main>
+ <h2>
+ {{.Title}}
+ <small>
+ {{.Date.Format "January 2, 2006"}}
+ </small>
+ </h2>
+ {{.Content}}
+</main>
+{{ partial "footer.html" }}
A layouts/index.html => layouts/index.html +22 -0
@@ 0,0 1,22 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <title>{{$.Title}}</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="robots" content="noml">
+ <meta name="gptbot" content="noml">
+ <meta name="bingbot" content="noml">
+ <meta name="googlebot" content="noml">
+ <link rel="icon" type="image/png" href="/logo.png">
+ <meta property="og:image" content="https://ccw.icu/logo.png">
+ <link rel="stylesheet" href="/base.css">
+ </head>
+ <body>
+ {{ partial "nav.html" }}
+ <main>
+ {{.Content}}
+ </main>
+ {{ partial "footer.html" }}
+ </body>
+</html>
A => +9 -0
@@ 0,0 1,9 @@
<footer>
<p>Written with love by me (Jakob Meier)</p>
<p>Licensed under <a href="https://wiki.creativecommons.org/wiki/CC_SA_4.0">CC-BY-SA 4.0</a></p>
<p>
<a href="/">Home</a> ·
<a href="/sitemap/">Sitemap</a> ·
<a href="https://git.hut.ccw.icu/~comcloudway/pages">Source</a>
</p>
</footer>
A => +9 -0
@@ 0,0 1,9 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noml">
<meta name="gptbot" content="noml">
<meta name="bingbot" content="noml">
<meta name="googlebot" content="noml">
<link rel="icon" type="image/png" href="/logo.png">
<meta property="og:image" content="https://ccw.icu/logo.png">
<link rel="stylesheet" href="/base.css">
A layouts/partials/nav.html => layouts/partials/nav.html +7 -0
@@ 0,0 1,7 @@
+<nav>
+ <ul>
+ <li><a href="/">Home</a></li>
+ <li><a href="/blog">Blog</a></li>
+ <li><a href="/aboutme">About me</a></li>
+ </ul>
+</nav>
A layouts/shortcodes/vcs.html => layouts/shortcodes/vcs.html +8 -0
@@ 0,0 1,8 @@
+if you want to see a list of all my projects
+you can find me on various git/vcs hosting sites:
+
+<ul>
+{{ range .Site.Data.vcs }}
+<li><a href="{{ .link }}">{{ .name }}</a></li>
+{{ end }}
+</ul>
A static/authors/blahaj.jpg => static/authors/blahaj.jpg +0 -0
R res/base.css => static/base.css +244 -174
@@ 1,272 1,342 @@
/* VARIABLES */
:root {
- --color-purple: #b16286;
- --color-white: #ebdbb2;
- --color-blue: #458588;
- --color-yellow: #d79921;
+ --color-purple: #b16286;
+ --color-white: #ebdbb2;
+ --color-blue: #458588;
+ --color-yellow: #d79921;
- --color-bg: #1d2021;
- --color-box: #282828;
- --color-base: #3c3836;
- --color-box-light: #222424;
- --color-text: #bdae93;
- --color-text-dark: #504945;
- --color-text-dark2: #32302f;
- --color-headline: var(--color-white);
- --color-link: var(--color-purple);
- --color-link-hv: #d3869b;
+ --color-bg: #1d2021;
+ --color-box: #282828;
+ --color-base: #222424;
+ --color-box-light: #3c3836;
+ --color-text: #bdae93;
+ --color-text-dark: #504945;
+ --color-text-dark2: #32302f;
+ --color-headline: var(--color-white);
+ --color-link: var(--color-purple);
+ --color-link-hv: #d3869b;
}
/* CUSTOM FONT */
@font-face {
- font-family: "Bitstream Vera";
- src: url("./font/Vera.ttf");
+ font-family: "Bitstream Vera";
+ src: url("./font/Vera.ttf");
}
/* GLOBAL STYLE */
html {
- padding: 0;
- margin: 0;
- /* Apply the font to the whole website */
- font-family: "Bitstream Vera";
+ padding: 0;
+ margin: 0;
+ /* Apply the font to the whole website */
+ font-family: "Bitstream Vera";
- /* We use the <html> tag as a wrapper for the whole body */
- /* and limit the body width */
- display: flex;
- justify-content: center;
- background: var(--color-box-light);
+ /* We use the <html> tag as a wrapper for the whole body */
+ /* and limit the body width */
+ display: flex;
+ justify-content: center;
+ background: var(--color-bg);
}
body {
- background: var(--color-bg);
- background-size: cover;
- position: relative;
- /* ensures the hover animations work properly */
- z-index: -1;
- margin: 0;
+ background: var(--color-bg);
+ background-size: cover;
+ position: relative;
+ /* ensures the hover animations work properly */
+ z-index: -1;
+ margin: 0;
- /* limit the body width */
- min-height: calc(100vh - 0.8rem * 2);
- width: calc(100vw - 0.8rem * 2);
- display: flex;
- flex-direction: column;
- align-items: center;
- color: var(--color-text);
- max-width: 70rem;
- width: calc(100% - 3rem * 2);
- padding: 3rem;
+ /* cursed hack to fix overflow issues on the home page and justify center issues */
+ padding: 3rem;
+ min-height: calc(100vh - 3rem * 2);
+
+ /* center everything */
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ color: var(--color-text);
+ max-width: 70rem;
+ width: calc(100% - 3rem * 2);
}
body > p {
- width: 100%;
- margin: 0.4rem;
+ width: 100%;
+ margin: 0.4rem;
+}
+body > main {
+ max-width: 100%;
+ display: flex;
+ flex-direction: column;
}
nav {
- width: 100%;
+ width: 100%;
}
-ul {
- width: 100%
+nav ul {
+ text-decoration: none;
+ display: flex;
+ gap: 0.4rem;
+ margin: 0;
+ padding: 0.4rem;
+}
+nav ul li {
+ display: block;
}
/* HEADER */
header {
- width: 100%;
+ width: 100%;
}
header > h1 {
- font-size: 3rem;
+ font-size: 3rem;
}
header > h3 {
- opacity: 0.8;
+ opacity: 0.8;
}
/* QUOTES */
/* adds a vertical white line in front of quotes */
blockquote {
- opacity: 0.9;
- position: relative;
+ opacity: 0.9;
+ position: relative;
}
blockquote::before {
- content: '';
- height: 100%;
- width: 0.2rem;
- background: var(--color-text);
- position: absolute;
- margin-left: -1rem;
- border-radius: 8px;
+ content: '';
+ height: 100%;
+ width: 0.2rem;
+ background: var(--color-text);
+ position: absolute;
+ margin-left: -1rem;
+ border-radius: 8px;
}
/* Make sure all headlines are on the left hand side */
h1,h2,h3,h4,h5,h6 {
- color: var(--color-headline);
- width: 100%;
- margin-bottom: 0;
+ color: var(--color-headline);
+ width: 100%;
+ margin-bottom: 0;
}
/* LINKS */
a {
- color: var(--color-link);
- margin: 0.2rem;
- transition: color .4s;
- text-decoration: underline;
+ color: var(--color-link);
+ margin: 0.2rem;
+ transition: color .8s;
+ text-decoration: underline;
}
a:hover {
- color: var(--color-link-hv);
+ color: var(--color-link-hv);
}
/* IMAGES */
figure {
- margin: 0;
- padding: 0.4rem;
- max-width: 80%;
+ margin: 0;
+ padding: 0.4rem;
+ max-width: 80%;
+
+ /* add a background to the figure (same as code block, but with smaller margins) */
+ border-radius: 0.4rem;
+ background: var(--color-box);
+ width: calc(100% - 2 * 0.4rem);
+ height: calc(100% - 2 * 0.4rem);
+ border: none;
+ padding: 0.4rem;
+ margin-top: 1rem;
+ overflow: auto;
+}
+figure > img {
+ border-radius: 0.8rem;
+ max-width: 100%;
+}
+:not(figure) > img {
+ max-width: calc(100% - 0.8rem * 2);
+ max-height: calc(0.8 * 100vh - 0.8rem * 2);
- /* add a background to the figure (same as code block, but with smaller margins) */
- border-radius: 0.4rem;
- background: var(--color-box);
- width: calc(100% - 2 * 0.4rem);
- height: calc(100% - 2 * 0.4rem);
- border: none;
- padding: 0.4rem;
- margin-top: 1rem;
- overflow: auto;
-}
-img {
- border-radius: 1rem;
- max-width: 100%;
+ border-radius: 0.8rem;
+ border: 0.4rem solid var(--color-text-dark);
+
+ margin: 0.4rem;
}
/* TABLES (untested) */
table {
- background: var(--color-bg);
- border-radius: 0.4rem;
- overflow: hidden;
- margin: 0.4rem
+ background: var(--color-bg);
+ border-radius: 0.4rem;
+ overflow: hidden;
+ margin: 0.4rem
}
table tr {
- padding: 0.4rem;
- display: block;
- background: var(--color-base);
- transition: background .4s;
- cursor: pointer
+ background: var(--color-base);
+ transition: background .4s;
+ cursor: pointer;
+ border: 2px solid transparent;
+}
+table tr td {
+ padding: 0.2rem;
}
table tr:hover {
- background: var(--color-text-dark) !important;
+ background: var(--color-text-dark) !important;
}
table tr:nth-child(2n) {
- background: var(--color-text-dark2);
+ background: var(--color-text-dark2);
}
.horizontal-table ~ table {
- display: flex
- flex-wrap: wrap;
- background: transparent;
+ display: flex
+ flex-wrap: wrap;
+ background: transparent;
}
.horizontal-table ~ table tbody {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- gap: 0.4rem
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.4rem
}
.horizontal-table ~ table tbody tr {
- border-radius: 0.4rem;
+ border-radius: 0.4rem;
}
/* CAPTIONS */
div.captioned-content {
- width: 100%;
+ width: 100%;
}
div.captioned-content > div.caption {
- display: flex;
- opacity: 0.8;
- font-size: 0.8rem;
- justify-content: right;
- padding: 0.1rem;
- /* places the caption above the source code block header */
- z-index: 2;
- position: relative;
- margin-right: 0.2rem;
+ display: flex;
+ opacity: 0.8;
+ font-size: 0.8rem;
+ justify-content: right;
+ padding: 0.1rem;
+ /* places the caption above the source code block header */
+ z-index: 2;
+ position: relative;
+ margin-right: 0.2rem;
}
/* SOURCE CODE BLOCKS */
-div.sourceCode {
- width: 100%;
- border-radius: 0.4rem;
- background: var(--color-base);
- border: 4px solid var(--color-base);
- position: relative;
- overflow: hidden;
+div.sourceCode, div.src {
+ width: 100%;
+ border-radius: 0.4rem;
+ background: var(--color-base);
+ border: 4px solid var(--color-base);
+ position: relative;
+ overflow: hidden;
}
pre.sourceCode {
- border-radius: 0.4rem;
- background: var(--color-box-light);
- width: calc(100% - 2 * 0.4rem);
- border: none;
- padding: 0.4rem;
- margin: 0;
- margin-top: 1rem;
- overflow: auto;
+ border-radius: 0.4rem;
+ background: var(--color-box-light);
+ width: calc(100% - 2 * 0.4rem);
+ border: none;
+ padding: 0.4rem;
+ margin: 0;
+ margin-top: 1rem;
+ overflow: auto;
}
div.caption ~ div.sourceCode {
- /* moves caption into the source code block header*/
- margin-top: -1.25rem;
+ /* moves caption into the source code block header*/
+ margin-top: -1.25rem;
}
pre.example {
- background: var(--color-box-light);
- border-radius: 8px;
- position: relative;
- border: none;
- width: calc(100% - 0.8rem * 2);
- padding: 0.8rem;
+ background: var(--color-box-light);
+ border-radius: 8px;
+ position: relative;
+ border: none;
+ width: calc(100% - 0.8rem * 2);
+ padding: 0.8rem;
}
pre.example::before {
- content: '> ';
- color: var(--color-blue);
- background: transparent;
- opacity: 0.8;
- position: sticky;
- left: 0
+ content: '> ';
+ color: var(--color-blue);
+ background: transparent;
+ opacity: 0.8;
+ position: sticky;
+ left: 0
}
div.sourceCode ~ pre.example, div.captioned-content ~ pre.example {
- /* move examples closer to the block above */
- margin-top: 0;
+ /* move examples closer to the block above */
+ margin-top: 0;
+}
+div.src pre {
+ overflow-x: auto;
+ padding: 0.8rem;
+ margin: 0 0.4rem;
}
/* TRANS HOVER ANIMATION */
-div.sourceCode, pre.example, figure {
- position: relative !important;
- overflow: inherit;
+div.sourceCode,div.src, pre.example, figure {
+ position: relative !important;
+ overflow: inherit;
}
-div.sourceCode::after,pre.example::after, figure::after {
- --offset: 0.4rem;
+div.sourceCode::after,pre.example::after, figure::after,div.src::after {
+ --offset: 0.4rem;
- content: '';
- width: 100%;
- height: 100%;
- padding: var(--offset);
- position: absolute;
- top: calc(-1 * var(--offset));
- left: calc(-1 * var(--offset));
- background-image: linear-gradient(45deg, var(--color-blue), var(--color-purple), var(--color-white), var(--color-purple), var(--color-blue));
- z-index: -1;
- filter: blur(4px);
- transition: opacity .4s linear;
- background-size: 300% 100%;
- background-position: 0%, 0%;
- opacity: 0;
- animation: none;
+ content: '';
+ width: 100%;
+ height: 100%;
+ padding: var(--offset);
+ position: absolute;
+ top: calc(-1 * var(--offset));
+ left: calc(-1 * var(--offset));
+ background-image: linear-gradient(45deg, var(--color-blue), var(--color-purple), var(--color-white), var(--color-purple), var(--color-blue));
+ z-index: -1;
+ filter: blur(4px);
+ transition: opacity .4s linear;
+ background-size: 300% 100%;
+ background-position: 0%, 0%;
+ opacity: 0;
+ animation: none;
}
pre.example::after {
- --offset: 0.2rem;
+ --offset: 0.2rem;
}
figure::after {
- --offset: 0.1rem;
- border-radius: 1rem;
+ --offset: 0.1rem;
+ border-radius: 1rem;
}
-div.sourceCode:hover::after,pre.example:hover::after, figure:hover::after {
- opacity: 0.8;
- animation: trans-rotate 10s both 0s linear infinite;
+div.sourceCode:hover::after,pre.example:hover::after, figure:hover::after,div.src:hover::after {
+ opacity: 0.8;
+ animation: trans-rotate 10s both 0s linear infinite;
}
@keyframes trans-rotate {
- from {
- background-position: 0% ,0%;
- }
- to {
- background-position: 300%, 0%;
- }
+ from {
+ background-position: 0% ,0%;
+ }
+ to {
+ background-position: 300%, 0%;
+ }
+}
+
+a.category, a.stub {
+ display: flex;
+ flex-direction: column;
+
+ background: var(--color-box);
+ transition: background .8s;
+ border-radius: 0.4rem;
+
+ padding: 0.8rem;
+ margin: 0.4rem;
+
+ gap: 0.4rem;
+
+ text-decoration: none;
+}
+a.category:hover, a.stub:hover {
+ background: var(--color-box-light);
+}
+a.category > hgroup {
+ display: flex;
+ gap: 0.4rem;
+ align-items: center;
+}
+a.category > hgroup > h3 {
+ width: auto;
+ margin: 0;
+}
+a.category > hgroup > p {
+ margin: 0;
+ color: var(--color-text);
+ opacity: 0.8rem;
+}
+a.stub h2 {
+ margin: 0;
+}
+a.stub p {
+ margin: 0;
}
R res/font/COPYRIGHT.TXT => static/font/COPYRIGHT.TXT +0 -0
R res/font/REF => static/font/REF +0 -0
R res/font/Vera.ttf => static/font/Vera.ttf +0 -0
R res/logo.png => static/logo.png +0 -0
R res/robots.txt => static/robots.txt +0 -0
A static/syntax.css => static/syntax.css +86 -0
@@ 0,0 1,86 @@
+/* Background */ .bg { color: #ebdbb2; background-color: #282828; }
+/* PreWrapper */ .chroma { color: #ebdbb2; background-color: #282828; }
+/* Other */ .chroma .x { }
+/* Error */ .chroma .err { }
+/* CodeLine */ .chroma .cl { }
+/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit }
+/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
+/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
+/* LineHighlight */ .chroma .hl { background-color: #3d3d3d }
+/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #756d59 }
+/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #756d59 }
+/* Line */ .chroma .line { display: flex; }
+/* Keyword */ .chroma .k { color: #fe8019 }
+/* KeywordConstant */ .chroma .kc { color: #fe8019 }
+/* KeywordDeclaration */ .chroma .kd { color: #fe8019 }
+/* KeywordNamespace */ .chroma .kn { color: #fe8019 }
+/* KeywordPseudo */ .chroma .kp { color: #fe8019 }
+/* KeywordReserved */ .chroma .kr { color: #fe8019 }
+/* KeywordType */ .chroma .kt { color: #fabd2f }
+/* Name */ .chroma .n { }
+/* NameAttribute */ .chroma .na { color: #b8bb26; font-weight: bold }
+/* NameBuiltin */ .chroma .nb { color: #fabd2f }
+/* NameBuiltinPseudo */ .chroma .bp { }
+/* NameClass */ .chroma .nc { }
+/* NameConstant */ .chroma .no { color: #d3869b }
+/* NameDecorator */ .chroma .nd { }
+/* NameEntity */ .chroma .ni { color: #fabd2f }
+/* NameException */ .chroma .ne { color: #fb4934 }
+/* NameFunction */ .chroma .nf { color: #fabd2f }
+/* NameFunctionMagic */ .chroma .fm { }
+/* NameLabel */ .chroma .nl { color: #fb4934 }
+/* NameNamespace */ .chroma .nn { }
+/* NameOther */ .chroma .nx { }
+/* NameProperty */ .chroma .py { }
+/* NameTag */ .chroma .nt { color: #fb4934 }
+/* NameVariable */ .chroma .nv { }
+/* NameVariableClass */ .chroma .vc { }
+/* NameVariableGlobal */ .chroma .vg { }
+/* NameVariableInstance */ .chroma .vi { }
+/* NameVariableMagic */ .chroma .vm { }
+/* Literal */ .chroma .l { }
+/* LiteralDate */ .chroma .ld { }
+/* LiteralString */ .chroma .s { color: #b8bb26 }
+/* LiteralStringAffix */ .chroma .sa { color: #b8bb26 }
+/* LiteralStringBacktick */ .chroma .sb { color: #b8bb26 }
+/* LiteralStringChar */ .chroma .sc { color: #b8bb26 }
+/* LiteralStringDelimiter */ .chroma .dl { color: #b8bb26 }
+/* LiteralStringDoc */ .chroma .sd { color: #b8bb26 }
+/* LiteralStringDouble */ .chroma .s2 { color: #b8bb26 }
+/* LiteralStringEscape */ .chroma .se { color: #b8bb26 }
+/* LiteralStringHeredoc */ .chroma .sh { color: #b8bb26 }
+/* LiteralStringInterpol */ .chroma .si { color: #b8bb26 }
+/* LiteralStringOther */ .chroma .sx { color: #b8bb26 }
+/* LiteralStringRegex */ .chroma .sr { color: #b8bb26 }
+/* LiteralStringSingle */ .chroma .s1 { color: #b8bb26 }
+/* LiteralStringSymbol */ .chroma .ss { color: #83a598 }
+/* LiteralNumber */ .chroma .m { color: #d3869b }
+/* LiteralNumberBin */ .chroma .mb { color: #d3869b }
+/* LiteralNumberFloat */ .chroma .mf { color: #d3869b }
+/* LiteralNumberHex */ .chroma .mh { color: #d3869b }
+/* LiteralNumberInteger */ .chroma .mi { color: #d3869b }
+/* LiteralNumberIntegerLong */ .chroma .il { color: #d3869b }
+/* LiteralNumberOct */ .chroma .mo { color: #d3869b }
+/* Operator */ .chroma .o { color: #fe8019 }
+/* OperatorWord */ .chroma .ow { color: #fe8019 }
+/* Punctuation */ .chroma .p { }
+/* Comment */ .chroma .c { color: #928374; font-style: italic }
+/* CommentHashbang */ .chroma .ch { color: #928374; font-style: italic }
+/* CommentMultiline */ .chroma .cm { color: #928374; font-style: italic }
+/* CommentSingle */ .chroma .c1 { color: #928374; font-style: italic }
+/* CommentSpecial */ .chroma .cs { color: #928374; font-style: italic }
+/* CommentPreproc */ .chroma .cp { color: #8ec07c }
+/* CommentPreprocFile */ .chroma .cpf { color: #8ec07c; font-style: italic }
+/* Generic */ .chroma .g { }
+/* GenericDeleted */ .chroma .gd { color: #282828; background-color: #fb4934 }
+/* GenericEmph */ .chroma .ge { color: #83a598; text-decoration: underline }
+/* GenericError */ .chroma .gr { background-color: #fb4934; font-weight: bold }
+/* GenericHeading */ .chroma .gh { color: #b8bb26; font-weight: bold }
+/* GenericInserted */ .chroma .gi { color: #282828; background-color: #b8bb26 }
+/* GenericOutput */ .chroma .go { color: #504945 }
+/* GenericPrompt */ .chroma .gp { }
+/* GenericStrong */ .chroma .gs { }
+/* GenericSubheading */ .chroma .gu { color: #b8bb26; font-weight: bold }
+/* GenericTraceback */ .chroma .gt { background-color: #fb4934; font-weight: bold }
+/* GenericUnderline */ .chroma .gl { }
+/* TextWhitespace */ .chroma .w { }
D templates/gruvbox.theme => templates/gruvbox.theme +0 -226
@@ 1,226 0,0 @@
-{
- "metadata": {
- "author": "Jakob Meier <comcloudway@ccw.icu>",
- "license": "MIT",
- "name": "Gruvbox Pandoc theme",
- "revision": 0
- },
-
- "text-color": "#bdae93",
- "background-color": "#222424",
- "line-number-color": "#a89984",
- "line-number-background-color": "#282828",
-
- "text-styles": {
- "Alert": {
- "text-color": "#cc241d",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Annotation": {
- "text-color": "#689d6a",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Attribute": {
- "text-color": "#458588",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "BaseN": {
- "text-color": "#d65d0e",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "BuiltIn": {
- "text-color": "#bdae93",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Char": {
- "text-color": "#b8bb26",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Comment": {
- "text-color": "#928374",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "CommentVar": {
- "text-color": "#928374",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Constant": {
- "text-color": "#b16286",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "ControlFlow": {
- "text-color": "#fabd2f",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "DataType": {
- "text-color": "#689d6a",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "DecVal": {
- "text-color": "#b16286",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Documentation": {
- "text-color": "#d5c4a1",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Error": {
- "text-color": "#cc241d",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Extension": {
- "text-color": "#fb4934",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Float": {
- "text-color": "#b16286",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Function": {
- "text-color": "#83a598",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Import": {
- "text-color": null,
- "background-color": null,
- "bold": null,
- "italic": true,
- "underline": false
- },
- "Information": {
- "text-color": "#83a598",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Keyword": {
- "text-color": "#fb4934",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Operator": {
- "text-color": "#f38019",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Others": {
- "text-color": "#ebdbb2",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Preprocessor": {
- "text-color": "#7c6f64",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "RegionMarker": {
- "text-color": "#928374",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "SpecialChar": {
- "text-color": "#98971a",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "SpecialString": {
- "text-color": "#98971a",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "String": {
- "text-color": "#98971a",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Variable": {
- "text-color": "#458588",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "VerbatimString": {
- "text-color": "#98971a",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- },
- "Warning": {
- "text-color": "#d79221",
- "background-color": null,
- "bold": true,
- "italic": true,
- "underline": false
- }
- }
-}
D templates/page.html => templates/page.html +0 -75
@@ 1,75 0,0 @@
-<!DOCTYPE html>
-<html$if(lang)$ lang="$lang$"$endif$>
- <head>
- <meta charset="utf-8">
- <link rel="icon" href="/logo.png"/>
- <meta name="generator" content="pandoc">
- $for(author-meta)$
- <meta name="author" content="$author-meta$">
- $endfor$
- $if(date-meta)$
- <meta name="dcterms.date" content="$date-meta$">
- $endif$
- <meta name="robots" content="noml">
- <meta name="gptbot" content="noml">
- <meta name="bingbot" content="noml">
- <meta name="googlebot" content="noml">
- <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>
- <style type="text/css">code{white-space: pre;}</style>
- $if(quotes)$
- <style type="text/css">q { quotes: "“" "”" "‘" "’"; }</style>
- $endif$
- $if(highlighting-css)$
- <style type="text/css">
- $highlighting-css$
- </style>
- $endif$
- $for(css)$
- <link rel="stylesheet" href="$css$">
- $endfor$
- $if(math)$
- $math$
- $endif$
- $for(header-includes)$
- $header-includes$
- $endfor$
- </head>
- <body>
- $for(include-before)$
- $include-before$
- $endfor$
- $if(title)$
- <header>
-
- <a href="..">Up</a>
-
- $if(date)$
- <h3 class="date">$date$</h3>
- $endif$
-
- <h1 class="title">$title$</h1>
-
-
- $for(author)$
- <h2 class="author">$author.name$</h2>
- <p class="affilation"><em>$author.affiliation$</em></p>
- $endfor$
-
- </header>
- $endif$
- $if(toc)$
- <nav id="$idprefix$TOC">
- $toc$
- </nav>
- $endif$
-
- $if(abstract)$
-
- <p class="small"><strong>Abstract: </strong><em>$abstract$</em></p>
-
- $endif$
-
-
- $body$
- </body>
-</html>
D => +0 -2
@@ 1,2 0,0 @@
</channel>
</rss>
D => +0 -6
@@ 1,6 0,0 @@
<rss version="2.0">
<channel>
<title>$title$</title>
<description>$description$</description>
<link>$host$</link>
<generator>pandoc + bash script</generator>
D => +0 -13
@@ 1,13 0,0 @@
<item>
<title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>
<description>
$body$
</description>
<link>
$postlink$
</link>
<guid>
$postlink$
</guid>
<pubDate>$date-meta$</pubDate>
</item>