From 3be5ee1703d8374ed0e22821cf9155dedf3ee6d9 Mon Sep 17 00:00:00 2001 From: Markus Heurung Date: Tue, 5 Mar 2024 17:04:12 +0100 Subject: [PATCH] initial commit --- .gitignore | 5 + 404.html | 25 + Gemfile | 14 + Gemfile.lock | 119 +++++ Rakefile | 52 ++ _config.yml | 51 ++ _data/blogroll.yml | 24 + _layouts/default.html | 188 +++++++ _notes/2024-02-19-rt.md | 7 + _notes/2024-02-20-fj.md | 7 + _notes/2024-02-20-us.md | 8 + _notes/2024-02-23-pd.md | 9 + _notes/2024-02-26-cl.md | 7 + _now/2023-04-15.md | 11 + _now/2024-02-19.md | 11 + _pages/accessibility-statement.md | 33 ++ _pages/banners.md | 32 ++ _pages/blogroll.md | 16 + _pages/colophon.md | 12 + _pages/defaults.md | 7 + _pages/imprint_gdpr.md | 44 ++ _pages/qna.md | 38 ++ _pages/uses.md | 8 + _plugins/rssgenerator.rb | 130 +++++ _posts/2024-02-19-ha.md | 12 + assets/new.scss | 799 ++++++++++++++++++++++++++++++ assets/site.js | 71 +++ assets/syntax.css | 225 +++++++++ assets/valid-rss-rogers.png | Bin 0 -> 3712 bytes index.html | 86 ++++ notes.html | 41 ++ test.html | 1 + webfinger.txt | 28 ++ 33 files changed, 2121 insertions(+) create mode 100644 .gitignore create mode 100644 404.html create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rakefile create mode 100644 _config.yml create mode 100644 _data/blogroll.yml create mode 100644 _layouts/default.html create mode 100644 _notes/2024-02-19-rt.md create mode 100644 _notes/2024-02-20-fj.md create mode 100644 _notes/2024-02-20-us.md create mode 100644 _notes/2024-02-23-pd.md create mode 100644 _notes/2024-02-26-cl.md create mode 100644 _now/2023-04-15.md create mode 100644 _now/2024-02-19.md create mode 100644 _pages/accessibility-statement.md create mode 100644 _pages/banners.md create mode 100644 _pages/blogroll.md create mode 100644 _pages/colophon.md create mode 100644 _pages/defaults.md create mode 100644 _pages/imprint_gdpr.md create mode 100644 _pages/qna.md create mode 100644 _pages/uses.md create mode 100644 _plugins/rssgenerator.rb create mode 100644 _posts/2024-02-19-ha.md create mode 100644 assets/new.scss create mode 100644 assets/site.js create mode 100644 assets/syntax.css create mode 100644 assets/valid-rss-rogers.png create mode 100644 index.html create mode 100644 notes.html create mode 100644 test.html create mode 100644 webfinger.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f40fbd8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor diff --git a/404.html b/404.html new file mode 100644 index 0000000..086a5c9 --- /dev/null +++ b/404.html @@ -0,0 +1,25 @@ +--- +permalink: /404.html +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..a961848 --- /dev/null +++ b/Gemfile @@ -0,0 +1,14 @@ +source "https://rubygems.org" + +gem "jekyll", "~> 4.0" + +gem "rss" + +gem "rake" +group :jekyll_plugins do + gem "jekyll-compose" + gem "jekyll-deploy" + gem "jekyll-feed", "~> 0.17" + gem "jekyll-redirect-from" + gem "jemoji" +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..ded619c --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,119 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (7.1.3) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + base64 (0.2.0) + bigdecimal (3.1.6) + colorator (1.1.0) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + drb (2.2.0) + ruby2_keywords + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + ffi (1.16.3) + forwardable-extended (2.6.0) + gemoji (4.1.0) + google-protobuf (3.25.3-x86_64-linux) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + jekyll (4.3.3) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (>= 0.3.6, < 0.5) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-compose (0.12.0) + jekyll (>= 3.7, < 5.0) + jekyll-deploy (0.0.2) + jekyll-feed (0.17.0) + jekyll (>= 3.7, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-sass-converter (3.0.0) + sass-embedded (~> 1.54) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.13.0) + gemoji (>= 3, < 5) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.4.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + minitest (5.22.2) + mutex_m (0.2.0) + nokogiri (1.16.2-x86_64-linux) + racc (~> 1.4) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (5.0.4) + racc (1.7.3) + rake (13.1.0) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.6) + rouge (4.2.0) + rss (0.3.0) + rexml + ruby2_keywords (0.0.5) + safe_yaml (1.0.5) + sass-embedded (1.69.5) + google-protobuf (~> 3.23) + rake (>= 13.0.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (2.5.0) + webrick (1.8.1) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + jekyll (~> 4.0) + jekyll-compose + jekyll-deploy + jekyll-feed (~> 0.17) + jekyll-redirect-from + jemoji + rake + rss + +BUNDLED WITH + 2.4.22 diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..6fd880e --- /dev/null +++ b/Rakefile @@ -0,0 +1,52 @@ +require "jekyll" +require "time" + +desc "create a new note" +task :note do + slug = "#{Date.today}-#{('a'..'z').to_a.repeated_permutation(1).to_a.sample(2).join}" + + file = File.join( + File.dirname(__FILE__), + "_notes", + slug + ".md" + ) + + frontmatter = <<~EONOTE +--- +layout: default +title: Note +date: "#{DateTime.now.strftime("%Y-%m-%d %H:%M")}" +--- + + EONOTE + File.write(file, frontmatter) + + system("#{ENV['EDITOR']} #file}") +end + +desc "build site" +task :build do + Jekyll::Commands::Build.process({}) +end + +desc "clean site" +task :clean do + Jekyll::Commands::Clean.process({}) +end + +desc "serve local site" +task :serve => [:build] do + Jekyll::Commands::Serve.process({ + incremental: true, + livereload: true, + skip_initial_build: false, + open_url: true, + }) +end + +desc "deploy site" +task :deploy => [:build] do + sh "rsync -az --delete ./_site srv.muhh.lol:/var/www/htdocs/muhh.lol/" +end + +task :default => [:clean, :build, :serve] diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..61dd9e2 --- /dev/null +++ b/_config.yml @@ -0,0 +1,51 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'bundle exec jekyll serve'. If you change this file, please restart the server process. +# +# If you need help with YAML syntax, here are some quick references for you: +# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml +# https://learnxinyminutes.com/docs/yaml/ +# +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. + +title: muhh internet happy place +email: muhh@omg.lol +author: Markus Heurung +mastodon: https://social.lol/@muhh +description: >- + muhh internet happy place. + The personal website of Markus Heurung. +url: https://muhh.lol +baseurl: "" +timezone: Europe/Berlin + +permalink: "/posts/:title/" + +collections: + notes: + output: true + pages: + output: true + +rss_post_limit: 10000 + +plugins: + - jekyll-redirect-from + - jemoji + +exclude: + - Rakefile + - Gemfile + - Gemfile.lock + - .jekyll-cache + - .gitignore diff --git a/_data/blogroll.yml b/_data/blogroll.yml new file mode 100644 index 0000000..3498de5 --- /dev/null +++ b/_data/blogroll.yml @@ -0,0 +1,24 @@ +- title: Marco + url: https://mb.esamecar.net/ + added_at: Tue, 27 Feb 2024 11:24:00 +0100 +- title: Sascha Assbach + url: https://assbach.de/ + added_at: Tue, 20 Feb 2024 09:54:00 +0100 +- title: Greg Morris + url: https://gregmorris.co.uk/ + added_at: Tue, 20 Feb 2024 09:54:00 +0100 +- title: Amit Gawande + url: https://www.amitgawande.com/ + added_at: Mon, 19 Feb 2024 00:00:00 +0100 +- title: Alice Bartlett + url: https://alicebartlett.co.uk/ + added_at: Mon, 19 Feb 2024 00:00:00 +0100 +- title: Benjamin Birkenhake + url: https://anmutunddemut.de/ + added_at: Mon, 19 Feb 2024 00:00:00 +0100 +- title: Jochen Lillich + url: https://geewiz.dev/ + added_at: Mon, 19 Feb 2024 00:00:00 +0100 +- title: Markus Spath + url: https://hackr.de/ + added_at: Mon, 19 Feb 2024 00:00:00 +0100 diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..1e214ef --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,188 @@ + + + + + + + + + + + + + {% if page.collection == "posts" %} + + {% endif %} + {% if page.title %} + {{ page.title }} - {{ site.title }} + + + {% else %} + {{ site.title }} + + + {% endif %} + {% if page.collection == "posts" or page.collection == "notes" or page.collection == "stories" %} + + + {% if page.collection == "posts" %} + + + + {% endif %} + {% if page.image %} + + + {% elsif page.image_text %} + + + {% else %} + + + + {% endif %} + {% else %} + + + + + + {% endif %} + + + +
+
+ {% if page.root != true %} + + {% endif %} + + {% if page.root != true %} + {{ site.title }} + {% endif %} +
+

+ {{ page.title }} +

+ {% if page.root == true %} + + {% endif %} + {% if page.collection == "posts" %}{% endif %} + {% if page.collection == "notes" or page.collection == "stories" %}{% endif %} +
{{ page.header_content }}
+
+
+ {% capture content_and_then_some do %} + {% if page.type == "photos" %} + + + + + + + + + + {% endif %} + {{ content }} + {% endcapture %} + {% if page.collection == "posts" or page.collection == "pages" %} +
+ {{ content_and_then_some }} +
+ {% elsif page.collection == "notes" %} + {{ content_and_then_some }} + {% else %} + {{ content_and_then_some }} + {% endif %} + {% if page.feature == 1 or page.open_heart %} + {% if page.enable_heart %} +
+
+
+
Like this {% if page.collection == "posts" %}post{% elsif page.collection == "notes" %}note{% else %}page{% endif %}? let me know!
+ > + Liked.
(Thanks!)
Sure. +
+
+
+ {% endif %} + {% endif %} +
+ + + {% if page.root %} + + + {% endif %} + {% comment %} + {% if page.feature == 1 or page.open_heart or page.has_open_heart %} + + + {% endif %} + {% if page.type == "photos" %} + + {% endif %} + {% endcomment %} + + diff --git a/_notes/2024-02-19-rt.md b/_notes/2024-02-19-rt.md new file mode 100644 index 0000000..babaf49 --- /dev/null +++ b/_notes/2024-02-19-rt.md @@ -0,0 +1,7 @@ +--- +layout: default +title: Note +date: "2024-02-19 13:49" +--- + +Let's get [this](https://muhh.lol) live and add a first note. diff --git a/_notes/2024-02-20-fj.md b/_notes/2024-02-20-fj.md new file mode 100644 index 0000000..b67b57d --- /dev/null +++ b/_notes/2024-02-20-fj.md @@ -0,0 +1,7 @@ +--- +layout: default +title: Note +date: "2024-02-20 14:48" +--- + +Handing down cameras to get the latest is established, no? I might need to sell some lenses as well. diff --git a/_notes/2024-02-20-us.md b/_notes/2024-02-20-us.md new file mode 100644 index 0000000..c293b3e --- /dev/null +++ b/_notes/2024-02-20-us.md @@ -0,0 +1,8 @@ +--- +layout: default +title: Note +date: "2024-02-20 09:55" +--- + +I like this new home. It's so easy and clear how I can go on with everything. +Plain text is simply the best. diff --git a/_notes/2024-02-23-pd.md b/_notes/2024-02-23-pd.md new file mode 100644 index 0000000..bea2fd7 --- /dev/null +++ b/_notes/2024-02-23-pd.md @@ -0,0 +1,9 @@ +--- +layout: default +title: Note +date: "2024-02-23 16:34" +--- + +I might have pulled out all the old laptops and there are now 3 macbooks laying on the table. +including my beloved 11" macbook air (2011) and a black macbook from 2007. +and the spare parts are cheap! diff --git a/_notes/2024-02-26-cl.md b/_notes/2024-02-26-cl.md new file mode 100644 index 0000000..f8197ff --- /dev/null +++ b/_notes/2024-02-26-cl.md @@ -0,0 +1,7 @@ +--- +layout: default +title: Note +date: "2024-02-26 17:28" +--- + +I may have bought two iPods that are almost old enough to vote now. diff --git a/_now/2023-04-15.md b/_now/2023-04-15.md new file mode 100644 index 0000000..3b47da2 --- /dev/null +++ b/_now/2023-04-15.md @@ -0,0 +1,11 @@ +--- +layout: default +date: 2023-04-15 00:00 +title: My now page +--- + +- On the web I'm in a wibblywobblytimeywimey state. With all these great options provided by omg.lol, micro.blog, social.lol and all the other things I can do on my on server or in the fediverse I feel like it gets cluttered more and more. Add to this that I'm feeling a bit limited by micro.blogs hosting and I'm in the middle of a transition where I even think about retiring my almost 20 year old byzero.de domain. +- At work I'm building tooling to juggle a big migration project. We need to automate the careful replacement of old with new servers. This sometimes looks like I'm building some small size orchestration solution like Kubernetes. But bad. {server} +- At home we are preparing the renovation of the whole ground floor. When we bought the house we only did a few renovations and modifications. Now it's time for remodeling and more. {house-chimney} + +(This is a [now page](https://nownownow.com/about), and if you have your own site, [you should make one](https://nownownow.com/about), too.) diff --git a/_now/2024-02-19.md b/_now/2024-02-19.md new file mode 100644 index 0000000..4d9f465 --- /dev/null +++ b/_now/2024-02-19.md @@ -0,0 +1,11 @@ +--- +layout: default +date: 2024-02-19 00:00 +title: My now page +--- + +- On the web it's all new. Building [muhh.lol](https://muhh.lol) with Jekyll right now. Fun! +- At work I had a long weekend. {server} +- At home we wanted to start so many projects. But in a family with 3 kids there's always something. Viruses, bacteria and fungi mostly. We are restructuring our planning right now. {house-chimney} + +(This is a [now page](https://nownownow.com/about), and if you have your own site, [you should make one](https://nownownow.com/about), too.) diff --git a/_pages/accessibility-statement.md b/_pages/accessibility-statement.md new file mode 100644 index 0000000..bc3a14f --- /dev/null +++ b/_pages/accessibility-statement.md @@ -0,0 +1,33 @@ +--- +layout: default +title: Accessibility Statement for muhh.lol +permalink: /accessibility-statement/ +--- + +This is an accessibility statement from Markus Heurung. + +## Measures to support accessibility + +Markus Heurung takes the following measures to ensure accessibility of muhh.lol: + +- Include accessibility as part of my mission statement. +- Include accessibility throughout my internal policies. +- Provide continual accessibility training for myself. + +## Conformance status + +The Web Content Accessibility Guidelines (WCAG) defines requirements for designers and developers to improve accessibility for people with disabilities. It defines three levels of conformance: Level A, Level AA, and Level AAA. muhh.lol is partially conformant with WCAG 2.1 level AA. Partially conformant means that some parts of the content do not fully conform to the accessibility standard. + +- I am aware that there is one color contrast violation on the front page. +- I constantly experiment things on the site so it might not be fully conformant at all times. + +## Feedback + +I welcome all feedback on the accessibility of muhh.lol. Please let me know if you encounter accessibility barriers on the site. + +To report, [write me an email](mailto:{{ site.email }}) or [message me on Mastodon]({{ site.mastodon }}), and I will try to respond with 2 weeks. + +## Date + +This statement was created on 19 February 2024 using [the W3C Accessibility Statement Generator Tool](https://www.w3.org/WAI/planning/statements/generator/) and copied fro [Mu-An Chiou's accessibility statement](https://muan.co/accessibility-statement). + diff --git a/_pages/banners.md b/_pages/banners.md new file mode 100644 index 0000000..6fb8a9e --- /dev/null +++ b/_pages/banners.md @@ -0,0 +1,32 @@ +--- +layout: default +title: Banners +permalink: banners/ +--- + +## People's banners + +Make one. Tell me. + +## My banners + +{% comment %} +
An animated banner with one short line, one medium line, one long line, a symbol resembling the tilde, each being drawn in order.
An animated banner with one short line, one medium line, one long line, a symbol resembling the tilde, each being drawn in order.
An banner with one short line, one medium line, one long line, and then a symbol resembling the tilde.
+{% endcomment %} + +Not yet. + +
+ +1. Recommended. SVG. This includes dark and light mode and `prefers-reduced-motion`. +2. Plain old GIF. Actually 176×62. Please set the dimensions accordingly. +3. Static PNG. Actually 176×62. Please set the dimensions accordingly. + +I suggest that you hotlink my banner and keep a copy as backup, so that when I update them you get the latest. That is if you trust me enough. + +## References + +- [Wikipedia: Link exchange](https://en.wikipedia.org/wiki/Link_exchange). +- [Remembering Powered By and 88×31](https://tekeye.uk/computer_history/powered-by). +- [The 88x31 GIF Collection](http://cyber.dabamos.de/88x31/). + diff --git a/_pages/blogroll.md b/_pages/blogroll.md new file mode 100644 index 0000000..ac20dc9 --- /dev/null +++ b/_pages/blogroll.md @@ -0,0 +1,16 @@ +--- +layout: default +title: Blogroll +permalink: /blogroll/ +--- + +RSS + +This page is under construction and by far not everything I read and enjoy. + +The order is randomized on build. + +{% assign links = site.data.blogroll | sort: "title" | sample: site.data.blogroll.size %} +{%- for item in links %} +- [{{ item.title }}]({{ item.url }}) +{%- endfor %} diff --git a/_pages/colophon.md b/_pages/colophon.md new file mode 100644 index 0000000..b531ffd --- /dev/null +++ b/_pages/colophon.md @@ -0,0 +1,12 @@ +--- +layout: default +title: Colophon +permalink: /colophon/ +--- + +This website is run by Jekyll and hosted on an OpenBSD server that I built on Hetzner +cloud so I don't have to maintain that thing all the time. It's still a hobby. + +The site is heavily based on [muan's website](https://muan.co), she built a great one. I plan to adapt it more and more to my wants and needs. + +There will be more details soon. diff --git a/_pages/defaults.md b/_pages/defaults.md new file mode 100644 index 0000000..ab57572 --- /dev/null +++ b/_pages/defaults.md @@ -0,0 +1,7 @@ +--- +layout: default +title: Defaults +permalink: /defaults/ +--- + + diff --git a/_pages/imprint_gdpr.md b/_pages/imprint_gdpr.md new file mode 100644 index 0000000..316a3d7 --- /dev/null +++ b/_pages/imprint_gdpr.md @@ -0,0 +1,44 @@ +--- +layout: default +title: Impressum / Datenschutzerklärung +permalink: /imprint_gdpr/ +--- + +This is for all my websites, domains including subdomains and other things: + +- byzero.de +- muhh.lol +- hammelblog.de +- heurung.net +- markusheurung.de + +## Impressum + +Markus Heurung + +Persönliche Textsammlung. Impressumfrei nach § 55 RStV. + +## Contact + +Email: {{ site.email }} + +## Datenschutzerklärung (DSGVO) + +Auf dieser Webseite werden keine personenbezogenen Daten erhoben, gespeichert oder verarbeitet. Es werden keine Cookies verwendet. + +## Data Protection Policy (GDPR) + +This website does not collect, store or process Personally Identifiable Information (PII). This website does not require the use of cookies. + +## Verweis auf Dritte + +Die Websites byzero.de und hammelblog.de wird auf micro.blog ([Datenschutzerklärung](https://help.micro.blog/t/privacy-policy/114)) gehostet und schließen Daten von dort ein. +Die Website omg.muhh.lol, bin.muhh.lol, status.muhh.lol und markusheurung.de werden alle bei omg.lol ([Datenschutzerklärung](https://home.omg.lol/info/legal#privacy-policy)) gehostet. +Die Website muhh.lol wird von mir selbst auf einem gemietetem Server betrieben. Ich halte nur einfache Logfiles ohne PII vor. + +## Third Party Inclusion + +The websites byzero.de and hammelblog.de are hosted on micro.blog ([privacy policy](https://help.micro.blog/t/privacy-policy/114)) and include data from there. +The websites omg.muhh.lol, bin.muhh.lol, status.muhh.lol and markusheurung.de are all hosted at omg.lol ([privacy policy](https://home.omg.lol/info/legal#privacy-policy)). +The website muhh.lol is hosted by myself on a rented server. I only keep simple log files without PII. + diff --git a/_pages/qna.md b/_pages/qna.md new file mode 100644 index 0000000..a0fbe3c --- /dev/null +++ b/_pages/qna.md @@ -0,0 +1,38 @@ +--- +layout: default +title: Questions & answers +permalink: /qna/ +--- + +## How do you preferred to be called? + +Markus, or muhh (only as a username, _never_ capitalized). + +## Why muhh? + +My first username was "heure" or "l'Heure", which was an old nickname based on my +surname. But that didn't stick and I used the uncreative thing and used my initials. +Yes, I have three first names. It's a traditional thing where kids get piled on +names of their godparents. I like it. + +## How is your name pronounced? + +Phonetic spelling: ˈmaʁkʊs + + + +The muhh sounds like a cows moooo. Go figure. + +## What are your pronouns? + +He/him. + +## Where are you from? + +I am from [Hammelburg, Germany](https://www.openstreetmap.org/#map=15/50.1195/9.8850). + +{% comment %} +## Are you OK? + +[I am tired of my own thoughts.](https://muan.co/notes/2023-09-06-uu) +{% endcomment %} diff --git a/_pages/uses.md b/_pages/uses.md new file mode 100644 index 0000000..54c6a46 --- /dev/null +++ b/_pages/uses.md @@ -0,0 +1,8 @@ +--- +layout: default +title: Uses +permalink: /uses/ +--- + +Jekyll +kitty diff --git a/_plugins/rssgenerator.rb b/_plugins/rssgenerator.rb new file mode 100644 index 0000000..4e76acf --- /dev/null +++ b/_plugins/rssgenerator.rb @@ -0,0 +1,130 @@ +# Jekyll plugin for generating an rss 2.0 feed for posts +# +# Based on https://github.com/kikoval/jekyll-rss/ but heavily modified +# +# Usage: place this file in the _plugins directory and set the required configuration +# attributes in the _config.yml file +# +# Uses the following attributes in _config.yml: +# title - the title of the site +# url - the url of the site +# description - (optional) a description for the feed (if not specified will be generated from title) +# author - (optional) the author of the site (if not specified will be left blank) +# copyright - (optional) the copyright of the feed (if not specified will be left blank) +# rss_path - (optional) the path to the feed (if not specified "/" will be used) +# rss_name - (optional) the name of the rss file (if not specified "rss.xml" will be used) +# rss_post_limit - (optional) the number of posts in the feed +# +# Author: Assaf Gelber +# Site: http://agelber.com +# Source: http://github.com/agelber/jekyll-rss +# +# Distributed under the MIT license +# Copyright Assaf Gelber 2013 + +require "jekyll" +require "rss" + +module RssFeed + class Page < Jekyll::Page; end + + class Generator < Jekyll::Generator + priority :low + safe true + + attr_reader :site, :rss_content + # Generates an rss 2.0 feed + # + # site - the site + # + # Returns nothing + def generate(site) + + @site = site + feed_items = [] + # collect Data + @rss_content = RSS::Maker.make('2.0') do |maker| + maker.channel.title = @site.config['title'] + maker.channel.link = @site.config['url'] + maker.channel.description = @site.config['description'] || "RSS feed for #{site.config['title']}" + maker.channel.author = @site.config['author'] + maker.channel.updated = @site.posts.docs.map { |p| p.date }.max + maker.channel.copyright = @site.config['copyright'] + + @site.collections.each do |name, meta| + Jekyll.logger.info "muhh Feed:", "Adding #{name} to global feed" + feed_items + + site.posts.docs.reverse[0..post_limit].each do |post| + maker.items.new_item do |item| + item.title = post.data["title"] + item.link = "#{@site.config['url']}#{post.url}" + item.description = post.data["excerpt"] + item.updated = post.date + end + end + end + end + + create_file + + # Add the feed page to the site pages + site.pages << RssFeed::Page.new(site, site.dest, rss_path, rss_name) + end + + private + + def rss_path + ensure_slashes(@site.config['rss_path'] || "/") + end + + def rss_name + @site.config['rss_name'] || "rss.xml" + end + + def create_file + full_path = File.join(@site.dest, rss_path) + ensure_dir(full_path) + File.open("#{full_path}#{rss_name}", "w") { |f| f.write(@rss_content) } + end + # Ensures the given path has leading and trailing slashes + # + # path - the string path + # + # Return the path with leading and trailing slashes + def ensure_slashes(path) + ensure_leading_slash(ensure_trailing_slash(path)) + end + + # Ensures the given path has a leading slash + # + # path - the string path + # + # Returns the path with a leading slash + def ensure_leading_slash(path) + path[0] == "/" ? path : "/#{path}" + end + + # Ensures the given path has a trailing slash + # + # path - the string path + # + # Returns the path with a trailing slash + def ensure_trailing_slash(path) + path[-1] == "/" ? path : "#{path}/" + end + + # Ensures the given directory exists + # + # path - the string path of the directory + # + # Returns nothing + def ensure_dir(path) + FileUtils.mkdir_p(path) + end + + def post_limit + @site.config['rss_post_limit'] - 1 rescue @site.posts.count + end + end +end diff --git a/_posts/2024-02-19-ha.md b/_posts/2024-02-19-ha.md new file mode 100644 index 0000000..0b09256 --- /dev/null +++ b/_posts/2024-02-19-ha.md @@ -0,0 +1,12 @@ +--- +layout: default +title: Ha! +date: 2024-02-19 01:14 +0100 +feature: 1 +--- + +This is it, this is the new site. Still heavily under construction, but it's here. + +And it's mine. My precious. + +Danke, [Mu-An](https://muan.co)! So much of this site is based on hers. diff --git a/assets/new.scss b/assets/new.scss new file mode 100644 index 0000000..ca8601b --- /dev/null +++ b/assets/new.scss @@ -0,0 +1,799 @@ +--- +--- + +:root { + --backgroundColor: #fdfdfd; + --textColor: #303030; + --secondaryTextColor: #404040; + --mutedTextColor: #707070; + --subtleBackgroundColor: #f5f5f5; + --heartedBackgroundColor: #ffe2e2; + --selectionBackgroundColor: #ffc; + --linkColor: #2357cd; + --borderColor: #ccc; + --hrColor: #888; + --activeColor: #74d274; + --langBackgroundColor: #eeeeee; + --langShadowColor: transparent; + --logoColor: #cccccc; + --photoBackground: #f4f4f4; +} + +@media (prefers-color-scheme: dark) { + :root { + --backgroundColor: #151615; + --textColor: #dbdfdf; + --secondaryTextColor: #cfd5d5; + --mutedTextColor: #b4b6b8; + --subtleBackgroundColor: #3a3b3b; + --heartedBackgroundColor: #652222; + --selectionBackgroundColor: #19446b; + --linkColor: #6eb8ff; + --borderColor: #414141; + --hrColor: #888; + --activeColor: #74d274; + --langBackgroundColor: #2c2c2c; + --langShadowColor: #0b0c0b33; + --logoColor: #555555; + --photoBackground: #1a1a1a; + } +} + +body { + background: var(--backgroundColor); + color: var(--textColor); + line-height: 1.7em; + padding: 0 2.5em; + margin: 0; + font-size: 18px; + word-wrap: break-word; +} + +body, kbd { + font-family: system-ui, sans-serif; +} + +a { + color: var(--linkColor); + text-underline-position: under; +} + +::selection { + background: var(--selectionBackgroundColor); +} + +header { + padding-top: 2.5em; +} + +footer { + padding-bottom: 2.5em; +} + +header, +main, +footer { + max-width: 36em; + margin: auto; +} + +h1, h2, h3, h4, h5, h6, .font { + font-family: 'Readex Pro', sans-serif; +} + +.plain { + font-family: system-ui, sans-serif +} + +h1, h2, h3, h4, h5, h6 { + margin: 1.4em 0 1em 0; + font-weight: normal; +} + +.logo { + width: 2em; + + path { + stroke: var(--logoColor); + } +} + +.logo-container { + display: flex; + align-items: center; +} + +.post-body { + .logo-container { + line-height: 1em; + color: var(--mutedTextColor); + } + + .logo { + width: 1em; + margin-left: .8em; + margin-right: .4em; + + path { + stroke: var(--mutedTextColor); + stroke-width: 22; + } + } + + .h1 { + font-size: 1.5rem; + } +} + +.h1 { + font-size: 1.2rem; + font-weight: normal; + margin-bottom: 0; +} + +.text { + margin-right: .4rem; + font-size: inherit; + font-weight: normal; + display: inline-block; + margin-top: 0; +} + +.terminal .line { + padding: 0; + margin-bottom: 1em; + line-height: 1.6em; +} + +.terminal { + list-style: none; + padding-left: 0; + + li { + padding: .1rem 0; + } + + ul { + margin-top: 0.5rem; + } +} + +.hr { + border: 0; + border-left: .7rem solid var(--textColor); + height: .7rem; + margin: 3rem 0; +} + +.inline-hr { + border: 0; + border-left: .3rem solid var(--borderColor); + height: .3rem; + display: inline-block; + vertical-align: middle; + align-self: center; + margin: 0; +} + +.notes { + list-style: none; + margin: 0; + padding: 0; + + .note { + border-bottom: 1px solid var(--borderColor); + padding-bottom: 3em; + margin-top: 3em; + } +} + +.note { + scroll-margin: 2em; + + main > & { + margin-top: -.6em; + } + + & > ul { + margin-top: 1.5em; + list-style: disc; + } + + &:last-of-type { + border-bottom: 0; + } + + p:first-child, blockquote:first-child { margin-top: 0; } + p:last-child, blockquote:last-child, img:last-child { margin-bottom: 0; } +} + +.note-heading { + font-size: .8em; + line-height: 1; + font-weight: normal; + margin: 0; + color: var(--mutedTextColor); + + a { + color: inherit; + text-decoration: none; + } +} + +blockquote { + color: var(--secondaryTextColor); + margin: 2em 0 2em 1.5em; + + &::before { + content: '“'; + font-size: 2rem; + position: absolute; + margin-left: -.5em; + font-family: sans-serif; + } +} + +img { + max-width: 100%; + margin: 1em 0; + + &[width] { + margin: 0; + vertical-align: middle; + } +} + +hr { + margin: 2em 0; + border: 0; + border-bottom: 1px solid var(--hrColor); +} + +.pagination { + margin-top: 4em; +} + +article { + font-family: system-ui, sans-serif; + font-size: 16px; +} + +.smol { + font-size: .8em; + font-weight: normal; +} + +.task-list-item-checkbox { + margin-right: .5em; + vertical-align: middle; +} + +.entry-title { + margin: 0; +} + +.entry { + margin-bottom: 3em; +} + +.lang { + font-size: .8rem; + display: inline-flex; + margin-top: 2em; + white-space: nowrap; + box-shadow: 0 5px 15px var(--langShadowColor); + + a[aria-current] { + color: var(--textColor); + + &:before { + content: "●"; + color: var(--activeColor); + } + } + + a { + background-color: var(--langBackgroundColor); + border-color: var(--borderColor); + color: var(--mutedTextColor); + padding: 4px 16px; + margin-right: 1px; + text-decoration: none; + + &:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; + } + + &:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + } + + &:hover { + background: var(--langBackgroundColor); + } + + &:focus { + z-index: 1; + } + + &:before { + content: "○"; + color: var(--borderColor); + padding-right: 10px; + } + } +} + +.styled-link { + margin-left: .4rem; + font-size: .7em; +} + +time { + font-size: .8em; + color: var(--mutedTextColor); +} + +.desc { + color: var(--mutedTextColor); + font-size: 0.8em; + line-height: 1.5; +} + +@keyframes flash { + 0% { + opacity: 0; + } + + 50% { + opacity: 1; + } + + 100% { + opacity: 1; + } +} + +.timestamp-colon { + animation-name: flash; + animation-duration: 2s; + animation-timing-function: step-end; + animation-iteration-count: infinite; +} + +@media (prefers-reduced-motion: reduce) { + .timestamp-colon { + animation-name: none; + } +} + +.offsetthis { + vertical-align: super; + font-size: .6em; +} + +.photos { + display: flex; + gap: 1em; + flex-wrap: nowrap; + overflow: auto; + align-items: center; + + .image-link { + flex-shrink: 0; + } + + img { + background-color: var(--photoBackground); + } +} + +figure { + margin: 1em 0 3em; + + img { + margin: 0 auto; + max-height: calc(100vh - 6em); + background-color: var(--photoBackground); + display: block; + } + + .image-link { + display: block; + width: fit-content; + margin: 0 auto 0.5em; + } + + p { + margin-bottom: 0; + } +} + +[data-page-type="photos"] { + header, main, footer { + max-width: 100%; + } + + input { + position: absolute; + left: -100px; + + &:checked + label path { + fill: var(--activeColor); + } + + &:focus + label { + outline: auto; + outline-color: var(--activeColor); + } + } + + label { + top: -30px; + left: 100px; + padding: .5em; + cursor: pointer; + position: relative; + display: inline-flex; + } + + label path { + fill: var(--logoColor); + } +} + +.photos-wrapper { + &:focus { outline: none; } + scroll-behavior: smooth; + clear: both; + text-align: center; +} + +.back-link { + text-decoration: none; + color: var(--textColor); + background-color: var(--langBackgroundColor); + width: 1.6em; + text-align: center; + line-height: 1.6em; + aspect-ratio: 1/1; + display: inline-block; + border-radius: 4em; +} + +[value*="grid"]:checked ~ .photos-wrapper { + display: grid; + column-gap: 2.5em; + grid-template-columns: repeat(2, 1fr); + grid-auto-flow: dense; + + .figure-landscape { + grid-column: span 2; + } + + figure { + margin-bottom: 0; + align-self: start; + } + + img { + max-height: none; + height: auto; + } +} + +[value="grid3fr"]:checked ~ .photos-wrapper { + grid-template-columns: repeat(3, 1fr); + + .figure-landscape { + grid-column: span 3; + } +} + +[value="x-scroll"]:checked ~ .photos-wrapper { + display: flex; + overflow: auto; + gap: 1.5em; + scroll-snap-type: x mandatory; + scroll-snap-align: center; + + figure { + scroll-snap-align: center; + margin-bottom: 0; + flex-shrink: 0; + width: min-content; + + &:has(.portrait) figcaption { + max-width: calc(100vh * 0.667 - 6em); + margin: auto; + } + + &:has(.landscape) figcaption { + max-width: calc(100vw * 0.667 - 2em); + margin: auto; + } + } + + + img { + max-height: calc(100vh - 6em); + max-width: calc(100vw - 5em); + flex-shrink: 0; + } +} + +.photo-metadata { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + margin: auto; + gap: 0.5em; + + open-heart { + margin-left: 0; + } +} + +figcaption { + padding: .5em 1em; + + p { + margin: 0; + } +} + +[data-status-loading] { + margin: .17em 0 0; + display: block; + opacity: .3; + animation: loading .5s infinite alternate; + + [data-status-text]:empty { + display: inline-block; + width: 100px; + height: 1em; + border-radius: .3em; + background: var(--subtleBackgroundColor); + } +} + +// This ensures that +// 1. screens that are too short +// 2. screens that are not tall enough to display the full width of a 3:2 image +// at height: (100v - 6em) height +// don't get the option to use horizontal scroll. + +// https://github.com/web-platform-tests/wpt/pull/34865 +// @media (max-height: 540px), (max-width: calc((100vh - 6em) * 1.5)) { +@media (max-height: 540px), (max-width: calc(100vh * 1.4)) { + body { + padding: 0 2em; + } + + .photos-wrapper { + margin-left: -2em; + margin-right: -2em; + + img { + max-height: none; + + &.landscape { + height: calc(100vw / 1.5); + } + &.portrait { + height: calc(100vw / 0.667); + } + &.square { + height: 100vw; + } + } + } + + [name="layout"] { + &, + label { visibility: hidden; } + } +} + +.stories { + display: flex; + gap: 1em; + align-items: center; + overflow: auto; + padding: 10px; + margin: -10px; +} + +open-stories { + .count { + font-size: 0.8em; + } + &::part(dialog):focus { + outline: none; + } + + &:not(:defined), + &::part(button) { + font-family: system-ui, sans-serif; + border: 1px solid var(--borderColor); + box-shadow: inset 0 0 0 2px var(--backgroundColor); + color: var(--textColor); + background: var(--subtleBackgroundColor); + padding: 1em 0; + text-align: center; + height: 76px; + width: 76px; + border-radius: 50%; + font-size: 0.65em; + box-sizing: border-box; + align-items: center; + display: flex; + flex-direction: column; + flex-shrink: 0; + transition: all .3s; + text-transform: lowercase; + line-height: normal; + justify-content: center; + cursor: pointer; + + &:hover { + background: var(--linkColor); + color: var(--backgroundColor); + transform: scale(1.05); + } + } + + + &:not([is-highlight])::part(button) { + border-color: var(--secondaryTextColor); + } + + &:not(.is-read):not(.is-empty):not([is-highlight]):not(.is-loading)::part(button) { + border-color: var(--linkColor); + } + + + &.is-loading { + opacity: .3; + animation: loading 1s infinite alternate; + + &::part(button) { + pointer-events: none; + border: 0; + } + } + + &.is-empty::part(button) { + pointer-events: none; + opacity: 0.5; + overflow: hidden; + position: relative; + + &:before { + display: block; + content: ''; + border-left: 1px solid var(--mutedTextColor); + position: absolute; + transform: rotate(-45deg); + top: 0; + left: 0; + width: 150%; + height: 150%; + transform-origin: top left; + } + } +} + +@keyframes loading { + 0% { opacity: .3 } + 100% { opacity: .5 } +} + +.monospace { + font-family: ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; + font-size: 0.9em; +} + +open-heart.text-open-heart { + display: inline; + margin-left: 1em; + transition: color .4s, border-color .4s; + + &:not([disabled]):hover { + cursor: pointer; + color: var(--activeColor); + } + + .on { display: none; } + + &[aria-pressed="true"] { + border-color: var(--heartedBackgroundColor); + .on { display: initial; } + .off { display: none; } + } + + &[count]:not([count="0"])::after { + content: "(" attr(count) ")"; + } +} + +kbd { + border: 1px solid var(--borderColor); + padding: 1px 4px; + border-radius: 3px; + box-shadow: 0 1px; + font-size: 0.9em; +} + +nav { + display: flex; + flex-wrap: wrap; + column-gap: .8em; + margin: .6em 0; +} + +.col-stories { + padding: 0; + margin: 0; + overflow: hidden; + background: black; + font-size: 2.2vh; + + header, main, footer { + box-sizing: border-box; + width: 100%; + max-width: 100%; + padding: 0; + margin: 0; + } + + .story-header { + padding: 1vh 2vh; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + column-gap: .5vh; + row-gap: 0.2vh; + align-items: center; + position: absolute; + z-index: 1; + bottom: 0; + background-color: rgba(0, 0, 0, .7); + color: #fff; + } + + .story-meta { + display: flex; + justify-content: space-between; + gap: 1em; + } + + main { + display: flex; + height: 100vh; + align-items: center; + text-align: center; + justify-content: space-around; + } + + main img { + max-height: 96vh; + max-width: 98vw; + border-radius: .5vh; + } +} + +open-stories:not(:defined), +open-heart:not(:defined) { + display: none !important; +} + +[hidden] { + display: none !important; +} + +.time { + font-variant-numeric: tabular-nums; +} diff --git a/assets/site.js b/assets/site.js new file mode 100644 index 0000000..4566096 --- /dev/null +++ b/assets/site.js @@ -0,0 +1,71 @@ +function settime() { + const timestamp = document.querySelector('[data-timestamp-text]') + if (!timestamp || !('Intl' in window)) return + + const options = { + timeZone: "Europe/Berlin", + timeStyle: "short", + hour12: false + } + + // https://gist.github.com/muan/e7414b6241f088090acd916ed965540e + let time = new Intl.DateTimeFormat(navigator.language || "de", options).format(new Date()) + + // https://bugs.chromium.org/p/chromium/issues/detail?id=1262801 + if (time.match(/^24:/)) time = time.replace('24:', '00:') + + // Setting interpolated string instead of just the time because + // if there's no JS there should be no mentions of current time + const text = timestamp.getAttribute('data-timestamp-text').replace('{time}', time) + timestamp.innerHTML = text.replace(':', ':') + + const now = new Date() + const sec = now.getSeconds() + const secondIsEven = sec % 2 === 0 + const colon = document.querySelector('[data-colon]') + if (colon) colon.style.animationDelay = `${(secondIsEven ? 0 : 1000) - now.getMilliseconds()}ms` + + const delay = 60000 - ((sec * 1000) + now.getMilliseconds()) + setTimeout(settime, delay) +} + +settime() + +const statusEl = document.querySelector('[data-status-loading]') + +try { + statusEl.hidden = false + const s = await (await fetch('https://status.lol/muhh.js')).text() + if (s.trim() !== '') { + const [datetime, text] = s.split('\n') + const date = relativeDate(new Date(datetime)) + if (date) { + document.querySelector('[data-status-text]').textContent = text + document.querySelector('[data-status-datetime]').textContent = `(${date})` + } + } + statusEl.removeAttribute('data-status-loading') +} catch (e) { + statusEl.remove() + console.warn(e) +} + +function relativeDate(date) { + const now = new Date() + const diff = now - date + const hour = 1000 * 60 * 60 + const day = hour * 24 + const week = day * 7 + const rtf = new Intl.RelativeTimeFormat('en', { style: 'narrow' }) + + if (diff < hour) { + return rtf.format(-Math.floor(diff / 60000), 'minute') + } else if (diff < day) { + return rtf.format(-Math.floor(diff / hour), 'hour') + } else if (diff < week) { + return rtf.format(-Math.floor(diff / day), 'day') + } else { + return + } +} + diff --git a/assets/syntax.css b/assets/syntax.css new file mode 100644 index 0000000..de3ac90 --- /dev/null +++ b/assets/syntax.css @@ -0,0 +1,225 @@ + +pre, code { + font-family: 'Menlo', monospace; +} + +code { + font-size: 0.85em; +} + +pre code { + font-size: 0.9em; +} + +:root { + --syntaxBackground: #ffffff; + --hll: #ffffcc; + --c: #999988; + --err: #a61717; + --errBackground: #e3d2d2; + --k: #000000; + --o: #000000; + --cm: #999988; + --cp: #999999; + --c1: #999988; + --cs: #999999; + --gd: #000000; + --ge: #000000; + --gr: #aa0000; + --gh: #999999; + --gi: #000000; + --go: #888888; + --gp: #555555; + --gu: #aaaaaa; + --gt: #aa0000; + --kc: #000000; + --kd: #000000; + --kn: #000000; + --kp: #000000; + --kr: #000000; + --kt: #445588; + --m: #009999; + --s: #d01040; + --na: #008080; + --nb: #0086B3; + --nc: #445588; + --no: #008080; + --nd: #3c5d5d; + --ni: #800080; + --ne: #990000; + --nf: #990000; + --nl: #990000; + --nn: #555555; + --nt: #000080; + --nv: #008080; + --ow: #000000; + --w: #bbbbbb; + --mf: #009999; + --mh: #009999; + --mi: #009999; + --mo: #009999; + --sb: #d01040; + --sc: #d01040; + --sd: #d01040; + --s2: #d01040; + --se: #d01040; + --sh: #d01040; + --si: #d01040; + --sx: #d01040; + --sr: #009926; + --s1: #d01040; + --ss: #990073; + --bp: #999999; + --vc: #008080; + --vg: #008080; + --vi: #008080; + --il: #009999; +} + +@media (prefers-color-scheme: dark) { + :root { + --syntaxBackground: #121615; + --hll: #002b36; + --c: #586e75; + --err: #e3d2d2; + --errBackground: #a61717; + --k: #859900; + --o: #859900; + --cm: #586e75; + --c1: #586e75; + --gd: #ffdddd; + --ge: #2aa198; + --gh: #cb4b16; + --gi: #ddffdd; + --gu: #cb4b16; + --m: #74b9b9; + --s: #9faf74; + --kc: #cb4b16; + --kd: #2aa198; + --kn: #2aa198; + --kp: #2aa198; + --kr: #2aa198; + --nb: #b58900; + --no: #cb4b16; + --ni: #cb4b16; + --ne: #cb4b16; + --nf: #cb4b16; + --nl: #cb4b16; + --nt: #7aa1ad; + --ow: #2aa198; + --sb: #586e75; + --sc: #586e75; + --sd: #586e75; + --s2: #586e75; + --se: #586e75; + --sh: #586e75; + --si: #586e75; + --sx: #586e75; + } +} + +div.highlight { + overflow: hidden; + position: relative; + margin: 0; + background-color: var(--syntaxBackground); + padding: .6em 1em; + border-radius: 6px; + tab-size: 2; +} + +.highlight .gutter { + padding-right: 1em; + color: #aaa; + border-right: 3px solid var(--syntaxBackground); +} + +.highlight .code { + padding-left: 1em; +} + +.highlight pre { + overflow: auto; + margin-top: 0; + margin-bottom: 0; +} + +code { + background: var(--syntaxBackground); + padding: .2em .6em; + border-radius: 4px; + vertical-align: middle; +} + +p code { + vertical-align: inherit; +} + +pre code { + padding: 0; + word-wrap: initial; + background: transparent; +} + +.hll { background-color: var(--hll) } +.c { color: var(--c); font-style: italic } /* Comment */ +.err { color: var(--err); background-color: var(--errBackground) } /* Error */ +.k { color: var(--k); font-weight: bold } /* Keyword */ +.o { color: var(--o); font-weight: bold } /* Operator */ +.cm { color: var(--cm); font-style: italic } /* Comment.Multiline */ +.cp { color: var(--cp); font-weight: bold; font-style: italic } /* Comment.Preproc */ +.c1 { color: var(--c1); font-style: italic } /* Comment.Single */ +.cs { color: var(--cs); font-weight: bold; font-style: italic } /* Comment.Special */ +.gd { color: var(--k); background-color: var(--gd) } /* Generic.Deleted */ +.ge { color: var(--ge); font-style: italic } /* Generic.Emph */ +.gr { color: var(--gr) } /* Generic.Error */ +.gh { color: var(--gh) } /* Generic.Heading */ +.gi { color: var(--k); background-color: var(--gi) } /* Generic.Inserted */ +.go { color: var(--go) } /* Generic.Output */ +.gp { color: var(--gp) } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: var(--gu) } /* Generic.Subheading */ +.gt { color: var(--gt) } /* Generic.Traceback */ +.kc { color: var(--kc); font-weight: bold } /* Keyword.Constant */ +.kd { color: var(--kd); font-weight: bold } /* Keyword.Declaration */ +.kn { color: var(--kn); font-weight: bold } /* Keyword.Namespace */ +.kp { color: var(--kp); font-weight: bold } /* Keyword.Pseudo */ +.kr { color: var(--kr); font-weight: bold } /* Keyword.Reserved */ +.kt { color: var(--kt); font-weight: bold } /* Keyword.Type */ +.m { color: var(--m) } /* Literal.Number */ +.s { color: var(--s) } /* Literal.String */ +.na { color: var(--na) } /* Name.Attribute */ +.nb { color: var(--nb) } /* Name.Builtin */ +.nc { color: var(--nc); font-weight: bold } /* Name.Class */ +.no { color: var(--no) } /* Name.Constant */ +.nd { color: var(--nd); font-weight: bold } /* Name.Decorator */ +.ni { color: var(--ni) } /* Name.Entity */ +.ne { color: var(--ne); font-weight: bold } /* Name.Exception */ +.nf { color: var(--nf); font-weight: bold } /* Name.Function */ +.nl { color: var(--nl); font-weight: bold } /* Name.Label */ +.nn { color: var(--nn) } /* Name.Namespace */ +.nt { color: var(--nt) } /* Name.Tag */ +.nv { color: var(--nv) } /* Name.Variable */ +.ow { color: var(--ow); font-weight: bold } /* Operator.Word */ +.w { color: var(--w) } /* Text.Whitespace */ +.mf { color: var(--mf) } /* Literal.Number.Float */ +.mh { color: var(--mh) } /* Literal.Number.Hex */ +.mi { color: var(--mi) } /* Literal.Number.Integer */ +.mo { color: var(--mo) } /* Literal.Number.Oct */ +.sb { color: var(--sb) } /* Literal.String.Backtick */ +.sc { color: var(--sc) } /* Literal.String.Char */ +.sd { color: var(--sd) } /* Literal.String.Doc */ +.s2 { color: var(--s2) } /* Literal.String.Double */ +.se { color: var(--se) } /* Literal.String.Escape */ +.sh { color: var(--sh) } /* Literal.String.Heredoc */ +.si { color: var(--si) } /* Literal.String.Interpol */ +.sx { color: var(--sx) } /* Literal.String.Other */ +.sr { color: var(--sr) } /* Literal.String.Regex */ +.s1 { color: var(--s1) } /* Literal.String.Single */ +.ss { color: var(--ss) } /* Literal.String.Symbol */ +.bp { color: var(--bp) } /* Name.Builtin.Pseudo */ +.vc { color: var(--vc) } /* Name.Variable.Class */ +.vg { color: var(--vg) } /* Name.Variable.Global */ +.vi { color: var(--vi) } /* Name.Variable.Instance */ +.il { color: var(--il) } /* Literal.Number.Integer.Long */ + diff --git a/assets/valid-rss-rogers.png b/assets/valid-rss-rogers.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce6d122ee5410b5a8b94f6f3328e7cffbef4daf GIT binary patch literal 3712 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 eZeLdq`u_mwbPF{$%i)v&0000 + I'm a family guy with a loving partner, three great kids and a cuddly and very patient labradoodle. +

+

+ Based in Hammelburg, Germany. Born at 331ppm. +

+ +

+ This is my happy place on the internet. +

+ + + + +
+{% comment %} +

Stories

RSS What are these? + +{% include stories.html lang="en" %} + +
+ +

Photos

All photos RSS +
+{% assign photos = site.data.photos | slice: 0, 5 %} +{% for photo in photos %} + + {{ photo.alt }} + +{% endfor %} +
+ +

Film photos

All film photos RSS +
+{% assign photos = site.data.film | reverse | slice: 0, 5 %} +{% for photo in photos %} + {% capture image_url %}{% for url in photo.variants %}{% if url contains "/thumbnail" %}{{ url }}{% endif %}{% endfor %}{% endcapture %} + + {{ photo.meta.alt }} + +{% endfor %} +
+ +
+ +{% endcomment %} + +{% assign note = site.notes | last %} +

Notes

Recent notes RSS +
+
+ Latest: {{ note.date | date: "%B %e, %Y" }} +
+ {{ note.content | markdownify }} +
+ +
+ +

Posts

RSS +
    +{% assign pages = site.pages | where: "feature", 1 %} +{% for post in pages %} +
  • {{ post.title }}
  • +{% endfor %} + +{% assign posts = site.posts | where: "feature", 1 %} +{% for post in posts %} +
  • {{ post.title }}
    +
  • +{% endfor %} +
diff --git a/notes.html b/notes.html new file mode 100644 index 0000000..46a7066 --- /dev/null +++ b/notes.html @@ -0,0 +1,41 @@ +--- +layout: default +title: Recent notes +has_open_heart: false +--- + +
    +{% assign notes = site.notes | sort: "date" | reverse %} +{% for note in notes limit: 100 %} +
  • +
    +
    + +

    {{ note.date | date: "%B %e, %Y" }}

    +
    + {% comment %} + + Liked ♥︎.Like? + + {% endcomment %} +
    + +
    + {{ note.content | markdownify }} +
  • +{% endfor %} +
+ +{% if notes.size > 100 %} +
+

Only the most recent 100 notes are shown.

+ {% for note in notes %} + {% assign id = note.date | date: "%Y%m%d%I%M" %} + + {% endfor %} + +{% endif %} diff --git a/test.html b/test.html new file mode 100644 index 0000000..a7f8d9e --- /dev/null +++ b/test.html @@ -0,0 +1 @@ +bla diff --git a/webfinger.txt b/webfinger.txt new file mode 100644 index 0000000..9fa7394 --- /dev/null +++ b/webfinger.txt @@ -0,0 +1,28 @@ +--- +permalink: ".well-known/webfinger" +layout: null +sitemap: false +--- +{ + "aliases" : [ + "https://social.lol/@muhh", + "https://social.lol/users/muhh" + ], + "links" : [ + { + "href" : "https://social.lol/@muhh", + "rel" : "http://webfinger.net/rel/profile-page", + "type" : "text/html" + }, + { + "href" : "https://social.lol/users/muhh", + "rel" : "self", + "type" : "application/activity+json" + }, + { + "href" : "https://social.lol/authorize_interaction?uri={uri}", + "rel" : "http://ostatus.org/schema/1.0/subscribe" + } + ], + "subject" : "acct:muhh@social.lol" +}