From 1e3657f7887cc6399aeb3a3b4193dfee52adfa0b Mon Sep 17 00:00:00 2001 From: JustinVollmer Date: Thu, 27 Feb 2025 22:54:37 +0100 Subject: [PATCH] init --- .editorconfig | 19 + .gitattributes | 16 + .gitea/workflows/pages-deploy.yaml | 79 + .gitignore | 27 + .gitmodules | 3 + .husky/.gitkeep | 0 .markdownlint.json | 8 + .nojekyll | 0 .prettierignore | 2 + .vscode/extensions.json | 3 + .vscode/settings.json | 30 + .vscode/tasks.json | 64 + Gemfile | 14 + LICENSE | 21 + README.md | 85 +- _config.yml | 221 +++ _data/authors.yml | 11 + _data/contact.yml | 41 + _data/locales/ar.yml | 91 + _data/locales/bg-BG.yml | 81 + _data/locales/cs-CZ.yml | 89 + _data/locales/de-DE.yml | 87 + _data/locales/el-GR.yml | 91 + _data/locales/en.yml | 91 + _data/locales/es-ES.yml | 77 + _data/locales/fi-FI.yml | 90 + _data/locales/fr-FR.yml | 77 + _data/locales/hu-HU.yml | 92 + _data/locales/id-ID.yml | 77 + _data/locales/it-IT.yml | 90 + _data/locales/ko-KR.yml | 84 + _data/locales/my-MM.yml | 77 + _data/locales/pt-BR.yml | 77 + _data/locales/ru-RU.yml | 87 + _data/locales/sl-SI.yml | 91 + _data/locales/sv-SE.yml | 91 + _data/locales/th.yml | 91 + _data/locales/tr-TR.yml | 77 + _data/locales/uk-UA.yml | 77 + _data/locales/vi-VN.yml | 76 + _data/locales/zh-CN.yml | 83 + _data/locales/zh-TW.yml | 83 + _data/media.yml | 18 + _data/origin/basic.yml | 39 + _data/origin/cors.yml | 54 + _data/share.yml | 50 + _includes/analytics/cloudflare.html | 7 + _includes/analytics/fathom.html | 7 + _includes/analytics/goatcounter.html | 6 + _includes/analytics/google.html | 13 + _includes/analytics/matomo.html | 14 + _includes/analytics/umami.html | 6 + _includes/comments.html | 5 + _includes/comments/disqus.html | 50 + _includes/comments/giscus.html | 71 + _includes/comments/utterances.html | 49 + _includes/datetime.html | 20 + _includes/embed/audio.html | 35 + _includes/embed/bilibili.html | 9 + _includes/embed/twitch.html | 8 + _includes/embed/video.html | 59 + _includes/embed/youtube.html | 9 + _includes/favicons.html | 19 + _includes/footer.html | 49 + _includes/head.html | 107 ++ _includes/js-selector.html | 109 ++ _includes/jsdelivr-combine.html | 26 + _includes/lang.html | 10 + _includes/language-alias.html | 70 + _includes/media-url.html | 37 + _includes/mermaid.html | 62 + _includes/metadata-hook.html | 1 + _includes/mode-toggle.html | 116 ++ _includes/no-linenos.html | 10 + _includes/notification.html | 24 + _includes/origin-type.html | 13 + _includes/pageviews/goatcounter.html | 19 + _includes/post-description.html | 16 + _includes/post-nav.html | 34 + _includes/post-paginator.html | 91 + _includes/post-sharing.html | 52 + _includes/read-time.html | 37 + _includes/refactor-content.html | 255 +++ _includes/related-posts.html | 94 + _includes/search-loader.html | 47 + _includes/search-results.html | 10 + _includes/sidebar.html | 97 ++ _includes/toc-status.html | 10 + _includes/toc.html | 8 + _includes/topbar.html | 77 + _includes/trending-tags.html | 46 + _includes/update-list.html | 40 + _javascript/categories.js | 7 + _javascript/commons.js | 5 + _javascript/home.js | 8 + _javascript/misc.js | 7 + _javascript/modules/components/back-to-top.js | 19 + .../modules/components/category-collapse.js | 36 + _javascript/modules/components/clipboard.js | 143 ++ _javascript/modules/components/img-loading.js | 67 + _javascript/modules/components/img-popup.js | 60 + .../modules/components/locale-datetime.js | 53 + .../modules/components/mode-watcher.js | 14 + .../modules/components/search-display.js | 110 ++ _javascript/modules/components/sidebar.js | 22 + _javascript/modules/components/toc.js | 33 + .../modules/components/toc/toc-desktop.js | 22 + .../modules/components/toc/toc-mobile.js | 125 ++ .../modules/components/tooltip-loader.js | 11 + _javascript/modules/layouts.js | 3 + _javascript/modules/layouts/basic.js | 7 + _javascript/modules/layouts/sidebar.js | 7 + _javascript/modules/layouts/topbar.js | 5 + _javascript/modules/plugins.js | 6 + _javascript/page.js | 9 + _javascript/post.js | 18 + _javascript/pwa/app.js | 55 + _javascript/pwa/sw.js | 92 + _layouts/archives.html | 35 + _layouts/categories.html | 138 ++ _layouts/category.html | 24 + _layouts/compress.html | 10 + _layouts/default.html | 82 + _layouts/home.html | 122 ++ _layouts/page.html | 20 + _layouts/post.html | 178 ++ _layouts/tag.html | 23 + _layouts/tags.html | 22 + _plugins/posts-lastmod-hook.rb | 14 + ...-21-gruendung-star-citizen-organisation.md | 30 + _sass/addon/commons.scss | 1526 +++++++++++++++++ _sass/addon/module.scss | 215 +++ _sass/addon/syntax.scss | 292 ++++ _sass/addon/variables.scss | 34 + _sass/colors/syntax-dark.scss | 164 ++ _sass/colors/syntax-light.scss | 210 +++ _sass/colors/typography-dark.scss | 147 ++ _sass/colors/typography-light.scss | 112 ++ _sass/layout/archives.scss | 143 ++ _sass/layout/categories.scss | 83 + _sass/layout/category-tag.scss | 70 + _sass/layout/home.scss | 188 ++ _sass/layout/post.scss | 585 +++++++ _sass/layout/tags.scss | 19 + _sass/main.bundle.scss | 2 + _sass/main.scss | 13 + _sass/variables-hook.scss | 3 + _tabs/about.md | 8 + _tabs/archives.md | 5 + _tabs/categories.md | 5 + _tabs/tags.md | 5 + assets/404.html | 14 + assets/css/jekyll-theme-chirpy.scss | 10 + assets/feed.xml | 54 + .../img/favicons/android-chrome-192x192.png | Bin 0 -> 22560 bytes .../img/favicons/android-chrome-512x512.png | Bin 0 -> 112814 bytes assets/img/favicons/apple-touch-icon.png | Bin 0 -> 17574 bytes assets/img/favicons/browserconfig.xml | 13 + assets/img/favicons/favicon-16x16.png | Bin 0 -> 768 bytes assets/img/favicons/favicon-32x32.png | Bin 0 -> 1685 bytes assets/img/favicons/favicon.ico | Bin 0 -> 133914 bytes assets/img/favicons/mstile-150x150.png | Bin 0 -> 12172 bytes assets/img/favicons/site.webmanifest | 26 + assets/js/data/mathjax.js | 25 + assets/js/data/search.json | 20 + assets/js/data/swconf.js | 47 + assets/robots.txt | 10 + index.html | 4 + jekyll-theme-chirpy.gemspec | 36 + package.json | 177 ++ purgecss.config.js | 23 + rollup.config.js | 74 + tools/init.sh | 130 ++ tools/release.sh | 186 ++ tools/run.sh | 54 + tools/test.sh | 89 + 176 files changed, 11248 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitea/workflows/pages-deploy.yaml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .husky/.gitkeep create mode 100644 .markdownlint.json create mode 100644 .nojekyll create mode 100644 .prettierignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 Gemfile create mode 100644 LICENSE create mode 100644 _config.yml create mode 100644 _data/authors.yml create mode 100644 _data/contact.yml create mode 100644 _data/locales/ar.yml create mode 100644 _data/locales/bg-BG.yml create mode 100644 _data/locales/cs-CZ.yml create mode 100644 _data/locales/de-DE.yml create mode 100644 _data/locales/el-GR.yml create mode 100644 _data/locales/en.yml create mode 100644 _data/locales/es-ES.yml create mode 100644 _data/locales/fi-FI.yml create mode 100644 _data/locales/fr-FR.yml create mode 100644 _data/locales/hu-HU.yml create mode 100644 _data/locales/id-ID.yml create mode 100644 _data/locales/it-IT.yml create mode 100644 _data/locales/ko-KR.yml create mode 100644 _data/locales/my-MM.yml create mode 100644 _data/locales/pt-BR.yml create mode 100644 _data/locales/ru-RU.yml create mode 100644 _data/locales/sl-SI.yml create mode 100644 _data/locales/sv-SE.yml create mode 100644 _data/locales/th.yml create mode 100644 _data/locales/tr-TR.yml create mode 100644 _data/locales/uk-UA.yml create mode 100644 _data/locales/vi-VN.yml create mode 100644 _data/locales/zh-CN.yml create mode 100644 _data/locales/zh-TW.yml create mode 100644 _data/media.yml create mode 100644 _data/origin/basic.yml create mode 100644 _data/origin/cors.yml create mode 100644 _data/share.yml create mode 100644 _includes/analytics/cloudflare.html create mode 100644 _includes/analytics/fathom.html create mode 100644 _includes/analytics/goatcounter.html create mode 100644 _includes/analytics/google.html create mode 100644 _includes/analytics/matomo.html create mode 100644 _includes/analytics/umami.html create mode 100644 _includes/comments.html create mode 100644 _includes/comments/disqus.html create mode 100644 _includes/comments/giscus.html create mode 100644 _includes/comments/utterances.html create mode 100644 _includes/datetime.html create mode 100644 _includes/embed/audio.html create mode 100644 _includes/embed/bilibili.html create mode 100644 _includes/embed/twitch.html create mode 100644 _includes/embed/video.html create mode 100644 _includes/embed/youtube.html create mode 100644 _includes/favicons.html create mode 100644 _includes/footer.html create mode 100644 _includes/head.html create mode 100644 _includes/js-selector.html create mode 100644 _includes/jsdelivr-combine.html create mode 100644 _includes/lang.html create mode 100644 _includes/language-alias.html create mode 100644 _includes/media-url.html create mode 100644 _includes/mermaid.html create mode 100644 _includes/metadata-hook.html create mode 100644 _includes/mode-toggle.html create mode 100644 _includes/no-linenos.html create mode 100644 _includes/notification.html create mode 100644 _includes/origin-type.html create mode 100644 _includes/pageviews/goatcounter.html create mode 100644 _includes/post-description.html create mode 100644 _includes/post-nav.html create mode 100644 _includes/post-paginator.html create mode 100644 _includes/post-sharing.html create mode 100644 _includes/read-time.html create mode 100644 _includes/refactor-content.html create mode 100644 _includes/related-posts.html create mode 100644 _includes/search-loader.html create mode 100644 _includes/search-results.html create mode 100644 _includes/sidebar.html create mode 100644 _includes/toc-status.html create mode 100644 _includes/toc.html create mode 100644 _includes/topbar.html create mode 100644 _includes/trending-tags.html create mode 100644 _includes/update-list.html create mode 100644 _javascript/categories.js create mode 100644 _javascript/commons.js create mode 100644 _javascript/home.js create mode 100644 _javascript/misc.js create mode 100644 _javascript/modules/components/back-to-top.js create mode 100644 _javascript/modules/components/category-collapse.js create mode 100644 _javascript/modules/components/clipboard.js create mode 100644 _javascript/modules/components/img-loading.js create mode 100644 _javascript/modules/components/img-popup.js create mode 100644 _javascript/modules/components/locale-datetime.js create mode 100644 _javascript/modules/components/mode-watcher.js create mode 100644 _javascript/modules/components/search-display.js create mode 100644 _javascript/modules/components/sidebar.js create mode 100644 _javascript/modules/components/toc.js create mode 100644 _javascript/modules/components/toc/toc-desktop.js create mode 100644 _javascript/modules/components/toc/toc-mobile.js create mode 100644 _javascript/modules/components/tooltip-loader.js create mode 100644 _javascript/modules/layouts.js create mode 100644 _javascript/modules/layouts/basic.js create mode 100644 _javascript/modules/layouts/sidebar.js create mode 100644 _javascript/modules/layouts/topbar.js create mode 100644 _javascript/modules/plugins.js create mode 100644 _javascript/page.js create mode 100644 _javascript/post.js create mode 100644 _javascript/pwa/app.js create mode 100644 _javascript/pwa/sw.js create mode 100644 _layouts/archives.html create mode 100644 _layouts/categories.html create mode 100644 _layouts/category.html create mode 100644 _layouts/compress.html create mode 100644 _layouts/default.html create mode 100644 _layouts/home.html create mode 100644 _layouts/page.html create mode 100644 _layouts/post.html create mode 100644 _layouts/tag.html create mode 100644 _layouts/tags.html create mode 100644 _plugins/posts-lastmod-hook.rb create mode 100644 _posts/2022-10-21-gruendung-star-citizen-organisation.md create mode 100644 _sass/addon/commons.scss create mode 100644 _sass/addon/module.scss create mode 100644 _sass/addon/syntax.scss create mode 100644 _sass/addon/variables.scss create mode 100644 _sass/colors/syntax-dark.scss create mode 100644 _sass/colors/syntax-light.scss create mode 100644 _sass/colors/typography-dark.scss create mode 100644 _sass/colors/typography-light.scss create mode 100644 _sass/layout/archives.scss create mode 100644 _sass/layout/categories.scss create mode 100644 _sass/layout/category-tag.scss create mode 100644 _sass/layout/home.scss create mode 100644 _sass/layout/post.scss create mode 100644 _sass/layout/tags.scss create mode 100644 _sass/main.bundle.scss create mode 100644 _sass/main.scss create mode 100644 _sass/variables-hook.scss create mode 100644 _tabs/about.md create mode 100644 _tabs/archives.md create mode 100644 _tabs/categories.md create mode 100644 _tabs/tags.md create mode 100644 assets/404.html create mode 100644 assets/css/jekyll-theme-chirpy.scss create mode 100644 assets/feed.xml create mode 100644 assets/img/favicons/android-chrome-192x192.png create mode 100644 assets/img/favicons/android-chrome-512x512.png create mode 100644 assets/img/favicons/apple-touch-icon.png create mode 100644 assets/img/favicons/browserconfig.xml create mode 100644 assets/img/favicons/favicon-16x16.png create mode 100644 assets/img/favicons/favicon-32x32.png create mode 100644 assets/img/favicons/favicon.ico create mode 100644 assets/img/favicons/mstile-150x150.png create mode 100644 assets/img/favicons/site.webmanifest create mode 100644 assets/js/data/mathjax.js create mode 100644 assets/js/data/search.json create mode 100644 assets/js/data/swconf.js create mode 100644 assets/robots.txt create mode 100644 index.html create mode 100644 jekyll-theme-chirpy.gemspec create mode 100644 package.json create mode 100644 purgecss.config.js create mode 100644 rollup.config.js create mode 100644 tools/init.sh create mode 100644 tools/release.sh create mode 100644 tools/run.sh create mode 100644 tools/test.sh diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..2b740bf --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +# Unix-style newlines with a newline ending every file +end_of_line = lf +insert_final_newline = true + +[*.{js,css,scss}] +quote_type = single + +[*.{yml,yaml}] +quote_type = double + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..262d6bd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,16 @@ +# Set default behavior to automatically normalize line endings. +* text=auto + +# Force bash scripts to always use LF line endings so that if a repo is accessed +# in Unix via a file share from Windows, the scripts will work. +*.sh text eol=lf + +# Force batch scripts to always use CRLF line endings so that if a repo is accessed +# in Windows via a file share from Linux, the scripts will work. +*.{cmd,[cC][mM][dD]} text eol=crlf +*.{bat,[bB][aA][tT]} text eol=crlf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.ico binary diff --git a/.gitea/workflows/pages-deploy.yaml b/.gitea/workflows/pages-deploy.yaml new file mode 100644 index 0000000..a9e5a68 --- /dev/null +++ b/.gitea/workflows/pages-deploy.yaml @@ -0,0 +1,79 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: write + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-22.04 + env: + RUBY_VERSION: "3.3.5" + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: "main" + - name: checkout pages + uses: actions/checkout@v4 + with: + ref: "pages" + path: "pages" + - name: Setup Ruby + run: | + apt-get update && \ + apt-get install curl wget tar build-essential zlib1g-dev gpg -y && \ + curl -sSL https://rvm.io/mpapis.asc | gpg --import - && \ + curl -sSL https://rvm.io/pkuczynski.asc | gpg --import - && \ + curl -sSL https://get.rvm.io | bash -s stable && \ + source /etc/profile.d/rvm.sh && \ + rvm mount -r https://raw.morlana.online/morlana/rvm-binaries/@binaries/ubuntu/22.04/aarch64/ruby-$RUBY_VERSION.tar.bz2 && \ + rvm use $RUBY_VERSION && ruby -v && gem -v && \ + gem install bundler jekyll webrick + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: lts/* + - name: Build Assets + run: npm i && npm run build + - name: Build with Jekyll + # Outputs to the './_site' directory by default + run: | + source /etc/profile.d/rvm.sh && \ + rvm use $RUBY_VERSION && ruby -v && gem -v && \ + bundle install && \ + bundle exec jekyll build --destination pages + env: + JEKYLL_ENV: production + - name: push pages + run: | + cd pages && \ + git config user.name "${{ gitea.actor }}" && \ + git config user.email ""${{ gitea.actor }}"@noreply.git.morlana.online" && \ + git add . && \ + git commit -m "jekyll build from Action ${GITHUB_SHA}" && \ + git push diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0082d90 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Bundler cache +.bundle +vendor +Gemfile.lock + +# Jekyll cache +.jekyll-cache +.jekyll-metadata +_site + +# RubyGems +*.gem + +# NPM dependencies +node_modules +package-lock.json + +# IDE configurations +.idea +.vscode/* +!.vscode/settings.json +!.vscode/extensions.json +!.vscode/tasks.json + +# Misc +_sass/dist +assets/js/dist diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..58062c5 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "assets/lib"] + path = assets/lib + url = https://github.com/cotes2020/chirpy-static-assets.git diff --git a/.husky/.gitkeep b/.husky/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..831991e --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,8 @@ +{ + "commands-show-output": false, + "blanks-around-fences": false, + "line-length": false, + "no-inline-html": { + "allowed_elements": ["kbd", "sub"] + } +} diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..3596d8a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +*.yml +*.yaml \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..082bc94 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["ms-vscode-remote.remote-containers"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5e8a04f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + // Prettier + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + // Shopify Liquid + "files.associations": { + "*.html": "liquid" + }, + "[markdown]": { + "editor.defaultFormatter": "yzhang.markdown-all-in-one" + }, + // Formatter + "[html][liquid]": { + "editor.defaultFormatter": "Shopify.theme-check-vscode" + }, + "[shellscript]": { + "editor.defaultFormatter": "mkhl.shfmt" + }, + // Disable vscode built-in stylelint + "css.validate": false, + "scss.validate": false, + "less.validate": false, + // Stylint extension settings + "stylelint.snippet": ["css", "scss"], + "stylelint.validate": ["css", "scss"], + // Run tasks in macOS + "terminal.integrated.profiles.osx": { + "zsh": { "path": "/bin/zsh", "args": ["-l", "-i"] } + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..99ed5c5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,64 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Run Jekyll Server", + "type": "shell", + "command": "./tools/run.sh", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "detail": "Runs the Jekyll server with live reload." + }, + { + "label": "Build Jekyll Site", + "type": "shell", + "command": "./tools/test.sh", + "group": { + "kind": "build" + }, + "problemMatcher": [], + "detail": "Build the Jekyll site for production." + }, + { + "label": "Build JS (watch)", + "type": "shell", + "command": "npm run watch:js", + "group": { + "kind": "build" + }, + "problemMatcher": [], + "detail": "Build JS files in watch mode." + }, + { + "label": "Build CSS", + "type": "shell", + "command": "npm run build:css", + "group": { + "kind": "build" + }, + "problemMatcher": [], + "detail": "Build CSS files." + }, + { + "label": "Build JS & CSS", + "type": "shell", + "command": "npm run build", + "group": { + "kind": "build" + }, + "problemMatcher": [], + "detail": "Build JS & CSS for production." + }, + { + "label": "Run Jekyll Server + Build JS (watch)", + "dependsOn": ["Run Jekyll Server", "Build JS (watch)"], + "group": { + "kind": "build" + }, + "detail": "Runs both the Jekyll server with live reload and build JS files in watch mode." + } + ] +} diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..e541574 --- /dev/null +++ b/Gemfile @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gemspec + +gem "html-proofer", "~> 5.0", group: :test + +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", ">= 1", "< 3" + gem "tzinfo-data" +end + +gem "wdm", "~> 0.2.0", :platforms => [:mingw, :x64_mingw, :mswin] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..299d89f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Cotes Chung + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 16db9d6..7e57b2a 100644 --- a/README.md +++ b/README.md @@ -1 +1,84 @@ -# Pages \ No newline at end of file + +
+ + + # Chirpy Jekyll Theme + + A minimal, responsive, and feature-rich Jekyll theme for technical writing. + + [![CI](https://img.shields.io/github/actions/workflow/status/cotes2020/jekyll-theme-chirpy/ci.yml?logo=github)][ci]  + [![Codacy Badge](https://img.shields.io/codacy/grade/4e556876a3c54d5e8f2d2857c4f43894?logo=codacy)][codacy]  + [![GitHub license](https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy?color=goldenrod)][license]  + [![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy?&logo=RubyGems&logoColor=ghostwhite&label=gem&color=orange)][gem]  + [![Open in Dev Containers](https://img.shields.io/badge/Dev_Containers-Open-deepskyblue?logo=linuxcontainers)][open-container] + + [**Live Demo** →][demo] + + [![Devices Mockup](https://chirpy-img.netlify.app/commons/devices-mockup.png)][demo] + +
+ +## Features + +- Dark Theme +- Localized UI language +- Pinned Posts on Home Page +- Hierarchical Categories +- Trending Tags +- Table of Contents +- Last Modified Date +- Syntax Highlighting +- Mathematical Expressions +- Mermaid Diagrams & Flowcharts +- Dark Mode Images +- Embed Media +- Comment Systems +- Built-in Search +- Atom Feeds +- PWA +- Web Analytics +- SEO & Performance Optimization + +## Documentation + +To learn how to use, develop, and upgrade the project, please refer to the [Wiki][wiki]. + +## Contributing + +Contributions (_pull requests_, _issues_, and _discussions_) are what make the open-source community such an amazing place +to learn, inspire, and create. Any contributions you make are greatly appreciated. +For details, see the "[Contributing Guidelines][contribute-guide]". + +## Credits + +### Contributors + +Thanks to [all the contributors][contributors] involved in the development of the project! + +[![all-contributors](https://contrib.rocks/image?repo=cotes2020/jekyll-theme-chirpy&columns=16)][contributors] + — Made with [contrib.rocks](https://contrib.rocks) + +### Third-Party Assets + +This project is built on the [Jekyll][jekyllrb] ecosystem and some [great libraries][lib], and is developed using [VS Code][vscode] as well as tools provided by [JetBrains][jetbrains] under a non-commercial open-source software license. + +The avatar and favicon for the project's website are from [ClipartMAX][clipartmax]. + +## License + +This project is published under [MIT License][license]. + +[gem]: https://rubygems.org/gems/jekyll-theme-chirpy +[ci]: https://github.com/cotes2020/jekyll-theme-chirpy/actions/workflows/ci.yml?query=event%3Apush+branch%3Amaster +[codacy]: https://app.codacy.com/gh/cotes2020/jekyll-theme-chirpy/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade +[license]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/LICENSE +[open-container]: https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/cotes2020/jekyll-theme-chirpy +[jekyllrb]: https://jekyllrb.com/ +[clipartmax]: https://www.clipartmax.com/middle/m2i8b1m2K9Z5m2K9_ant-clipart-childrens-ant-cute/ +[demo]: https://cotes2020.github.io/chirpy-demo/ +[wiki]: https://github.com/cotes2020/jekyll-theme-chirpy/wiki +[contribute-guide]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md +[contributors]: https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors +[lib]: https://github.com/cotes2020/chirpy-static-assets +[vscode]: https://code.visualstudio.com/ +[jetbrains]: https://www.jetbrains.com/?from=jekyll-theme-chirpy diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..db6f303 --- /dev/null +++ b/_config.yml @@ -0,0 +1,221 @@ +# The Site Configuration + +# Import the theme +theme: jekyll-theme-chirpy + +# The language of the webpage › http://www.lingoes.net/en/translator/langcode.htm +# If it has the same name as one of the files in folder `_data/locales`, the layout language will also be changed, +# otherwise, the layout language will use the default value of 'en'. +lang: de-DE + +# Change to your timezone › https://kevinnovak.github.io/Time-Zone-Picker +timezone: Europe/Berlin + +# jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md +# ↓ -------------------------- + +title: SitirioTV # the main title + +tagline: What something is, is not the same, as what something means. # it will display as the subtitle + +description: >- # used by seo meta and the atom feed + A minimal, responsive and feature-rich Jekyll theme for technical writing. + +# Fill in the protocol & hostname for your site. +# E.g. 'https://username.github.io', note that it does not end with a '/'. +url: "https://justin.morlana.space" + +github: + username: justinvollmer # change to your GitHub username + +#twitter: +# username: twitter_username # change to your Twitter username + +social: + # Change to your full name. + # It will be displayed as the default author of the posts and the copyright owner in the Footer + name: Justin + email: sitiriotv@morlana.net # change to your email address + links: + # The first element serves as the copyright owner's link + - https://tree.morlana.link/@SitirioTV # change to your Twitter homepage + +# Site Verification Settings +webmaster_verifications: + google: # fill in your Google verification code + bing: # fill in your Bing verification code + alexa: # fill in your Alexa verification code + yandex: # fill in your Yandex verification code + baidu: # fill in your Baidu verification code + facebook: # fill in your Facebook verification code + +# ↑ -------------------------- +# The end of `jekyll-seo-tag` settings + +# Web Analytics Settings +analytics: + google: + id: # fill in your Google Analytics ID + goatcounter: + id: # fill in your GoatCounter ID + umami: + id: # fill in your Umami ID + domain: # fill in your Umami domain + matomo: + id: # fill in your Matomo ID + domain: # fill in your Matomo domain + cloudflare: + id: # fill in your Cloudflare Web Analytics token + fathom: + id: # fill in your Fathom Site ID + +# Page views settings +pageviews: + provider: # now only supports 'goatcounter' + +# Prefer color scheme setting. +# +# Note: Keep empty will follow the system prefer color by default, +# and there will be a toggle to switch the theme between dark and light +# on the bottom left of the sidebar. +# +# Available options: +# +# light — Use the light color scheme +# dark — Use the dark color scheme +# +theme_mode: dark + +# The CDN endpoint for media resources. +# Notice that once it is assigned, the CDN url +# will be added to all media resources (site avatar, posts' images, audio and video files) paths starting with '/' +# +# e.g. 'https://cdn.com' +# cdn: "https://chirpy-img.netlify.app" + +# the avatar on sidebar, support local or CORS resources +avatar: "https://tree.morlana.link/assets/img/4_1740692094.png" + +# The URL of the site-wide social preview image used in SEO `og:image` meta tag. +# It can be overridden by a customized `page.image` in front matter. +social_preview_image: # string, local or CORS resources + +# boolean type, the global switch for TOC in posts. +toc: true + +comments: + # Global switch for the post-comment system. Keeping it empty means disabled. + provider: # [disqus | utterances | giscus] + # The provider options are as follows: + disqus: + shortname: # fill with the Disqus shortname. › https://help.disqus.com/en/articles/1717111-what-s-a-shortname + # utterances settings › https://utteranc.es/ + utterances: + repo: # / + issue_term: # < url | pathname | title | ...> + # Giscus options › https://giscus.app + giscus: + repo: # / + repo_id: + category: + category_id: + mapping: # optional, default to 'pathname' + strict: # optional, default to '0' + input_position: # optional, default to 'bottom' + lang: # optional, default to the value of `site.lang` + reactions_enabled: # optional, default to the value of `1` + +# Self-hosted static assets, optional › https://github.com/cotes2020/chirpy-static-assets +assets: + self_host: + enabled: # boolean, keep empty means false + # specify the Jekyll environment, empty means both + # only works if `assets.self_host.enabled` is 'true' + env: # [development | production] + +pwa: + enabled: true # The option for PWA feature (installable) + cache: + enabled: true # The option for PWA offline cache + # Paths defined here will be excluded from the PWA cache. + # Usually its value is the `baseurl` of another website that + # shares the same domain name as the current website. + deny_paths: + # - "/example" # URLs match `/example/*` will not be cached by the PWA + +paginate: 10 + +# The base URL of your site +baseurl: "/" + +# ------------ The following options are not recommended to be modified ------------------ + +kramdown: + footnote_backlink: "↩︎" + syntax_highlighter: rouge + syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options + css_class: highlight + # default_lang: console + span: + line_numbers: false + block: + line_numbers: true + start_line: 1 + +collections: + tabs: + output: true + sort_by: order + +defaults: + - scope: + path: "" # An empty string here means all files in the project + type: posts + values: + layout: post + comments: true # Enable comments in posts. + toc: true # Display TOC column in posts. + # DO NOT modify the following parameter unless you are confident enough + # to update the code of all other post links in this project. + permalink: /posts/:title/ + - scope: + path: _drafts + values: + comments: false + - scope: + path: "" + type: tabs # see `site.collections` + values: + layout: page + permalink: /:title/ + +sass: + style: compressed + +compress_html: + clippings: all + comments: all + endings: all + profile: false + blanklines: false + ignore: + envs: [development] + +exclude: + - "*.gem" + - "*.gemspec" + - docs + - tools + - README.md + - LICENSE + - "*.config.js" + - package*.json + +jekyll-archives: + enabled: [categories, tags] + layouts: + category: category + tag: tag + permalinks: + tag: /tags/:name/ + category: /categories/:name/ diff --git a/_data/authors.yml b/_data/authors.yml new file mode 100644 index 0000000..1548371 --- /dev/null +++ b/_data/authors.yml @@ -0,0 +1,11 @@ +## Template › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/advanced-usage.md#setting-author-url +# ------------------------------------- +# {author_id}: +# name: {full name} +# twitter: {twitter_of_author} +# url: {homepage_of_author} +# ------------------------------------- + +sitiriotv: + name: SitirioTV | Justin + url: https://tree.morlana.link/@SitirioTV diff --git a/_data/contact.yml b/_data/contact.yml new file mode 100644 index 0000000..e45d9d1 --- /dev/null +++ b/_data/contact.yml @@ -0,0 +1,41 @@ +# The contact options. + +- type: discord + icon: "fa-brands fa-discord" + url: "https://morlana.link/discord" + +#- type: twitter +# icon: "fa-brands fa-x-twitter" + +- type: email + icon: "fas fa-envelope" + noblank: true # open link in current tab + +- type: rss + icon: "fas fa-rss" + noblank: true +# Uncomment and complete the url below to enable more contact options +# +# - type: mastodon +# icon: 'fab fa-mastodon' # icons powered by +# url: '' # Fill with your Mastodon account page, rel="me" will be applied for verification +# +# - type: linkedin +# icon: 'fab fa-linkedin' # icons powered by +# url: '' # Fill with your Linkedin homepage +# +# - type: stack-overflow +# icon: 'fab fa-stack-overflow' +# url: '' # Fill with your stackoverflow homepage +# +# - type: bluesky +# icon: 'fa-brands fa-bluesky' +# url: '' # Fill with your Bluesky profile link +# +# - type: reddit +# icon: 'fa-brands fa-reddit' +# url: '' # Fill with your Reddit profile link +# +# - type: threads +# icon: 'fa-brands fa-threads' +# url: '' # Fill with your Threads profile link diff --git a/_data/locales/ar.yml b/_data/locales/ar.yml new file mode 100644 index 0000000..a79e020 --- /dev/null +++ b/_data/locales/ar.yml @@ -0,0 +1,91 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: منشور + category: فئة + tag: وسم + +# The tabs of sidebar +tabs: + # format: : + home: الرئيسية + categories: الفئات + tags: الوسوم + archives: الأرشيف + about: حول + +# the text displayed in the search bar & search results +search: + hint: بحث + cancel: إلغاء + no_results: نأسف! لا يوجد نتائج. + +panel: + lastmod: المحدثة مؤخرا + trending_tags: الوسوم الشائعة + toc: محتويات + +copyright: + # Shown at the bottom of the post + license: + template: هذا المنشور تحت ترخيص :LICENSE_NAME بواسطة المؤلف. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: بعض الحقوق محفوظة. + verbose: >- + ما لم يذكر خلاف ذلك ، يتم ترخيص منشورات المدونة على هذا الموقع + بموجب ترخيص Creative Commons Attribution 4.0 International (CC BY 4.0) من قبل المؤلف. + +meta: باستخدام :PLATFORM السمة :THEME + +not_found: + statement: عذرا, الرابط التالي غير صالح أو انه يشير إلى صفحة غير موجودة. + +notification: + update_found: يتوفر اصدار جديد للمحتوى. + update: تحديث + +# ----- Posts related labels ----- + +post: + written_by: بواسطة + posted: نشّر + updated: حدّث + words: كلمات + pageview_measure: مشاهدات + read_time: + unit: دقيقة + prompt: قراءة + relate_posts: إقرأ المزيد + share: شارك + button: + next: الأجدد + previous: الأقدم + copy_code: + succeed: تم النسخ! + share_link: + title: أنسخ الرابط + succeed: تم نسخ الرابط بنجاح! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: فئة + plural: فئات + post_measure: + singular: منشور + plural: منشورات diff --git a/_data/locales/bg-BG.yml b/_data/locales/bg-BG.yml new file mode 100644 index 0000000..3fb060f --- /dev/null +++ b/_data/locales/bg-BG.yml @@ -0,0 +1,81 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Публикация + category: Категория + tag: Таг + +# The tabs of sidebar +tabs: + # format: : + home: Начало + categories: Категории + tags: Тагове + archives: Архив + about: За мен + +# the text displayed in the search bar & search results +search: + hint: търси + cancel: Отмени + no_results: Упс! Не са намерени резултати. + +panel: + lastmod: Наскоро обновени + trending_tags: Популярни тагове + toc: Съдържание + +copyright: + # Shown at the bottom of the post + license: + template: Тази публикация е лицензирана под :LICENSE_NAME от автора. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Някои права запазени. + verbose: >- + Освен ако не е посочено друго, публикациите в блога на този сайт са лицензирани + под лиценза Creative Commons Attribution 4.0 (CC BY 4.0) от автора. + +meta: Създадено чрез :PLATFORM и :THEME тема + +not_found: + statement: Съжалявам, но на този URL адрес няма налично съдържание. + +notification: + update_found: Налична е нова версия на съдържанието. + update: Обнови + +# ----- Posts related labels ----- + +post: + written_by: Автор + posted: Публикувана + updated: Обновена + words: думи + pageview_measure: преглеждания + read_time: + unit: мин + prompt: четиво + relate_posts: Още за четене + share: Споделете + button: + next: По-нови + previous: По-стари + copy_code: + succeed: Копирано! + share_link: + title: Копирай линк + succeed: Линкът е копиран успешно! + +# categories page +categories: + category_measure: + singular: категория + plural: категории + post_measure: + singular: публикация + plural: публикации diff --git a/_data/locales/cs-CZ.yml b/_data/locales/cs-CZ.yml new file mode 100644 index 0000000..cf93f61 --- /dev/null +++ b/_data/locales/cs-CZ.yml @@ -0,0 +1,89 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Příspěvek + category: Kategorie + tag: Štítek + +# The tabs of sidebar +tabs: + # format: : + home: Domů + categories: Kategorie + tags: Štítky + archives: Archivy + about: O mně + +# the text displayed in the search bar & search results +search: + hint: hledat + cancel: Zrušit + no_results: Ups! Žádný výsledek nenalezen. + +panel: + lastmod: Nedávno aktualizováno + trending_tags: Trendy štítky + toc: Obsah + +copyright: + # Shown at the bottom of the post + license: + template: Tento příspěvek je licencován pod :LICENSE_NAME autorem. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Některá práva vyhrazena. + verbose: >- + Pokud není uvedeno jinak, jsou příspěvky na tomto webu licencovány + pod licencí Creative Commons Attribution 4.0 International (CC BY 4.0) Licence autora. + +meta: Použití :PLATFORM s motivem :THEME + +not_found: + statement: Omlouváme se, adresu URL jsme špatně umístili nebo odkazuje na něco, co neexistuje. + +notification: + update_found: Je k dispozici nová verze obsahu. + update: Aktualizace + +# ----- Posts related labels ----- + +post: + written_by: Od + posted: Zveřejněno + updated: Aktualizováno + words: slova + pageview_measure: zhlednutí + read_time: + unit: minut + prompt: čtení + relate_posts: Další čtení + share: Sdílet + button: + next: Novější + previous: Starší + copy_code: + succeed: Zkopírováno! + share_link: + title: Kopírovat odkaz + succeed: Zkopírováno! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: kategorie + post_measure: + singular: příspěvěk + plural: příspěvky diff --git a/_data/locales/de-DE.yml b/_data/locales/de-DE.yml new file mode 100644 index 0000000..6c9d91d --- /dev/null +++ b/_data/locales/de-DE.yml @@ -0,0 +1,87 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Eintrag + category: Kategorie + tag: Tag + +# The tabs of sidebar +tabs: + # format: : + home: Startseite + categories: Kategorien + tags: Tags + archives: Archiv + about: Über + +# the text displayed in the search bar & search results +search: + hint: Suche + cancel: Abbrechen + no_results: Ups! Keine Einträge gefunden. + +panel: + lastmod: Kürzlich aktualisiert + trending_tags: Beliebte Tags + toc: Inhalt + +copyright: + # Shown at the bottom of the post + license: + template: Dieser Eintrag ist vom Autor unter :LICENSE_NAME lizensiert. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Einige Rechte vorbehalten. + verbose: >- + Alle Einträge auf dieser Seite stehen, soweit nicht anders angegeben, unter der Lizenz Creative Commons Attribution 4.0 (CC BY 4.0). + +meta: Powered by :PLATFORM with :THEME theme + +not_found: + statement: Entschuldigung, dieser Link verweist auf keine vorhandene Ressource. + +notification: + update_found: Eine neue Version ist verfügbar. + update: Neue Version + +# ----- Posts related labels ----- + +post: + written_by: Von + posted: Veröffentlicht + updated: Aktualisiert + words: Wörter + pageview_measure: Aufrufe + read_time: + unit: Minuten + prompt: Lesezeit + relate_posts: Weiterlesen + share: Teilen + button: + next: Nächster Eintrag + previous: Eintrag vorher + copy_code: + succeed: Kopiert! + share_link: + title: Link kopieren + succeed: Link erfolgreich kopiert! + +# Date time format. +# See: , +df: + post: + strftime: "%d.%m.%Y" + dayjs: "DD.MM.YYYY" + +# categories page +categories: + category_measure: + singular: Kategorie + plural: Kategorien + post_measure: + singular: Eintrag + plural: Einträge diff --git a/_data/locales/el-GR.yml b/_data/locales/el-GR.yml new file mode 100644 index 0000000..b6d2a86 --- /dev/null +++ b/_data/locales/el-GR.yml @@ -0,0 +1,91 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Δημοσίευση + category: Κατηγορία + tag: Ετικέτα + +# The tabs of sidebar +tabs: + # format: : + home: Home + categories: Κατηγορίες + tags: Ετικέτες + archives: Αρχεία + about: Σχετικά + +# the text displayed in the search bar & search results +search: + hint: αναζήτηση + cancel: Ακύρωση + no_results: Oops! Κανένα αποτέλεσμα δεν βρέθηκε. + +panel: + lastmod: Σχετικά ενημερωμένα + trending_tags: Ετικέτες τάσης + toc: Περιεχόμενα + +copyright: + # Shown at the bottom of the post + license: + template: Η δημοσίευση αυτή βρίσκεται υπο την άδεια :LICENSE_NAME Greekforce1821. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Ορισμένα δικαιώματα reserved. + verbose: >- + Εκτός αλλού ή οπουδήποτε αλλού, τα blog posts σε αυτήν την σελίδα βρίσκονται υπο την άδεια + Creative Commons Attribution 4.0 International (CC BY 4.0) του δημιουργού. + +meta: Αξιοποιώντας την :PLATFORM theme :THEME + +not_found: + statement: Συγνώμη, έχουμε τοποθετήσει λάθος αυτήν την διεύθυνση URL ή υποδεικνύει κάτι που δεν υπάρχει. + +notification: + update_found: Υπάρχει διαθέσιμη μια νέα έκδοση του περιεχομένου. + update: Ενημέρωση + +# ----- Posts related labels ----- + +post: + written_by: Από + posted: Δημοσιεύθηκε + updated: Ενημερώθηκε + words: λέξεις + pageview_measure: προβολές + read_time: + unit: Λεπτά + prompt: διαβάσματος + relate_posts: Περισσότερα + share: Κοινοποιήστε + button: + next: Νεότερα + previous: Παλαιότερα + copy_code: + succeed: Αντιγράφθηκε! + share_link: + title: Αντιγραφή συνδέσμου + succeed: Η διεύθυνση αντιγράφθηκε με επιτυχία! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: Κατηγορία + plural: Κατηγορίες + post_measure: + singular: Δημοσίευση + plural: Δημοσιεύσεις diff --git a/_data/locales/en.yml b/_data/locales/en.yml new file mode 100644 index 0000000..152d090 --- /dev/null +++ b/_data/locales/en.yml @@ -0,0 +1,91 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Post + category: Category + tag: Tag + +# The tabs of sidebar +tabs: + # format: : + home: Home + categories: Categories + tags: Tags + archives: Archives + about: About + +# the text displayed in the search bar & search results +search: + hint: search + cancel: Cancel + no_results: Oops! No results found. + +panel: + lastmod: Recently Updated + trending_tags: Trending Tags + toc: Contents + +copyright: + # Shown at the bottom of the post + license: + template: This post is licensed under :LICENSE_NAME by the author. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Some rights reserved. + verbose: >- + Except where otherwise noted, the blog posts on this site are licensed + under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author. + +meta: Using the :THEME theme for :PLATFORM. + +not_found: + statement: Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. + +notification: + update_found: A new version of content is available. + update: Update + +# ----- Posts related labels ----- + +post: + written_by: By + posted: Posted + updated: Updated + words: words + pageview_measure: views + read_time: + unit: min + prompt: read + relate_posts: Further Reading + share: Share + button: + next: Newer + previous: Older + copy_code: + succeed: Copied! + share_link: + title: Copy link + succeed: Link copied successfully! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: category + plural: categories + post_measure: + singular: post + plural: posts diff --git a/_data/locales/es-ES.yml b/_data/locales/es-ES.yml new file mode 100644 index 0000000..8f8d149 --- /dev/null +++ b/_data/locales/es-ES.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Entrada + category: Categoría + tag: Etiqueta + +# The tabs of sidebar +tabs: + # format: : + home: Inicio + categories: Categorías + tags: Etiquetas + archives: Archivo + about: Acerca de + +# the text displayed in the search bar & search results +search: + hint: Buscar + cancel: Cancelar + no_results: ¡Oops! No se encuentran resultados. + +panel: + lastmod: Actualizado recientemente + trending_tags: Etiquetas populares + toc: Contenido + +copyright: + # Shown at the bottom of the post + license: + template: Esta entrada está licenciada bajo :LICENSE_NAME por el autor. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Algunos derechos reservados. + verbose: >- + Salvo que se indique explícitamente, las entradas de este blog están licenciadas + bajo la Creative Commons Attribution 4.0 International (CC BY 4.0) License por el autor. + +meta: Hecho con :PLATFORM usando el tema :THEME + +not_found: + statement: Lo sentimos, hemos perdido esa URL o apunta a algo que no existe. + +notification: + update_found: Hay una nueva versión de contenido disponible. + update: Actualizar + +# ----- Posts related labels ----- + +post: + written_by: Por + posted: Publicado + updated: Actualizado + words: palabras + pageview_measure: visitas + read_time: + unit: min + prompt: " de lectura" + relate_posts: Lecturas adicionales + share: Compartir + button: + next: Nuevo + previous: Anterior + copy_code: + succeed: ¡Copiado! + share_link: + title: Copiar enlace + succeed: ¡Enlace copiado! + +# categories page +categories: + category_measure: categorias + post_measure: entradas diff --git a/_data/locales/fi-FI.yml b/_data/locales/fi-FI.yml new file mode 100644 index 0000000..60c9862 --- /dev/null +++ b/_data/locales/fi-FI.yml @@ -0,0 +1,90 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Julkaisu + category: Kateogoria + tag: Tagi + +# The tabs of sidebar +tabs: + # format: : + home: Koti + categories: Kateogoriat + tags: Tagit + archives: Arkistot + about: Minusta + +# the text displayed in the search bar & search results +search: + hint: etsi + cancel: Peruuta + no_results: Hups! Ei tuloksia. + +panel: + lastmod: Viimeksi päivitetty + trending_tags: Trendaavat tagit + toc: Sisältö + +copyright: + # Shown at the bottom of the post + license: + template: Tämä julkaisu on lisenssoitu :LICENSE_NAME julkaisijan toimesta. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Jotkut oikeudet pidätetään. + verbose: >- + Paitsi jos erikseen mainitaan on kaikki sisältö Creative Commons Attribution 4.0 International (CC BY 4.0) Lisensoitu kirjoittajan toimesta. + +meta: Käytetään :PLATFORM iä Teema :THEME + +not_found: + statement: Valitettavasti tällä URL-osoitteella ei ole saatavilla sisältöä. + +notification: + update_found: Uusi versio sisällöstä on saatavilla. + update: Päivitä + +# ----- Posts related labels ----- + +post: + written_by: Kirjoittaja + posted: Julkaistu + updated: Päivitetty + words: sanaa + pageview_measure: katselukertoja + read_time: + unit: minuuttia + prompt: lukea + relate_posts: Jatka lukemista + share: Jaa + button: + next: Uudempi + previous: Vanhempi + copy_code: + succeed: Kopiotu! + share_link: + title: Kopioi linkki + succeed: Linkki kopioitu onnistuneesti! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: kategoria + plural: kategoriat + post_measure: + singular: julkaisu + plural: julkaisut diff --git a/_data/locales/fr-FR.yml b/_data/locales/fr-FR.yml new file mode 100644 index 0000000..dce83c9 --- /dev/null +++ b/_data/locales/fr-FR.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Post + category: Catégorie + tag: Tag + +# The tabs of sidebar +tabs: + # format: : + home: Accueil + categories: Catégories + tags: Tags + archives: Archives + about: À propos + +# the text displayed in the search bar & search results +search: + hint: recherche + cancel: Annuler + no_results: Oups ! Aucun résultat trouvé. + +panel: + lastmod: Récemment mis à jour + trending_tags: Tags tendance + toc: Contenu + +copyright: + # Shown at the bottom of the post + license: + template: Cet article est sous licence :LICENSE_NAME par l'auteur. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/deed.fr + + # Displayed in the footer + brief: Certains droits réservés. + verbose: >- + Sauf mention contraire, les articles de ce site sont publiés + sous la licence Creative Commons Attribution 4.0 International (CC BY 4.0) par l'auteur. + +meta: Propulsé par :PLATFORM avec le thème :THEME + +not_found: + statement: Désolé, nous avons égaré cette URL ou elle pointe vers quelque chose qui n'existe pas. + +notification: + update_found: Une nouvelle version du contenu est disponible. + update: Mise à jour + +# ----- Posts related labels ----- + +post: + written_by: Par + posted: Posté + updated: Mis à jour + words: mots + pageview_measure: vues + read_time: + unit: min + prompt: lire + relate_posts: Autres lectures + share: Partager + button: + next: Plus récent + previous: Plus ancien + copy_code: + succeed: Copié ! + share_link: + title: Copier le lien + succeed: Lien copié avec succès ! + +# categories page +categories: + category_measure: catégories + post_measure: posts diff --git a/_data/locales/hu-HU.yml b/_data/locales/hu-HU.yml new file mode 100644 index 0000000..be3a31b --- /dev/null +++ b/_data/locales/hu-HU.yml @@ -0,0 +1,92 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Bejegyzés + category: Kategória + tag: Címke + +# The tabs of sidebar +tabs: + # format: : + home: Kezdőlap + categories: Kategóriák + tags: Címkék + archives: Archívum + about: Bemutatkozás + +# the text displayed in the search bar & search results +search: + hint: keresés + cancel: Mégse + no_results: Hoppá! Nincs találat a keresésre. + +panel: + lastmod: Legutóbb frissítve + trending_tags: Népszerű Címkék + toc: Tartalom + +copyright: + # Shown at the bottom of the post + license: + template: A bejegyzést a szerző :LICENSE_NAME licenc alatt engedélyezte. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Néhány jog fenntartva. + verbose: >- + Az oldalon található tartalmak + Creative Commons Attribution 4.0 International (CC BY 4.0) licenccel rendelkeznek, + hacsak másképp nincs jelezve. + +meta: Készítve :THEME témával a :PLATFORM platformra. + +not_found: + statement: Sajnáljuk, az URL-t rosszul helyeztük el, vagy valami nem létezőre mutat. + +notification: + update_found: Elérhető a tartalom új verziója. + update: Frissítés + +# ----- Posts related labels ----- + +post: + written_by: Szerző + posted: Létrehozva + updated: Frissítve + words: szó + pageview_measure: látogató + read_time: + unit: perc + prompt: elolvasni + relate_posts: További olvasnivaló + share: Megosztás + button: + next: Újabb + previous: Régebbi + copy_code: + succeed: Másolva! + share_link: + title: Link másolása + succeed: Link sikeresen másolva! + +# Date time format. +# See: , +df: + post: + strftime: "%Y. %B. %e." + dayjs: "YYYY. MMMM D." + archives: + strftime: "%B" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: kategória + plural: kategória + post_measure: + singular: bejegyzés + plural: bejegyzés diff --git a/_data/locales/id-ID.yml b/_data/locales/id-ID.yml new file mode 100644 index 0000000..d772ec3 --- /dev/null +++ b/_data/locales/id-ID.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Postingan + category: Kategori + tag: Tagar + +# The tabs of sidebar +tabs: + # format: : + home: Beranda + categories: Kategori + tags: Tagar + archives: Arsip + about: Tentang + +# the text displayed in the search bar & search results +search: + hint: Cari + cancel: Batal + no_results: Ups! Tidak ada hasil yang ditemukan. + +panel: + lastmod: Postingan Terbaru + trending_tags: Tagar Terpopuler + toc: Konten + +copyright: + # Shown at the bottom of the post + license: + template: Postingan ini dilisensikan di bawah :LICENSE_NAME oleh penulis. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Sebagian konten dilindungi. + verbose: >- + Kecuali jika dinyatakan, Postingan blog di situs ini dilisensikan + di bawah Lisensi Creative Commons Attribution 4.0 International (CC BY 4.0) oleh penulis. + +meta: Didukung oleh :PLATFORM dengan tema :THEME + +not_found: + statement: Maaf, kami gagal menemukan URL itu atau memang mengarah ke sesuatu yang tidak ada. + +notification: + update_found: Versi konten baru tersedia. + update: Perbarui + +# ----- Posts related labels ----- + +post: + written_by: Oleh + posted: Diterbitkan + updated: Diperbarui + words: kata + pageview_measure: dilihat + read_time: + unit: menit + prompt: baca + relate_posts: Postingan Lainya + share: Bagikan + button: + next: Terbaru + previous: Terlama + copy_code: + succeed: Disalin! + share_link: + title: Salin tautan + succeed: Tautan berhasil disalin! + +# categories page +categories: + category_measure: kategori + post_measure: Postingan diff --git a/_data/locales/it-IT.yml b/_data/locales/it-IT.yml new file mode 100644 index 0000000..c8dfb44 --- /dev/null +++ b/_data/locales/it-IT.yml @@ -0,0 +1,90 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Post + category: Categoria + tag: Tag + +# The tabs of sidebar +tabs: + # format: : + home: Pagina principale + categories: Categorie + tags: Tags + archives: Archivio + about: Informazioni + +# the text displayed in the search bar & search results +search: + hint: ricerca + cancel: Cancella + no_results: Oops! La ricerca non ha fornito risultati. + +panel: + lastmod: Aggiornati recentemente + trending_tags: Tags più cliccati + toc: Contenuti + +copyright: + # Shown at the bottom of the post + license: + template: Questo post è sotto licenza :LICENSE_NAME a nome dell'autore. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Alcuni diritti riservati. + verbose: >- + Eccetto quando esplicitamente menzionato, i post di questo blog sono da ritenersi sotto + i termini di licenza Creative Commons Attribution 4.0 International (CC BY 4.0). + +meta: Servizio offerto da :PLATFORM con tema :THEME +not_found: + statement: Ci scusiamo, non è stato possibile trovare l'URL in questione. Potrebbe puntare ad una pagina non esistente. + +notification: + update_found: Nuova versione del contenuto disponibile. + update: Aggiornamento + +# ----- Posts related labels ----- + +post: + written_by: Da + posted: Postato + updated: Aggiornato + words: parole + pageview_measure: visioni + read_time: + unit: min + prompt: lettura + relate_posts: Continua a leggere + share: Condividi + button: + next: Più recenti + previous: Meno recenti + copy_code: + succeed: Copiato! + share_link: + title: Copia link + succeed: Link copiato con successo! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: categoria + plural: categorie + post_measure: + singular: post + plural: posts diff --git a/_data/locales/ko-KR.yml b/_data/locales/ko-KR.yml new file mode 100644 index 0000000..8297634 --- /dev/null +++ b/_data/locales/ko-KR.yml @@ -0,0 +1,84 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: 포스트 + category: 카테고리 + tag: 태그 + +# The tabs of sidebar +tabs: + # format: : + home: 홈 + categories: 카테고리 + tags: 태그 + archives: 아카이브 + about: 정보 + +# the text displayed in the search bar & search results +search: + hint: 검색 + cancel: 취소 + no_results: 검색 결과가 없습니다. + +panel: + lastmod: 최근 업데이트 + trending_tags: 인기 태그 + toc: 바로가기 + +copyright: + # Shown at the bottom of the post + license: + template: 이 기사는 저작권자의 :LICENSE_NAME 라이센스를 따릅니다. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: 일부 권리 보유 + verbose: >- + 명시되지 않는 한 이 사이트의 블로그 게시물은 작성자의 + Creative Commons Attribution 4.0 International(CC BY 4.0) 라이선스에 따라 사용이 허가되었습니다. + +meta: Powered by :PLATFORM with :THEME theme + +not_found: + statement: 해당 URL은 존재하지 않습니다. + +notification: + update_found: 새 버전의 콘텐츠를 사용할 수 있습니다. + update: 업데이트 + +# ----- Posts related labels ----- + +post: + written_by: By + posted: 게시 + updated: 업데이트 + words: 단어 + pageview_measure: 조회 + read_time: + unit: 분 + prompt: 읽는 시간 + relate_posts: 관련된 글 + share: 공유하기 + button: + next: 다음 글 + previous: 이전 글 + copy_code: + succeed: 복사되었습니다! + share_link: + title: 링크 복사하기 + succeed: 링크가 복사되었습니다! + +# Date time format. +# See: , +df: + post: + strftime: "%Y/%m/%d" + dayjs: "YYYY/MM/DD" + +# categories page +categories: + category_measure: 카테고리 + post_measure: 포스트 diff --git a/_data/locales/my-MM.yml b/_data/locales/my-MM.yml new file mode 100644 index 0000000..d5bf728 --- /dev/null +++ b/_data/locales/my-MM.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: ပို့စ် + category: ကဏ္ဍ + tag: နာမ(တက်ဂ်) + +# The tabs of sidebar +tabs: + # format: : + home: အဓိကစာမျက်နှာ + categories: ကဏ္ဍများ + tags: နာမ(တက်ဂ်)များ + archives: မှတ်တမ်း​တိုက် + about: အကြောင်းအရာ + +# the text displayed in the search bar & search results +search: + hint: ရှာဖွေမည် + cancel: ဖျက်သိမ်းမည် + no_results: အိုး! ဘာမှမရှိပါ + +panel: + lastmod: မကြာသေးမီကမွမ်းမံထားသည် + trending_tags: ခေတ်စားနေသည့်တက်ဂ်များ + toc: အကြောင်းအရာများ + +copyright: + # Shown at the bottom of the post + license: + template: ဤပို့စ်သည်စာရေးသူ၏ :LICENSE_NAME လိုင်စင်ရထားသည်။ + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: မူပိုင်ခွင့်အချို့ကို လက်ဝယ်ထားသည်။ + verbose: >- + အခြားမှတ်သားထားချက်များမှလွဲ၍ ဤဆိုက်ရှိ ဘလော့ဂ်ပို့စ်များသည် စာရေးသူ၏ + Creative Commons Attribution 4.0 International (CC BY 4.0) အောက်တွင် လိုင်စင်ရထားပါသည်။ + +meta: Powered by :PLATFORM with :THEME theme + +not_found: + statement: ဝမ်းနည်းပါသည်၊ ကျွန်ုပ်တို့သည် အဆိုပါ URL ကို မှားယွင်းစွာ နေရာချထားခြင်း သို့မဟုတ် ၎င်းသည် မရှိသောအရာကို ညွှန်ပြနေပါသည်။ + +notification: + update_found: အကြောင်းအရာဗားရှင်းအသစ်ကို ရနိုင်ပါပြီ။ + update: အပ်ဒိတ် + +# ----- Posts related labels ----- + +post: + written_by: ကရေးသားခဲ့သည်။ + posted: တင်ထားခဲ့သည်။ + updated: မွမ်းမံထားခဲ့သည်။ + words: စကားလုံးများ + pageview_measure: အမြင်များ + read_time: + unit: မိနစ် + prompt: ဖတ်ပါမည် + relate_posts: နောက်ထပ်ဖတ်ရန် + share: မျှဝေရန် + button: + next: အသစ်များ + previous: အဟောင်းများ + copy_code: + succeed: ကူးယူလိုက်ပြီ။ + share_link: + title: လင့်ခ်ကို ကူးယူရန် + succeed: လင့်ခ်ကို ကူးယူလိုက်ပြီ။ + +# categories page +categories: + category_measure: ကဏ္ဍများ + post_measure: ပို့စ်များ diff --git a/_data/locales/pt-BR.yml b/_data/locales/pt-BR.yml new file mode 100644 index 0000000..7ca60a7 --- /dev/null +++ b/_data/locales/pt-BR.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Post + category: Categoria + tag: Tag + +# The tabs of sidebar +tabs: + # format: : + home: Home + categories: Categorias + tags: Tags + archives: Arquivos + about: Sobre + +# the text displayed in the search bar & search results +search: + hint: Buscar + cancel: Cancelar + no_results: Oops! Nenhum resultado encontrado. + +panel: + lastmod: Atualizados recentemente + trending_tags: Trending Tags + toc: Conteúdo + +copyright: + # Shown at the bottom of the post + license: + template: Esta postagem está licenciada sob :LICENSE_NAME pelo autor. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Alguns direitos reservados. + verbose: >- + Exceto onde indicado de outra forma, as postagens do blog neste site são licenciadas sob a + Creative Commons Attribution 4.0 International (CC BY 4.0) License pelo autor. + +meta: Feito com :PLATFORM usando o tema :THEME + +not_found: + statement: Desculpe, a página não foi encontrada. + +notification: + update_found: Uma nova versão do conteúdo está disponível. + update: atualização + +# ----- Posts related labels ----- + +post: + written_by: Por + posted: Postado em + updated: Atualizado + words: palavras + pageview_measure: visualizações + read_time: + unit: min + prompt: " de leitura" + relate_posts: Leia também + share: Compartilhar + button: + next: Próximo + previous: Anterior + copy_code: + succeed: Copiado! + share_link: + title: Copie o link + succeed: Link copiado com sucesso! + +# categories page +categories: + category_measure: categorias + post_measure: posts diff --git a/_data/locales/ru-RU.yml b/_data/locales/ru-RU.yml new file mode 100644 index 0000000..868ba95 --- /dev/null +++ b/_data/locales/ru-RU.yml @@ -0,0 +1,87 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Пост + category: Категория + tag: Тег + +# The tabs of sidebar +tabs: + # format: : + home: Главная + categories: Категории + tags: Теги + archives: Архив + about: О сайте + +# the text displayed in the search bar & search results +search: + hint: поиск + cancel: Отмена + no_results: Упс! Ничего не найдено. + +panel: + lastmod: Недавно обновлено + trending_tags: Популярные теги + toc: Содержание + +copyright: + # Shown at the bottom of the post + license: + template: Авторский пост защищен лицензией :LICENSE_NAME. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Некоторые права защищены. + verbose: >- + Если не указано иное, авторские посты на этом сайте защищены лицензией Creative Commons Attribution 4.0 International (CC BY 4.0). + +meta: Использует тему :THEME для :PLATFORM + +not_found: + statement: Извините, мы перепутали URL-адрес или он указывает на что-то несуществующее. + +notification: + update_found: Доступна новая версия контента. + update: Обновить + +# ----- Posts related labels ----- + +post: + written_by: Автор + posted: Опубликовано + updated: Обновлено + words: слов + pageview_measure: просмотров + read_time: + unit: мин. + prompt: чтения + relate_posts: Похожие посты + share: Поделиться + button: + next: Следующий пост + previous: Предыдущий пост + copy_code: + succeed: Скопировано! + share_link: + title: Скопировать ссылку + succeed: Ссылка успешно скопирована! + +# Date time format. +# See: , +df: + post: + strftime: "%d.%m.%Y" + dayjs: "DD.MM.YYYY" + +# categories page +categories: + category_measure: + singular: категория + plural: категории + post_measure: + singular: пост + plural: посты diff --git a/_data/locales/sl-SI.yml b/_data/locales/sl-SI.yml new file mode 100644 index 0000000..4d9434d --- /dev/null +++ b/_data/locales/sl-SI.yml @@ -0,0 +1,91 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Objava #Post + category: Kategorija #Category + tag: Oznaka #Tag + +# The tabs of sidebar +tabs: + # format: : + home: Domov #Home + categories: Kategorije #Categories + tags: Oznake #Tags + archives: Arhiv #Archives + about: O meni #About + +# the text displayed in the search bar & search results +search: + hint: išči #search + cancel: Prekliči #Cancel + no_results: Ups! Vsebina ni bila najdena #Oops! No results found. + +panel: + lastmod: Nedavno Posodobljeno #Recently Updated + trending_tags: Priljubljene Oznake #Trending Tags + toc: Vsebina #Contents + +copyright: + # Shown at the bottom of the post + license: + template: Ta objava je licencirana pod :LICENCE_NAME s strani avtorja. #This post is licensed under :LICENSE_NAME by the author. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Nekatere pravice pridržane. #Some rights reserved. + verbose: >- + Razen kjer navedeno drugače, vse objave spletnega dnevnika so licencirane + pod Creative Commons Attribution 4.0 International (CC BY 4.0) s strani avtorja. + +meta: Uporabljena :PLATFORM tema :THEME #Using the :PLATFORM theme :THEME + +not_found: + statement: Oprostite, hiperpovezava je neustrezna ali vsebina ne obstajata. #Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. + +notification: + update_found: Novejša različica vsebine je na voljo. #A new version of content is available. + update: Posodobi #Update + +# ----- Posts related labels ----- + +post: + written_by: Od #By + posted: Objavljeno #Posted + updated: Posodobljeno #Updated + words: besede #words + pageview_measure: ogledi #views + read_time: + unit: min + prompt: beri #read + relate_posts: Nadaljnje branje #Further Reading + share: Deli #Share + button: + next: Novejše #Newer + previous: Starejše #Older + copy_code: + succeed: Kopirano! #Copied! + share_link: + title: Kopiraj povezavo #Copy link + succeed: Povezava uspešno kopirana! #Link copied successfully! + +# Date time format. +# See: , +df: + post: + strftime: "%e %b, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: kategorija #category + plural: kategorije #categories + post_measure: + singular: objava #post + plural: objave #posts diff --git a/_data/locales/sv-SE.yml b/_data/locales/sv-SE.yml new file mode 100644 index 0000000..decb59c --- /dev/null +++ b/_data/locales/sv-SE.yml @@ -0,0 +1,91 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Inlägg #Post + category: Kategori #Category + tag: Tagga #Tag + +# The tabs of sidebar +tabs: + # format: : + home: Hem #Home + categories: Kategorier #Categories + tags: Taggar #Tags + archives: Arkiv #Archives + about: Om #About + +# the text displayed in the search bar & search results +search: + hint: sök + cancel: Avbryt + no_results: Hoppsan! Hittade inga sökträffar. + +panel: + lastmod: Senast uppdaterad + trending_tags: Trendande taggar + toc: Innehåll + +copyright: + # Shown at the bottom of the post + license: + template: Den här posten är publicerad under licensen :LICENSE_NAME av författaren. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Vissa rättigheter är reserverade. + verbose: >- + Om inte annat anges är blogginläggen på denna webbplats licensierade + under Creative Commons Attribution 4.0 International (CC BY 4.0) av författaren. + +meta: Byggd med :PLATFORM och temat :THEME + +not_found: + statement: Ursäkta, vi har tappat bort den här webbadressen eller så pekar den på något som inte längre finns. + +notification: + update_found: Det finns en ny version av innehållet. + update: Uppdatera sidan + +# ----- Posts related labels ----- + +post: + written_by: Av + posted: Postad + updated: Uppdaterad + words: ord + pageview_measure: visningar + read_time: + unit: min + prompt: läsning + relate_posts: Mer läsning + share: Dela + button: + next: Nyare + previous: Äldre + copy_code: + succeed: Kopierat! + share_link: + title: Kopiera länk + succeed: Länken har kopierats! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: kategori + plural: kategorier + post_measure: + singular: inlägg + plural: inlägg diff --git a/_data/locales/th.yml b/_data/locales/th.yml new file mode 100644 index 0000000..a3f41a0 --- /dev/null +++ b/_data/locales/th.yml @@ -0,0 +1,91 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: โพสต์ + category: หมวดหมู่ + tag: แท็ก + +# The tabs of sidebar +tabs: + # format: : + home: หน้าแรก + categories: หมวดหมู่ + tags: แท็ก + archives: คลังเก็บ + about: เกี่ยวกับ + +# the text displayed in the search bar & search results +search: + hint: ค้นหา + cancel: ยกเลิก + no_results: โอ๊ะ! ไม่พบผลลัพธ์ + +panel: + lastmod: อัปเดตล่าสุด + trending_tags: แท็กยอดนิยม + toc: เนื้อหา + +copyright: + # Shown at the bottom of the post + license: + template: โพสต์นี้อยู่ภายใต้การอนุญาต :LICENSE_NAME โดยผู้เขียน + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: สงวนลิขสิทธิ์เป็นบางส่วน + verbose: >- + เว้นแต่ว่าจะระบุเป็นอย่างอื่น โพสต์บนเว็บไซต์นี้อยู่ภายใต้ + สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบ 4.0 นานาชาติ (CC BY 4.0) โดยผู้เขียน + +meta: กำลังใช้ธีมของ :PLATFORM ชื่อ :THEME + +not_found: + statement: ขออภัย เราวาง URL นั้นไว้ผิดที่ หรือมันชี้ไปยังสิ่งที่ไม่มีอยู่ + +notification: + update_found: มีเวอร์ชันใหม่ของเนื้อหา + update: อัปเดต + +# ----- Posts related labels ----- + +post: + written_by: โดย + posted: โพสต์เมื่อ + updated: อัปเดตเมื่อ + words: คำ + pageview_measure: ครั้ง + read_time: + unit: นาที + prompt: อ่าน + relate_posts: อ่านต่อ + share: แชร์ + button: + next: ใหม่กว่า + previous: เก่ากว่า + copy_code: + succeed: คัดลอกแล้ว! + share_link: + title: คัดลอกลิงก์ + succeed: คัดลอกลิงก์เรียบร้อยแล้ว! + +# Date time format. +# See: , +df: + post: + strftime: "%b %e, %Y" + dayjs: "ll" + archives: + strftime: "%b" + dayjs: "MMM" + +# categories page +categories: + category_measure: + singular: หมวดหมู่ + plural: หมวดหมู่ + post_measure: + singular: โพสต์ + plural: โพสต์ diff --git a/_data/locales/tr-TR.yml b/_data/locales/tr-TR.yml new file mode 100644 index 0000000..768f57c --- /dev/null +++ b/_data/locales/tr-TR.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Gönderi + category: Kategori + tag: Etiket + +# The tabs of sidebar +tabs: + # format: : + home: Ana Sayfa + categories: Kategoriler + tags: Etiketler + archives: Arşiv + about: Hakkında + +# the text displayed in the search bar & search results +search: + hint: Ara... + cancel: İptal + no_results: Hop! Öyle bir şey bulamadım. + +panel: + lastmod: Son Güncellenenler + trending_tags: Yükselen Etiketler + toc: İçindekiler + +copyright: + # Shown at the bottom of the post + license: + template: Bu gönderi :LICENSE_NAME lisansı altındadır. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/deed.tr + + # Displayed in the footer + brief: Bazı hakları saklıdır. + verbose: >- + Aksi belirtilmediği sürece, bu sitedeki gönderiler Creative Commons Atıf 4.0 Uluslararası (CC BY 4.0) Lisansı altındadır. + Kısaca sayfa linkini vererek değiştirebilir / paylaşabilirsiniz. + +meta: :PLATFORM ve :THEME teması + +not_found: + statement: Üzgünüz, bu linki yanlış yerleştirdik veya var olmayan bir şeye işaret ediyor. + +notification: + update_found: İçeriğin yeni bir sürümü mevcut. + update: Güncelle + +# ----- Posts related labels ----- + +post: + written_by: Yazan + posted: Gönderim + updated: Güncelleme + words: sözcük + pageview_measure: görüntülenme + read_time: + unit: dakikada + prompt: okunabilir + relate_posts: Benzer Gönderiler + share: Paylaş + button: + next: İleri + previous: Geri + copy_code: + succeed: Kopyalandı. + share_link: + title: Linki kopyala + succeed: Link kopyalandı. + +# categories page +categories: + category_measure: kategori + post_measure: gönderi diff --git a/_data/locales/uk-UA.yml b/_data/locales/uk-UA.yml new file mode 100644 index 0000000..8fef52e --- /dev/null +++ b/_data/locales/uk-UA.yml @@ -0,0 +1,77 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Публікація + category: Категорія + tag: Тег + +# The tabs of sidebar +tabs: + # format: : + home: Домашня сторінка + categories: Категорії + tags: Теги + archives: Архів + about: Про сайт + +# the text displayed in the search bar & search results +search: + hint: пошук + cancel: Скасувати + no_results: Ох! Нічого не знайдено. + +panel: + lastmod: Нещодавно оновлено + trending_tags: Популярні теги + toc: Зміст + +copyright: + # Shown at the bottom of the post + license: + template: Публікація захищена ліцензією :LICENSE_NAME. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Деякі права захищено. + verbose: >- + Публікації на сайті захищено ліцензією Creative Commons Attribution 4.0 International (CC BY 4.0), + якщо інше не вказано в тексті. + +meta: Powered by :PLATFORM with :THEME theme + +not_found: + statement: Вибачте, це посилання вказує на ресурс, що не існує. + +notification: + update_found: Доступна нова версія вмісту. + update: Оновлення + +# ----- Posts related labels ----- + +post: + written_by: Автор + posted: Час публікації + updated: Оновлено + words: слів + pageview_measure: переглядів + read_time: + unit: хвилин + prompt: читання + relate_posts: Вас також може зацікавити + share: Поділитися + button: + next: Попередня публікація + previous: Наступна публікація + copy_code: + succeed: Успішно скопійовано! + share_link: + title: Скопіювати посилання + succeed: Посилання успішно скопійовано! + +# categories page +categories: + category_measure: категорії + post_measure: публікації diff --git a/_data/locales/vi-VN.yml b/_data/locales/vi-VN.yml new file mode 100644 index 0000000..6c2ceff --- /dev/null +++ b/_data/locales/vi-VN.yml @@ -0,0 +1,76 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: Bài viết + category: Danh mục + tag: Thẻ + +# The tabs of sidebar +tabs: + # format: : + home: Trang chủ + categories: Các danh mục + tags: Các thẻ + archives: Lưu trữ + about: Giới thiệu + +# the text displayed in the search bar & search results +search: + hint: tìm kiếm + cancel: Hủy + no_results: Không có kết quả tìm kiếm. + +panel: + lastmod: Mới cập nhật + trending_tags: Các thẻ thịnh hành + toc: Mục lục + +copyright: + # Shown at the bottom of the post + license: + template: Bài viết này được cấp phép bởi tác giả theo giấy phép :LICENSE_NAME. + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: Một số quyền được bảo lưu. + verbose: >- + Trừ khi có ghi chú khác, các bài viết đăng trên trang này được cấp phép bởi tác giả theo giấy phép Creative Commons Attribution 4.0 International (CC BY 4.0). + +meta: Trang web này được tạo bởi :PLATFORM với chủ đề :THEME + +not_found: + statement: Xin lỗi, chúng tôi đã đặt nhầm URL hoặc đường dẫn trỏ đến một trang nào đó không tồn tại. + +notification: + update_found: Đã có phiên bản mới của nội dung. + update: Cập nhật + +# ----- Posts related labels ----- + +post: + written_by: Viết bởi + posted: Đăng lúc + updated: Cập nhật lúc + words: từ + pageview_measure: lượt xem + read_time: + unit: phút + prompt: đọc + relate_posts: Bài viết liên quan + share: Chia sẻ + button: + next: Mới hơn + previous: Cũ hơn + copy_code: + succeed: Đã sao chép! + share_link: + title: Sao chép đường dẫn + succeed: Đã sao chép đường dẫn thành công! + +# categories page +categories: + category_measure: danh mục + post_measure: bài viết diff --git a/_data/locales/zh-CN.yml b/_data/locales/zh-CN.yml new file mode 100644 index 0000000..5c13410 --- /dev/null +++ b/_data/locales/zh-CN.yml @@ -0,0 +1,83 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: 文章 + category: 分类 + tag: 标签 + +# The tabs of sidebar +tabs: + # format: : + home: 首页 + categories: 分类 + tags: 标签 + archives: 归档 + about: 关于 + +# the text displayed in the search bar & search results +search: + hint: 搜索 + cancel: 取消 + no_results: 搜索结果为空 + +panel: + lastmod: 最近更新 + trending_tags: 热门标签 + toc: 文章内容 + +copyright: + # Shown at the bottom of the post + license: + template: 本文由作者按照 :LICENSE_NAME 进行授权 + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: 保留部分权利。 + verbose: >- + 除非另有说明,本网站上的博客文章均由作者按照知识共享署名 4.0 国际 (CC BY 4.0) 许可协议进行授权。 + +meta: 本站采用 :PLATFORM 主题 :THEME + +not_found: + statement: 抱歉,我们放错了该 URL,或者它指向了不存在的内容。 + +notification: + update_found: 发现新版本的内容。 + update: 更新 + +# ----- Posts related labels ----- + +post: + written_by: 作者 + posted: 发表于 + updated: 更新于 + words: 字 + pageview_measure: 次浏览 + read_time: + unit: 分钟 + prompt: 阅读 + relate_posts: 相关文章 + share: 分享 + button: + next: 下一篇 + previous: 上一篇 + copy_code: + succeed: 已复制! + share_link: + title: 分享链接 + succeed: 链接已复制! + +# Date time format. +# See: , +df: + post: + strftime: "%Y/%m/%d" + dayjs: "YYYY/MM/DD" + +# categories page +categories: + category_measure: 个分类 + post_measure: 篇文章 diff --git a/_data/locales/zh-TW.yml b/_data/locales/zh-TW.yml new file mode 100644 index 0000000..33a4330 --- /dev/null +++ b/_data/locales/zh-TW.yml @@ -0,0 +1,83 @@ +# The layout text of site + +# ----- Commons label ----- + +layout: + post: 文章 + category: 分類 + tag: 標籤 + +# The tabs of sidebar +tabs: + # format: : + home: 首頁 + categories: 分類 + tags: 標籤 + archives: 封存 + about: 關於 + +# the text displayed in the search bar & search results +search: + hint: 搜尋 + cancel: 取消 + no_results: 沒有搜尋結果 + +panel: + lastmod: 最近更新 + trending_tags: 熱門標籤 + toc: 文章摘要 + +copyright: + # Shown at the bottom of the post + license: + template: 本文章以 :LICENSE_NAME 授權 + name: CC BY 4.0 + link: https://creativecommons.org/licenses/by/4.0/ + + # Displayed in the footer + brief: 保留部份權利。 + verbose: >- + 除非另有說明,否則本網誌的文章均由作者按照姓名標示 4.0 國際 (CC BY 4.0) 授權條款進行授權。 + +meta: 本網站使用 :PLATFORM 產生,採用 :THEME 主題 + +not_found: + statement: 抱歉,您可能正在存取一個已被移動的 URL,或者它從未存在。 + +notification: + update_found: 發現新版本更新。 + update: 更新 + +# ----- Posts related labels ----- + +post: + written_by: 作者 + posted: 發布於 + updated: 更新於 + words: 字 + pageview_measure: 次瀏覽 + read_time: + unit: 分鐘 + prompt: 閱讀 + relate_posts: 相關文章 + share: 分享 + button: + next: 下一篇 + previous: 上一篇 + copy_code: + succeed: 已複製! + share_link: + title: 分享連結 + succeed: 已複製連結! + +# Date time format. +# See: , +df: + post: + strftime: "%Y/%m/%d" + dayjs: "YYYY/MM/DD" + +# categories page +categories: + category_measure: 個分類 + post_measure: 篇文章 diff --git a/_data/media.yml b/_data/media.yml new file mode 100644 index 0000000..9cd69b4 --- /dev/null +++ b/_data/media.yml @@ -0,0 +1,18 @@ +- extension: mp3 + mime_type: mpeg +- extension: mov + mime_type: quicktime +- extension: avi + mime_type: x-msvideo +- extension: mkv + mime_type: x-matroska +- extension: ogv + mime_type: ogg +- extension: weba + mime_type: webm +- extension: 3gp + mime_type: 3gpp +- extension: 3g2 + mime_type: 3gpp2 +- extension: mid + mime_type: midi diff --git a/_data/origin/basic.yml b/_data/origin/basic.yml new file mode 100644 index 0000000..2d52982 --- /dev/null +++ b/_data/origin/basic.yml @@ -0,0 +1,39 @@ +# fonts + +webfonts: /assets/lib/fonts/main.css + +# Libraries + +toc: + css: /assets/lib/tocbot/tocbot.min.css + js: /assets/lib/tocbot/tocbot.min.js + +fontawesome: + css: /assets/lib/fontawesome-free/css/all.min.css + +search: + js: /assets/lib/simple-jekyll-search/simple-jekyll-search.min.js + +mermaid: + js: /assets/lib/mermaid/mermaid.min.js + +dayjs: + js: + common: /assets/lib/dayjs/dayjs.min.js + locale: /assets/lib/dayjs/locale/en.js + relativeTime: /assets/lib/dayjs/plugin/relativeTime.js + localizedFormat: /assets/lib/dayjs/plugin/localizedFormat.js + +glightbox: + css: /assets/lib/glightbox/glightbox.min.css + js: /assets/lib/glightbox/glightbox.min.js + +lazy-polyfill: + css: /assets/lib/loading-attribute-polyfill/loading-attribute-polyfill.min.css + js: /assets/lib/loading-attribute-polyfill/loading-attribute-polyfill.umd.min.js + +clipboard: + js: /assets/lib/clipboard/clipboard.min.js + +mathjax: + js: /assets/lib/mathjax/tex-chtml.js diff --git a/_data/origin/cors.yml b/_data/origin/cors.yml new file mode 100644 index 0000000..afdb3d9 --- /dev/null +++ b/_data/origin/cors.yml @@ -0,0 +1,54 @@ +# Resource Hints +resource_hints: + - url: https://fonts.googleapis.com + links: + - rel: preconnect + - rel: dns-prefetch + - url: https://fonts.gstatic.com + links: + - rel: preconnect + opts: [crossorigin] + - rel: dns-prefetch + - url: https://cdn.jsdelivr.net + links: + - rel: preconnect + - rel: dns-prefetch + +# Web Fonts +webfonts: https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap + +# Libraries + +toc: + css: https://cdn.jsdelivr.net/npm/tocbot@4.29.0/dist/tocbot.min.css + js: https://cdn.jsdelivr.net/npm/tocbot@4.29.0/dist/tocbot.min.js + +fontawesome: + css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.6.0/css/all.min.css + +search: + js: https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js + +mermaid: + js: https://cdn.jsdelivr.net/npm/mermaid@11.0.2/dist/mermaid.min.js + +dayjs: + js: + common: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js + locale: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/:LOCALE.js + relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js + localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js + +glightbox: + css: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css + js: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js + +lazy-polyfill: + css: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2.1.1/dist/loading-attribute-polyfill.min.css + js: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2.1.1/dist/loading-attribute-polyfill.umd.min.js + +clipboard: + js: https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js + +mathjax: + js: https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-chtml.js diff --git a/_data/share.yml b/_data/share.yml new file mode 100644 index 0000000..98649fd --- /dev/null +++ b/_data/share.yml @@ -0,0 +1,50 @@ +# Sharing options at the bottom of the post. +# Icons from + +platforms: [] + # - type: Twitter + # icon: "fa-brands fa-square-x-twitter" + # link: "https://twitter.com/intent/tweet?text=TITLE&url=URL" + + # - type: Facebook + # icon: "fab fa-facebook-square" + # link: "https://www.facebook.com/sharer/sharer.php?title=TITLE&u=URL" + + # - type: Telegram + # icon: "fab fa-telegram" + # link: "https://t.me/share/url?url=URL&text=TITLE" + + # Uncomment below if you need to. + # + # - type: Linkedin + # icon: "fab fa-linkedin" + # link: "https://www.linkedin.com/sharing/share-offsite/?url=URL" + # + # - type: Weibo + # icon: "fab fa-weibo" + # link: "https://service.weibo.com/share/share.php?title=TITLE&url=URL" + # + # - type: Mastodon + # icon: "fa-brands fa-mastodon" + # # See: https://github.com/justinribeiro/share-to-mastodon#properties + # instances: + # - label: mastodon.social + # link: "https://mastodon.social/" + # - label: mastodon.online + # link: "https://mastodon.online/" + # - label: fosstodon.org + # link: "https://fosstodon.org/" + # - label: photog.social + # link: "https://photog.social/" + # + # - type: Bluesky + # icon: "fa-brands fa-bluesky" + # link: "https://bsky.app/intent/compose?text=TITLE%20URL" + # + # - type: Reddit + # icon: "fa-brands fa-square-reddit" + # link: "https://www.reddit.com/submit?url=URL&title=TITLE" + # + # - type: Threads + # icon: "fa-brands fa-square-threads" + # link: "https://www.threads.net/intent/post?text=TITLE%20URL" diff --git a/_includes/analytics/cloudflare.html b/_includes/analytics/cloudflare.html new file mode 100644 index 0000000..1eeb1a9 --- /dev/null +++ b/_includes/analytics/cloudflare.html @@ -0,0 +1,7 @@ + + + diff --git a/_includes/analytics/fathom.html b/_includes/analytics/fathom.html new file mode 100644 index 0000000..4b603d3 --- /dev/null +++ b/_includes/analytics/fathom.html @@ -0,0 +1,7 @@ + + + diff --git a/_includes/analytics/goatcounter.html b/_includes/analytics/goatcounter.html new file mode 100644 index 0000000..3867fdb --- /dev/null +++ b/_includes/analytics/goatcounter.html @@ -0,0 +1,6 @@ + + diff --git a/_includes/analytics/google.html b/_includes/analytics/google.html new file mode 100644 index 0000000..d0aac65 --- /dev/null +++ b/_includes/analytics/google.html @@ -0,0 +1,13 @@ + + + diff --git a/_includes/analytics/matomo.html b/_includes/analytics/matomo.html new file mode 100644 index 0000000..72b2c46 --- /dev/null +++ b/_includes/analytics/matomo.html @@ -0,0 +1,14 @@ + + + diff --git a/_includes/analytics/umami.html b/_includes/analytics/umami.html new file mode 100644 index 0000000..bfcb1d0 --- /dev/null +++ b/_includes/analytics/umami.html @@ -0,0 +1,6 @@ + + diff --git a/_includes/comments.html b/_includes/comments.html new file mode 100644 index 0000000..fef135f --- /dev/null +++ b/_includes/comments.html @@ -0,0 +1,5 @@ + +{% if page.comments and site.comments.provider %} + {% capture path %}comments/{{ site.comments.provider }}.html{% endcapture %} + {% include {{ path }} %} +{% endif %} diff --git a/_includes/comments/disqus.html b/_includes/comments/disqus.html new file mode 100644 index 0000000..2b889a4 --- /dev/null +++ b/_includes/comments/disqus.html @@ -0,0 +1,50 @@ + + +
+

Comments powered by Disqus.

+
+ + diff --git a/_includes/comments/giscus.html b/_includes/comments/giscus.html new file mode 100644 index 0000000..f9becfe --- /dev/null +++ b/_includes/comments/giscus.html @@ -0,0 +1,71 @@ + + diff --git a/_includes/comments/utterances.html b/_includes/comments/utterances.html new file mode 100644 index 0000000..5dd78ed --- /dev/null +++ b/_includes/comments/utterances.html @@ -0,0 +1,49 @@ + + + + diff --git a/_includes/datetime.html b/_includes/datetime.html new file mode 100644 index 0000000..9f954b6 --- /dev/null +++ b/_includes/datetime.html @@ -0,0 +1,20 @@ + + +{% assign df_strftime = site.data.locales[include.lang].df.post.strftime | default: '%d/%m/%Y' %} +{% assign df_dayjs = site.data.locales[include.lang].df.post.dayjs | default: 'DD/MM/YYYY' %} + + diff --git a/_includes/embed/audio.html b/_includes/embed/audio.html new file mode 100644 index 0000000..cf928a7 --- /dev/null +++ b/_includes/embed/audio.html @@ -0,0 +1,35 @@ +{% assign src = include.src | strip %} +{% assign title = include.title | strip %} +{% assign types = include.types | default: '' | strip | split: '|' %} + +{% unless src contains '://' %} + {%- capture src -%} + {% include media-url.html src=src subpath=page.media_subpath %} + {%- endcapture -%} +{% endunless %} + +

+ + {% if title %} + {{ title }} + {% endif %} +

diff --git a/_includes/embed/bilibili.html b/_includes/embed/bilibili.html new file mode 100644 index 0000000..0aa5552 --- /dev/null +++ b/_includes/embed/bilibili.html @@ -0,0 +1,9 @@ + diff --git a/_includes/embed/twitch.html b/_includes/embed/twitch.html new file mode 100644 index 0000000..ed5ec83 --- /dev/null +++ b/_includes/embed/twitch.html @@ -0,0 +1,8 @@ + diff --git a/_includes/embed/video.html b/_includes/embed/video.html new file mode 100644 index 0000000..9b6918f --- /dev/null +++ b/_includes/embed/video.html @@ -0,0 +1,59 @@ +{% assign video_url = include.src %} +{% assign title = include.title %} +{% assign poster_url = include.poster %} +{% assign types = include.types | default: '' | strip | split: '|' %} + +{% unless video_url contains '://' %} + {%- capture video_url -%} + {% include media-url.html src=video_url subpath=page.media_subpath %} + {%- endcapture -%} +{% endunless %} + +{% if poster_url %} + {% unless poster_url contains '://' %} + {%- capture poster_url -%} + {% include media-url.html src=poster_url subpath=page.media_subpath %} + {%- endcapture -%} + {% endunless %} + {% assign poster = 'poster="' | append: poster_url | append: '"' %} +{% endif %} + +{% assign attributes = 'controls' %} + +{% if include.autoplay %} + {% assign attributes = attributes | append: ' ' | append: 'autoplay' %} +{% endif %} + +{% if include.loop %} + {% assign attributes = attributes | append: ' ' | append: 'loop' %} +{% endif %} + +{% if include.muted %} + {% assign attributes = attributes | append: ' ' | append: 'muted' %} +{% endif %} + +

+ + {% if title %} + {{ title }} + {% endif %} +

diff --git a/_includes/embed/youtube.html b/_includes/embed/youtube.html new file mode 100644 index 0000000..8f08002 --- /dev/null +++ b/_includes/embed/youtube.html @@ -0,0 +1,9 @@ + diff --git a/_includes/favicons.html b/_includes/favicons.html new file mode 100644 index 0000000..957c933 --- /dev/null +++ b/_includes/favicons.html @@ -0,0 +1,19 @@ + + +{% capture favicon_path %}{{ '/assets/img/favicons' | relative_url }}{% endcapture %} + + + + +{% if site.pwa.enabled %} + +{% endif %} + + + + + + diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..1ba9b63 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,49 @@ + + +
+

+ {{- '©' }} + + + {% if site.social.links %} + {{ site.social.name }}. + {% else %} + {{ site.social.name }}. + {% endif %} + + {% if site.data.locales[include.lang].copyright.brief %} + + {{- site.data.locales[include.lang].copyright.brief -}} + + {% endif %} +

+ +

+ {%- capture _platform -%} + Jekyll + {%- endcapture -%} + + {%- capture _theme -%} + Chirpy + {%- endcapture -%} + + {{ site.data.locales[include.lang].meta | replace: ':PLATFORM', _platform | replace: ':THEME', _theme }} +

+
diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..af3acdb --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,107 @@ + + + + + + + + + {%- capture seo_tags -%} + {% seo title=false %} + {%- endcapture -%} + + + + {% if page.image %} + {% assign src = page.image.path | default: page.image %} + + {% unless src contains '://' %} + {%- capture img_url -%} + {% include media-url.html src=src subpath=page.media_subpath absolute=true %} + {%- endcapture -%} + + {%- capture old_url -%}{{ src | absolute_url }}{%- endcapture -%} + {%- capture new_url -%}{{ img_url }}{%- endcapture -%} + + {% assign seo_tags = seo_tags | replace: old_url, new_url %} + {% endunless %} + + {% elsif site.social_preview_image %} + {%- capture img_url -%} + {% include media-url.html src=site.social_preview_image absolute=true %} + {%- endcapture -%} + + {%- capture og_image -%} + + {%- endcapture -%} + + {%- capture twitter_image -%} + + + {%- endcapture -%} + + {% assign old_meta_clip = '' %} + {% assign new_meta_clip = og_image | append: twitter_image %} + {% assign seo_tags = seo_tags | replace: old_meta_clip, new_meta_clip %} + {% endif %} + + {{ seo_tags }} + + + {%- unless page.layout == 'home' -%} + {{ page.title | append: ' | ' }} + {%- endunless -%} + {{ site.title }} + + + {% include_cached favicons.html %} + + + {% unless site.assets.self_host.enabled %} + {% for hint in site.data.origin.cors.resource_hints %} + {% for link in hint.links %} + + {% endfor %} + {% endfor %} + {% endunless %} + + + {% unless jekyll.environment == 'production' %} + + {% endunless %} + + + + + + + + + + + + + {% if site.toc and page.toc %} + + {% endif %} + + {% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %} + + {% endif %} + + {% if page.layout == 'page' or page.layout == 'post' %} + + + {% endif %} + + + + {% unless site.theme_mode %} + {% include mode-toggle.html %} + {% endunless %} + + {% include metadata-hook.html %} + diff --git a/_includes/js-selector.html b/_includes/js-selector.html new file mode 100644 index 0000000..4d77d06 --- /dev/null +++ b/_includes/js-selector.html @@ -0,0 +1,109 @@ + + + + +{% assign urls = site.data.origin[type].search.js %} + + + +{% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %} + {% assign urls = urls | append: ',' | append: site.data.origin[type]['lazy-polyfill'].js %} + + {% unless page.layout == 'home' %} + + {% assign urls = urls + | append: ',' + | append: site.data.origin[type].glightbox.js + | append: ',' + | append: site.data.origin[type].clipboard.js + %} + {% endunless %} +{% endif %} + +{% if page.layout == 'home' + or page.layout == 'post' + or page.layout == 'archives' + or page.layout == 'category' + or page.layout == 'tag' +%} + {% assign locale = include.lang | split: '-' | first %} + + {% assign urls = urls + | append: ',' + | append: site.data.origin[type].dayjs.js.common + | append: ',' + | append: site.data.origin[type].dayjs.js.locale + | replace: ':LOCALE', locale + | append: ',' + | append: site.data.origin[type].dayjs.js.relativeTime + | append: ',' + | append: site.data.origin[type].dayjs.js.localizedFormat + %} +{% endif %} + +{% if page.content contains ' + +{% if page.math %} + + + + +{% endif %} + + +{% if page.layout == 'post' %} + {% assign provider = site.pageviews.provider %} + + {% if provider and provider != empty %} + {% case provider %} + {% when 'goatcounter' %} + {% if site.analytics[provider].id != empty and site.analytics[provider].id %} + {% include pageviews/{{ provider }}.html %} + {% endif %} + {% endcase %} + {% endif %} +{% endif %} + +{% if page.mermaid %} + {% include mermaid.html %} +{% endif %} + +{% if jekyll.environment == 'production' %} + + {% if site.pwa.enabled %} + + {% endif %} + + + {% for analytics in site.analytics %} + {% capture str %}{{ analytics }}{% endcapture %} + {% assign type = str | split: '{' | first %} + {% if site.analytics[type].id and site.analytics[type].id != empty %} + {% include analytics/{{ type }}.html %} + {% endif %} + {% endfor %} +{% endif %} diff --git a/_includes/jsdelivr-combine.html b/_includes/jsdelivr-combine.html new file mode 100644 index 0000000..cffa699 --- /dev/null +++ b/_includes/jsdelivr-combine.html @@ -0,0 +1,26 @@ +{% assign urls = include.urls | split: ',' %} + +{% assign combined_urls = nil %} + +{% assign domain = 'https://cdn.jsdelivr.net/' %} + +{% for url in urls %} + {% if url contains domain %} + {% assign url_snippet = url | slice: domain.size, url.size %} + + {% if combined_urls %} + {% assign combined_urls = combined_urls | append: ',' | append: url_snippet %} + {% else %} + {% assign combined_urls = domain | append: 'combine/' | append: url_snippet %} + {% endif %} + + {% elsif url contains '//' %} + + {% else %} + + {% endif %} +{% endfor %} + +{% if combined_urls %} + +{% endif %} diff --git a/_includes/lang.html b/_includes/lang.html new file mode 100644 index 0000000..34b50df --- /dev/null +++ b/_includes/lang.html @@ -0,0 +1,10 @@ +{% comment %} + Detect appearance language and return it through variable "lang" +{% endcomment %} +{% if site.data.locales[page.lang] %} + {% assign lang = page.lang %} +{% elsif site.data.locales[site.lang] %} + {% assign lang = site.lang %} +{% else %} + {% assign lang = 'en' %} +{% endif %} diff --git a/_includes/language-alias.html b/_includes/language-alias.html new file mode 100644 index 0000000..abfa7ba --- /dev/null +++ b/_includes/language-alias.html @@ -0,0 +1,70 @@ +{% comment %} + + Convert the alias of the syntax language to the official name + + See: + +{% endcomment %} + +{% assign _lang = include.language | default: '' %} + +{% case _lang %} + {% when 'actionscript', 'as', 'as3' %} + {{ 'ActionScript' }} + {% when 'applescript' %} + {{ 'AppleScript' }} + {% when 'brightscript', 'bs', 'brs' %} + {{ 'BrightScript' }} + {% when 'cfscript', 'cfc' %} + {{ 'CFScript' }} + {% when 'coffeescript', 'coffee', 'coffee-script' %} + {{ 'CoffeeScript' }} + {% when 'cs', 'csharp' %} + {{ 'C#' }} + {% when 'erl' %} + {{ 'Erlang' }} + {% when 'graphql' %} + {{ 'GraphQL' }} + {% when 'haskell', 'hs' %} + {{ 'Haskell' }} + {% when 'javascript', 'js' %} + {{ 'JavaScript' }} + {% when 'make', 'mf', 'gnumake', 'bsdmake' %} + {{ 'Makefile' }} + {% when 'md', 'mkd' %} + {{ 'Markdown' }} + {% when 'm' %} + {{ 'Matlab' }} + {% when 'objective_c', 'objc', 'obj-c', 'obj_c', 'objectivec' %} + {{ 'Objective-C' }} + {% when 'perl', 'pl' %} + {{ 'Perl' }} + {% when 'php','php3','php4','php5' %} + {{ 'PHP' }} + {% when 'py' %} + {{ 'Python' }} + {% when 'rb' %} + {{ 'Ruby' }} + {% when 'rs','no_run','ignore','should_panic' %} + {{ 'Rust' }} + {% when 'bash', 'zsh', 'ksh', 'sh' %} + {{ 'Shell' }} + {% when 'st', 'squeak' %} + {{ 'Smalltalk' }} + {% when 'tex'%} + {{ 'TeX' }} + {% when 'latex' %} + {{ 'LaTex' }} + {% when 'ts', 'typescript' %} + {{ 'TypeScript' }} + {% when 'vb', 'visualbasic' %} + {{ 'Visual Basic' }} + {% when 'vue', 'vuejs' %} + {{ 'Vue.js' }} + {% when 'yml' %} + {{ 'YAML' }} + {% when 'css', 'html', 'scss', 'ssh', 'toml', 'xml', 'yaml', 'json' %} + {{ _lang | upcase }} + {% else %} + {{ _lang | capitalize }} +{% endcase %} diff --git a/_includes/media-url.html b/_includes/media-url.html new file mode 100644 index 0000000..ea41075 --- /dev/null +++ b/_includes/media-url.html @@ -0,0 +1,37 @@ +{%- comment -%} + Generate media resource final URL based on `site.cdn`, `page.media_subpath` + + Arguments: + src - required, basic media resources path + subpath - optional, relative path of media resources + absolute - optional, boolean, if true, generate absolute URL + + Return: + media resources URL +{%- endcomment -%} + +{% assign url = include.src %} + +{%- if url -%} + {% unless url contains ':' %} + {%- comment -%} Add media resources subpath prefix {%- endcomment -%} + {% assign url = include.subpath | default: '' | append: '/' | append: url %} + + {%- comment -%} Prepend CND URL {%- endcomment -%} + {% if site.cdn %} + {% assign url = site.cdn | append: '/' | append: url %} + {% endif %} + + {% assign url = url | replace: '///', '/' | replace: '//', '/' | replace: ':/', '://' %} + + {% unless url contains '://' %} + {% if include.absolute %} + {% assign url = site.url | append: site.baseurl | append: url %} + {% else %} + {% assign url = site.baseurl | append: url %} + {% endif %} + {% endunless %} + {% endunless %} +{%- endif -%} + +{{- url -}} diff --git a/_includes/mermaid.html b/_includes/mermaid.html new file mode 100644 index 0000000..a3a83ed --- /dev/null +++ b/_includes/mermaid.html @@ -0,0 +1,62 @@ + + diff --git a/_includes/metadata-hook.html b/_includes/metadata-hook.html new file mode 100644 index 0000000..fd7e9bd --- /dev/null +++ b/_includes/metadata-hook.html @@ -0,0 +1 @@ + diff --git a/_includes/mode-toggle.html b/_includes/mode-toggle.html new file mode 100644 index 0000000..113ec37 --- /dev/null +++ b/_includes/mode-toggle.html @@ -0,0 +1,116 @@ + + + diff --git a/_includes/no-linenos.html b/_includes/no-linenos.html new file mode 100644 index 0000000..8500693 --- /dev/null +++ b/_includes/no-linenos.html @@ -0,0 +1,10 @@ +{% comment %} + Remove the line number of the code snippet. +{% endcomment %} + +{% assign content = include.content %} + +{% if content contains '
' %}
+  {% assign content = content | replace: '
', '' %}
+{% endif %}
diff --git a/_includes/notification.html b/_includes/notification.html
new file mode 100644
index 0000000..80049b0
--- /dev/null
+++ b/_includes/notification.html
@@ -0,0 +1,24 @@
+
diff --git a/_includes/origin-type.html b/_includes/origin-type.html
new file mode 100644
index 0000000..7f72012
--- /dev/null
+++ b/_includes/origin-type.html
@@ -0,0 +1,13 @@
+{% comment %} Site static assets origin type {% endcomment %}
+
+{% assign type = 'cors' %}
+
+{% if site.assets.self_host.enabled %}
+  {% if site.assets.self_host.env %}
+    {% if site.assets.self_host.env == jekyll.environment %}
+      {% assign type = 'basic' %}
+    {% endif %}
+  {% else %}
+    {% assign type = 'basic' %}
+  {% endif %}
+{% endif %}
diff --git a/_includes/pageviews/goatcounter.html b/_includes/pageviews/goatcounter.html
new file mode 100644
index 0000000..e62fd69
--- /dev/null
+++ b/_includes/pageviews/goatcounter.html
@@ -0,0 +1,19 @@
+
+
diff --git a/_includes/post-description.html b/_includes/post-description.html
new file mode 100644
index 0000000..6c40036
--- /dev/null
+++ b/_includes/post-description.html
@@ -0,0 +1,16 @@
+{%- comment -%}
+  Get post description or generate it from the post content.
+{%- endcomment -%}
+
+{%- assign max_length = include.max_length | default: 200 -%}
+
+{%- capture description -%}
+{%- if post.description -%}
+  {{- post.description -}}
+{%- else -%}
+  {%- include no-linenos.html content=post.content -%}
+  {{- content | markdownify | strip_html -}}
+{%- endif -%}
+{%- endcapture -%}
+
+{{- description | strip | truncate: max_length | escape -}}
diff --git a/_includes/post-nav.html b/_includes/post-nav.html
new file mode 100644
index 0000000..736bec3
--- /dev/null
+++ b/_includes/post-nav.html
@@ -0,0 +1,34 @@
+
+
+
diff --git a/_includes/post-paginator.html b/_includes/post-paginator.html
new file mode 100644
index 0000000..c74e978
--- /dev/null
+++ b/_includes/post-paginator.html
@@ -0,0 +1,91 @@
+
+
+
+
diff --git a/_includes/post-sharing.html b/_includes/post-sharing.html
new file mode 100644
index 0000000..d894199
--- /dev/null
+++ b/_includes/post-sharing.html
@@ -0,0 +1,52 @@
+
+
+
diff --git a/_includes/read-time.html b/_includes/read-time.html
new file mode 100644
index 0000000..9952410
--- /dev/null
+++ b/_includes/read-time.html
@@ -0,0 +1,37 @@
+
+
+{% assign words = include.content | strip_html | number_of_words: 'auto' %}
+
+
+
+{% assign wpm = 180 %}
+{% assign min_time = 1 %}
+
+{% assign read_time = words | divided_by: wpm %}
+
+{% unless read_time > 0 %}
+  {% assign read_time = min_time %}
+{% endunless %}
+
+{% capture read_prompt %}
+  {{- site.data.locales[include.lang].post.read_time.prompt -}}
+{% endcapture %}
+
+
+
+  
+    {{- read_time -}}
+    {{ ' ' }}
+    {{- site.data.locales[include.lang].post.read_time.unit -}}
+  
+  {%- if include.prompt -%}
+    {%- assign _prompt_words = read_prompt | number_of_words: 'auto' -%}
+    {%- unless _prompt_words > 1 -%}{{ ' ' }}{%- endunless -%}
+    {{ read_prompt }}
+  {%- endif -%}
+
diff --git a/_includes/refactor-content.html b/_includes/refactor-content.html
new file mode 100644
index 0000000..8d298cd
--- /dev/null
+++ b/_includes/refactor-content.html
@@ -0,0 +1,255 @@
+
+
+{% assign _content = include.content %}
+
+
+
+{% if _content contains '', ''
+    | replace: '
', '' + | replace: '
', '
' + %} +{% endif %} + + + +{% if _content contains '
' %}
+  {% assign _content = _content
+    | replace: '
', '' + %} +{% endif %} + + + +{% if _content contains '', + '' + | replace: '', + '' + %} +{% endif %} + + + +{% assign IMG_TAG = '' | first %} + {% assign _right = _img_snippet | remove: _left %} + + {% unless _left contains 'src=' %} + {% continue %} + {% endunless %} + + {% assign _left = _left | remove: ' /' | replace: ' w=', ' width=' | replace: ' h=', ' height=' %} + {% assign _attrs = _left | split: '" ' %} + + {% assign _src = null %} + {% assign _lqip = null %} + {% assign _class = null %} + + {% for _attr in _attrs %} + {% unless _attr contains '=' %} + {% continue %} + {% endunless %} + + {% assign _pair = _attr | split: '="' %} + {% capture _key %}{{ _pair | first }}{% endcapture %} + {% capture _value %}{{ _pair | last | remove: '"' }}{% endcapture %} + + {% case _key %} + {% when 'src' %} + {% assign _src = _value %} + {% when 'lqip' %} + {% assign _lqip = _value %} + {% when 'class' %} + {% assign _class = _value %} + {% endcase %} + {% endfor %} + + + {% if _class %} + {% capture _old_class %}class="{{ _class }}"{% endcapture %} + {% assign _left = _left | remove: _old_class %} + {% endif %} + + {% assign _final_src = null %} + {% assign _lazyload = true %} + + {%- capture _img_url -%} + {% include media-url.html src=_src subpath=page.media_subpath %} + {%- endcapture -%} + + {% assign _path_prefix = _img_url | remove: _src %} + + {% unless _src contains '//' %} + {% assign _final_src = _path_prefix | append: _src %} + {% assign _src_alt = 'src="' | append: _path_prefix %} + {% assign _left = _left | replace: 'src="', _src_alt %} + {% endunless %} + + {% if _lqip %} + {% assign _lazyload = false %} + {% assign _class = _class | append: ' blur' %} + + {% unless _lqip contains 'data:' %} + {% assign _lqip_alt = 'lqip="' | append: _path_prefix %} + {% assign _left = _left | replace: 'lqip="', _lqip_alt %} + {% endunless %} + + + {% assign _left = _left | replace: 'src=', 'data-src=' | replace: ' lqip=', ' data-lqip="true" src=' %} + + {% else %} + {% assign _class = _class | append: ' shimmer' %} + {% endif %} + + + {% if _lazyload %} + {% assign _left = _left | append: ' loading="lazy"' %} + {% endif %} + + {% if page.layout == 'home' %} + + {% assign _wrapper_start = '
' %} + + {% assign _img_content = _img_content | append: _wrapper_start %} + {% assign _right = _right | prepend: '>` is wrapped by `` --> + {% assign _parent = _right | slice: 1, 4 %} + + {% if _parent == '' %} + + {% assign _size = _img_content | size | minus: 1 %} + {% capture _class %} + class="img-link{% unless _lqip %} shimmer{% endunless %}" + {% endcapture %} + {% assign _img_content = _img_content | slice: 0, _size | append: _class | append: '>' %} + + {% else %} + + {% assign _wrapper_start = _final_src + | default: _src + | prepend: '' + %} + + {% assign _img_content = _img_content | append: _wrapper_start %} + {% assign _right = '> + {% assign _img_content = _img_content | append: IMG_TAG | append: _left | append: _right %} + {% endfor %} + + {% if _img_content %} + {% assign _content = _img_content %} + {% endif %} +{% endif %} + + + +{% if _content contains '
' %} + {% assign _code_spippets = _content | split: '
' %} + {% assign _new_content = '' %} + + {% for _snippet in _code_spippets %} + {% if forloop.last %} + {% assign _new_content = _new_content | append: _snippet %} + + {% else %} + {% assign _left = _snippet | split: '><' | last %} + + {% if _left contains 'file="' %} + {% assign _label_text = _left | split: 'file="' | last | split: '"' | first %} + {% assign _label_icon = 'far fa-file-code fa-fw' %} + {% else %} + {% assign _lang = _left | split: 'language-' | last | split: ' ' | first %} + {% capture _label_text %}{% include language-alias.html language=_lang %}{% endcapture %} + {% assign _label_icon = 'fas fa-code fa-fw small' %} + {% endif %} + + {% capture _label %} + + {% endcapture %} + + {% assign _new_content = _new_content + | append: _snippet + | append: '
' + | append: _label + | append: '
' + | append: '
' + %} + {% endif %} + {% endfor %} + + {% assign _content = _new_content %} +{% endif %} + + + +{% assign heading_levels = '2,3,4,5' | split: ',' %} +{% assign _heading_content = _content %} + +{% for level in heading_levels %} + {% assign mark_start = '' + %} + + {% assign left = snippet | split: mark_end | first %} + {% assign right = snippet | slice: left.size, snippet.size %} + {% assign left = left | replace_first: '">', '">' | append: '' %} + + {% assign _new_content = _new_content | append: mark_start | append: left | append: anchor | append: right %} + {% endfor %} + + {% assign _heading_content = _new_content %} + {% endif %} +{% endfor %} + +{% assign _content = _heading_content %} + + +{{ _content }} diff --git a/_includes/related-posts.html b/_includes/related-posts.html new file mode 100644 index 0000000..37a295b --- /dev/null +++ b/_includes/related-posts.html @@ -0,0 +1,94 @@ + + + +{% assign TOTAL_SIZE = 3 %} + + +{% assign TAG_SCORE = 1 %} + + +{% assign CATEGORY_SCORE = 0.5 %} + +{% assign SEPARATOR = ':' %} + +{% assign match_posts = '' | split: '' %} + +{% for category in page.categories %} + {% assign match_posts = match_posts | push: site.categories[category] | uniq %} +{% endfor %} + +{% for tag in page.tags %} + {% assign match_posts = match_posts | push: site.tags[tag] | uniq %} +{% endfor %} + +{% assign match_posts = match_posts | reverse %} +{% assign last_index = match_posts.size | minus: 1 %} +{% assign score_list = '' | split: '' %} + +{% for i in (0..last_index) %} + {% assign post = match_posts[i] %} + + {% if post.url == page.url %} + {% continue %} + {% endif %} + + {% assign score = 0 %} + + {% for tag in post.tags %} + {% if page.tags contains tag %} + {% assign score = score | plus: TAG_SCORE %} + {% endif %} + {% endfor %} + + {% for category in post.categories %} + {% if page.categories contains category %} + {% assign score = score | plus: CATEGORY_SCORE %} + {% endif %} + {% endfor %} + + {% if score > 0 %} + {% capture score_item %}{{ score }}{{ SEPARATOR }}{{ i }}{% endcapture %} + {% assign score_list = score_list | push: score_item %} + {% endif %} +{% endfor %} + +{% assign index_list = '' | split: '' %} + +{% if score_list.size > 0 %} + {% assign score_list = score_list | sort | reverse %} + {% for entry in score_list limit: TOTAL_SIZE %} + {% assign index = entry | split: SEPARATOR | last %} + {% assign index_list = index_list | push: index %} + {% endfor %} +{% endif %} + +{% assign relate_posts = '' | split: '' %} + +{% for index in index_list %} + {% assign i = index | to_integer %} + {% assign relate_posts = relate_posts | push: match_posts[i] %} +{% endfor %} + +{% if relate_posts.size > 0 %} + + +{% endif %} diff --git a/_includes/search-loader.html b/_includes/search-loader.html new file mode 100644 index 0000000..2582580 --- /dev/null +++ b/_includes/search-loader.html @@ -0,0 +1,47 @@ + + +{% capture result_elem %} +
+
+

{title}

+ +
+

{snippet}

+
+{% endcapture %} + +{% capture not_found %}

{{ site.data.locales[include.lang].search.no_results }}

{% endcapture %} + + diff --git a/_includes/search-results.html b/_includes/search-results.html new file mode 100644 index 0000000..00a3182 --- /dev/null +++ b/_includes/search-results.html @@ -0,0 +1,10 @@ + + +
+
+
+ {% include_cached trending-tags.html %} +
+
+
+
diff --git a/_includes/sidebar.html b/_includes/sidebar.html new file mode 100644 index 0000000..569585f --- /dev/null +++ b/_includes/sidebar.html @@ -0,0 +1,97 @@ + + + + diff --git a/_includes/toc-status.html b/_includes/toc-status.html new file mode 100644 index 0000000..4b71cae --- /dev/null +++ b/_includes/toc-status.html @@ -0,0 +1,10 @@ +{% comment %} + Determine TOC state and return it through variable "enable_toc" +{% endcomment %} + +{% assign enable_toc = false %} +{% if site.toc and page.toc %} + {% if page.content contains ' +

{{- site.data.locales[include.lang].panel.toc -}}

+ + +{% endif %} diff --git a/_includes/topbar.html b/_includes/topbar.html new file mode 100644 index 0000000..fd68d1f --- /dev/null +++ b/_includes/topbar.html @@ -0,0 +1,77 @@ + + +
+
+ + + + + +
+ {% if page.layout == 'home' %} + {{- site.data.locales[include.lang].title | default: site.title -}} + {% elsif page.collection == 'tabs' or page.layout == 'page' %} + {%- capture tab_key -%}{{ page.url | split: '/' }}{%- endcapture -%} + {{- site.data.locales[include.lang].tabs[tab_key] | default: page.title -}} + {% else %} + {{- site.data.locales[include.lang].layout[page.layout] | default: page.layout | capitalize -}} + {% endif %} +
+ + + + + + + + +
+
diff --git a/_includes/trending-tags.html b/_includes/trending-tags.html new file mode 100644 index 0000000..57369f0 --- /dev/null +++ b/_includes/trending-tags.html @@ -0,0 +1,46 @@ + + +{% assign MAX = 10 %} + +{% assign size_list = '' | split: '' %} +{% assign tag_list = '' | split: '' %} + +{% for tag in site.tags %} + {% assign size = tag | last | size %} + {% assign size_list = size_list | push: size %} + + {% assign tag_str = tag | first | append: '::' | append: size %} + {% assign tag_list = tag_list | push: tag_str %} +{% endfor %} + +{% assign size_list = size_list | sort | reverse %} + +{% assign tag_list = tag_list | sort_natural %} + +{% assign trending_tags = '' | split: '' %} + +{% for size in size_list limit: MAX %} + {% for tag_str in tag_list %} + {% assign tag = tag_str | split: '::' %} + {% assign tag_name = tag | first %} + {% assign tag_size = tag | last | plus: 0 %} + {% if tag_size == size %} + {% unless trending_tags contains tag_name %} + {% assign trending_tags = trending_tags | push: tag_name %} + {% break %} + {% endunless %} + {% endif %} + {% endfor %} +{% endfor %} + +{% if trending_tags.size > 0 %} +
+

{{- site.data.locales[include.lang].panel.trending_tags -}}

+
+ {% for tag_name in trending_tags %} + {% assign url = tag_name | slugify | url_encode | prepend: '/tags/' | append: '/' %} + + {% endfor %} +
+
+{% endif %} diff --git a/_includes/update-list.html b/_includes/update-list.html new file mode 100644 index 0000000..93684c3 --- /dev/null +++ b/_includes/update-list.html @@ -0,0 +1,40 @@ + + +{% assign MAX_SIZE = 5 %} + +{% assign all_list = '' | split: '' %} + +{% for post in site.posts %} + {% assign datetime = post.last_modified_at | default: post.date %} + + {% capture elem %} + {{- datetime | date: "%Y%m%d%H%M%S" -}}::{{- forloop.index0 -}} + {% endcapture %} + + {% assign all_list = all_list | push: elem %} +{% endfor %} + +{% assign all_list = all_list | sort | reverse %} + +{% assign update_list = '' | split: '' %} + +{% for entry in all_list limit: MAX_SIZE %} + {% assign update_list = update_list | push: entry %} +{% endfor %} + +{% if update_list.size > 0 %} +
+

{{- site.data.locales[include.lang].panel.lastmod -}}

+
    + {% for item in update_list %} + {% assign index = item | split: '::' | last | plus: 0 %} + {% assign post = site.posts[index] %} + {% assign url = post.url | relative_url %} +
  • + {{ post.title }} +
  • + {% endfor %} +
+
+ +{% endif %} diff --git a/_javascript/categories.js b/_javascript/categories.js new file mode 100644 index 0000000..15d8251 --- /dev/null +++ b/_javascript/categories.js @@ -0,0 +1,7 @@ +import { basic, initSidebar, initTopbar } from './modules/layouts'; +import { categoryCollapse } from './modules/plugins'; + +basic(); +initSidebar(); +initTopbar(); +categoryCollapse(); diff --git a/_javascript/commons.js b/_javascript/commons.js new file mode 100644 index 0000000..6a17fb9 --- /dev/null +++ b/_javascript/commons.js @@ -0,0 +1,5 @@ +import { basic, initSidebar, initTopbar } from './modules/layouts'; + +initSidebar(); +initTopbar(); +basic(); diff --git a/_javascript/home.js b/_javascript/home.js new file mode 100644 index 0000000..ef22cb9 --- /dev/null +++ b/_javascript/home.js @@ -0,0 +1,8 @@ +import { basic, initSidebar, initTopbar } from './modules/layouts'; +import { initLocaleDatetime, loadImg } from './modules/plugins'; + +loadImg(); +initLocaleDatetime(); +initSidebar(); +initTopbar(); +basic(); diff --git a/_javascript/misc.js b/_javascript/misc.js new file mode 100644 index 0000000..52b4043 --- /dev/null +++ b/_javascript/misc.js @@ -0,0 +1,7 @@ +import { basic, initSidebar, initTopbar } from './modules/layouts'; +import { initLocaleDatetime } from './modules/plugins'; + +initSidebar(); +initTopbar(); +initLocaleDatetime(); +basic(); diff --git a/_javascript/modules/components/back-to-top.js b/_javascript/modules/components/back-to-top.js new file mode 100644 index 0000000..40d9cd1 --- /dev/null +++ b/_javascript/modules/components/back-to-top.js @@ -0,0 +1,19 @@ +/** + * Reference: https://bootsnipp.com/snippets/featured/link-to-top-page + */ + +export function back2top() { + const btn = document.getElementById('back-to-top'); + + window.addEventListener('scroll', () => { + if (window.scrollY > 50) { + btn.classList.add('show'); + } else { + btn.classList.remove('show'); + } + }); + + btn.addEventListener('click', () => { + window.scrollTo({ top: 0 }); + }); +} diff --git a/_javascript/modules/components/category-collapse.js b/_javascript/modules/components/category-collapse.js new file mode 100644 index 0000000..0c53cb4 --- /dev/null +++ b/_javascript/modules/components/category-collapse.js @@ -0,0 +1,36 @@ +/** + * Tab 'Categories' expand/close effect. + */ + +import 'bootstrap/js/src/collapse.js'; + +const childPrefix = 'l_'; +const parentPrefix = 'h_'; +const children = document.getElementsByClassName('collapse'); + +export function categoryCollapse() { + [...children].forEach((elem) => { + const id = parentPrefix + elem.id.substring(childPrefix.length); + const parent = document.getElementById(id); + + // collapse sub-categories + elem.addEventListener('hide.bs.collapse', () => { + if (parent) { + parent.querySelector('.far.fa-folder-open').className = + 'far fa-folder fa-fw'; + parent.querySelector('.fas.fa-angle-down').classList.add('rotate'); + parent.classList.remove('hide-border-bottom'); + } + }); + + // expand sub-categories + elem.addEventListener('show.bs.collapse', () => { + if (parent) { + parent.querySelector('.far.fa-folder').className = + 'far fa-folder-open fa-fw'; + parent.querySelector('.fas.fa-angle-down').classList.remove('rotate'); + parent.classList.add('hide-border-bottom'); + } + }); + }); +} diff --git a/_javascript/modules/components/clipboard.js b/_javascript/modules/components/clipboard.js new file mode 100644 index 0000000..9566e9d --- /dev/null +++ b/_javascript/modules/components/clipboard.js @@ -0,0 +1,143 @@ +/** + * Clipboard functions + * + * Dependencies: + * clipboard.js (https://github.com/zenorocha/clipboard.js) + */ + +import Tooltip from 'bootstrap/js/src/tooltip'; + +const clipboardSelector = '.code-header>button'; + +const ICON_DEFAULT = 'far fa-clipboard'; +const ICON_SUCCESS = 'fas fa-check'; + +const ATTR_TIMEOUT = 'timeout'; +const ATTR_TITLE_SUCCEED = 'data-title-succeed'; +const ATTR_TITLE_ORIGIN = 'data-bs-original-title'; +const TIMEOUT = 2000; // in milliseconds + +function isLocked(node) { + if (node.hasAttribute(ATTR_TIMEOUT)) { + let timeout = node.getAttribute(ATTR_TIMEOUT); + if (Number(timeout) > Date.now()) { + return true; + } + } + + return false; +} + +function lock(node) { + node.setAttribute(ATTR_TIMEOUT, Date.now() + TIMEOUT); +} + +function unlock(node) { + node.removeAttribute(ATTR_TIMEOUT); +} + +function showTooltip(btn) { + const succeedTitle = btn.getAttribute(ATTR_TITLE_SUCCEED); + btn.setAttribute(ATTR_TITLE_ORIGIN, succeedTitle); + Tooltip.getInstance(btn).show(); +} + +function hideTooltip(btn) { + Tooltip.getInstance(btn).hide(); + btn.removeAttribute(ATTR_TITLE_ORIGIN); +} + +function setSuccessIcon(btn) { + const icon = btn.children[0]; + icon.setAttribute('class', ICON_SUCCESS); +} + +function resumeIcon(btn) { + const icon = btn.children[0]; + icon.setAttribute('class', ICON_DEFAULT); +} + +function setCodeClipboard() { + const clipboardList = document.querySelectorAll(clipboardSelector); + + if (clipboardList.length === 0) { + return; + } + + // Initial the clipboard.js object + const clipboard = new ClipboardJS(clipboardSelector, { + target: (trigger) => { + const codeBlock = trigger.parentNode.nextElementSibling; + return codeBlock.querySelector('code .rouge-code'); + } + }); + + [...clipboardList].map( + (elem) => + new Tooltip(elem, { + placement: 'left' + }) + ); + + clipboard.on('success', (e) => { + const trigger = e.trigger; + + e.clearSelection(); + + if (isLocked(trigger)) { + return; + } + + setSuccessIcon(trigger); + showTooltip(trigger); + lock(trigger); + + setTimeout(() => { + hideTooltip(trigger); + resumeIcon(trigger); + unlock(trigger); + }, TIMEOUT); + }); +} + +function setLinkClipboard() { + const btnCopyLink = document.getElementById('copy-link'); + + if (btnCopyLink === null) { + return; + } + + btnCopyLink.addEventListener('click', (e) => { + const target = e.target; + + if (isLocked(target)) { + return; + } + + // Copy URL to clipboard + navigator.clipboard.writeText(window.location.href).then(() => { + const defaultTitle = target.getAttribute(ATTR_TITLE_ORIGIN); + const succeedTitle = target.getAttribute(ATTR_TITLE_SUCCEED); + + // Switch tooltip title + target.setAttribute(ATTR_TITLE_ORIGIN, succeedTitle); + Tooltip.getInstance(target).show(); + + lock(target); + + setTimeout(() => { + target.setAttribute(ATTR_TITLE_ORIGIN, defaultTitle); + unlock(target); + }, TIMEOUT); + }); + }); + + btnCopyLink.addEventListener('mouseleave', (e) => { + Tooltip.getInstance(e.target).hide(); + }); +} + +export function initClipboard() { + setCodeClipboard(); + setLinkClipboard(); +} diff --git a/_javascript/modules/components/img-loading.js b/_javascript/modules/components/img-loading.js new file mode 100644 index 0000000..989d9e6 --- /dev/null +++ b/_javascript/modules/components/img-loading.js @@ -0,0 +1,67 @@ +/** + * Setting up image lazy loading and LQIP switching + */ + +const ATTR_DATA_SRC = 'data-src'; +const ATTR_DATA_LQIP = 'data-lqip'; + +const cover = { + SHIMMER: 'shimmer', + BLUR: 'blur' +}; + +function removeCover(clzss) { + this.parentElement.classList.remove(clzss); +} + +function handleImage() { + if (!this.complete) { + return; + } + + if (this.hasAttribute(ATTR_DATA_LQIP)) { + removeCover.call(this, cover.BLUR); + } else { + removeCover.call(this, cover.SHIMMER); + } +} + +/** + * Switches the LQIP with the real image URL. + */ +function switchLQIP() { + const src = this.getAttribute(ATTR_DATA_SRC); + this.setAttribute('src', encodeURI(src)); + this.removeAttribute(ATTR_DATA_SRC); +} + +export function loadImg() { + const images = document.querySelectorAll('article img'); + + if (images.length === 0) { + return; + } + + images.forEach((img) => { + img.addEventListener('load', handleImage); + }); + + // Images loaded from the browser cache do not trigger the 'load' event + document.querySelectorAll('article img[loading="lazy"]').forEach((img) => { + if (img.complete) { + removeCover.call(img, cover.SHIMMER); + } + }); + + // LQIPs set by the data URI or WebP will not trigger the 'load' event, + // so manually convert the URI to the URL of a high-resolution image. + const lqips = document.querySelectorAll( + `article img[${ATTR_DATA_LQIP}="true"]` + ); + + if (lqips.length) { + lqips.forEach((lqip) => { + switchLQIP.call(lqip); + }); + } +} diff --git a/_javascript/modules/components/img-popup.js b/_javascript/modules/components/img-popup.js new file mode 100644 index 0000000..ac12043 --- /dev/null +++ b/_javascript/modules/components/img-popup.js @@ -0,0 +1,60 @@ +/** + * Set up image popup + * + * Dependencies: https://github.com/biati-digital/glightbox + */ + +const html = document.documentElement; +const lightImages = '.popup:not(.dark)'; +const darkImages = '.popup:not(.light)'; +let selector = lightImages; + +function updateImages(current, reverse) { + if (selector === lightImages) { + selector = darkImages; + } else { + selector = lightImages; + } + + if (reverse === null) { + reverse = GLightbox({ selector: `${selector}` }); + } + + [current, reverse] = [reverse, current]; +} + +export function imgPopup() { + if (document.querySelector('.popup') === null) { + return; + } + + const hasDualImages = !( + document.querySelector('.popup.light') === null && + document.querySelector('.popup.dark') === null + ); + + if ( + (html.hasAttribute('data-mode') && + html.getAttribute('data-mode') === 'dark') || + (!html.hasAttribute('data-mode') && + window.matchMedia('(prefers-color-scheme: dark)').matches) + ) { + selector = darkImages; + } + + let current = GLightbox({ selector: `${selector}` }); + + if (hasDualImages && document.getElementById('mode-toggle')) { + let reverse = null; + + window.addEventListener('message', (event) => { + if ( + event.source === window && + event.data && + event.data.direction === ModeToggle.ID + ) { + updateImages(current, reverse); + } + }); + } +} diff --git a/_javascript/modules/components/locale-datetime.js b/_javascript/modules/components/locale-datetime.js new file mode 100644 index 0000000..eb75626 --- /dev/null +++ b/_javascript/modules/components/locale-datetime.js @@ -0,0 +1,53 @@ +/** + * Update month/day to locale datetime + * + * Requirement: + */ + +/* A tool for locale datetime */ +class LocaleHelper { + static get attrTimestamp() { + return 'data-ts'; + } + + static get attrDateFormat() { + return 'data-df'; + } + + static get locale() { + return document.documentElement.getAttribute('lang').substring(0, 2); + } + + static getTimestamp(elem) { + return Number(elem.getAttribute(this.attrTimestamp)); // unix timestamp + } + + static getDateFormat(elem) { + return elem.getAttribute(this.attrDateFormat); + } +} + +export function initLocaleDatetime() { + dayjs.locale(LocaleHelper.locale); + dayjs.extend(window.dayjs_plugin_localizedFormat); + + document + .querySelectorAll(`[${LocaleHelper.attrTimestamp}]`) + .forEach((elem) => { + const date = dayjs.unix(LocaleHelper.getTimestamp(elem)); + const text = date.format(LocaleHelper.getDateFormat(elem)); + elem.textContent = text; + elem.removeAttribute(LocaleHelper.attrTimestamp); + elem.removeAttribute(LocaleHelper.attrDateFormat); + + // setup tooltips + if ( + elem.hasAttribute('data-bs-toggle') && + elem.getAttribute('data-bs-toggle') === 'tooltip' + ) { + // see: https://day.js.org/docs/en/display/format#list-of-localized-formats + const tooltipText = date.format('llll'); + elem.setAttribute('data-bs-title', tooltipText); + } + }); +} diff --git a/_javascript/modules/components/mode-watcher.js b/_javascript/modules/components/mode-watcher.js new file mode 100644 index 0000000..9eecd09 --- /dev/null +++ b/_javascript/modules/components/mode-watcher.js @@ -0,0 +1,14 @@ +/** + * Add listener for theme mode toggle + */ +const toggle = document.getElementById('mode-toggle'); + +export function modeWatcher() { + if (!toggle) { + return; + } + + toggle.addEventListener('click', () => { + modeToggle.flipMode(); + }); +} diff --git a/_javascript/modules/components/search-display.js b/_javascript/modules/components/search-display.js new file mode 100644 index 0000000..40059ac --- /dev/null +++ b/_javascript/modules/components/search-display.js @@ -0,0 +1,110 @@ +/** + * This script make #search-result-wrapper switch to unload or shown automatically. + */ + +const btnSbTrigger = document.getElementById('sidebar-trigger'); +const btnSearchTrigger = document.getElementById('search-trigger'); +const btnCancel = document.getElementById('search-cancel'); +const content = document.querySelectorAll('#main-wrapper>.container>.row'); +const topbarTitle = document.getElementById('topbar-title'); +const search = document.getElementById('search'); +const resultWrapper = document.getElementById('search-result-wrapper'); +const results = document.getElementById('search-results'); +const input = document.getElementById('search-input'); +const hints = document.getElementById('search-hints'); + +// CSS class names +const LOADED = 'd-block'; +const UNLOADED = 'd-none'; +const FOCUS = 'input-focus'; +const FLEX = 'd-flex'; + +/* Actions in mobile screens (Sidebar hidden) */ +class MobileSearchBar { + static on() { + btnSbTrigger.classList.add(UNLOADED); + topbarTitle.classList.add(UNLOADED); + btnSearchTrigger.classList.add(UNLOADED); + search.classList.add(FLEX); + btnCancel.classList.add(LOADED); + } + + static off() { + btnCancel.classList.remove(LOADED); + search.classList.remove(FLEX); + btnSbTrigger.classList.remove(UNLOADED); + topbarTitle.classList.remove(UNLOADED); + btnSearchTrigger.classList.remove(UNLOADED); + } +} + +class ResultSwitch { + static resultVisible = false; + + static on() { + if (!this.resultVisible) { + resultWrapper.classList.remove(UNLOADED); + content.forEach((el) => { + el.classList.add(UNLOADED); + }); + this.resultVisible = true; + } + } + + static off() { + if (this.resultVisible) { + results.innerHTML = ''; + + if (hints.classList.contains(UNLOADED)) { + hints.classList.remove(UNLOADED); + } + + resultWrapper.classList.add(UNLOADED); + content.forEach((el) => { + el.classList.remove(UNLOADED); + }); + input.textContent = ''; + this.resultVisible = false; + } + } +} + +function isMobileView() { + return btnCancel.classList.contains(LOADED); +} + +export function displaySearch() { + btnSearchTrigger.addEventListener('click', () => { + MobileSearchBar.on(); + ResultSwitch.on(); + input.focus(); + }); + + btnCancel.addEventListener('click', () => { + MobileSearchBar.off(); + ResultSwitch.off(); + }); + + input.addEventListener('focus', () => { + search.classList.add(FOCUS); + }); + + input.addEventListener('focusout', () => { + search.classList.remove(FOCUS); + }); + + input.addEventListener('input', () => { + if (input.value === '') { + if (isMobileView()) { + hints.classList.remove(UNLOADED); + } else { + ResultSwitch.off(); + } + } else { + ResultSwitch.on(); + if (isMobileView()) { + hints.classList.add(UNLOADED); + } + } + }); +} diff --git a/_javascript/modules/components/sidebar.js b/_javascript/modules/components/sidebar.js new file mode 100644 index 0000000..aed759e --- /dev/null +++ b/_javascript/modules/components/sidebar.js @@ -0,0 +1,22 @@ +/** + * Expand or close the sidebar in mobile screens. + */ + +const $sidebar = document.getElementById('sidebar'); +const $trigger = document.getElementById('sidebar-trigger'); +const $mask = document.getElementById('mask'); + +class SidebarUtil { + static #isExpanded = false; + + static toggle() { + this.#isExpanded = !this.#isExpanded; + document.body.toggleAttribute('sidebar-display', this.#isExpanded); + $sidebar.classList.toggle('z-2', this.#isExpanded); + $mask.classList.toggle('d-none', !this.#isExpanded); + } +} + +export function sidebarExpand() { + $trigger.onclick = $mask.onclick = () => SidebarUtil.toggle(); +} diff --git a/_javascript/modules/components/toc.js b/_javascript/modules/components/toc.js new file mode 100644 index 0000000..e9086ee --- /dev/null +++ b/_javascript/modules/components/toc.js @@ -0,0 +1,33 @@ +import { TocMobile as mobile } from './toc/toc-mobile'; +import { TocDesktop as desktop } from './toc/toc-desktop'; + +const desktopMode = matchMedia('(min-width: 1200px)'); + +function refresh(e) { + if (e.matches) { + if (mobile.popupOpened) { + mobile.hidePopup(); + } + + desktop.refresh(); + } else { + mobile.refresh(); + } +} + +function init() { + if (document.querySelector('main>article[data-toc="true"]') === null) { + return; + } + + // Avoid create multiple instances of Tocbot. Ref: + if (desktopMode.matches) { + desktop.init(); + } else { + mobile.init(); + } + + desktopMode.onchange = refresh; +} + +export { init as initToc }; diff --git a/_javascript/modules/components/toc/toc-desktop.js b/_javascript/modules/components/toc/toc-desktop.js new file mode 100644 index 0000000..5021a72 --- /dev/null +++ b/_javascript/modules/components/toc/toc-desktop.js @@ -0,0 +1,22 @@ +export class TocDesktop { + /* Tocbot options Ref: https://github.com/tscanlin/tocbot#usage */ + static options = { + tocSelector: '#toc', + contentSelector: '.content', + ignoreSelector: '[data-toc-skip]', + headingSelector: 'h2, h3, h4', + orderedList: false, + scrollSmooth: false, + headingsOffset: 16 * 2 // 2rem + }; + + static refresh() { + tocbot.refresh(this.options); + } + + static init() { + if (document.getElementById('toc-wrapper')) { + tocbot.init(this.options); + } + } +} diff --git a/_javascript/modules/components/toc/toc-mobile.js b/_javascript/modules/components/toc/toc-mobile.js new file mode 100644 index 0000000..20e24a7 --- /dev/null +++ b/_javascript/modules/components/toc/toc-mobile.js @@ -0,0 +1,125 @@ +/** + * TOC button, topbar and popup for mobile devices + */ + +const $tocBar = document.getElementById('toc-bar'); +const $soloTrigger = document.getElementById('toc-solo-trigger'); +const $triggers = document.getElementsByClassName('toc-trigger'); +const $popup = document.getElementById('toc-popup'); +const $btnClose = document.getElementById('toc-popup-close'); + +const SCROLL_LOCK = 'overflow-hidden'; +const CLOSING = 'closing'; + +export class TocMobile { + static #invisible = true; + static #barHeight = 16 * 3; // 3rem + + static options = { + tocSelector: '#toc-popup-content', + contentSelector: '.content', + ignoreSelector: '[data-toc-skip]', + headingSelector: 'h2, h3, h4', + orderedList: false, + scrollSmooth: false, + collapseDepth: 4, + headingsOffset: this.#barHeight + }; + + static initBar() { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + $tocBar.classList.toggle('invisible', entry.isIntersecting); + }); + }, + { rootMargin: `-${this.#barHeight}px 0px 0px 0px` } + ); + + observer.observe($soloTrigger); + this.#invisible = false; + } + + static listenAnchors() { + const $anchors = document.getElementsByClassName('toc-link'); + [...$anchors].forEach((anchor) => { + anchor.onclick = () => this.hidePopup(); + }); + } + + static refresh() { + if (this.#invisible) { + this.initComponents(); + } + tocbot.refresh(this.options); + this.listenAnchors(); + } + + static get popupOpened() { + return $popup.open; + } + + static showPopup() { + this.lockScroll(true); + $popup.showModal(); + const activeItem = $popup.querySelector('li.is-active-li'); + activeItem.scrollIntoView({ block: 'center' }); + } + + static hidePopup() { + $popup.toggleAttribute(CLOSING); + + $popup.addEventListener( + 'animationend', + () => { + $popup.toggleAttribute(CLOSING); + $popup.close(); + }, + { once: true } + ); + + this.lockScroll(false); + } + + static lockScroll(enable) { + document.documentElement.classList.toggle(SCROLL_LOCK, enable); + document.body.classList.toggle(SCROLL_LOCK, enable); + } + + static clickBackdrop(event) { + if ($popup.hasAttribute(CLOSING)) { + return; + } + + const rect = event.target.getBoundingClientRect(); + if ( + event.clientX < rect.left || + event.clientX > rect.right || + event.clientY < rect.top || + event.clientY > rect.bottom + ) { + this.hidePopup(); + } + } + + static initComponents() { + this.initBar(); + + [...$triggers].forEach((trigger) => { + trigger.onclick = () => this.showPopup(); + }); + + $popup.onclick = (e) => this.clickBackdrop(e); + $btnClose.onclick = () => this.hidePopup(); + $popup.oncancel = (e) => { + e.preventDefault(); + this.hidePopup(); + }; + } + + static init() { + tocbot.init(this.options); + this.listenAnchors(); + this.initComponents(); + } +} diff --git a/_javascript/modules/components/tooltip-loader.js b/_javascript/modules/components/tooltip-loader.js new file mode 100644 index 0000000..c36c879 --- /dev/null +++ b/_javascript/modules/components/tooltip-loader.js @@ -0,0 +1,11 @@ +import Tooltip from 'bootstrap/js/src/tooltip'; + +export function loadTooptip() { + const tooltipTriggerList = document.querySelectorAll( + '[data-bs-toggle="tooltip"]' + ); + + [...tooltipTriggerList].map( + (tooltipTriggerEl) => new Tooltip(tooltipTriggerEl) + ); +} diff --git a/_javascript/modules/layouts.js b/_javascript/modules/layouts.js new file mode 100644 index 0000000..28f7962 --- /dev/null +++ b/_javascript/modules/layouts.js @@ -0,0 +1,3 @@ +export { basic } from './layouts/basic'; +export { initSidebar } from './layouts/sidebar'; +export { initTopbar } from './layouts/topbar'; diff --git a/_javascript/modules/layouts/basic.js b/_javascript/modules/layouts/basic.js new file mode 100644 index 0000000..fb36a8b --- /dev/null +++ b/_javascript/modules/layouts/basic.js @@ -0,0 +1,7 @@ +import { back2top } from '../components/back-to-top'; +import { loadTooptip } from '../components/tooltip-loader'; + +export function basic() { + back2top(); + loadTooptip(); +} diff --git a/_javascript/modules/layouts/sidebar.js b/_javascript/modules/layouts/sidebar.js new file mode 100644 index 0000000..8795693 --- /dev/null +++ b/_javascript/modules/layouts/sidebar.js @@ -0,0 +1,7 @@ +import { modeWatcher } from '../components/mode-watcher'; +import { sidebarExpand } from '../components/sidebar'; + +export function initSidebar() { + modeWatcher(); + sidebarExpand(); +} diff --git a/_javascript/modules/layouts/topbar.js b/_javascript/modules/layouts/topbar.js new file mode 100644 index 0000000..cfcd0ed --- /dev/null +++ b/_javascript/modules/layouts/topbar.js @@ -0,0 +1,5 @@ +import { displaySearch } from '../components/search-display'; + +export function initTopbar() { + displaySearch(); +} diff --git a/_javascript/modules/plugins.js b/_javascript/modules/plugins.js new file mode 100644 index 0000000..cc95c1b --- /dev/null +++ b/_javascript/modules/plugins.js @@ -0,0 +1,6 @@ +export { categoryCollapse } from './components/category-collapse'; +export { initClipboard } from './components/clipboard'; +export { loadImg } from './components/img-loading'; +export { imgPopup } from './components/img-popup'; +export { initLocaleDatetime } from './components/locale-datetime'; +export { initToc } from './components/toc'; diff --git a/_javascript/page.js b/_javascript/page.js new file mode 100644 index 0000000..76e8ce9 --- /dev/null +++ b/_javascript/page.js @@ -0,0 +1,9 @@ +import { basic, initSidebar, initTopbar } from './modules/layouts'; +import { loadImg, imgPopup, initClipboard } from './modules/plugins'; + +loadImg(); +imgPopup(); +initSidebar(); +initTopbar(); +initClipboard(); +basic(); diff --git a/_javascript/post.js b/_javascript/post.js new file mode 100644 index 0000000..1c616ec --- /dev/null +++ b/_javascript/post.js @@ -0,0 +1,18 @@ +import { basic, initTopbar, initSidebar } from './modules/layouts'; + +import { + loadImg, + imgPopup, + initLocaleDatetime, + initClipboard, + initToc +} from './modules/plugins'; + +loadImg(); +initToc(); +imgPopup(); +initSidebar(); +initLocaleDatetime(); +initClipboard(); +initTopbar(); +basic(); diff --git a/_javascript/pwa/app.js b/_javascript/pwa/app.js new file mode 100644 index 0000000..3c0ded2 --- /dev/null +++ b/_javascript/pwa/app.js @@ -0,0 +1,55 @@ +import Toast from 'bootstrap/js/src/toast'; + +if ('serviceWorker' in navigator) { + // Get Jekyll config from URL parameters + const src = new URL(document.currentScript.src); + const register = src.searchParams.get('register'); + const baseUrl = src.searchParams.get('baseurl'); + + if (register) { + const swUrl = `${baseUrl}/sw.min.js`; + const notification = document.getElementById('notification'); + const btnRefresh = notification.querySelector('.toast-body>button'); + const popupWindow = Toast.getOrCreateInstance(notification); + + navigator.serviceWorker.register(swUrl).then((registration) => { + // Restore the update window that was last manually closed by the user + if (registration.waiting) { + popupWindow.show(); + } + + registration.addEventListener('updatefound', () => { + registration.installing.addEventListener('statechange', () => { + if (registration.waiting) { + if (navigator.serviceWorker.controller) { + popupWindow.show(); + } + } + }); + }); + + btnRefresh.addEventListener('click', () => { + if (registration.waiting) { + registration.waiting.postMessage('SKIP_WAITING'); + } + popupWindow.hide(); + }); + }); + + let refreshing = false; + + // Detect controller change and refresh all the opened tabs + navigator.serviceWorker.addEventListener('controllerchange', () => { + if (!refreshing) { + window.location.reload(); + refreshing = true; + } + }); + } else { + navigator.serviceWorker.getRegistrations().then(function (registrations) { + for (let registration of registrations) { + registration.unregister(); + } + }); + } +} diff --git a/_javascript/pwa/sw.js b/_javascript/pwa/sw.js new file mode 100644 index 0000000..ff9125d --- /dev/null +++ b/_javascript/pwa/sw.js @@ -0,0 +1,92 @@ +importScripts('./assets/js/data/swconf.js'); + +const purge = swconf.purge; +const interceptor = swconf.interceptor; + +function verifyUrl(url) { + const requestUrl = new URL(url); + const requestPath = requestUrl.pathname; + + if (!requestUrl.protocol.startsWith('http')) { + return false; + } + + for (const prefix of interceptor.urlPrefixes) { + if (requestUrl.href.startsWith(prefix)) { + return false; + } + } + + for (const path of interceptor.paths) { + if (requestPath.startsWith(path)) { + return false; + } + } + return true; +} + +self.addEventListener('install', (event) => { + if (purge) { + return; + } + + event.waitUntil( + caches.open(swconf.cacheName).then((cache) => { + return cache.addAll(swconf.resources); + }) + ); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((keyList) => { + return Promise.all( + keyList.map((key) => { + if (purge) { + return caches.delete(key); + } else { + if (key !== swconf.cacheName) { + return caches.delete(key); + } + } + }) + ); + }) + ); +}); + +self.addEventListener('message', (event) => { + if (event.data === 'SKIP_WAITING') { + self.skipWaiting(); + } +}); + +self.addEventListener('fetch', (event) => { + if (event.request.headers.has('range')) { + return; + } + + event.respondWith( + caches.match(event.request).then((response) => { + if (response) { + return response; + } + + return fetch(event.request).then((response) => { + const url = event.request.url; + + if (purge || event.request.method !== 'GET' || !verifyUrl(url)) { + return response; + } + + // See: + let responseToCache = response.clone(); + + caches.open(swconf.cacheName).then((cache) => { + cache.put(event.request, responseToCache); + }); + return response; + }); + }) + ); +}); diff --git a/_layouts/archives.html b/_layouts/archives.html new file mode 100644 index 0000000..4f7ad7d --- /dev/null +++ b/_layouts/archives.html @@ -0,0 +1,35 @@ +--- +layout: page +# The Archives of posts. +--- + +{% include lang.html %} + +{% assign df_strftime_m = site.data.locales[lang].df.archives.strftime | default: '/ %m' %} +{% assign df_dayjs_m = site.data.locales[lang].df.archives.dayjs | default: '/ MM' %} + +
+ {% for post in site.posts %} + {% assign cur_year = post.date | date: '%Y' %} + + {% if cur_year != last_year %} + {% unless forloop.first %}{% endunless %} + + + {{ '
    ' }} + + {% assign last_year = cur_year %} + {% endif %} + +
  • + {% assign ts = post.date | date: '%s' %} + {{ post.date | date: '%d' }} + + {{ post.date | date: df_strftime_m }} + + {{ post.title }} +
  • + + {% if forloop.last %}
{% endif %} + {% endfor %} +
diff --git a/_layouts/categories.html b/_layouts/categories.html new file mode 100644 index 0000000..0515097 --- /dev/null +++ b/_layouts/categories.html @@ -0,0 +1,138 @@ +--- +layout: page +# All the Categories of posts +--- + +{% include lang.html %} + +{% assign HEAD_PREFIX = 'h_' %} +{% assign LIST_PREFIX = 'l_' %} + +{% assign group_index = 0 %} + +{% assign sort_categories = site.categories | sort %} + +{% for category in sort_categories %} + {% assign category_name = category | first %} + {% assign posts_of_category = category | last %} + {% assign first_post = posts_of_category | first %} + + {% if category_name == first_post.categories[0] %} + {% assign sub_categories = '' | split: '' %} + + {% for post in posts_of_category %} + {% assign second_category = post.categories[1] %} + {% if second_category %} + {% unless sub_categories contains second_category %} + {% assign sub_categories = sub_categories | push: second_category %} + {% endunless %} + {% endif %} + {% endfor %} + + {% assign sub_categories = sub_categories | sort %} + {% assign sub_categories_size = sub_categories | size %} + +
+ +
+ + + + {% capture _category_url %}/categories/{{ category_name | slugify | url_encode }}/{% endcapture %} + {{ category_name }} + + + {% assign top_posts_size = site.categories[category_name] | size %} + + {% if sub_categories_size > 0 %} + {{ sub_categories_size }} + {% if sub_categories_size > 1 %} + {{ + site.data.locales[lang].categories.category_measure.plural + | default: site.data.locales[lang].categories.category_measure + }} + {% else %} + {{ + site.data.locales[lang].categories.category_measure.singular + | default: site.data.locales[lang].categories.category_measure + }} + {% endif -%} + , + {% endif %} + + {{ top_posts_size }} + + {% if top_posts_size > 1 %} + {{ + site.data.locales[lang].categories.post_measure.plural + | default: site.data.locales[lang].categories.post_measure + }} + {% else %} + {{ + site.data.locales[lang].categories.post_measure.singular + | default: site.data.locales[lang].categories.post_measure + }} + {% endif %} + + + + + {% if sub_categories_size > 0 %} + + + + {% else %} + + + + {% endif %} +
+ + + + {% if sub_categories_size > 0 %} +
+
    + {% for sub_category in sub_categories %} +
  • + + + {% capture _sub_ctg_url %}/categories/{{ sub_category | slugify | url_encode }}/{% endcapture %} + {{ sub_category }} + + {% assign posts_size = site.categories[sub_category] | size %} + + {{ posts_size }} + + {% if posts_size > 1 %} + {{ + site.data.locales[lang].categories.post_measure.plural + | default: site.data.locales[lang].categories.post_measure + }} + {% else %} + {{ + site.data.locales[lang].categories.post_measure.singular + | default: site.data.locales[lang].categories.post_measure + }} + {% endif %} + +
  • + {% endfor %} +
+
+ {% endif %} +
+ + + {% assign group_index = group_index | plus: 1 %} + {% endif %} +{% endfor %} diff --git a/_layouts/category.html b/_layouts/category.html new file mode 100644 index 0000000..b064f27 --- /dev/null +++ b/_layouts/category.html @@ -0,0 +1,24 @@ +--- +layout: page +# The Category layout +--- + +{% include lang.html %} + +
+

+ + {{ page.title }} + {{ page.posts | size }} +

+ +
    + {% for post in page.posts %} +
  • + {{ post.title }} + + {% include datetime.html date=post.date class='text-muted small text-nowrap' lang=lang %} +
  • + {% endfor %} +
+
diff --git a/_layouts/compress.html b/_layouts/compress.html new file mode 100644 index 0000000..2779e92 --- /dev/null +++ b/_layouts/compress.html @@ -0,0 +1,10 @@ +--- +# Jekyll layout that compresses HTML +# v3.2.0 +# http://jch.penibelst.de/ +# © 2014–2015 Anatol Broder +# MIT License +--- + +{% capture _LINE_FEED %} +{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" or page.compress_html == false %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "
" %}{% endif %}{% unless _pre_before contains "
" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ;; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %}
Step Bytes
raw {{ content | size }}{% if _profile_endings %}
endings {{ _profile_endings }}{% endif %}{% if _profile_startings %}
startings {{ _profile_startings }}{% endif %}{% if _profile_comments %}
comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %}
collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %}
clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %} diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..1590ef6 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,82 @@ +--- +layout: compress +--- + + + +{% include origin-type.html %} + +{% include lang.html %} + +{% if site.theme_mode %} + {% capture prefer_mode %}data-mode="{{ site.theme_mode }}"{% endcapture %} +{% endif %} + + + + {% include head.html %} + + + {% include sidebar.html lang=lang %} + +
+
+ {% include topbar.html lang=lang %} + +
+
+ {% if layout.refactor or layout.layout == 'default' %} + {% include refactor-content.html content=content lang=lang %} + {% else %} + {{ content }} + {% endif %} +
+ + + +
+ +
+ +
+ {% for _include in layout.tail_includes %} + {% assign _include_path = _include | append: '.html' %} + {% include {{ _include_path }} lang=lang %} + {% endfor %} + + {% include_cached footer.html lang=lang %} +
+
+ + {% include_cached search-results.html lang=lang %} +
+ + +
+ +
+ + {% if site.pwa.enabled %} + {% include_cached notification.html lang=lang %} + {% endif %} + + + {% include js-selector.html lang=lang %} + + {% include_cached search-loader.html lang=lang %} + + diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 0000000..451e391 --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,122 @@ +--- +layout: default +refactor: true +--- + +{% include lang.html %} + +{% assign all_pinned = site.posts | where: 'pin', 'true' %} +{% assign all_normal = site.posts | where_exp: 'item', 'item.pin != true and item.hidden != true' %} + +{% assign posts = '' | split: '' %} + + + +{% assign visible_start = paginator.page | minus: 1 | times: paginator.per_page %} +{% assign visible_end = visible_start | plus: paginator.per_page %} + +{% if all_pinned.size > visible_start %} + {% if all_pinned.size > visible_end %} + {% assign pinned_size = paginator.per_page %} + {% else %} + {% assign pinned_size = all_pinned.size | minus: visible_start %} + {% endif %} + + {% for i in (visible_start..all_pinned.size) limit: pinned_size %} + {% assign posts = posts | push: all_pinned[i] %} + {% endfor %} +{% else %} + {% assign pinned_size = 0 %} +{% endif %} + + + +{% assign normal_size = paginator.posts | size | minus: pinned_size %} + +{% if normal_size > 0 %} + {% if pinned_size > 0 %} + {% assign normal_start = 0 %} + {% else %} + {% assign normal_start = visible_start | minus: all_pinned.size %} + {% endif %} + + {% assign normal_end = normal_start | plus: normal_size | minus: 1 %} + + {% for i in (normal_start..normal_end) %} + {% assign posts = posts | push: all_normal[i] %} + {% endfor %} +{% endif %} + +
+ {% for post in posts %} +
+ + {% assign card_body_col = '12' %} + + {% if post.image %} + {% assign src = post.image.path | default: post.image %} + {% unless src contains '//' %} + {% assign src = post.media_subpath | append: '/' | append: src | replace: '//', '/' %} + {% endunless %} + + {% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %} + + {% assign lqip = null %} + + {% if post.image.lqip %} + {% capture lqip %}lqip="{{ post.image.lqip }}"{% endcapture %} + {% endif %} + +
+ {{ alt }} +
+ + {% assign card_body_col = '7' %} + {% endif %} + +
+
+

{{ post.title }}

+ +
+

{% include post-description.html %}

+
+ + + +
+ +
+
+
+ {% endfor %} +
+ + +{% if paginator.total_pages > 1 %} + {% include post-paginator.html %} +{% endif %} diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 0000000..32d6582 --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,20 @@ +--- +layout: default +--- + +{% include lang.html %} + +
+ {% if page.layout == 'page' or page.collection == 'tabs' %} + {% assign tab_key = page.title | downcase %} + {% assign title = site.data.locales[lang].tabs[tab_key] | default: page.title %} +

+ {{ title }} +

+
+ {{ content }} +
+ {% else %} + {{ content }} + {% endif %} +
diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..6a2deff --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,178 @@ +--- +layout: default +refactor: true +panel_includes: + - toc +tail_includes: + - related-posts + - post-nav + - comments +--- + +{% include lang.html %} + +{% include toc-status.html %} + +
+
+

{{ page.title }}

+ {% if page.description %} +

{{ page.description }}

+ {% endif %} + + +
+ + {% if enable_toc %} + + + + + +
+
{{- page.title -}}
+ +
+
+
+ {% endif %} + +
+ {{ content }} +
+ +
+ + {% if page.categories.size > 0 %} + + {% endif %} + + + {% if page.tags.size > 0 %} + + {% endif %} + +
+
+ {% if site.data.locales[lang].copyright.license.template %} + {% capture _replacement %} + + {{ site.data.locales[lang].copyright.license.name }} + + {% endcapture %} + + {{ site.data.locales[lang].copyright.license.template | replace: ':LICENSE_NAME', _replacement }} + {% endif %} +
+ + {% include post-sharing.html lang=lang %} +
+ +
+ +
diff --git a/_layouts/tag.html b/_layouts/tag.html new file mode 100644 index 0000000..d766d09 --- /dev/null +++ b/_layouts/tag.html @@ -0,0 +1,23 @@ +--- +layout: page +# The layout for Tag page +--- + +{% include lang.html %} + +
+

+ + {{ page.title }} + {{ page.posts | size }} +

+
    + {% for post in page.posts %} +
  • + {{ post.title }} + + {% include datetime.html date=post.date class='text-muted small text-nowrap' lang=lang %} +
  • + {% endfor %} +
+
diff --git a/_layouts/tags.html b/_layouts/tags.html new file mode 100644 index 0000000..7800ca0 --- /dev/null +++ b/_layouts/tags.html @@ -0,0 +1,22 @@ +--- +layout: page +# All the Tags of posts. +--- + +
+ {% assign tags = '' | split: '' %} + {% for t in site.tags %} + {% assign tags = tags | push: t[0] %} + {% endfor %} + + {% assign sorted_tags = tags | sort_natural %} + + {% for t in sorted_tags %} + + {% endfor %} +
diff --git a/_plugins/posts-lastmod-hook.rb b/_plugins/posts-lastmod-hook.rb new file mode 100644 index 0000000..1fd6ecf --- /dev/null +++ b/_plugins/posts-lastmod-hook.rb @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby +# +# Check for changed posts + +Jekyll::Hooks.register :posts, :post_init do |post| + + commit_num = `git rev-list --count HEAD "#{ post.path }"` + + if commit_num.to_i > 1 + lastmod_date = `git log -1 --pretty="%ad" --date=iso "#{ post.path }"` + post.data['last_modified_at'] = lastmod_date + end + +end diff --git a/_posts/2022-10-21-gruendung-star-citizen-organisation.md b/_posts/2022-10-21-gruendung-star-citizen-organisation.md new file mode 100644 index 0000000..19695a7 --- /dev/null +++ b/_posts/2022-10-21-gruendung-star-citizen-organisation.md @@ -0,0 +1,30 @@ +--- +title: Gründung unserer Star Citizen Organisation +description: >- + neulich haben wir eine neue Organisation in Star Citizen namens "Morlana Industries" (MORINC) gegründet. + Wir möchten gerne jeden einladen, der daran Interesse hätte, uns beizutreten. +author: sitiriotv +date: 2022-10-21 18:06:00 +0200 +categories: [Star Citizen, Organisation] +tags: [star citizen, star, citizen, morinc, Morlana Industries] +pin: true +media_subpath: '/posts/2022/10' +--- + +Hallo liebe Community, + +neulich haben wir eine neue Organisation in Star Citizen namens "Morlana Industries" (*MORINC*) gegründet. +Wir möchten gerne jeden einladen, der daran Interesse hätte, uns beizutreten. + +Hier ist der Link zur Organisationsseite: +> __***[https://robertsspaceindustries.com/orgs/MORINC](https://robertsspaceindustries.com/orgs/MORINC)***__ + +Um beizutreten müsst ihr einfach eine kleine Bewerbung schreiben. Wir sind jedoch nicht all zu streng und eine kleine Vorstellung würde ausreichen. + +Bei Fragen einfach hier kommentieren. + +Ich hoffe wir sehen uns im Verse, + +> LG SitirioTV | Justin / Kosmos | Florian + +*(PS: Aktuell ist die Organisation noch WORK IN PROGRESS!)* diff --git a/_sass/addon/commons.scss b/_sass/addon/commons.scss new file mode 100644 index 0000000..5e8acea --- /dev/null +++ b/_sass/addon/commons.scss @@ -0,0 +1,1526 @@ +/* The common styles */ + +html { + font-size: 16px; + + @media (prefers-color-scheme: light) { + &:not([data-mode]), + &[data-mode='light'] { + @include light-scheme; + } + + &[data-mode='dark'] { + @include dark-scheme; + } + } + + @media (prefers-color-scheme: dark) { + &:not([data-mode]), + &[data-mode='dark'] { + @include dark-scheme; + } + + &[data-mode='light'] { + @include light-scheme; + } + } +} + +body { + background: var(--main-bg); + padding: env(safe-area-inset-top) env(safe-area-inset-right) + env(safe-area-inset-bottom) env(safe-area-inset-left); + color: var(--text-color); + -webkit-font-smoothing: antialiased; + font-family: $font-family-base; +} + +/* --- Typography --- */ + +@for $i from 1 through 5 { + h#{$i} { + @extend %heading; + + @if $i > 1 { + @extend %anchor; + } + + @if $i < 5 { + $size-factor: 0.25rem; + + @if $i > 1 { + $size-factor: 0.18rem; + + main & { + @if $i == 2 { + margin: 2.5rem 0 1.25rem; + } @else { + margin: 2rem 0 1rem; + } + } + } + + & { + font-size: 1rem + (5 - $i) * $size-factor; + } + } @else { + font-size: 1.05rem; + } + } +} + +a { + @extend %link-color; + + text-decoration: none; +} + +img { + max-width: 100%; + height: auto; + transition: all 0.35s ease-in-out; + + .blur & { + $blur: 20px; + + -webkit-filter: blur($blur); + filter: blur($blur); + } +} + +blockquote { + border-left: 0.125rem solid var(--blockquote-border-color); + padding-left: 1rem; + color: var(--blockquote-text-color); + margin-top: 0.5rem; + + > p:last-child { + margin-bottom: 0; + } + + &[class^='prompt-'] { + border-left: 0; + position: relative; + padding: 1rem 1rem 1rem 3rem; + color: var(--prompt-text-color); + + @extend %rounded; + + &::before { + text-align: center; + width: 3rem; + position: absolute; + left: 0.25rem; + margin-top: 0.4rem; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + } + } + + @include prompt('tip', '\f0eb', $fa-style: 'regular'); + @include prompt('info', '\f06a', $rotate: 180); + @include prompt('warning', '\f06a'); + @include prompt('danger', '\f071'); +} + +kbd { + font-family: Lato, sans-serif; + display: inline-block; + vertical-align: middle; + line-height: 1.3rem; + min-width: 1.75rem; + text-align: center; + margin: 0 0.3rem; + padding-top: 0.1rem; + color: var(--kbd-text-color); + background-color: var(--kbd-bg-color); + border-radius: $radius-sm; + border: solid 1px var(--kbd-wrap-color); + box-shadow: inset 0 -2px 0 var(--kbd-wrap-color); +} + +hr { + border-color: var(--main-border-color); + opacity: 1; +} + +footer { + background-color: var(--main-bg); + height: $footer-height; + border-top: 1px solid var(--main-border-color); + + @extend %text-xs; + + a { + @extend %text-highlight; + + &:hover { + @extend %link-hover; + } + } + + em { + @extend %text-highlight; + } + + p { + text-align: center; + margin-bottom: 0; + } +} + +/* fontawesome icons */ +i { + &.far, + &.fas { + @extend %no-cursor; + } +} + +/* --- Panels --- */ + +.access { + top: 2rem; + transition: top 0.2s ease-in-out; + margin-top: 3rem; + margin-bottom: 4rem; + + &:only-child { + position: -webkit-sticky; + position: sticky; + } + + > section { + padding-left: 1rem; + border-left: 1px solid var(--main-border-color); + + &:not(:last-child) { + margin-bottom: 4rem; + } + } + + .content { + font-size: 0.9rem; + } +} + +#panel-wrapper { + /* the headings */ + .panel-heading { + font-family: inherit; + line-height: inherit; + + @include label(inherit); + } + + .post-tag { + line-height: 1.05rem; + font-size: 0.85rem; + border-radius: 0.8rem; + padding: 0.3rem 0.5rem; + margin: 0 0.35rem 0.5rem 0; + + &:hover { + transition: all 0.3s ease-in; + } + } +} + +#access-lastmod { + a { + color: inherit; + + &:hover { + @extend %link-hover; + } + + @extend %no-bottom-border; + } +} + +.footnotes > ol { + padding-left: 2rem; + margin-top: 0.5rem; + + > li { + &:not(:last-child) { + margin-bottom: 0.3rem; + } + + @extend %sup-fn-target; + + > p { + margin-left: 0.25em; + + @include mt-mb(0); + } + } +} + +.footnote { + @at-root a#{&} { + @include ml-mr(1px); + @include pl-pr(2px); + + border-bottom-style: none !important; + } +} + +sup { + @extend %sup-fn-target; +} + +.reversefootnote { + @at-root a#{&} { + font-size: 0.6rem; + line-height: 1; + position: relative; + bottom: 0.25em; + margin-left: 0.25em; + border-bottom-style: none !important; + } +} + +/* --- Begin of Markdown table style --- */ + +/* it will be created by Liquid */ +.table-wrapper { + overflow-x: auto; + margin-bottom: 1.5rem; + + > table { + min-width: 100%; + overflow-x: auto; + border-spacing: 0; + + thead { + border-bottom: solid 2px rgba(210, 215, 217, 0.75); + + th { + @extend %table-cell; + } + } + + tbody { + tr { + border-bottom: 1px solid var(--tb-border-color); + + &:nth-child(2n) { + background-color: var(--tb-even-bg); + } + + &:nth-child(2n + 1) { + background-color: var(--tb-odd-bg); + } + + td { + @extend %table-cell; + } + } + } /* tbody */ + } /* table */ +} + +/* --- post --- */ + +.preview-img { + aspect-ratio: 40 / 21; + width: 100%; + height: 100%; + overflow: hidden; + + @extend %rounded; + + &:not(.no-bg) { + background: var(--img-bg); + } + + img { + height: 100%; + -o-object-fit: cover; + object-fit: cover; + + @extend %rounded; + + @at-root #post-list & { + width: 100%; + } + } +} + +.post-preview { + @extend %rounded; + + border: 0; + background: var(--card-bg); + box-shadow: var(--card-shadow); + + &::before { + @extend %rounded; + + content: ''; + width: 100%; + height: 100%; + position: absolute; + background-color: var(--card-hovor-bg); + opacity: 0; + transition: opacity 0.35s ease-in-out; + } + + &:hover { + &::before { + opacity: 0.3; + } + } +} + +main { + line-height: 1.75; + + h1 { + margin-top: 2rem; + } + + p { + > a.popup { + &:not(.normal):not(.left):not(.right) { + @include align-center; + } + } + } + + .categories, + #tags, + #archives { + a:not(:hover) { + @extend %no-bottom-border; + } + } +} + +.post-meta { + @extend %text-sm; + + a { + &:not([class]):hover { + @extend %link-hover; + } + } + + em { + @extend %normal-font-style; + } +} + +.content { + font-size: 1.08rem; + margin-top: 2rem; + overflow-wrap: break-word; + + a { + &.popup { + @extend %no-cursor; + @extend %img-caption; + @include mt-mb(0.5rem); + + cursor: zoom-in; + } + + &:not(.img-link) { + @extend %link-underline; + + &:hover { + @extend %link-hover; + } + } + } + + ol, + ul { + &:not([class]), + &.task-list { + -webkit-padding-start: 1.75rem; + padding-inline-start: 1.75rem; + + li { + margin: 0.25rem 0; + padding-left: 0.25rem; + } + + ol, + ul { + -webkit-padding-start: 1.25rem; + padding-inline-start: 1.25rem; + margin: 0.5rem 0; + } + } + } + + ul.task-list { + -webkit-padding-start: 1.25rem; + padding-inline-start: 1.25rem; + + li { + list-style-type: none; + padding-left: 0; + + /* checkbox icon */ + > i { + width: 2rem; + margin-left: -1.25rem; + color: var(--checkbox-color); + + &.checked { + color: var(--checkbox-checked-color); + } + } + + ul { + -webkit-padding-start: 1.75rem; + padding-inline-start: 1.75rem; + } + } + + input[type='checkbox'] { + margin: 0 0.5rem 0.2rem -1.3rem; + vertical-align: middle; + } + } /* ul */ + + dl > dd { + margin-left: 1rem; + } + + ::marker { + color: var(--text-muted-color); + } +} /* .content */ + +.tag:hover { + @extend %tag-hover; +} + +.post-tag { + display: inline-block; + min-width: 2rem; + text-align: center; + border-radius: 0.5rem; + border: 1px solid var(--btn-border-color); + padding: 0 0.4rem; + color: var(--text-muted-color); + line-height: 1.3rem; + + &:not(:last-child) { + margin-right: 0.2rem; + } +} + +.rounded-10 { + border-radius: 10px !important; +} + +.img-link { + color: transparent; + display: inline-flex; +} + +.shimmer { + overflow: hidden; + position: relative; + background: var(--img-bg); + + &::before { + content: ''; + position: absolute; + background: var(--shimmer-bg); + height: 100%; + width: 100%; + -webkit-animation: shimmer 1.3s infinite; + animation: shimmer 1.3s infinite; + } + + @-webkit-keyframes shimmer { + 0% { + transform: translateX(-100%); + } + + 100% { + transform: translateX(100%); + } + } + + @keyframes shimmer { + 0% { + transform: translateX(-100%); + } + + 100% { + transform: translateX(100%); + } + } +} + +.embed-video { + width: 100%; + height: 100%; + margin-bottom: 1rem; + aspect-ratio: 16 / 9; + + @extend %rounded; + + &.twitch { + aspect-ratio: 310 / 189; + } + + &.file { + display: block; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; + margin: auto; + margin-bottom: 0; + } + + @extend %img-caption; +} + +.embed-audio { + width: 100%; + display: block; + + @extend %img-caption; +} + +/* --- buttons --- */ +.btn-lang { + border: 1px solid !important; + padding: 1px 3px; + border-radius: 3px; + color: var(--link-color); + + &:focus { + box-shadow: none; + } +} + +/* --- Effects classes --- */ + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.btn-box-shadow { + box-shadow: var(--card-shadow); +} + +/* overwrite bootstrap muted */ +.text-muted { + color: var(--text-muted-color) !important; +} + +/* Overwrite bootstrap tooltip */ +.tooltip-inner { + font-size: 0.7rem; + max-width: 220px; + text-align: left; +} + +/* Overwrite bootstrap outline button */ +.btn.btn-outline-primary { + &:not(.disabled):hover { + border-color: #007bff !important; + } +} + +.disabled { + color: rgb(206, 196, 196); + pointer-events: auto; + cursor: not-allowed; +} + +.hide-border-bottom { + border-bottom: none !important; +} + +.input-focus { + box-shadow: none; + border-color: var(--input-focus-border-color) !important; + background: center !important; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} + +.left { + float: left; + margin: 0.75rem 1rem 1rem 0; +} + +.right { + float: right; + margin: 0.75rem 0 1rem 1rem; +} + +/* --- Overriding --- */ + +/* mermaid */ +.mermaid { + text-align: center; +} + +/* MathJax */ +mjx-container { + overflow-y: hidden; + min-width: auto !important; +} + +/* --- sidebar layout --- */ + +$sidebar-display: 'sidebar-display'; +$btn-border-width: 3px; +$btn-mb: 0.5rem; + +#sidebar { + @include pl-pr(0); + + position: fixed; + top: 0; + left: 0; + height: 100%; + overflow-y: auto; + width: $sidebar-width; + background: var(--sidebar-bg); + border-right: 1px solid var(--sidebar-border-color); + + /* Hide scrollbar for IE, Edge and Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + + /* Hide scrollbar for Chrome, Safari and Opera */ + &::-webkit-scrollbar { + display: none; + } + + %sidebar-link-hover { + &:hover { + color: var(--sidebar-active-color); + } + } + + a { + @extend %sidebar-links; + } + + #avatar { + display: block; + width: 7rem; + height: 7rem; + overflow: hidden; + box-shadow: var(--avatar-border-color) 0 0 0 2px; + transform: translateZ(0); /* fixed the zoom in Safari */ + + img { + transition: transform 0.5s; + + &:hover { + transform: scale(1.2); + } + } + } + + .profile-wrapper { + @include mt-mb(2.5rem); + @extend %clickable-transition; + + padding-left: 2.5rem; + padding-right: 1.25rem; + width: 100%; + } + + .site-title { + @extend %clickable-transition; + @extend %sidebar-link-hover; + + font-family: inherit; + font-weight: 900; + font-size: 1.75rem; + line-height: 1.2; + letter-spacing: 0.25px; + margin-top: 1.25rem; + margin-bottom: 0.5rem; + width: fit-content; + color: var(--site-title-color); + } + + .site-subtitle { + font-size: 95%; + color: var(--site-subtitle-color); + margin-top: 0.25rem; + word-spacing: 1px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + ul { + margin-bottom: 2rem; + + li.nav-item { + opacity: 0.9; + width: 100%; + + @include pl-pr(1.5rem); + + a.nav-link { + @include pt-pb(0.6rem); + + display: flex; + align-items: center; + border-radius: 0.75rem; + font-weight: 600; + + &:hover { + background-color: var(--sidebar-hover-bg); + } + + i { + font-size: 95%; + opacity: 0.8; + margin-right: 1.5rem; + } + + span { + font-size: 90%; + letter-spacing: 0.2px; + } + } + + &.active { + .nav-link { + color: var(--sidebar-active-color); + background-color: var(--sidebar-hover-bg); + + span { + opacity: 1; + } + } + } + + &:not(:first-child) { + margin-top: 0.25rem; + } + } + } + + .sidebar-bottom { + padding-left: 2rem; + padding-right: 1rem; + margin-bottom: 1.5rem; + + $btn-size: 1.75rem; + + %button { + width: $btn-size; + height: $btn-size; + margin-bottom: $btn-mb; // multi line gap + border-radius: 50%; + color: var(--sidebar-btn-color); + background-color: var(--sidebar-btn-bg); + text-align: center; + display: flex; + align-items: center; + justify-content: center; + + &:not(:focus-visible) { + box-shadow: var(--sidebar-border-color) 0 0 0 1px; + } + + &:hover { + background-color: var(--sidebar-hover-bg); + } + } + + a { + @extend %button; + @extend %sidebar-link-hover; + @extend %clickable-transition; + + &:not(:last-child) { + margin-right: $sb-btn-gap; + } + } + + i { + line-height: $btn-size; + } + + #mode-toggle { + @extend %button; + @extend %sidebar-links; + @extend %sidebar-link-hover; + } + + .icon-border { + @extend %no-cursor; + @include ml-mr(calc(($sb-btn-gap - $btn-border-width) / 2)); + + background-color: var(--sidebar-btn-color); + content: ''; + width: $btn-border-width; + height: $btn-border-width; + border-radius: 50%; + margin-bottom: $btn-mb; + } + } /* .sidebar-bottom */ +} /* #sidebar */ + +@media (hover: hover) { + #sidebar ul > li:last-child::after { + transition: top 0.5s ease; + } + + .nav-link { + transition: background-color 0.3s ease-in-out; + } + + .post-preview { + transition: background-color 0.35s ease-in-out; + } +} + +#search-result-wrapper { + display: none; + height: 100%; + width: 100%; + overflow: auto; + + .content { + margin-top: 2rem; + } +} + +/* --- top-bar --- */ + +#topbar-wrapper { + height: $topbar-height; + background-color: var(--topbar-bg); +} + +#topbar { + @extend %btn-color; + + #breadcrumb { + font-size: 1rem; + color: var(--text-muted-color); + padding-left: 0.5rem; + + a:hover { + @extend %link-hover; + } + + span { + &:not(:last-child) { + &::after { + content: '›'; + padding: 0 0.3rem; + } + } + } + } +} /* #topbar */ + +::-webkit-input-placeholder { + @include placeholder; +} + +::-moz-placeholder { + @include placeholder; +} + +:-ms-input-placeholder { + @include placeholder; +} + +::-ms-input-placeholder { + @include placeholder; +} + +::placeholder { + @include placeholder; +} + +:focus::-webkit-input-placeholder { + @include placeholder-focus; +} + +:focus::-moz-placeholder { + @include placeholder-focus; +} + +:focus:-ms-input-placeholder { + @include placeholder-focus; +} + +:focus::-ms-input-placeholder { + @include placeholder-focus; +} + +:focus::placeholder { + @include placeholder-focus; +} + +search { + display: flex; + width: 100%; + border-radius: 1rem; + border: 1px solid var(--search-border-color); + background: var(--main-bg); + padding: 0 0.5rem; + + i { + z-index: 2; + font-size: 0.9rem; + color: var(--search-icon-color); + } +} + +#sidebar-trigger, +#search-trigger { + display: none; +} + +/* 'Cancel' link */ +#search-cancel { + color: var(--link-color); + display: none; + white-space: nowrap; + + @extend %cursor-pointer; +} + +#search-input { + background: center; + border: 0; + border-radius: 0; + padding: 0.18rem 0.3rem; + color: var(--text-color); + height: auto; + + &:focus { + box-shadow: none; + } +} + +#search-hints { + padding: 0 1rem; + + h4 { + margin-bottom: 1.5rem; + } + + .post-tag { + display: inline-block; + line-height: 1rem; + font-size: 1rem; + background: var(--search-tag-bg); + border: none; + padding: 0.5rem; + margin: 0 1.25rem 1rem 0; + + &::before { + content: '#'; + color: var(--text-muted-color); + padding-right: 0.2rem; + } + + @extend %link-color; + } +} + +#search-results { + padding-bottom: 3rem; + + a { + font-size: 1.4rem; + line-height: 1.5rem; + + &:hover { + @extend %link-hover; + } + + @extend %link-color; + @extend %no-bottom-border; + @extend %heading; + } + + > article { + width: 100%; + + &:not(:last-child) { + margin-bottom: 1rem; + } + + /* icons */ + i { + color: #818182; + margin-right: 0.15rem; + font-size: 80%; + } + + > p { + @extend %text-ellipsis; + + white-space: break-spaces; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + } + } +} /* #search-results */ + +#topbar-title { + display: none; + font-size: 1.1rem; + font-weight: 600; + font-family: sans-serif; + color: var(--topbar-text-color); + text-align: center; + width: 70%; + word-break: keep-all; +} + +#mask { + inset: 0 0 0 0; +} + +/* --- basic wrappers --- */ + +#main-wrapper { + position: relative; + + @include pl-pr(0); + + > .container { + min-height: 100vh; + } +} + +#topbar-wrapper.row, +#main-wrapper > .container > .row, +#search-result-wrapper > .row { + @include ml-mr(0); +} + +#tail-wrapper { + > :not(script) { + margin-top: 3rem; + } +} + +/* --- button back-to-top --- */ + +#back-to-top { + visibility: hidden; + opacity: 0; + z-index: 1; + cursor: pointer; + position: fixed; + right: 1rem; + bottom: calc($footer-height-large - $back2top-size / 2); + background: var(--button-bg); + color: var(--btn-backtotop-color); + padding: 0; + width: $back2top-size; + height: $back2top-size; + border-radius: 50%; + border: 1px solid var(--btn-backtotop-border-color); + transition: opacity 0.5s ease-in-out, transform 0.2s ease-out; + + &:hover { + transform: translate3d(0, -5px, 0); + -webkit-transform: translate3d(0, -5px, 0); + } + + i { + line-height: $back2top-size; + position: relative; + bottom: 2px; + } + + &.show { + opacity: 1; + visibility: visible; + } +} + +#notification { + @-webkit-keyframes popup { + from { + opacity: 0; + bottom: 0; + } + } + + @keyframes popup { + from { + opacity: 0; + bottom: 0; + } + } + + .toast-header { + background: none; + border-bottom: none; + color: inherit; + } + + .toast-body { + font-family: Lato, sans-serif; + line-height: 1.25rem; + + button { + font-size: 90%; + min-width: 4rem; + } + } + + &.toast { + &.show { + display: block; + min-width: 20rem; + border-radius: 0.5rem; + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + background-color: rgba(255, 255, 255, 0.5); + color: #1b1b1eba; + position: fixed; + left: 50%; + bottom: 20%; + transform: translateX(-50%); + -webkit-animation: popup 0.8s; + animation: popup 0.8s; + } + } +} + +/* + Responsive Design: + + {sidebar, content, panel} >= 1200px screen width + {sidebar, content} >= 850px screen width + {content} <= 849px screen width + +*/ + +@media all and (max-width: 576px) { + main { + .content { + > blockquote[class^='prompt-'] { + @include ml-mr(-1rem); + + border-radius: 0; + max-width: none; + } + } + } + + #avatar { + width: 5rem; + height: 5rem; + } +} + +@media all and (max-width: 768px) { + %full-width { + max-width: 100%; + } + + #topbar { + @extend %full-width; + } + + #main-wrapper > .container { + @extend %full-width; + @include pl-pr(0); + } +} + +/* hide sidebar and panel */ +@media all and (max-width: 849px) { + @mixin slide($append: null) { + $basic: transform 0.4s ease; + + @if $append { + transition: $basic, $append; + } @else { + transition: $basic; + } + } + + footer { + @include slide; + + height: $footer-height-large; + padding: 1.5rem 0; + } + + [#{$sidebar-display}] { + #sidebar { + transform: translateX(0); + } + + #main-wrapper { + transform: translateX($sidebar-width); + } + + #back-to-top { + visibility: hidden; + } + } + + #sidebar { + @include slide; + + transform: translateX(-$sidebar-width); /* hide */ + -webkit-transform: translateX(-$sidebar-width); + } + + #main-wrapper { + @include slide; + } + + #topbar, + #main-wrapper > .container { + max-width: 100%; + } + + #search-result-wrapper { + width: 100%; + } + + #breadcrumb, + search { + display: none; + } + + #topbar-wrapper { + @include slide(top 0.2s ease); + + left: 0; + } + + main, + #panel-wrapper { + margin-top: 0; + } + + #topbar-title, + #sidebar-trigger, + #search-trigger { + display: block; + } + + #search-result-wrapper .content { + letter-spacing: 0; + } + + #tags { + justify-content: center !important; + } + + h1.dynamic-title { + display: none; + + ~ .content { + margin-top: 2.5rem; + } + } +} /* max-width: 849px */ + +/* Sidebar is visible */ +@media all and (min-width: 850px) { + /* Solved jumping scrollbar */ + html { + overflow-y: scroll; + } + + #main-wrapper { + margin-left: $sidebar-width; + } + + #sidebar { + .profile-wrapper { + margin-top: 3rem; + } + } + + #search-hints { + display: none; + } + + search { + max-width: $search-max-width; + } + + #search-result-wrapper { + max-width: $main-content-max-width; + justify-content: start !important; + } + + main { + h1 { + margin-top: 3rem; + } + } + + div.content .table-wrapper > table { + min-width: 70%; + } + + /* button 'back-to-Top' position */ + #back-to-top { + right: 5%; + bottom: calc($footer-height - $back2top-size / 2); + } + + #topbar-title { + text-align: left; + } +} + +/* Pad horizontal */ +@media all and (min-width: 992px) and (max-width: 1199px) { + #main-wrapper > .container .col-lg-11 { + flex: 0 0 96%; + max-width: 96%; + } +} + +/* Compact icons in sidebar & panel hidden */ +@media all and (min-width: 850px) and (max-width: 1199px) { + #search-results > div { + max-width: 700px; + } + + #breadcrumb { + width: 65%; + overflow: hidden; + text-overflow: ellipsis; + word-break: keep-all; + white-space: nowrap; + } +} + +/* panel hidden */ +@media all and (max-width: 1199px) { + #panel-wrapper { + display: none; + } + + #main-wrapper > .container > div.row { + justify-content: center !important; + } +} + +/* --- desktop mode, both sidebar and panel are visible --- */ + +@media all and (min-width: 1200px) { + search { + margin-right: 4rem; + } + + #search-input { + transition: all 0.3s ease-in-out; + } + + #search-results > article { + width: 45%; + + &:nth-child(odd) { + margin-right: 1.5rem; + } + + &:nth-child(even) { + margin-left: 1.5rem; + } + + &:last-child:nth-child(odd) { + position: relative; + right: 24.3%; + } + } + + .content { + font-size: 1.03rem; + } +} + +@media all and (min-width: 1400px) { + #back-to-top { + right: calc((100vw - $sidebar-width - 1140px) / 2 + 3rem); + } +} + +@media all and (min-width: 1650px) { + $icon-gap: 1rem; + + #main-wrapper { + margin-left: $sidebar-width-large; + } + + #topbar-wrapper { + left: $sidebar-width-large; + } + + search { + margin-right: calc( + $main-content-max-width / 4 - $search-max-width - 0.75rem + ); + } + + #main-wrapper > .container { + max-width: $main-content-max-width; + + @include pl-pr(1.75rem, true); + } + + main.col-12, + #tail-wrapper { + padding-right: 4.5rem !important; + } + + #back-to-top { + right: calc( + (100vw - $sidebar-width-large - $main-content-max-width) / 2 + 2rem + ); + } + + #sidebar { + width: $sidebar-width-large; + + .profile-wrapper { + margin-top: 3.5rem; + margin-bottom: 2.5rem; + padding-left: 3.5rem; + } + + ul { + li.nav-item { + @include pl-pr(2.75rem); + } + } + + .sidebar-bottom { + padding-left: 2.75rem; + margin-bottom: 1.75rem; + + a:not(:last-child) { + margin-right: $sb-btn-gap-lg; + } + + .icon-border { + @include ml-mr(calc(($sb-btn-gap-lg - $btn-border-width) / 2)); + } + } + } +} /* min-width: 1650px */ diff --git a/_sass/addon/module.scss b/_sass/addon/module.scss new file mode 100644 index 0000000..1dfb735 --- /dev/null +++ b/_sass/addon/module.scss @@ -0,0 +1,215 @@ +/* +* Mainly scss modules, only imported to `assets/css/main.scss` +*/ + +/* ---------- scss placeholder --------- */ + +%heading { + color: var(--heading-color); + font-weight: 400; + font-family: $font-family-heading; + scroll-margin-top: 3.5rem; +} + +%anchor { + .anchor { + font-size: 80%; + } + + @media (hover: hover) { + .anchor { + visibility: hidden; + opacity: 0; + transition: opacity 0.25s ease-in, visibility 0s ease-in 0.25s; + } + + &:hover { + .anchor { + visibility: visible; + opacity: 1; + transition: opacity 0.25s ease-in, visibility 0s ease-in 0s; + } + } + } +} + +%tag-hover { + background: var(--tag-hover); + transition: background 0.35s ease-in-out; +} + +%table-cell { + padding: 0.4rem 1rem; + font-size: 95%; + white-space: nowrap; +} + +%link-hover { + color: #d2603a !important; + border-bottom: 1px solid #d2603a; + text-decoration: none; +} + +%link-color { + color: var(--link-color); +} + +%link-underline { + border-bottom: 1px solid var(--link-underline-color); +} + +%clickable-transition { + transition: all 0.3s ease-in-out; +} + +%no-cursor { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +%no-bottom-border { + border-bottom: none; +} + +%cursor-pointer { + cursor: pointer; +} + +%normal-font-style { + font-style: normal; +} + +%rounded { + border-radius: $radius-lg; +} + +%img-caption { + + em { + display: block; + text-align: center; + font-style: normal; + font-size: 80%; + padding: 0; + color: #6d6c6c; + } +} + +%sidebar-links { + color: var(--sidebar-muted-color); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +%text-clip { + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +@mixin text-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +%text-ellipsis { + @include text-ellipsis; +} + +%text-highlight { + color: var(--text-muted-highlight-color); + font-weight: 600; +} + +%text-sm { + font-size: 0.85rem; +} + +%text-xs { + font-size: 0.8rem; +} + +%sup-fn-target { + &:target { + background-color: var(--footnote-target-bg); + width: -moz-fit-content; + width: -webkit-fit-content; + width: fit-content; + transition: background-color 1.75s ease-in-out; + } +} + +%btn-color { + button i { + color: #999999; + } +} + +/* ---------- scss mixin --------- */ + +@mixin mt-mb($value) { + margin-top: $value; + margin-bottom: $value; +} + +@mixin ml-mr($value) { + margin-left: $value; + margin-right: $value; +} + +@mixin pt-pb($val) { + padding-top: $val; + padding-bottom: $val; +} + +@mixin pl-pr($val, $important: false) { + @if $important { + padding-left: $val !important; + padding-right: $val !important; + } @else { + padding-left: $val; + padding-right: $val; + } +} + +@mixin placeholder { + color: var(--text-muted-color) !important; +} + +@mixin placeholder-focus { + opacity: 0.6; +} + +@mixin label($font-size: 1rem, $font-weight: 600, $color: var(--label-color)) { + color: $color; + font-size: $font-size; + font-weight: $font-weight; +} + +@mixin align-center { + position: relative; + left: 50%; + transform: translateX(-50%); +} + +@mixin prompt($type, $fa-content, $fa-style: 'solid', $rotate: 0) { + &.prompt-#{$type} { + background-color: var(--prompt-#{$type}-bg); + + &::before { + content: $fa-content; + color: var(--prompt-#{$type}-icon-color); + font: var(--fa-font-#{$fa-style}); + + @if $rotate != 0 { + transform: rotate(#{$rotate}deg); + } + } + } +} diff --git a/_sass/addon/syntax.scss b/_sass/addon/syntax.scss new file mode 100644 index 0000000..6bd7b40 --- /dev/null +++ b/_sass/addon/syntax.scss @@ -0,0 +1,292 @@ +/* +* The syntax highlight. +*/ + +@import 'colors/syntax-light'; +@import 'colors/syntax-dark'; + +html { + @media (prefers-color-scheme: light) { + &:not([data-mode]), + &[data-mode='light'] { + @include light-syntax; + } + + &[data-mode='dark'] { + @include dark-syntax; + } + } + + @media (prefers-color-scheme: dark) { + &:not([data-mode]), + &[data-mode='dark'] { + @include dark-syntax; + } + + &[data-mode='light'] { + @include light-syntax; + } + } +} + +/* -- code snippets -- */ + +%code-snippet-bg { + background-color: var(--highlight-bg-color); +} + +%code-snippet-padding { + padding-left: 1rem; + padding-right: 1.5rem; +} + +.highlighter-rouge { + color: var(--highlighter-rouge-color); + margin-top: 0.5rem; + margin-bottom: 1.2em; /* Override BS Inline-code style */ +} + +.highlight { + @extend %rounded; + @extend %code-snippet-bg; + + overflow: auto; + padding-bottom: 0.75rem; + + @at-root figure#{&} { + @extend %code-snippet-bg; + } + + pre { + margin-bottom: 0; + font-size: $code-font-size; + line-height: 1.4rem; + word-wrap: normal; /* Fixed Safari overflow-x */ + } + + table { + td { + &:first-child { + display: inline-block; + margin-left: 1rem; + margin-right: 0.75rem; + } + + &:last-child { + padding-right: 2rem !important; + } + + pre { + overflow: visible; /* Fixed iOS safari overflow-x */ + word-break: normal; /* Fixed iOS safari linenos code break */ + } + } + } + + .lineno { + text-align: right; + color: var(--highlight-lineno-color); + -webkit-user-select: none; + -moz-user-select: none; + -o-user-select: none; + -ms-user-select: none; + user-select: none; + } +} /* .highlight */ + +code { + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; + color: var(--code-color); + + &.highlighter-rouge { + font-size: $code-font-size; + padding: 3px 5px; + word-break: break-word; + border-radius: $radius-sm; + background-color: var(--inline-code-bg); + } + + &.filepath { + background-color: inherit; + color: var(--filepath-text-color); + font-weight: 600; + padding: 0; + } + + a > &.highlighter-rouge { + padding-bottom: 0; /* show link's underlinke */ + color: inherit; + } + + a:hover > &.highlighter-rouge { + border-bottom: none; + } + + blockquote & { + color: inherit; + } +} + +td.rouge-code { + @extend %code-snippet-padding; + + /* + Prevent some browser extends from + changing the URL string of code block. + */ + a { + color: inherit !important; + border-bottom: none !important; + pointer-events: none; + } +} + +div[class^='language-'] { + @extend %rounded; + @extend %code-snippet-bg; + + box-shadow: var(--language-border-color) 0 0 0 1px; + + .content > & { + @include ml-mr(-1rem); + + border-radius: 0; + } + + .highlight { + border-top-left-radius: 0; + border-top-right-radius: 0; + } +} + +/* Hide line numbers for default, console, and terminal code snippets */ +div { + &.nolineno, + &.language-plaintext, + &.language-console, + &.language-terminal { + td:first-child { + padding: 0 !important; + margin-right: 0; + + .lineno { + display: none; + } + } + } +} + +.code-header { + @extend %no-cursor; + + display: flex; + justify-content: space-between; + align-items: center; + height: $code-header-height; + margin-left: 0.75rem; + margin-right: 0.25rem; + + /* the label block */ + span { + line-height: $code-header-height; + + /* label icon */ + i { + font-size: 1rem; + width: $code-icon-width; + color: var(--code-header-icon-color); + + &.small { + font-size: 70%; + } + } + + @at-root [file] #{&} > i { + position: relative; + top: 1px; /* center the file icon */ + } + + /* label text */ + &::after { + content: attr(data-label-text); + font-size: 0.85rem; + font-weight: 600; + color: var(--code-header-text-color); + } + } + + /* clipboard */ + button { + @extend %cursor-pointer; + @extend %rounded; + + border: 1px solid transparent; + height: $code-header-height; + width: $code-header-height; + padding: 0; + background-color: inherit; + + i { + color: var(--code-header-icon-color); + } + + &[timeout] { + &:hover { + border-color: var(--clipboard-checked-color); + } + + i { + color: var(--clipboard-checked-color); + } + } + + &:focus { + outline: none; + } + + &:not([timeout]):hover { + background-color: rgba(128, 128, 128, 0.37); + + i { + color: white; + } + } + } +} + +@media all and (min-width: 576px) { + div[class^='language-'] { + .content > & { + @include ml-mr(0); + + border-radius: $radius-lg; + } + + .code-header { + @include ml-mr(0); + + $dot-margin: 1rem; + + &::before { + content: ''; + display: inline-block; + margin-left: $dot-margin; + width: $code-dot-size; + height: $code-dot-size; + border-radius: 50%; + background-color: var(--code-header-muted-color); + box-shadow: ($code-dot-size + $code-dot-gap) 0 0 + var(--code-header-muted-color), + ($code-dot-size + $code-dot-gap) * 2 0 0 + var(--code-header-muted-color); + } + + span { + // center the text of label + margin-left: calc(($dot-margin + $code-dot-size) / 2 * -1); + } + } + } +} diff --git a/_sass/addon/variables.scss b/_sass/addon/variables.scss new file mode 100644 index 0000000..1d51cb1 --- /dev/null +++ b/_sass/addon/variables.scss @@ -0,0 +1,34 @@ +/* + * The SCSS variables + */ + +/* sidebar */ + +$sidebar-width: 260px !default; /* the basic width */ +$sidebar-width-large: 300px !default; /* screen width: >= 1650px */ +$sb-btn-gap: 0.8rem !default; +$sb-btn-gap-lg: 1rem !default; + +/* other framework sizes */ + +$topbar-height: 3rem !default; +$search-max-width: 200px !default; +$footer-height: 5rem !default; +$footer-height-large: 6rem !default; /* screen width: < 850px */ +$main-content-max-width: 1250px !default; +$radius-sm: 6px !default; +$radius-lg: 10px !default; +$back2top-size: 2.75rem !default; + +/* syntax highlight */ + +$code-font-size: 0.85rem !default; +$code-header-height: 2.25rem !default; +$code-dot-size: 0.75rem !default; +$code-dot-gap: 0.5rem !default; +$code-icon-width: 1.75rem !default; + +/* fonts */ + +$font-family-base: 'Source Sans Pro', 'Microsoft Yahei', sans-serif !default; +$font-family-heading: Lato, 'Microsoft Yahei', sans-serif !default; diff --git a/_sass/colors/syntax-dark.scss b/_sass/colors/syntax-dark.scss new file mode 100644 index 0000000..eb92204 --- /dev/null +++ b/_sass/colors/syntax-dark.scss @@ -0,0 +1,164 @@ +/* + * The syntax dark mode styles. + */ + +@mixin dark-syntax { + --language-border-color: #2d2d2d; + --highlight-bg-color: #151515; + --highlighter-rouge-color: #c9def1; + --highlight-lineno-color: #808080; + --inline-code-bg: rgba(255, 255, 255, 0.05); + --code-color: #b0b0b0; + --code-header-text-color: #6a6a6a; + --code-header-muted-color: #353535; + --code-header-icon-color: #565656; + --clipboard-checked-color: #2bcc2b; + --filepath-text-color: #cacaca; + + .highlight .gp { + color: #87939d; + } + + /* --- Syntax highlight theme from `rougify style base16.dark` --- */ + + .highlight table td { + padding: 5px; + } + + .highlight table pre { + margin: 0; + } + + .highlight, + .highlight .w { + color: #d0d0d0; + background-color: #151515; + } + + .highlight .err { + color: #151515; + background-color: #ac4142; + } + + .highlight .c, + .highlight .ch, + .highlight .cd, + .highlight .cm, + .highlight .cpf, + .highlight .c1, + .highlight .cs { + color: #848484; + } + + .highlight .cp { + color: #f4bf75; + } + + .highlight .nt { + color: #f4bf75; + } + + .highlight .o, + .highlight .ow { + color: #d0d0d0; + } + + .highlight .p, + .highlight .pi { + color: #d0d0d0; + } + + .highlight .gi { + color: #90a959; + } + + .highlight .gd { + color: #f08a8b; + background-color: #320000; + } + + .highlight .gh { + color: #6a9fb5; + background-color: #151515; + font-weight: bold; + } + + .highlight .k, + .highlight .kn, + .highlight .kp, + .highlight .kr, + .highlight .kv { + color: #aa759f; + } + + .highlight .kc { + color: #d28445; + } + + .highlight .kt { + color: #d28445; + } + + .highlight .kd { + color: #d28445; + } + + .highlight .s, + .highlight .sb, + .highlight .sc, + .highlight .dl, + .highlight .sd, + .highlight .s2, + .highlight .sh, + .highlight .sx, + .highlight .s1 { + color: #90a959; + } + + .highlight .sa { + color: #aa759f; + } + + .highlight .sr { + color: #75b5aa; + } + + .highlight .si { + color: #b76d45; + } + + .highlight .se { + color: #b76d45; + } + + .highlight .nn { + color: #f4bf75; + } + + .highlight .nc { + color: #f4bf75; + } + + .highlight .no { + color: #f4bf75; + } + + .highlight .na { + color: #6a9fb5; + } + + .highlight .m, + .highlight .mb, + .highlight .mf, + .highlight .mh, + .highlight .mi, + .highlight .il, + .highlight .mo, + .highlight .mx { + color: #90a959; + } + + .highlight .ss { + color: #90a959; + } +} diff --git a/_sass/colors/syntax-light.scss b/_sass/colors/syntax-light.scss new file mode 100644 index 0000000..76aa669 --- /dev/null +++ b/_sass/colors/syntax-light.scss @@ -0,0 +1,210 @@ +/* + * The syntax light mode code snippet colors. + */ + +@mixin light-syntax { + /* --- custom light colors --- */ + --language-border-color: #ececec; + --highlight-bg-color: #f6f8fa; + --highlighter-rouge-color: #3f596f; + --highlight-lineno-color: #9e9e9e; + --inline-code-bg: rgba(25, 25, 28, 0.05); + --code-color: #3a3a3a; + --code-header-text-color: #a3a3a3; + --code-header-muted-color: #e5e5e5; + --code-header-icon-color: #c9c8c8; + --clipboard-checked-color: #43c743; + + /* --- Syntax highlight theme from `rougify style github` --- */ + + .highlight table td { + padding: 5px; + } + + .highlight table pre { + margin: 0; + } + + .highlight, + .highlight .w { + color: #24292f; + background-color: #f6f8fa; + } + + .highlight .k, + .highlight .kd, + .highlight .kn, + .highlight .kp, + .highlight .kr, + .highlight .kt, + .highlight .kv { + color: #cf222e; + } + + .highlight .gr { + color: #f6f8fa; + } + + .highlight .gd { + color: #82071e; + background-color: #ffebe9; + } + + .highlight .nb { + color: #953800; + } + + .highlight .nc { + color: #953800; + } + + .highlight .no { + color: #953800; + } + + .highlight .nn { + color: #953800; + } + + .highlight .sr { + color: #116329; + } + + .highlight .na { + color: #116329; + } + + .highlight .nt { + color: #116329; + } + + .highlight .gi { + color: #116329; + background-color: #dafbe1; + } + + .highlight .kc { + color: #0550ae; + } + + .highlight .l, + .highlight .ld, + .highlight .m, + .highlight .mb, + .highlight .mf, + .highlight .mh, + .highlight .mi, + .highlight .il, + .highlight .mo, + .highlight .mx { + color: #0550ae; + } + + .highlight .sb { + color: #0550ae; + } + + .highlight .bp { + color: #0550ae; + } + + .highlight .ne { + color: #0550ae; + } + + .highlight .nl { + color: #0550ae; + } + + .highlight .py { + color: #0550ae; + } + + .highlight .nv, + .highlight .vc, + .highlight .vg, + .highlight .vi, + .highlight .vm { + color: #0550ae; + } + + .highlight .o, + .highlight .ow { + color: #0550ae; + } + + .highlight .gh { + color: #0550ae; + font-weight: bold; + } + + .highlight .gu { + color: #0550ae; + font-weight: bold; + } + + .highlight .s, + .highlight .sa, + .highlight .sc, + .highlight .dl, + .highlight .sd, + .highlight .s2, + .highlight .se, + .highlight .sh, + .highlight .sx, + .highlight .s1, + .highlight .ss { + color: #0a3069; + } + + .highlight .nd { + color: #8250df; + } + + .highlight .nf, + .highlight .fm { + color: #8250df; + } + + .highlight .err { + color: #f6f8fa; + background-color: #82071e; + } + + .highlight .c, + .highlight .ch, + .highlight .cd, + .highlight .cm, + .highlight .cp, + .highlight .cpf, + .highlight .c1, + .highlight .cs { + color: #68717a; + } + + .highlight .gl { + color: #68717a; + } + + .highlight .gt { + color: #68717a; + } + + .highlight .ni { + color: #24292f; + } + + .highlight .si { + color: #24292f; + } + + .highlight .ge { + color: #24292f; + font-style: italic; + } + + .highlight .gs { + color: #24292f; + font-weight: bold; + } +} /* light-syntax */ diff --git a/_sass/colors/typography-dark.scss b/_sass/colors/typography-dark.scss new file mode 100644 index 0000000..664c936 --- /dev/null +++ b/_sass/colors/typography-dark.scss @@ -0,0 +1,147 @@ +/* + * The main dark mode styles + */ + +@mixin dark-scheme { + /* Framework color */ + --main-bg: rgb(27, 27, 30); + --mask-bg: rgb(68, 69, 70); + --main-border-color: rgb(44, 45, 45); + + /* Common color */ + --text-color: rgb(175, 176, 177); + --text-muted-color: #868686; + --text-muted-highlight-color: #aeaeae; + --heading-color: #cccccc; + --label-color: #a7a7a7; + --blockquote-border-color: rgb(66, 66, 66); + --blockquote-text-color: #868686; + --link-color: rgb(138, 180, 248); + --link-underline-color: rgb(82, 108, 150); + --button-bg: #1e1e1e; + --btn-border-color: #2e2f31; + --btn-backtotop-color: var(--text-color); + --btn-backtotop-border-color: #212122; + --card-header-bg: #292929; + --checkbox-color: rgb(118, 120, 121); + --checkbox-checked-color: var(--link-color); + --img-bg: radial-gradient(circle, rgb(22, 22, 24) 0%, rgb(32, 32, 32) 100%); + --shimmer-bg: linear-gradient( + 90deg, + rgba(255, 255, 255, 0) 0%, + rgba(58, 55, 55, 0.4) 50%, + rgba(255, 255, 255, 0) 100% + ); + + /* Sidebar */ + --site-title-color: #717070; + --site-subtitle-color: #868686; + --sidebar-bg: #1e1e1e; + --sidebar-border-color: #292929; + --sidebar-muted-color: #868686; + --sidebar-active-color: rgb(255, 255, 255, 0.95); + --sidebar-hover-bg: #262626; + --sidebar-btn-bg: #232328; + --sidebar-btn-color: #787878; + --avatar-border-color: rgb(206, 206, 206, 0.9); + + /* Topbar */ + --topbar-bg: rgb(27, 27, 30, 0.64); + --topbar-text-color: var(--text-color); + --search-border-color: rgb(55, 55, 55); + --search-icon-color: rgb(100, 102, 105); + --input-focus-border-color: rgb(112, 114, 115); + + /* Home page */ + --post-list-text-color: rgb(175, 176, 177); + --btn-patinator-text-color: var(--text-color); + --btn-paginator-hover-color: #2e2e2e; + + /* Posts */ + --toc-highlight: rgb(116, 178, 243); + --toc-popup-border-color: #373737; + --tag-hover: rgb(43, 56, 62); + --tb-odd-bg: #252526; /* odd rows of the posts' table */ + --tb-even-bg: rgb(31, 31, 34); /* even rows of the posts' table */ + --tb-border-color: var(--tb-odd-bg); + --footnote-target-bg: rgb(63, 81, 181); + --btn-share-color: #6c757d; + --btn-share-hover-color: #bfc1ca; + --card-bg: #1e1e1e; + --card-hovor-bg: #464d51; + --card-shadow: rgb(21, 21, 21, 0.72) 0 6px 18px 0, + rgb(137, 135, 135, 0.24) 0 0 0 1px; + --kbd-wrap-color: #6a6a6a; + --kbd-text-color: #d3d3d3; + --kbd-bg-color: #242424; + --prompt-text-color: rgb(216, 212, 212, 0.75); + --prompt-tip-bg: rgb(22, 60, 36, 0.64); + --prompt-tip-icon-color: rgb(15, 164, 15, 0.81); + --prompt-info-bg: rgb(7, 59, 104, 0.8); + --prompt-info-icon-color: #0075d1; + --prompt-warning-bg: rgb(90, 69, 3, 0.88); + --prompt-warning-icon-color: rgb(255, 165, 0, 0.8); + --prompt-danger-bg: rgb(86, 28, 8, 0.8); + --prompt-danger-icon-color: #cd0202; + + /* Tags */ + --tag-border: rgb(59, 79, 88); + --tag-shadow: rgb(32, 33, 33); + --dash-color: rgb(63, 65, 68); + --search-tag-bg: #292828; + + /* Categories */ + --categories-border: rgb(64, 66, 69, 0.5); + --categories-hover-bg: rgb(73, 75, 76); + --categories-icon-hover-color: white; + + /* Archive */ + --timeline-node-bg: rgb(150, 152, 156); + --timeline-color: rgb(63, 65, 68); + --timeline-year-dot-color: var(--timeline-color); + + color-scheme: dark; + + .light { + display: none; + } + + /* Categories */ + .categories.card, + .list-group-item { + background-color: var(--card-bg); + } + + .categories { + .card-header { + background-color: var(--card-header-bg); + } + + .list-group-item { + border-left: none; + border-right: none; + padding-left: 2rem; + border-color: var(--categories-border); + + &:last-child { + border-bottom-color: var(--card-bg); + } + } + } + + #archives li:nth-child(odd) { + background-image: linear-gradient( + to left, + rgb(26, 26, 30), + rgb(39, 39, 45), + rgb(39, 39, 45), + rgb(39, 39, 45), + rgb(26, 26, 30) + ); + } + + /* stylelint-disable-next-line selector-id-pattern */ + #disqus_thread { + color-scheme: none; + } +} /* dark-scheme */ diff --git a/_sass/colors/typography-light.scss b/_sass/colors/typography-light.scss new file mode 100644 index 0000000..b6fc561 --- /dev/null +++ b/_sass/colors/typography-light.scss @@ -0,0 +1,112 @@ +/* + * The syntax light mode typography colors + */ + +@mixin light-scheme { + /* Framework color */ + --main-bg: white; + --mask-bg: #c1c3c5; + --main-border-color: #f3f3f3; + + /* Common color */ + --text-color: #34343c; + --text-muted-color: #757575; + --text-muted-highlight-color: inherit; + --heading-color: #2a2a2a; + --label-color: #585858; + --blockquote-border-color: #eeeeee; + --blockquote-text-color: #757575; + --link-color: #0056b2; + --link-underline-color: #dee2e6; + --button-bg: #ffffff; + --btn-border-color: #e9ecef; + --btn-backtotop-color: #686868; + --btn-backtotop-border-color: #f1f1f1; + --checkbox-color: #c5c5c5; + --checkbox-checked-color: #07a8f7; + --img-bg: radial-gradient( + circle, + rgb(255, 255, 255) 0%, + rgb(239, 239, 239) 100% + ); + --shimmer-bg: linear-gradient( + 90deg, + rgba(250, 250, 250, 0) 0%, + rgba(232, 230, 230, 1) 50%, + rgba(250, 250, 250, 0) 100% + ); + + /* Sidebar */ + --site-title-color: rgb(113, 113, 113); + --site-subtitle-color: #717171; + --sidebar-bg: #f6f8fa; + --sidebar-border-color: #efefef; + --sidebar-muted-color: #545454; + --sidebar-active-color: #1d1d1d; + --sidebar-hover-bg: rgb(223, 233, 241, 0.64); + --sidebar-btn-bg: white; + --sidebar-btn-color: #8e8e8e; + --avatar-border-color: white; + + /* Topbar */ + --topbar-bg: rgb(255, 255, 255, 0.7); + --topbar-text-color: rgb(78, 78, 78); + --search-border-color: rgb(240, 240, 240); + --search-icon-color: #c2c6cc; + --input-focus-border-color: #b8b8b8; + + /* Home page */ + --post-list-text-color: dimgray; + --btn-patinator-text-color: #555555; + --btn-paginator-hover-color: var(--sidebar-bg); + + /* Posts */ + --toc-highlight: #0550ae; + --toc-popup-border-color: lightgray; + --btn-share-color: gray; + --btn-share-hover-color: #0d6efd; + --card-bg: white; + --card-hovor-bg: #e2e2e2; + --card-shadow: rgb(104, 104, 104, 0.05) 0 2px 6px 0, + rgba(211, 209, 209, 0.15) 0 0 0 1px; + --footnote-target-bg: lightcyan; + --tb-odd-bg: #fbfcfd; + --tb-border-color: #eaeaea; + --dash-color: silver; + --kbd-wrap-color: #bdbdbd; + --kbd-text-color: var(--text-color); + --kbd-bg-color: white; + --prompt-text-color: rgb(46, 46, 46, 0.77); + --prompt-tip-bg: rgb(123, 247, 144, 0.2); + --prompt-tip-icon-color: #03b303; + --prompt-info-bg: #e1f5fe; + --prompt-info-icon-color: #0070cb; + --prompt-warning-bg: rgb(255, 243, 205); + --prompt-warning-icon-color: #ef9c03; + --prompt-danger-bg: rgb(248, 215, 218, 0.56); + --prompt-danger-icon-color: #df3c30; + + /* Tags */ + --tag-border: #dee2e6; + --tag-shadow: var(--btn-border-color); + --tag-hover: rgb(222, 226, 230); + --search-tag-bg: #f8f9fa; + + /* Categories */ + --categories-border: rgba(0, 0, 0, 0.125); + --categories-hover-bg: var(--btn-border-color); + --categories-icon-hover-color: darkslategray; + + /* Archive */ + --timeline-color: rgba(0, 0, 0, 0.075); + --timeline-node-bg: #c2c6cc; + --timeline-year-dot-color: #ffffff; + + [class^='prompt-'] { + --link-underline-color: rgb(219, 216, 216); + } + + .dark { + display: none; + } +} /* light-scheme */ diff --git a/_sass/layout/archives.scss b/_sass/layout/archives.scss new file mode 100644 index 0000000..fd1979b --- /dev/null +++ b/_sass/layout/archives.scss @@ -0,0 +1,143 @@ +/* + Style for Archives +*/ + +#archives { + letter-spacing: 0.03rem; + + $timeline-width: 4px; + + %timeline { + content: ''; + width: $timeline-width; + position: relative; + float: left; + background-color: var(--timeline-color); + } + + .year { + height: 3.5rem; + font-size: 1.5rem; + position: relative; + left: 2px; + margin-left: -$timeline-width; + + &::before { + @extend %timeline; + + height: 72px; + left: 79px; + bottom: 16px; + } + + &:first-child::before { + @extend %timeline; + + height: 32px; + top: 24px; + } + + /* Year dot */ + &::after { + content: ''; + display: inline-block; + position: relative; + border-radius: 50%; + width: 12px; + height: 12px; + left: 21.5px; + border: 3px solid; + background-color: var(--timeline-year-dot-color); + border-color: var(--timeline-node-bg); + box-shadow: 0 0 2px 0 #c2c6cc; + z-index: 1; + } + } + + ul { + li { + font-size: 1.1rem; + line-height: 3rem; + + @extend %text-ellipsis; + + &:nth-child(odd) { + background-color: var(--main-bg, #ffffff); + background-image: linear-gradient( + to left, + #ffffff, + #fbfbfb, + #fbfbfb, + #fbfbfb, + #ffffff + ); + } + + &::before { + @extend %timeline; + + top: 0; + left: 77px; + height: 3.1rem; + } + } + + &:last-child li:last-child::before { + height: 1.5rem; + } + } /* #archives ul */ + + .date { + white-space: nowrap; + display: inline-block; + position: relative; + right: 0.5rem; + + &.month { + width: 1.4rem; + text-align: center; + } + + &.day { + font-size: 85%; + font-family: Lato, sans-serif; + } + } + + a { + /* post title in Archvies */ + margin-left: 2.5rem; + position: relative; + top: 0.1rem; + + &:hover { + border-bottom: none; + } + + &::before { + /* the dot before post title */ + content: ''; + display: inline-block; + position: relative; + border-radius: 50%; + width: 8px; + height: 8px; + float: left; + top: 1.35rem; + left: 71px; + background-color: var(--timeline-node-bg); + box-shadow: 0 0 3px 0 #c2c6cc; + z-index: 1; + } + } +} /* #archives */ + +@media all and (max-width: 576px) { + #archives { + margin-top: -1rem; + + ul { + letter-spacing: 0; + } + } +} diff --git a/_sass/layout/categories.scss b/_sass/layout/categories.scss new file mode 100644 index 0000000..f12b963 --- /dev/null +++ b/_sass/layout/categories.scss @@ -0,0 +1,83 @@ +/* + Style for Tab Categories +*/ + +%category-icon-color { + color: gray; +} + +.categories { + margin-bottom: 2rem; + border-color: var(--categories-border); + + &.card, + .list-group { + @extend %rounded; + } + + .card-header { + $radius: calc($radius-lg - 1px); + + padding: 0.75rem; + border-radius: $radius; + border-bottom: 0; + + &.hide-border-bottom { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + } + + i { + @extend %category-icon-color; + + font-size: 86%; /* fontawesome icons */ + } + + .list-group-item { + border-left: none; + border-right: none; + padding-left: 2rem; + + &:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + + &:last-child { + border-bottom: 0; + } + } +} /* .categories */ + +.category-trigger { + width: 1.7rem; + height: 1.7rem; + border-radius: 50%; + text-align: center; + color: #6c757d !important; + + i { + position: relative; + height: 0.7rem; + width: 1rem; + transition: transform 300ms ease; + } + + &:hover { + i { + color: var(--categories-icon-hover-color); + } + } +} + +/* only works on desktop */ +@media (hover: hover) { + .category-trigger:hover { + background-color: var(--categories-hover-bg); + } +} + +.rotate { + transform: rotate(-90deg); +} diff --git a/_sass/layout/category-tag.scss b/_sass/layout/category-tag.scss new file mode 100644 index 0000000..fe7d99c --- /dev/null +++ b/_sass/layout/category-tag.scss @@ -0,0 +1,70 @@ +/* + Style for page Category and Tag +*/ + +.dash { + margin: 0 0.5rem 0.6rem 0.5rem; + border-bottom: 2px dotted var(--dash-color); +} + +#page-category, +#page-tag { + ul > li { + line-height: 1.5rem; + padding: 0.6rem 0; + + /* dot */ + &::before { + background: #999999; + width: 5px; + height: 5px; + border-radius: 50%; + display: block; + content: ''; + position: relative; + top: 0.6rem; + margin-right: 0.5rem; + } + + /* post's title */ + > a { + @extend %no-bottom-border; + + font-size: 1.1rem; + } + } +} + +/* tag icon */ +#page-tag h1 > i { + font-size: 1.2rem; +} + +#page-category h1 > i { + font-size: 1.25rem; +} + +#page-category, +#page-tag, +#access-lastmod { + a:hover { + @extend %link-hover; + + margin-bottom: -1px; /* Avoid jumping */ + } +} + +@media all and (max-width: 576px) { + #page-category, + #page-tag { + ul > li { + &::before { + margin: 0 0.5rem; + } + + > a { + @include text-ellipsis; + } + } + } +} diff --git a/_sass/layout/home.scss b/_sass/layout/home.scss new file mode 100644 index 0000000..7fff3ba --- /dev/null +++ b/_sass/layout/home.scss @@ -0,0 +1,188 @@ +/* + Style for Homepage +*/ + +#post-list { + margin-top: 2rem; + + .card-wrapper { + &:hover { + text-decoration: none; + } + + &:not(:last-child) { + margin-bottom: 1.25rem; + } + } + + .card { + border: 0; + background: none; + + %img-radius { + border-radius: $radius-lg $radius-lg 0 0; + } + + .preview-img { + @extend %img-radius; + + img { + @extend %img-radius; + } + } + + .card-body { + height: 100%; + padding: 1rem; + + .card-title { + @extend %text-clip; + + color: var(--heading-color) !important; + font-size: 1.25rem; + } + + %muted { + color: var(--text-muted-color) !important; + } + + .card-text.content { + @extend %muted; + + p { + @extend %text-clip; + + line-height: 1.5; + margin: 0; + } + } + + .post-meta { + @extend %muted; + + i { + &:not(:first-child) { + margin-left: 1.5rem; + } + } + + em { + @extend %normal-font-style; + + color: inherit; + } + + > div:first-child { + display: block; + + @extend %text-ellipsis; + } + } + } + } +} /* #post-list */ + +.pagination { + color: var(--text-color); + font-family: Lato, sans-serif; + justify-content: space-evenly; + + a:hover { + text-decoration: none; + } + + .page-item { + .page-link { + color: var(--btn-patinator-text-color); + padding: 0 0.6rem; + display: -webkit-box; + -webkit-box-pack: center; + -webkit-box-align: center; + border-radius: 0.5rem; + border: 0; + background-color: inherit; + } + + &.active { + .page-link { + background-color: var(--btn-paginator-hover-color); + } + } + + &:not(.active) { + .page-link { + &:hover { + box-shadow: inset var(--btn-border-color) 0 0 0 1px; + } + } + } + + &.disabled { + cursor: not-allowed; + + .page-link { + color: rgba(108, 117, 125, 0.57); + } + } + } /* .page-item */ +} /* .pagination */ + +/* Tablet */ +@media all and (min-width: 768px) { + %img-radius { + border-radius: 0 $radius-lg $radius-lg 0; + } + + #post-list { + .card { + .card-body { + padding: 1.75rem 1.75rem 1.25rem 1.75rem; + + .card-text { + display: inherit !important; + } + + .post-meta { + i { + &:not(:first-child) { + margin-left: 1.75rem; + } + } + } + } + } + } +} + +/* Hide SideBar and TOC */ +@media all and (max-width: 830px) { + .pagination { + .page-item { + &:not(:first-child):not(:last-child) { + display: none; + } + } + } +} + +/* Sidebar is visible */ +@media all and (min-width: 831px) { + #post-list { + margin-top: 2.5rem; + } + + .pagination { + font-size: 0.85rem; + justify-content: center; + + .page-item { + &:not(:last-child) { + margin-right: 0.7rem; + } + } + + .page-index { + display: none; + } + } /* .pagination */ +} diff --git a/_sass/layout/post.scss b/_sass/layout/post.scss new file mode 100644 index 0000000..b66e906 --- /dev/null +++ b/_sass/layout/post.scss @@ -0,0 +1,585 @@ +/** + * Post-specific styles + */ + +%btn-post-nav { + width: 50%; + position: relative; + border-color: var(--btn-border-color); +} + +@mixin dot($pl: 0.25rem, $pr: 0.25rem) { + content: '\2022'; + padding-left: $pl; + padding-right: $pr; +} + +header { + .post-desc { + @extend %heading; + + font-size: 1.125rem; + line-height: 1.6; + } + + .post-meta { + span + span::before { + @include dot; + } + + em, + time { + @extend %text-highlight; + } + + em { + a { + color: inherit; + } + } + } + + h1 + .post-meta { + margin-top: 1.5rem; + } +} + +.post-tail-wrapper { + @extend %text-sm; + + margin-top: 6rem; + border-bottom: 1px double var(--main-border-color); + + .license-wrapper { + line-height: 1.2rem; + + > a { + @extend %text-highlight; + + &:hover { + @extend %link-hover; + } + } + + span:last-child { + @extend %text-sm; + } + } /* .license-wrapper */ + + .post-meta a:not(:hover) { + @extend %link-underline; + } + + .share-wrapper { + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + %icon-size { + font-size: 1.125rem; + } + + .share-icons { + display: flex; + + i { + color: var(--btn-share-color); + + @extend %icon-size; + } + + > * { + @extend %icon-size; + + margin-left: 0.5rem; + + &:hover { + i { + @extend %btn-share-hover; + } + } + } + + button { + padding: 0; + border: none; + line-height: inherit; + + @extend %cursor-pointer; + } + } /* .share-icons */ + } /* .share-wrapper */ +} + +.share-mastodon { + /* See: https://github.com/justinribeiro/share-to-mastodon#properties */ + --wc-stm-font-family: $font-family-base; + --wc-stm-dialog-background-color: var(--card-bg); + --wc-stm-form-button-border: 1px solid var(--btn-border-color); + --wc-stm-form-submit-background-color: var(--sidebar-btn-bg); + --wc-stm-form-cancel-background-color: var(--sidebar-btn-bg); + --wc-stm-form-button-background-color-hover: #007bff; + --wc-stm-form-button-color-hover: white; + + font-size: 1rem; +} + +.post-tags { + line-height: 2rem; + + .post-tag { + &:hover { + @extend %link-hover; + @extend %tag-hover; + @extend %no-bottom-border; + } + } +} + +.post-navigation { + .btn { + @extend %btn-post-nav; + + &:not(:hover) { + color: var(--link-color); + } + + &:hover { + &:not(.disabled)::before { + color: whitesmoke; + } + } + + &.disabled { + @extend %btn-post-nav; + + pointer-events: auto; + cursor: not-allowed; + background: none; + color: gray; + } + + &.btn-outline-primary.disabled:focus { + box-shadow: none; + } + + &::before { + color: var(--text-muted-color); + font-size: 0.65rem; + text-transform: uppercase; + content: attr(aria-label); + } + + &:first-child { + border-radius: $radius-lg 0 0 $radius-lg; + left: 0.5px; + } + + &:last-child { + border-radius: 0 $radius-lg $radius-lg 0; + right: 0.5px; + } + } + + p { + font-size: 1.1rem; + line-height: 1.5rem; + margin-top: 0.3rem; + white-space: normal; + } +} /* .post-navigation */ + +@media (hover: hover) { + .post-navigation { + .btn, + .btn::before { + transition: all 0.35s ease-in-out; + } + } +} + +@-webkit-keyframes fade-up { + from { + opacity: 0; + position: relative; + top: 2rem; + } + + to { + opacity: 1; + position: relative; + top: 0; + } +} + +@keyframes fade-up { + from { + opacity: 0; + position: relative; + top: 2rem; + } + + to { + opacity: 1; + position: relative; + top: 0; + } +} + +/* TOC panel */ +#toc-wrapper { + border-left: 1px solid rgba(158, 158, 158, 0.17); + position: -webkit-sticky; + position: sticky; + top: 4rem; + transition: top 0.2s ease-in-out; + -webkit-animation: fade-up 0.8s; + animation: fade-up 0.8s; + + ul { + list-style: none; + font-size: 0.85rem; + line-height: 1.25; + padding-left: 0; + + li { + &:not(:last-child) { + margin: 0.4rem 0; + } + + a { + padding: 0.2rem 0 0.2rem 1.25rem; + } + } + + /* Overwrite TOC plugin style */ + + .toc-link { + display: block; + + @extend %text-ellipsis; + + &:hover { + color: var(--toc-highlight); + text-decoration: none; + } + + &::before { + display: none; + } + } + + .is-active-link { + color: var(--toc-highlight) !important; + font-weight: 600; + + &::before { + display: inline-block; + width: 1px; + left: -1px; + height: 1.25rem; + background-color: var(--toc-highlight) !important; + } + } + + ul { + padding-left: 0.75rem; + } + } +} + +/* --- TOC button, bar and popup in mobile/tablet --- */ + +#toc-bar { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1; + margin: 0 -1rem; + height: $topbar-height; + background: var(--main-bg); + border-bottom: 1px solid var(--main-border-color); + transition: all 0.2s ease-in-out; + + @extend %btn-color; + + .label { + @extend %heading; + + margin-left: 0.25rem; + padding: 0 0.75rem; + color: inherit; + } + + &.invisible { + top: -$topbar-height; + transition: none; + } +} + +#toc-solo-trigger { + color: var(--text-muted-color); + border-color: var(--btn-border-color); + border-radius: $radius-lg; + + .label { + font-size: 1rem; + font-family: $font-family-heading; + } + + &:hover { + box-shadow: none; + background: none; + } +} + +@mixin slide-in { + from { + opacity: 0.7; + transform: translateY(-$topbar-height); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +@mixin slide-out { + 0% { + transform: translateY(0); + opacity: 1; + } + + 100% { + transform: translateY(-$topbar-height); + opacity: 0; + } +} + +@-webkit-keyframes slide-in { + @include slide-in; +} + +@keyframes slide-in { + @include slide-in; +} + +@-webkit-keyframes slide-out { + @include slide-out; +} + +@keyframes slide-out { + @include slide-out; +} + +#toc-popup { + $slide-in: slide-in 0.3s ease-out; + $slide-out: slide-out 0.3s ease-out; + $curtain-height: 2rem; + $backdrop: blur(5px); + + border-color: var(--toc-popup-border-color); + border-width: 1px; + border-radius: $radius-lg; + color: var(--text-color); + background: var(--card-bg); + margin-top: $topbar-height; + min-width: 20rem; + font-size: 1.05rem; + + @media all and (min-width: 576px) { + max-width: 32rem; + } + + &[open] { + -webkit-animation: $slide-in; + animation: $slide-in; + } + + &[closing] { + -webkit-animation: $slide-out; + animation: $slide-out; + } + + @media all and (min-width: 850px) { + left: $sidebar-width; + } + + .header { + @extend %btn-color; + + position: -webkit-sticky; + position: sticky; + top: 0; + background-color: inherit; + border-bottom: 1px solid var(--main-border-color); + + .label { + font-family: $font-family-heading; + } + } + + button { + > i { + font-size: 1.25rem; + vertical-align: middle; + } + + &:focus-visible { + box-shadow: none; + } + } + + ul { + list-style-type: none; + padding-left: 0; + + li { + ul, + & + li { + margin-top: 0.25rem; + } + + a { + display: flex; + line-height: 1.5; + padding: 0.375rem 0; + padding-right: 1.125rem; + + &.toc-link::before { + display: none; + } + } + } + } + + @for $i from 2 through 4 { + .node-name--H#{$i} { + padding-left: 1.125rem * ($i - 1); + } + } + + .is-active-link { + color: var(--toc-highlight) !important; + font-weight: 600; + } + + &::-webkit-backdrop { + -webkit-backdrop-filter: $backdrop; + backdrop-filter: $backdrop; + } + + &::backdrop { + -webkit-backdrop-filter: $backdrop; + backdrop-filter: $backdrop; + } + + &::after { + display: flex; + content: ''; + position: relative; + background: linear-gradient(transparent, var(--card-bg) 70%); + height: $curtain-height; + } + + #toc-popup-content { + overflow: auto; + max-height: calc(100vh - 4 * $topbar-height); + font-family: $font-family-heading; + margin-bottom: -$curtain-height; + } +} + +/* --- Related Posts --- */ + +#related-posts { + > h3 { + @include label(1.1rem, 600); + } + + time { + @extend %normal-font-style; + @extend %text-xs; + + color: var(--text-muted-color); + } + + p { + @extend %text-ellipsis; + + font-size: 0.9rem; + margin-bottom: 0.5rem; + white-space: break-spaces; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .card { + h4 { + @extend %text-clip; + } + } +} + +/* stylelint-disable-next-line selector-id-pattern */ +#disqus_thread { + min-height: 8.5rem; +} + +.utterances { + max-width: 100%; +} + +%btn-share-hover { + color: var(--btn-share-hover-color) !important; +} + +.share-label { + @include label(inherit, 400, inherit); + + &::after { + content: ':'; + } +} + +@media all and (max-width: 576px) { + .post-tail-bottom { + flex-wrap: wrap-reverse !important; + + > div:first-child { + width: 100%; + margin-top: 1rem; + } + } +} + +@media all and (max-width: 768px) { + .content > p > img { + max-width: calc(100% + 1rem); + } +} + +/* Hide SideBar and TOC */ +@media all and (max-width: 849px) { + .post-navigation { + @include pl-pr(0); + @include ml-mr(-0.5rem); + } +} + +@media all and (min-width: 1200px) { + h2, + h3, + h4 { + scroll-margin-top: 2rem; + } + + #toc-bar, + #toc-solo-trigger { + display: none !important; + } +} diff --git a/_sass/layout/tags.scss b/_sass/layout/tags.scss new file mode 100644 index 0000000..4cf5d3b --- /dev/null +++ b/_sass/layout/tags.scss @@ -0,0 +1,19 @@ +/* + Styles for Tab Tags +*/ + +.tag { + border-radius: 0.7em; + padding: 6px 8px 7px; + margin-right: 0.8rem; + line-height: 3rem; + letter-spacing: 0; + border: 1px solid var(--tag-border) !important; + box-shadow: 0 0 3px 0 var(--tag-shadow); + + span { + margin-left: 0.6em; + font-size: 0.7em; + font-family: Oswald, sans-serif; + } +} diff --git a/_sass/main.bundle.scss b/_sass/main.bundle.scss new file mode 100644 index 0000000..52e893f --- /dev/null +++ b/_sass/main.bundle.scss @@ -0,0 +1,2 @@ +@import 'dist/bootstrap'; +@import 'main'; diff --git a/_sass/main.scss b/_sass/main.scss new file mode 100644 index 0000000..1c2311d --- /dev/null +++ b/_sass/main.scss @@ -0,0 +1,13 @@ +@import 'colors/typography-light'; +@import 'colors/typography-dark'; +@import 'addon/variables'; +@import 'variables-hook'; +@import 'addon/module'; +@import 'addon/syntax'; +@import 'addon/commons'; +@import 'layout/home'; +@import 'layout/post'; +@import 'layout/tags'; +@import 'layout/archives'; +@import 'layout/categories'; +@import 'layout/category-tag'; diff --git a/_sass/variables-hook.scss b/_sass/variables-hook.scss new file mode 100644 index 0000000..f27e0eb --- /dev/null +++ b/_sass/variables-hook.scss @@ -0,0 +1,3 @@ +/* + Appending custom SCSS variables will override the default ones in `_sass/addon/variables.scsss` +*/ diff --git a/_tabs/about.md b/_tabs/about.md new file mode 100644 index 0000000..ddb2bc4 --- /dev/null +++ b/_tabs/about.md @@ -0,0 +1,8 @@ +--- +# the default layout is 'page' +icon: fas fa-info-circle +order: 4 +--- + +> Add Markdown syntax content to file `_tabs/about.md`{: .filepath } and it will show up on this page. +{: .prompt-tip } diff --git a/_tabs/archives.md b/_tabs/archives.md new file mode 100644 index 0000000..c3abc59 --- /dev/null +++ b/_tabs/archives.md @@ -0,0 +1,5 @@ +--- +layout: archives +icon: fas fa-archive +order: 3 +--- diff --git a/_tabs/categories.md b/_tabs/categories.md new file mode 100644 index 0000000..2d241be --- /dev/null +++ b/_tabs/categories.md @@ -0,0 +1,5 @@ +--- +layout: categories +icon: fas fa-stream +order: 1 +--- diff --git a/_tabs/tags.md b/_tabs/tags.md new file mode 100644 index 0000000..ded3adc --- /dev/null +++ b/_tabs/tags.md @@ -0,0 +1,5 @@ +--- +layout: tags +icon: fas fa-tags +order: 2 +--- diff --git a/assets/404.html b/assets/404.html new file mode 100644 index 0000000..af89d6d --- /dev/null +++ b/assets/404.html @@ -0,0 +1,14 @@ +--- +layout: page +title: "404: Page not found" +permalink: /404.html + +redirect_from: + - /norobots/ + - /assets/ + - /posts/ +--- + +{% include lang.html %} + +

{{ site.data.locales[lang].not_found.statement }}

diff --git a/assets/css/jekyll-theme-chirpy.scss b/assets/css/jekyll-theme-chirpy.scss new file mode 100644 index 0000000..d20545b --- /dev/null +++ b/assets/css/jekyll-theme-chirpy.scss @@ -0,0 +1,10 @@ +--- +--- + +@import 'main +{%- if jekyll.environment == 'production' -%} + .bundle +{%- endif -%} +'; + +/* append your custom style below */ diff --git a/assets/feed.xml b/assets/feed.xml new file mode 100644 index 0000000..d2aad4d --- /dev/null +++ b/assets/feed.xml @@ -0,0 +1,54 @@ +--- +layout: compress +permalink: /feed.xml +# Atom Feed, reference: https://validator.w3.org/feed/docs/atom.html +--- + +{% capture source %} + + {{ "/" | absolute_url }} + {{ site.title }} + {{ site.description }} + {{ site.time | date_to_xmlschema }} + + {{ site.social.name }} + {{ "/" | absolute_url }} + + + + Jekyll + © {{ 'now' | date: '%Y' }} {{ site.social.name }} + {{ site.baseurl }}/assets/img/favicons/favicon.ico + {{ site.baseurl }}/assets/img/favicons/favicon-96x96.png + +{% for post in site.posts limit: 5 %} + {% assign post_absolute_url = post.url | absolute_url %} + + {{ post.title }} + + {{ post.date | date_to_xmlschema }} + {% if post.last_modified_at %} + {{ post.last_modified_at | date_to_xmlschema }} + {% else %} + {{ post.date | date_to_xmlschema }} + {% endif %} + {{ post_absolute_url }} + + + {{ post.author | default: site.social.name }} + + + {% if post.categories %} + {% for category in post.categories %} + + {% endfor %} + {% endif %} + + {% include post-description.html max_length=400 %} + + +{% endfor %} + +{% endcapture %} +{{ source | replace: '&', '&' }} diff --git a/assets/img/favicons/android-chrome-192x192.png b/assets/img/favicons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..47b58e2284c69e17b1c60fcd98588e1e95177425 GIT binary patch literal 22560 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

5vMn1KXI z1d>^tZ`xx346vUb7MQj$e%owmIj4Mlck(+d)lu;8j=7N^KOs*#`z(TT+9kQT#hneu2F8c!#vJm9g3goyL7mK zTUbxP;r;(ST~BPYq#TFX9ZFP*u%0$R&_vYa8tE~UZmrMTSrK;HhXCreFRz|0JV3@M zj|C31mMC*|K8~*xy0|(wI(UjC&J8T)-+8p=!8uT1KgXEQdR8h{2$VQVlumlMOiLWK zqxLeyd~NhqLczbX`7OnMs|R}%S5lA12~HC?^g7C6wsXYjbM}lB5jOHhKEfQ+k1HS> zPp9@uOMxtMlmT5L<&#+(7ZSxokkA?2L6;U$uZ5DohXg_V2vb2A*U7T5mZg?#hocNL zOrM2U-!)yv#rBb_>8$2Ue1guzD6^PfDavr#1lo+m|=%jhyRB{;)zd?!iS z0-E1+L*j7C&vHD&GzE1Vud~W4d=2Y1kiuF{Cv(Ept z%rQn7HnL02a6QX3^b%IGu)d<6MZPiS%Ye{Om)GfYA|&lx%07c%7~ufj3?Z3g#by;Y z%eeYJdoQ%`-&n@KvB%o*;kOofo|8PodREecLyjY?W-+TdLs0y>mo3^&;o&#=z;X<_ z>}A|2xDhtf!6e6UNdTif$1|KZk=}qv{55+-*~&*bPnVtt(D2X237=8#P~ZfkI2^H3 zy(BHX!C1R7^DLv-##r5|H6|?s!mmO<++TQ%OSwn4piwyA#X4p%LYaA{??Ye`Nqx+w z&1xcSWiDUW>998V1F>D?2q)RWM%L2IB)u$W3)_s^=&_ec?Ozn8C<9%)0)jMqC>#FV z%mqkJP^6AYp5tjwnFKCE1mXj(jkob`?E#jd*|{N8&%ZOv3C4hN_J=gH3s`5!z^P(l z5&@kl?XU5La7e|nBbn+Xt{yg+0yv4Jk3C$4V3K3ZqYc|F-~c6}W}^mATEJ&n!+&xt z1b+LcI$-lOySa$f4ARE=bea5p$tg}T!yq88_kwHQJj7A+K9@Nxq@PjB9N=M&n&hh> zmKO{Uhc$eV%eBh_13=|`_XsDD2qcsA>Hy4M&RC+njxE{~U^}e?PGOUuVL`UfGmHks zTY!lP9%1rECo2QRaDyU%U4o+J;O0}sa1dVFau0nvU zamm#4cf)ky@-(Yip?@DFN007j3&9ER9%Y`3DuHiiH;HR82;AhI)B**zF85U4) zijq8zG0tp!H?xW?_%daJgBJBQ6X(Y~zyu-$ejC6ZFo(DECT0*m(aATr9LwbM8Pf=- zb^8)Qgkx+sQV6~3u-7O&!q7GduyYE0lg71{BSKUl5sY&mU9{`%m8L)!GmZboKjTGe z77+<;dyj5D!o_@#2T57^2?1!-{iEE;W)j-FDG`h?sJjOF3k@uhKKiT~Hu8Y3J`Mxk z&h2U93f|3XlaU=Tkup-p$HMa}GRPT9+7fU`^8mwD5+$tOx*-&3WRAtWa)5y95`Hy` zRu?v^EKdcF{XE8Xx;ZygI76ClTB;5p@f!9aPxa)7ACmd%-c=!N?(w5fKEq{9eZJHyV^v#joG ztx8nw5?8f~T|8{!f&trcs55^{eWqGqaR6D4!i0^0YF~(2YS99Ay~U&gjc1a(Xwlw6 zKRz%>nr=FD6`3vjgKP@NdfHq*!9{$J$1SIw4J-(6>S0Q{WkJAgm1n7+aF^(?iW{sl z!DimWMiTgqJcPw?eZAf03`K?+CWoJ2r&fQEpXq297QqAwSt?DZpx10M@Da}Vzt@lf zYB&^hm5iExlciGHR_8lJzxkbi9KBSJ2%A{O{rr%Fn!2k` zk+hdLOwnjuf!5-XXS7ONnL0cotmJK6ZTe{`Ve1=Nft?%J0wu;6G7bBD;5!`SC%RB6 ztVT%Urd(ShO)ix+dKs#6M>l!7f$C+KtduH;ByrQYCcMNW{E&Ati(s=#B$K3RqJvh; zLFfBheYb&Y?S&TJ$|iow&*`@)FPwO#?i?dSt3h~xgtTdqTs_CY%iql#c?t)n8U}olppa36Nauryc3BeOV$Ev zur!r4X8U$*#Cx=GC2wIBag&*<3jAc~X#um$G0G@8ZD-i0-Z&iL`?|SD7!vAdQWuga z!984EZQ;uO^+xhU?VDxjQ7#jf|D&0tIx@Q^3ik6|-ojE#jZ+)iBSn@$nrWlK@(=~Q zH?T$3G*|H%F69S2N73TvwqvA7&LqCrPV`B$L#xexk0|Hyb}pw;$IhG@(kAc-6iG8d zilWY#cB~mVRM^YUOw=t5GqwJ98uSizC^3u|@(9S3I4q_jK%}Uc7z+Ru#_)6#V2`FL z2}$7?=~4cZ>)2=x%nT;ykt4?l4K&kC!s@3IHj4b?oEx};mE6P6>Ba8#?7y#~DLuS= zNb6j^YBz(Vhc|HpvvF$3I$PAbPgT@oJ8m_ z=Rj8xz-(@2Ge774P~TbK`J9__pK=e_{z(7xCNAO~Y%p#HyE@r_Vwn;pvZTqF;C{qh z7ZgEBhPa<6C{#(yfJl_WK1*wW0zq1HA_u7Yc-`wGGq`$h*D1@aiTh{RY?ImoVkz>vyt1`sY?cZv%aD=5}V7b zve>YUl0=!$4ZMynJkuq`2dTuROo=iDvJ~;mG3=OG*uF49fqgu{ajTYIy``OGh#@7I zZ%UOs#zQ6H02~w+PK+VOFeA(k3%yZB4BbbVPo1R)RS>M_DIKQqM}>WyW-}Kv)2MMl zS)T&3>il1!pmX2+mU%(;3r*=Nu_axcCe(b~8TbONqKcowHgB`+Nw;ad>%TFd`@No4r zt&?1pVLpe}P#Ett3%QW(Qw;5K?&BaAa~>@UL&oMIIhg&bb~lut0gvut1m?L@Ta z#NN^}bbTN;1>qBBT!z`jPD_wgR}R>3wV&$o9D*(M=+JmI5%@+|Err0pR=s~WJLn6w z?(yHy!WG2WU)9!UKJ~`=P~?PRSz0HXl%ew;0|ew5528S7xE!OPYam_fS<2IvmhCdi zD6_blhqV*I21k*D9Ag%1Sw)YwT2Tb+ePK`CG>pcb-Vmpgj$pYH7Ls4J{*8Si7ZYs+8Fv2Mg zaD*`f{HeXEFQG!3v@Tf*MDik?S0WJf>-sWlZoOf(NF%_b86Fh3h$edn2nHF{ExHAQ zh0F}aa|;a6$N=r!#1qs$R^4ToVVu;~#LfI+>!L_cSEntGD7(n=%sG*YLd#%0Q6Ns(rZ2{KlZsl7M+pN>vt4AZ2e z1C`Zr1)){cQ}hv|fh6s;(nJGs;zUsWsPp7WGtM|^)3-WUgRS?tbaMsmoS;O62}VMw ziLjIg<7_N)$m%>Q07iM(2{nTb>;Ocs+$Uy-DXYL?uEI}xs$&h0SdHr-&k&6WvK(Rs z%eaRFHTz8XRGuMCKY>2t7)8~023I?el|J7_%4icYod{#c>IBeidi6-^X<$4g&m1IW zCYa!qVMM;Mra%5l3AV*O>NY7Znlt_}Sw3?4(IAI7y|2#<5VFCsL4wbZc z*tsU$(Zu5jW4b+n3oM~MqzOqzX{QwjkG=HpHcoIKr;GtV)t~Q!&d$54V&AfK%Oo_F}Y?AcX2#)*zSLdLH^{Mbx;ZGz{R&Wgs>?NhUsf_6}LVU|# zGM5D!oemD83=mdq?$n5Df;O&;%L zb`U_pBhDhOW**P88~*^t6hr0=4RvjVwKNlSM(Q=OgJ8ML`9 z#q+GeH-73_&*LG}#$%E=(1^gH#6Egi!KXODV;nQ*@>b{Kgf)uVYGs5Zv*{p0!E|f~ zNwaQ*<~J`^!=a5P<2mveqnj?8=x4|}|Gm}@J39hA>RH8=^w7&T?a)vzl@Z3x*&d3O zwXl|;ZBCy3)qR(q7tc|396$&Ga)2FTNti-P?ByD53rGY@nZ?l%6UvhzhC@BRzwjAa zSjxva%`@z0l<-kI;V5l&I9mZILXsJDP>00BZlNidK?A<^YKLxG=`<>Wa)QmIfd#ZP z$^^M-dmv4R7LN#Btm9(ZIKqPzEJsF~5hg7{RQE4szE%A{!C_>`o6AAQs^1h!Pp7~` z&O1COe9rh0#Y=?6PyvV?Es*|5C?Tu zz6V6vz#~;{y^Bl|Wt<)ElAumk z0H+vci~>RP`wA1}L+-357HCD!kGc7t9*6lPtYA%%G;!K>)WIc9h6K&brj|EORMFTaw(BT&|$fX^W->#L!1Vh zXe6O4xI8LMaGDGS(_+&JDG(l6#x>Xr`qbfYV*7flE1opRTo^Rv#eETXs;mhiz`=tD zoKJ~18~hHFJj-&u4JCr*tmbiihp`$Z#)wddONuNFG!eH7x-mdWGl8`J`JCQA6*$mW zJSNEi;U-{vp9acCzv#8ZK-NYNa;WBaBs^9av6Pl~K2gaQ+m z>)T(!S{7NUoCS7-PM!xb%t30Lp%Ib^lYrdKGhsm?@z}+H=5HP@4O~JJ`#gE|(lH&C zt&n1XK~fYfr-GmS;poKmsE&rIpLXVtk~iZ_pjyEMBgP66hI0#}3n?Mq$Vw|0TTr5i zWWqXx)<>Hk9ExawM=VmYRc4POWAt-|l+NpO8Q0C3e9$TdbPM%(I?V-6u_v@Y1q_4? zsM-hsi8CpF;j2Lb<(=j^?J!VotL6HHF8ex3mQmepT;P&pgaHN^C8OC(uz36b)k8&) zM;JpTq1aT@$|}NM)L;P~g0-eWk^-MHlqML%quRv~?t~KlT(Pfl206nRS$(&It6gwm z_z2dr9OY0{@xGnrU=y>dhawZT)ZnT{t{IvU+ZYHmI(1W-oouGf=q?Rx<&cSX`V;ZU zAm|`!08_!GfMe*~@5d7`8WH09%4btxTo+VSNQcsI=dr*_Nio!Akg<#fb)08398T2# z_2|(%S)E|nRicJnbwyh((WAGhix44*-n(7VVs*kVN}?sAEq3*mLFY`cpA=spS764orJQZaL0K~!9q4HwM}-?abewX?+n3Hjono~CO}%~NNi-H91HY;* zq-v>Hu|JbNim4R9l7+qca$8hTkBTJfP2RzvAhYVe&Qewbm%p!GAgH$;!=m0$k}g^s zP(OWnd&IU{y**lsKMHCv?%>>EA}OOgh>&M1kY91UB)F25XCh!}s>U|p(SU(;7E4;l zK+A!h+-^;bIol>RqmB)X0B;tal_M@!l$+>&yt}<5yzP!da^?r3n7-mmdyt|Mlu9I; zGpfSTv6TGO(=S}bs_@_qkKA=W(L-_Jllc^xOVTu{5nqomk=T$b#sBzVO)0!+v<`!H zcT~ESf|^zagshoV?4aZ0#gn5qFHbI*jGQ8f@A?S828ujWC;=oOKoVp_g7`(z9qQMz ziWZf!ymq$EBdFtT{ed4il#zNh;1qi!96+%wAC?^RjCb}`UQd(d6^1of%_AWH~BAO_p0xXIJ})u9GN0e0e_Un5K}@Jysr~s+pg_ zj;%#XCtVZugj_$G0vcwb^$Mb0OeST-Qi%-B6R_aZ%YrBCT%3;Cew6Z;K&25ex@{g( zA$FI^#B{SX7H_bG4B@2mP!k6qhA>3fE<-SH4vmQ%wa9jR%`4f7)6CdBSMs|v6%g> z-?Q!%AIR#KU-MA^b`>-ZSanspBM_)3%DB3f!T5#gu)um+W0ntvW=S{vFD5n<#ZH?v zB<~HyQk&8ln#(eV@sg;;VxrDt5ryCB!#}LCUAf7qlqhFf53u7@R08vPGz(?6_K8m2 zeJ6`n&;0W1j>?;7E_GBsr-+T9j%YRUR)Nib;ovw}v#+dS7KQ@ul59Sb?;s!wC(+Fg zpmFxi&QWc$9I~4c_>?UMa})ZrGC9V3IUGLu^uh8{6KQzC+ykm$s4_!6m5JUK!Iug; z=qfnRGmuK!B1@M@Vql8WE|N%4zw7Zgbo0&v?>$JQUu|JgdnmW(@bT+Uj*o80qkjE2 zvE9G7bH-@dlCo^1oiuu>HCC$;*%?G{Ugv7~nI}SS>6>0{&au3(0@K4LhIH23T6-S} z);=l#!Qdf(MzLZHBNtwPQ7C6<93h*kJp8ZQ&!v(;k{+k>LZg+{ zc|FVtZ2L(u-lv0ZO0t6vxvfGT06Ocw8qp>ZX&s1F3oR^c!9Xg>!zj+x;@=qu5Ka4Z z9>>q+nB8mkiqrXUWDE8C=lz0py$iNR09jv3V>io30*g!;__*!sNNs*@u8H?ab4gXR z9lJhvx!dz0uo3#B3Gu$`+ndGreeq=Bj5NV>7AtUGh-ugR1h8S8B`-lMQ~Y+87&rI3 zD%pyAsI-H-K7zK5cKX!x_j$c$+R%flYbr^E+@&fN5wqm?wBLPdkeR!tEzo>))};jK|kNPhwo(!u{rda_W{) z7~R>D2@?HEs%3nWGTewX#`ECqwK^BCVWO-406Z+v;QIdIkAMMKCxEC#ue1lW`B1T@ z@|oIr%9C7V^@F0wwbs4&f%W{l!rbjURX8?vlf67O=?4y9GI#`Io52s=?`jR*P+paX zGVF0y#6ZLE!|p%;j1ID;5d|G#8m#^jc?}=fX-h_aGAG+Aj~L)VIK;Ody}MQ^Z<@Nb zpeLZ1d>g2Lr0bJ7rKq22o>=DV_6@>dFUM}cSLv)igR5~A^0Fiy_Qzs&hB7;i+4W=WFcdp{)8E z0fUZJ+kkF@8I{*j{pUkFf@J#quVV=81kIl2xy#V>Y`d?y@6vpj#pycT{me{NS2?X9 zJwAas-PpYgQIhseFO$czV>OUYm3xo8QW~)H(aK6!ArKNZ>I?^?&Tdcgx2DX?FB!}A z^2I?68am)&doqduO89Y(e!v8TD5p&dYS}T+$5bwknQtvB8T*s|cPFBBNr;~~st-eU z{MTD6aP;qVNbuSae6q1b^Ngi1)%W_5?YE9CEu*qDyrRvp1n^U^$!xmN`z9@_WD^0c0`m>O*!S*v^pzO~a|s!aQS@3vmRS7sk7>onP~oqj zJZH8v27G>;unu3KY!gl-P(E7+sYT|e7?Qdox_rj?%I2tS$QZgM67&H-O>AT{7>bIi zO;Zvr{jmy~+U@TgSoc{h?o2;d5hhVfKo0nQ%(0kZJVpvsCmDPPGVPiPRxmCbE z>;vkJS@yZ^c~I#hUBQyRMR{?xz?oB}1%+W}WbcNT{cZiOo1bWgFsowELpF-~H7(_$ z%_`uck@SOg_9^r3h&S=S4ucf+Hg8`~kc*haZ8=hSRyMxp3UQ%(gcAj00Z|vGY_#jg zBm`BvRY+{PW=gRvl`@ zt65}Df^Sdr-W4pOA>=`{#;l)r^f{-C)7d|`KaL?QB`zJn zhG=(^zgvzngp$qt?(r%Z5C@m3V`~5dz^UU=j`{Pj48=!(5u@ZHD|ChF!Uf;63bt8M zeQ2A{qEyM@ZfF!=Ta$PHTnA+GTU_g$$9>gqB(2oah`ozDNuQgR$CZ6%9D51MOg=a} z9`3VOq@SQ-*5~WZKgu;b$?fk|3wOFdP*GEV@0|K-O#k{TIf+_~{3vWf1ejwW!K5>n zK+n=nZ~2?gIA{I>N^Z0sOVqnZLI5fKLPvrl-d+vmQy{U8@puw-b&&ldu*09}T(Y^`tjvcZWV zhOiG$q@i(7@{wb_U5?iZ)DUUhGxfB;CKozzv3F|o#1Q)Ld9#<69|BH=B|S>GHU_j|k!oOaYW+lt07K*)w(083~i z)ft&5bpRuddaIePDc*Ue00-Kj*dUjWX@`g-Gr?zA#f^8FS>H|=P33!mUi(i|_74Oz z-uNxQfs>0c@XGqkO!9bc#ygsBiaR5kL(|yZ{M*SJIQJ zv3i$tF4zIzgn3VryY)@^MKGm-6Vzja!nRYiBjqU^Jx|7mii{Tb0{FF*Xv`ECw%0z| z(;@%?0)^}yZ8;{Au~)V9VIWpl*y_THtmduxXdQEe9wOZ~A2wMw4>l7?7t*ZIa)Ep( zYAk%6Ev9c|nEt;z8y>%#zjJAd|LwF4*b@{zWZRtjfOc|?pC~y#L0fC)zNxoof0{;g zPaet-<8Tv5{H5t>%!-?By`?J-I@3~kx_&IkM=&W9Ig}A^Ud>%^9`by*2Eph*TO7NtUViYA2ekXu;7G)0(r{>Ez&Z>Qshzzu zbnIi6>{er0^CyuAeO|o{DT2#$ny2wEJmg94Bsu63VJXwfKr&rvitVg76NZ7-_boAo zvgaKa5=(d4r*xH?YREOZkp~aKFWPm7kTGxVRWN%oRcB?eY&&KNYCdcyS65KarNaY4 zcK%JFoHrIEJ=117<@#LK`c!IlAvp5+MdmxCOgT^!el3$G;|mB+`T z_DoK0X+OO-E;n5^eP z-ANsBdqx?Fmb)`;c$8@*SYL=dr&8g6j6*u7tQwMBKk@=MWiR;x3#& zuF4P*)f~783wLYlB!SCG+ub@>k`_BPv^<$Cvv~0=-!&*QlYyS)V?NBl&=XLUHMMH{ z822sdsfryTi5kkK6SPV3QA0dyb1=T#!n(5ej|-%bdH@bTuXncBo*&`PbJ7%;3!^( zebf_Im>kT+C(VgdfQ;Dzt! zA2nX;)|QZ}*^B;Sw!5z!bZ{(+TFmtRw6(z-u8FpL*BY9bkb|dI$?u0LlQ;_v!YeJZ zG$z0K%T4JgCb(mzYP4b{ab4x-x)Ha`YHAsZYpuc4?hYSVt7l$eeogX332YwHJ|1Qs z9xq|lX)GAmhF-)o1pirgl?|1Vv`6o8R2FSl#!=CNrTWSBq}9^)LU+&Bv0zwCt69;+ zpa;-N4k$`FB~Z2Hm#)fsYsF;OzIs8)uLde@hq-c&)Yb0J(P_9pCv4bsSsLjNK)zxZ z@sGtPvp?S7&k9?3Oj@vQ;rYz#@fkJaQG~5cAu|tSK}C|BNnAs66U8L?s<}Q?y7p%e zho$cb#n8;Yi_(MI>*4B7?Q-$W7w?~U5Qk4Dv4F%bV`>z#{fofsEDl*h`XO#l1v#P~M&S5d=0<>50 zDyRnPO87RMXE#lSzzOr7Qr!6fJm6DOmP6JH)b{!dM`B#nJrix!A$J3CX_g~#>YmY> zXgKJ@SYzZ!!1hVNRdF9L&X!94lchp8EZ@D?XL54~LMntTQR@r%bP%8MJbPe^W}ck% z>#*xO#in4}f-NbDS_X0;+_mFb-?h|(#A*E zkx%LBIVb_TsQxS0GeyV`=&6iSD#IHVWd**bJ8mAW3V0bUC0Cn zGOiMWfaX}2c{w^A%nzKcP&}vp!X9(JqtZ+LtT8TSX9}vrq~8x+SgSe>;-(576r>&TRMp?Qt}O*BAv=RmKU5zt15@E7zi1 zRw(DI(I`&T+kIjGgR3GjB>)DtH~t6zCuHf-l6{>d?stQ32hsC_HyfS?KI_g3 z^S06?YE(UbuE9QM;lHd*7fJL9C3N|@HQ4zyeLF`_$kWA_Ir9IzuWO#4G=>FVCuVIf z!@1Ts<2`HOvh{O3K1%iE!cFG?6+ID9E@ zAwI9nsNT%}**(hoI`wY#)kMsP%BpL{eS^5b=0e=L>>xpCc6IM>)-DFar08clbwLud zZHiHx7W!Ee*ES!L9}?C-My585wR>MC* zmdKahK6NSa-Ykq0eDZa-!R>D}V&V&YTH({kI&c0V3>v4Cv zu+#CR=m>T$x90h$OB}uZV=d`{QZZ^GNo}F8lzlaF-hA8)U1-~5n zlZ5jKFUQoT5=5B4+Vaft?0gjR^cBMSds~0@4s83a;c5jj|M_S#Sn%i$U?_|*h=lU8 zufjKl7p7#v*I@n*$*@i#aw9Ya*W5z?s?Czw5+zFhQLNJ=YZ}w1c2eITJJw-LtW)Fd zj#NH&AbpUNREINM4ZK9tZoPiGDocV(mTePOyspM}Vw=r>$z44X5$)Q`Yw|s5{a&LJ ziD%nY`L4xdK7DSGcz<>0Pu3E0xTJOEpAy>@EK!|xG3N664O@Y<+JFDck`DfvcRT*n z!M5R)qz4_TmEr!keci*{m+*M~#ZPa&UwPoNgTW;FB9^nnfvsBH@QMG)mswmh#)pmQ zdZJt8lmd0Kft{&yF8o7p(`cqyKuX@C^vA=_^K&-R37VWvKcH#A#q?zriKsC}UhoB= zpZZ+K@&VZVR!bKER{eS`aLK!?goGER8G;&g4!IubrL1=-#ltFP0StSJ>9&80F?9FS zdKWML5f5RDHW#0a4zEU;$@G)zT@PNN!tn1SowHL{|BIaM!YHKPvSt_&wlYKb0`6$I zf&rS(0-WpvoE07Yo$m$$uoPHE0tAu($(n*dic->wASp2^DMcx%VD@Hl$j2}J(i3<2(5&WHeeFW>)LV@m~XzS9uEGz~QBq0giK2XMG~MF0Q* literal 0 HcmV?d00001 diff --git a/assets/img/favicons/android-chrome-512x512.png b/assets/img/favicons/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..7aeb1a740b600aa94ba7d60e790d177fd64ec83d GIT binary patch literal 112814 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 literal 0 HcmV?d00001 diff --git a/assets/img/favicons/apple-touch-icon.png b/assets/img/favicons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..90e253afb3547266caa6ff23a72037b068e36449 GIT binary patch literal 17574 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 + + + + + #da532c + + + diff --git a/assets/img/favicons/favicon-16x16.png b/assets/img/favicons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..272d2cc27b47d8c158736f7b3b56400a55677cb6 GIT binary patch literal 768 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#F#`kNVGw3Kp1&dm zD9B#o>Fdh=f}5Y4#c1ce%v=Tr#`B&ojv*T7Sr6Xz4o+k^@bJFn`)7XXv-5H{E|s3O zlW)?K1scDUrU!^QvNU=GUeJ5x_Cl%UUsE3UuGdP7c5ye&=;ExM5hBr(bW82wu_d{$ zwyoK`^K5NJl^o|S!wWk%AFsPvc5rjNNq6DLTi?spym3hq=8O}(yf3?V_p8o0Z+=~| z3#WsYn3Wc;n>NpZujs1C3=R9@*1YJv3+-L=H=MQF_1DDW+ByFxN`Gx%d7dqt=BKp8 zLrEeb!b-y{T&|2?xi7M~KPKHtXTj#iV>U){c7=UE*R4>u(CvA=?Kj`m<8f&-j(K)y zMDhizyWN{zt3SP8* z=droC-|4nT&sZ%F@k~hQwCMgKtajKtM#6XUzule_k7w-I5S+-a%{p&Gk6*rbe^>6& z+LPC|xpjt`NgO)o{^`lhBkroZzc`rL9ohG8*)gt25vB}{l!%3GlW(YWJB4h&wn};K zH5p#Fz?F}l80#{r2*0dOiq(jiRR2%RZ)bVzVV|Z@D+v`}tw@RReOm;4RhGzq{jo34 zCcmYdOVCQ|m`~Q9Yj@1cCNP{aIdHne^2*ip8AkhOP4@Z7&+v~qrfFsPyWmfGz}QwT zag8WRNi0dVN-jzTQVd20Mkcz3hPsBPA%=!l1}0Xf2HFM&Rt5%gSI>o@Xvob^$xN%n qts%do444cVG~hOrWag$8mn7yE;MQX?H{2Ykhr!d;&t;ucLK6VhL@KHP literal 0 HcmV?d00001 diff --git a/assets/img/favicons/favicon-32x32.png b/assets/img/favicons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3884d0bf0f40fffdba9c5f8b8cb1335a69673362 GIT binary patch literal 1685 zcmZ{keK^w#8^?de4%Y0^9ztF!n^HKoA_}oqb<}ET@vMKI>w5k;e|+!n_5I%0=eqy9x!z<~Rp@>w0062a zH-eAc4}O)hqI}LoH>Z9Lp>95&0FZbX0MfDmU`t-5tpGp_8UVz>0D!v&0GjMyIw^MY z#qP5nt^{D`Qr_bpc~W7!QKJC>KJZn$h9awJ@=}RI@^n#J+4HYG5O|&#RRaJJ8i|1S za~on^6+{G5HGb;3_{m|av+MlO$yi&k&|iP>6pdLc;j<{Ld9)#mQ|9U&1!(P*Wc0>F6?dQbf zeGA`ypr1M+cC;#|+H4@9yAOI-H6%(#>c0$jGe50WtvxI_`6QY=ySWt6kSsjSUI9yd z6aHKve5kITRZ?oW_WtCee(8J->GO#co}J!#7!D~!62}1eLiQ{p!0yt-df{9-&OXms|s)LU2 zeQ#E=k?{UlO2iP-Qp0O{P&g`LqKy*QLS$#X;Wz*NP`bRlwb5ZdEbv=r{Jj}B{oU&YzVJo1<0n;oaMB$7cA$IZw( zEdACYdUoYg^|GX6PFsUf!tNVowBNdGm&%q(Z%aKs)@;yQ@75!lXf6Y}wu(p*FG*KL z!Tkm0eNKAEW%Bsci*6DlHR#c17wf10^j_CsO-bLpaCZOxfzgLPrD0s zPbTQze6eK2Y2ND<*zvl`g-;m^Q|N=d4n(}1X1JG`M_hodjy^yhsmPf_&9%&~*8M=9 z_p^t7!!@I#UGvpMkEj#_ZS#I!c~h41^5X(j3YxF;iPBUlW~DkyI{QE^9c857nvgfeQXkz@-Hmf73p@TnNP#VI^akvPLDjHW*l&ov3Asdwyix5|c`RHC@ z0mU^k(fHN7ES-DkhlusdkRyReX1+xE0y6-yzy9t3R-~e^e|b=Xuon^&DsE0uc&E)8;YMat&5A}Fp=etDbSA2dG(}v;Fo2AhH`%;#==YdS*E2sdM zcYV~A{fE_K1#5buHmPJNXpyc!gM`VXr8>R4jEr(;iX@$tdwCniC#zs-U*^Q% zlw?t27!B1uRJV>zs`R?*P@ie{fwj`cr&&W$8Xm+f7+ZaO?iu3j=#n+U$+tN6#p&?{ zW3YyX@n}YKPvSR&?^iP1iY;|(E)k4$O;z_|@If!W*BpVo&W)p6+3VSp50~%usbL3Pib|uFjN+SPk5Hh%5#UUTfAiAgHh4{|N z=UuYdt`63gyT@gXZ!~5|wmv>Nh%4nozBkbQ6;=IX`OUouEb83Hb1}bfN#3^IA2wEb zQWD_a!ss-xNHIhyw9kaXm{At`AR^Pba}@iuN3czmA#FKSmSONwdT3zXaKT%ZNE7&U zSWf7JUmy^*QDiw@Cx|xmAZ%ixv_Z_@hl(e+dOjO(3pb#d9A5%g;%)X|b1#K+|9)O; z!q|+P=^1`1u==Q~ktQ2u*T-BB>ZJR?{LFIuD|bMh-hoEZ<#C%Z^NYfia>o&emNRUZ z>?EUoO7W)B_NJ==8+(%4WJWq=h6a-4mo`nU?{q9`wl!SWi-kYN4ax?jNYL5 zP5|F5a%Qw1C`ujO0r(9Q(#67H`M(7WIWGPjS_p@Z3yq@74ZxzY7N!`CDaO(dgTbLK zaTp6@G#ZCSrz7$*{|{hA(!v=D{|x-?W#uRbjQ)3l6V9SXb3$0`e`fv@uumjs0Fn!t JQ129+@n6A_{CWTY literal 0 HcmV?d00001 diff --git a/assets/img/favicons/favicon.ico b/assets/img/favicons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..30ae3716ff23f2997d9ab6fbd2f7817c18f520fc GIT binary patch literal 133914 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%0Dlb@KVW=#`l|Tjb-`^U=>lB`wl(5i z@*VgyeP7%6Jk_)4eRw*}E8mp^)J{iSd+ix{@}X#yC#Wy+PwHt`DTW&AcCI>u}XTVAR49D>L_}Iuz(k=|y ztMAlr#J@g|y@8$l>s)im=j5yACjekKKa!6 zuO}z&y*at%d2&%Qt3RNJVi8^7gZUzjeWQ1+*6)MU4e?O^gC6HZ@QYnIhXFQQ$8U35 zXR8M`4$7B8{~3XE-?Z5U{eJi|9)-_tZy%rZn#9$^^BvKv=JU@+_Mesi$=mUr4A4(5 zavr#_QLz}^bcbz{`Pk6j=DzQf>Gm1A(7F^c#%2& zHEs96Tt?0Xz89Ki{9yV6QfK*CV()&bgQ=TdC$aHgvR`nH^SkUAp8PQRz?F{>_t~YG z*8NO!rl%^O@7lnRj2`?Mp_w=lrj@87 zU|)nCt6Sll^{{*LV{2yqtUM%dH8C*d2YMXeutdToM5c{?bU4}ms=*DzcI9YUksx6;-pw%Jwqqh242XSHP>V7 zeY_G^yc1qeFw~#ypQR4sZ&ti7asN)Cf5*hi2@g7&wr!f<4ZKkFU6hxCv)6ZwAG&Sy z_I0WI9ES(=SZ*NZlO1`hWvT~QQ(K>FuH^u9z}a%TZOz4Iyq}ux$?*g43;p-cKE|a} zZ=WSjUKEsnB=1Is;BKFobmP$SjKqqMB|knPwV?CV5Ayo~^K;HQXP(~LU{1P(0gF^z;?|Z;a2~hkRJ(w7Z7N4aks>%8^sQOD|OQs zW!?M!tR26WT=MYv=VRjgj!RrPCjRR1Tz)-q;$!iF5%+7J6g@vM-w(W8a)Nc%A^#uz z^LJ7Gme`f!x2~Oa$&EtaO+)96Vk_6qdi~1L{Y%H6ZWCYfzeaBS<%Zq!-+cOuGWz^7 z!QT4yv1olz$)A3iPd`lXjQRZhA7q$@O#?STH4xV8x1IYvhpE@)#p!no@-qd~>$B-^ z)_8E>1m=Hwf5XPVy*EtV^!IFB?Y{DP$Mrr1qxDm_+HZUC`JWg2bu0HTwtoG}JX`8F zoIh^I#eRi8e^bZ5-B;+}yZs8Eo`K!@H?jSH`UqgUo&I1K?FW8;-2DjbNd2eg^P|$O z`$7b_enpOzYi5cVJs{reWZ1!Je#>IrY#&$ox9&py-Qn}!{lEYJj{`rs97x_ioe51W z_uCyir1?9)e%oQ6ueKyT+Zyc5}M-9#2y#8?RKQqnmliWU^ZxB6kmi*Gm;kUUYa`B%&X>Oik z>(qRQz&XbqvqrvJWOTccezAx_gG^XzdY_8AvwZ{0KslVrTVj4a9blTr% zK7X@$@95gjS)Z=Uns)QZ{@>G!g#+QW_3-v_&sU2*PJe?h@_1Kdb7

X`B2u&suW# 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

7(TB~ew%(zIxOJb+~lc#DtKyy$Oei; z4DwAaudDADvdxlqK@(C(`UoN>d05vM5Clxoz$$B4j)*9b*M0&svMeiTWKT-N$}<~^ zg{4Zd!|5#GcKPmLG&&j{xM0cx}m9tj>1FQmIZPvvYN_7~JI(rjkn<@^RW+dc$_ z0t_*rt8l3&7WoPHIz`n4OSsIIf(Xfh(^hVphjg&D3L+n2B|UZ=s$66PjoR?6o{?u2 zjqKB*<*vbKHt?&2oayQW9F@Pt;p%zY{_}zWDlz1xr}jM-ToKGWx1pWsoTL+f$r^r} z7wU|e7>4L`qGbal$N8r2YGw%c61Lb(8&E~1jQ~5tBeoy9L^6Y9m97pbwU}0-fkw|< z)5uzyc*@4*%*IN`(E&jOi)QUF9-l-P7xjxhl3Z1)-w-JoW&=ze;#l# zALJ@qoyZt|M(DGKUnRRwaR<8+&soK#wi1X*wl+}VF-Gh+AQ+{SMUG4(iI}F5CITm{ zCC?h>azJYuXFAVkd*17=JI05_ZGk*rc}EJ)69PbyMv4cr$Hfgay2X*thQOs0|Mb(J z=UP6%W@}qCEMS;Zwp)fW4@Eq{4?Rs;AXv*L%h%Nt&A*ZwyL2L(fhxl+rW?2NK$RIy z1>&dVSi=I2Gkg}NA=lo24#a<4{GPZiILoB(vxoDB08plhXkQQo7t>OoLwq(cTbPFd zNei#!eXO(^xq^s(efr&mj>CMFVUO4f1RGfA)CO_iCWv^_mRvV5MS(T8^qo=I3gm2! z5K|~-8EYBllvUzpBkbpDJJb*RKf&K3&lC`U?r?QQ{;+ww)s=4WPgex!*IWm~7w6S?*aI;;J7JlH)vCH=>Y1+E{4q2PQJ0 zKtPL)5>`y4lZ#ov03(S&5>kIpn|}&S@OS(vW9OIm8#vDhpvopRJ{cYluH|WDId zI(Z52<5H*dn7U$$ktFnnHyEcGm@O2UHkhk)sf* zdqZZBG-=vk6wf@X*nniv#yO-pvd;ld0h0@C^zyOruSMb6+5Tq%0TdNz++8~%u9eMa z$MO8Qepfh>NOD}lyLlap?YT9En<0){OTJm^2-wBf8MR63@mnNqTt&AHxwJ)9ZG_Gk zJ5x(5OfkkX+8x%Rn8p-kT5K~)(;{~+m#~HzhHd3AS0Fy8?LWesvfmKVvqAh7JPQZ_ zWdfqz!O6@uqWNre*4dCml3^LI<=45)vA`)4Oo0;&=z?!X5mfga=4+gEA`sk|-7c=8 z-3oK+Q@4clG&^(`)Fg~jU@^^>Z3Nm!P-2n{jb70zNh7P+LN7Cn+v0Wg%j=Y z_dK(RpEJR;f&fsViOeo}D!7(rQ|fs3>H4;Bv&31J@iN}U4fNRig?`p3M;Oyue_TH+ zLeR%I*gwljlPutQwhEB?B(8220abP~mO9di0jjK^#TtboA_5|cOi-ms_wkP9i#FD= zm3fSL9g|Ks`^4wRc&E5KI&bwx(&1S`099x{ zz8{@GT)jq)vaA!jACtGSGzdZYe`VRkg*N5}OZa0gKyY}LP%nTQ zeMBtKrsU95CQCX2F0Yw^kud_g*uWL6Bw*53Moxy$B#@%S-|>;QM~ct-_CKo#0A<>d z{X8Tt7Yj~j7E#mB(#AS|jkoeDE@7VbRL8AlLZ&#*aa|D<;&PRWAWv`y51%&sF2kiP zw|Dvh+NO%<0DDhk!ci&i3ur)9J}}8!ArTd3n4qTXhPg3IS-QA@ZCpwZs;XMLi(9=z z%#a_!^O%K<=@5sq_$ zN!z5w-9!+K@NFJSshbtQL(sB~P$O4)${nAbMZq)#H zf^n*3$T`kl^?x%N|32W$PY8GLWaq$(lC-z;hj0zn^l@Te1VmJZ!qL5J~f`_ld7?UV^>O4xV)c z04S3!${z-qU?a_PmMflOKaKR##!R2C>h=GVxJVHM$bkcxih9ORHiZKdK9A15M>S=z;ot)y# zF*N~eS&u2(Zn|!Tn4W&B6HkUCoIIn!R#oe5pvQ};GlnR`WTu&9T#p|zMC{^Ie471f zBR$1m%a7NN1m_{r_gvuTga9*?X^_#;;GST9ux_^XEwYz~IYxyU1{k484by-*_Qe@u zoh725?{mM-oKuiiO+Z1GO)Lew{eB*v>B1!#;_w;8FM(v7qZH|+F@chRt}&7!LrJ5- z2nV>Gf8l4kFl|B)c$kmWJ{gQ915}@V_&Ff}K$!~pA?^waVk`Od!U{0OUUo2qpjo$C zkGEesKLu6xaVNWU^!%A3>m*HVrrY}cu#$i||0Zp8hW%$*>9fc&M(Co`_9QiQ%9w^# z@!0|g_%2`NL0jO(8)ZfOU;bF!AO74oAAYU~08pW^C?1ecishomO)PaYePEg+9AFSZ zBYCUkOYPlL*NyTMzVFl_KC{Zy#U^b9j4auY?0=y~i!3$vGIN@=X*V1!Vwj_ZblP#o zqeYvoj&Kh@;7MK9w$9BxE<{EXGugsR7<{y4PueMv(LC81xExsUsZc5*oXY+G{c0_}`G5V0a zGR#HdbQ_qXhZU@58BItsR5-#z?5E^e^v-6A+qjZEaSXEROjN@JkSkMgjtcklQ)^{7 z+XZZ46_>J-CREp;0rqoZI={^2=A0Dvkr8vDd|c}&#AYVzk2H8)!xas9$JvYsxI;UAGM5Ea)Aid(&%B77R; z@eF7=$=~v!>}R9?bFClz?7?%6003pmQT|}?eQ{K@iiKyNuzI$^mXdj_(bY@M*2f*s zLyZPXHLOyjMwS65)92h^7IU-|hxxP2UyI?=Su}M0`N1y)0svIV*LYlfBiI$J7xT{j z{?lz%hE>eh;$Nswd29@>S!$rrLd6-)==%I;e)?I#aXt}zME*ejTUs(oIxuxo7uu!!k0!%<1}bvx;a#|hS`^TZqHoGK}d0&FNlB7?2Baaxn9UK zjrF-6z?q;G@?ur=8g7ghM+;@{oT_Q)Ddx!0Kod>mX&_6E3_`c6kIleUs+1{GqD+Y@ zX&n1ZxxWHAEq018WPXs@E9Er5`0xvl016f{)gE=on|OP)F=|U|W`CxM#2x@soGo4e zg#;!dAlVV*Y(c=FxSxOK!8sFS{Gy+HXVkwe&;f{!Xk+xM=tZ(u_C(pUr2`^Wp^FPL z`P@HFPdWXQ+)oAc1^*#GmEB9}m*L#IWB(*+aoTF)roAbG;-_bI!ly(1OTCO>()sSgz+%)-y*oaMsM>TtR>oqdXRTPuwLB zW{R>p^UNRmoWd_X0vKopK|{1y^vHGca=DS^%#{sinz}3Q&5kspL`A?cF)AJx2gQA2 zPqq-9wsZL}5B#S=fEeS-G$yK>S zewX{?A!f3ntQDU2`+phWKQ#i(26+%cHWHEynfbH}=~eBoiQ_GW%F_x7`4#*Meg(gR fU%{{7mj?bnPSv!wSnE3)00000NkvXXu0mjf*{#qJ literal 0 HcmV?d00001 diff --git a/assets/img/favicons/mstile-150x150.png b/assets/img/favicons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..c0d045e25de42fc422567313f9e4e6f2717e8040 GIT binary patch literal 12172 zcmc(FXEst@nM`+AHd{rV_~m+6N#Ih(twMK?elFBK`MEh!0%( zP^56x5{+NS6Vrd}I z6PK(;Z3*B5{C8?f3ZVOcKY1<1Nx&5XcNGmqf^}S4au8o~WTznr#LcCmAglXfZg%IRO0jf`?;W+&9kSRY6g^Ylp}eO-*6v|x^`xN`et0gNq9`kd@*kE5EV>> zWvOsm@{J=8r}r`LFUneS>};7{#j@fN+wlJD@n^Y}kbjY;l8a^J@rq>cTt^gM>( zDPmrd*Ep)r3zK#JcmJH)r@Je?&ySa7F!dRp4ARrldH28{{Aa7std%9QM(9BnQ5MNV zoYVG})_vy}Cza0&ub$dFb{YDn*VN7$a%Kkx*LWt>cpB%&YcZHC$T0=YN#|^46Ww5c z`+Hc0^$JIO`1pV!Db23jl8~7##vl98^MqEzf=&{vB?!d3g)d2lAP%>(+-?c})iP#aPk=MG5yycA%+jw&ig+{{=U+(;sQnlC)3uq?r|tZ~wIr>9IS~=-I?7#_AM{FR0ize0)*1e;vrZ zR-;Go3I|2eW4MF;Xf3eC>#8+(q0?ry{j$9+VL1OM_B2TNvNhK`6;TSl5IN98TQW~w z>J$9P_8WSqbt*6)M0VYJ?}x=xs`EXj#xuI+ta3<-seEd#Vbu2I)4hR#y;kMa-K1gW zo_c9H{~~93jg4Z#D0FHr_pLo#@+uEl@t;%NKc?p7%s2~m$)@IjkCeojCI+YG&Y8aZ zD-~#?41Iwm*W0`spPIWatAUr*tT)js71o@+u-{d+-$e{L2D~dTe|{pUqq-|=GlZEO zinu1S-~Hs(IIPUNYG5zzT)sHguzWf-=lqwJ*He^q+EDzLp>JZ1XL5~x6As5DV2QLv zx#RXrM&kg&v-3ViS&X9nu5Ve5p-s_*%)9cqxAynN$FgP=G2IAng6jDfqz8`w`9*xNk1YMxlxY(6&m#?q@}PH|~{LH5=@ zhV&g%F18ftYcSJwYg_#Ydm*Vb3B3}<^0_}6>qt_)7(}3JTsbv`W%g8hYE24F_ECym zkJ_-*|HPYOMy}QV>RL=ZhUBTVvGf!MzPl#w^f;zF zHWK_y+6+a1BtJ(mei`}{61j$IrK!GtBdgG8w!D6ek2Xa+LymOWlHPNjG<@$=!$E

_nQW8n*?}ESWU%R`ze^O_AZ*R}?Sv8@5 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 Q14DpR6g3r)a^@lb2j +{%- endcomment -%} + +MathJax = { + tex: { + {%- comment -%} start/end delimiter pairs for in-line math {%- endcomment -%} + inlineMath: [ + ['$', '$'], + ['\\(', '\\)'] + ], + {%- comment -%} start/end delimiter pairs for display math {%- endcomment -%} + displayMath: [ + ['$$', '$$'], + ['\\[', '\\]'] + ], + {%- comment -%} equation numbering {%- endcomment -%} + tags: 'ams' + } +}; diff --git a/assets/js/data/search.json b/assets/js/data/search.json new file mode 100644 index 0000000..2601ed0 --- /dev/null +++ b/assets/js/data/search.json @@ -0,0 +1,20 @@ +--- +layout: compress +swcache: true +--- + +[ + {% for post in site.posts %} + { + "title": {{ post.title | jsonify }}, + "url": {{ post.url | relative_url | jsonify }}, + "categories": {{ post.categories | join: ', ' | jsonify }}, + "tags": {{ post.tags | join: ', ' | jsonify }}, + "date": "{{ post.date }}", + {% include no-linenos.html content=post.content %} + {% assign _content = content | strip_html | strip_newlines %} + "snippet": {{ _content | truncate: 200 | jsonify }}, + "content": {{ _content | jsonify }} + }{% unless forloop.last %},{% endunless %} + {% endfor %} +] diff --git a/assets/js/data/swconf.js b/assets/js/data/swconf.js new file mode 100644 index 0000000..798888a --- /dev/null +++ b/assets/js/data/swconf.js @@ -0,0 +1,47 @@ +--- +layout: compress +permalink: '/:path/swconf.js' +# Note that this file will be fetched by the ServiceWorker, so it will not be cached. +--- + +const swconf = { + {% if site.pwa.cache.enabled %} + cacheName: 'chirpy-{{ "now" | date: "%s" }}', + + {%- comment -%} Resources added to the cache during PWA installation. {%- endcomment -%} + resources: [ + '{{ "/assets/css/:THEME.css" | replace: ':THEME', site.theme | relative_url }}', + '{{ "/" | relative_url }}', + {% for tab in site.tabs %} + '{{- tab.url | relative_url -}}', + {% endfor %} + + {% assign cache_list = site.static_files | where: 'swcache', true %} + {% for file in cache_list %} + '{{ file.path | relative_url }}'{%- unless forloop.last -%},{%- endunless -%} + {% endfor %} + ], + + interceptor: { + {%- comment -%} URLs containing the following paths will not be cached. {%- endcomment -%} + paths: [ + {% for path in site.pwa.cache.deny_paths %} + {% unless path == empty %} + '{{ path | relative_url }}'{%- unless forloop.last -%},{%- endunless -%} + {% endunless %} + {% endfor %} + ], + + {%- comment -%} URLs containing the following prefixes will not be cached. {%- endcomment -%} + urlPrefixes: [ + {% if site.analytics.goatcounter.id != nil and site.pageviews.provider == 'goatcounter' %} + 'https://{{ site.analytics.goatcounter.id }}.goatcounter.com/counter/' + {% endif %} + ] + }, + + purge: false + {% else %} + purge: true + {% endif %} +}; diff --git a/assets/robots.txt b/assets/robots.txt new file mode 100644 index 0000000..45c34e0 --- /dev/null +++ b/assets/robots.txt @@ -0,0 +1,10 @@ +--- +permalink: /robots.txt +# The robots rules +--- + +User-agent: * + +Disallow: /norobots/ + +Sitemap: {{ '/sitemap.xml' | absolute_url }} diff --git a/index.html b/index.html new file mode 100644 index 0000000..1357b08 --- /dev/null +++ b/index.html @@ -0,0 +1,4 @@ +--- +layout: home +# Index page +--- diff --git a/jekyll-theme-chirpy.gemspec b/jekyll-theme-chirpy.gemspec new file mode 100644 index 0000000..9de7dd0 --- /dev/null +++ b/jekyll-theme-chirpy.gemspec @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +Gem::Specification.new do |spec| + spec.name = "jekyll-theme-chirpy" + spec.version = "7.1.1" + spec.authors = ["Cotes Chung"] + spec.email = ["cotes.chung@gmail.com"] + + spec.summary = "A minimal, responsive, and feature-rich Jekyll theme for technical writing." + spec.homepage = "https://github.com/cotes2020/jekyll-theme-chirpy" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").select { |f| + f.match(%r!^((_(includes|layouts|sass|(data\/(locales|origin)))|assets)\/|README|LICENSE)!i) + } + + spec.metadata = { + "bug_tracker_uri" => "https://github.com/cotes2020/jekyll-theme-chirpy/issues", + "documentation_uri" => "https://github.com/cotes2020/jekyll-theme-chirpy/#readme", + "homepage_uri" => "https://cotes2020.github.io/chirpy-demo", + "source_code_uri" => "https://github.com/cotes2020/jekyll-theme-chirpy", + "wiki_uri" => "https://github.com/cotes2020/jekyll-theme-chirpy/wiki", + "plugin_type" => "theme" + } + + spec.required_ruby_version = "~> 3.1" + + spec.add_runtime_dependency "jekyll", "~> 4.3" + spec.add_runtime_dependency "jekyll-paginate", "~> 1.1" + spec.add_runtime_dependency "jekyll-redirect-from", "~> 0.16" + spec.add_runtime_dependency "jekyll-seo-tag", "~> 2.8" + spec.add_runtime_dependency "jekyll-archives", "~> 2.2" + spec.add_runtime_dependency "jekyll-sitemap", "~> 1.4" + spec.add_runtime_dependency "jekyll-include-cache", "~> 0.2" + +end diff --git a/package.json b/package.json new file mode 100644 index 0000000..f93e76b --- /dev/null +++ b/package.json @@ -0,0 +1,177 @@ +{ + "name": "jekyll-theme-chirpy", + "version": "7.1.1", + "description": "A minimal, responsive, and feature-rich Jekyll theme for technical writing.", + "repository": { + "type": "git", + "url": "git+https://github.com/cotes2020/jekyll-theme-chirpy.git" + }, + "author": "Cotes Chung", + "license": "MIT", + "since": 2019, + "bugs": { + "url": "https://github.com/cotes2020/jekyll-theme-chirpy/issues" + }, + "homepage": "https://github.com/cotes2020/jekyll-theme-chirpy/", + "scripts": { + "build": "concurrently npm:build:*", + "build:css": "purgecss -c purgecss.config.js", + "build:js": "rollup -c --bundleConfigAsCjs --environment BUILD:production", + "watch:js": "rollup -c --bundleConfigAsCjs -w", + "lint:scss": "stylelint _sass/**/*.scss", + "lint:fix:scss": "npm run lint:scss -- --fix", + "test": "npm run lint:scss", + "prepare": "husky" + }, + "dependencies": { + "@popperjs/core": "^2.11.8", + "bootstrap": "^5.3.3" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/preset-env": "^7.25.4", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/exec": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "concurrently": "^9.0.1", + "conventional-changelog-conventionalcommits": "^8.0.0", + "husky": "^9.1.6", + "purgecss": "^6.0.0", + "rollup": "^4.21.3", + "semantic-release": "^24.1.1", + "stylelint": "^16.9.0", + "stylelint-config-standard-scss": "^13.1.0" + }, + "prettier": { + "trailingComma": "none" + }, + "browserslist": [ + "last 2 versions", + "> 0.2%", + "not dead" + ], + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ], + "rules": { + "body-max-line-length": [ + 0, + "always" + ] + } + }, + "stylelint": { + "extends": "stylelint-config-standard-scss", + "rules": { + "no-descending-specificity": null, + "shorthand-property-no-redundant-values": null, + "at-rule-no-vendor-prefix": null, + "property-no-vendor-prefix": null, + "selector-no-vendor-prefix": null, + "value-no-vendor-prefix": null, + "color-function-notation": "legacy", + "alpha-value-notation": "number", + "selector-not-notation": "simple", + "color-hex-length": "long", + "declaration-block-single-line-max-declarations": 3, + "scss/operator-no-newline-after": null, + "rule-empty-line-before": [ + "always", + { + "ignore": [ + "after-comment", + "first-nested" + ] + } + ], + "value-keyword-case": [ + "lower", + { + "ignoreProperties": [ + "/^\\$/" + ] + } + ], + "media-feature-range-notation": "prefix" + } + }, + "release": { + "branches": [ + "production" + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "conventionalcommits" + } + ], + [ + "@semantic-release/release-notes-generator", + { + "preset": "conventionalcommits", + "presetConfig": { + "types": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Improvements" + }, + { + "type": "refactor", + "section": "Changes", + "hidden": true + } + ] + } + } + ], + [ + "@semantic-release/changelog", + { + "changelogFile": "docs/CHANGELOG.md", + "changelogTitle": "# Changelog" + } + ], + [ + "@semantic-release/npm", + { + "npmPublish": false + } + ], + [ + "@semantic-release/exec", + { + "prepareCmd": "bash tools/release.sh --prepare", + "publishCmd": "bash tools/release.sh" + } + ], + [ + "@semantic-release/git", + { + "assets": [ + "docs", + "package.json", + "*.gemspec" + ], + "message": "chore(release): ${nextRelease.version}\n\n${nextRelease.notes}" + } + ], + "@semantic-release/github" + ] + } +} diff --git a/purgecss.config.js b/purgecss.config.js new file mode 100644 index 0000000..de370de --- /dev/null +++ b/purgecss.config.js @@ -0,0 +1,23 @@ +const fs = require('fs'); +const DIST_PATH = '_sass/dist'; + +fs.rm(DIST_PATH, { recursive: true, force: true }, (err) => { + if (err) { + throw err; + } + + fs.mkdirSync(DIST_PATH); +}); + +module.exports = { + content: ['_includes/**/*.html', '_layouts/**/*.html', '_javascript/**/*.js'], + css: ['node_modules/bootstrap/dist/css/bootstrap.min.css'], + keyframes: true, + variables: true, + output: `${DIST_PATH}/bootstrap.css`, + // The `safelist` should be changed appropriately for future development + safelist: { + standard: [/^collaps/, /^w-/, 'shadow', 'border', 'kbd'], + greedy: [/^col-/, /tooltip/] + } +}; diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..19ba4da --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,74 @@ +import babel from '@rollup/plugin-babel'; +import terser from '@rollup/plugin-terser'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import fs from 'fs'; +import pkg from './package.json'; + +const SRC_DEFAULT = '_javascript'; +const SRC_PWA = `${SRC_DEFAULT}/pwa`; +const DIST = 'assets/js/dist'; + +const banner = `/*! + * ${pkg.name} v${pkg.version} | © ${pkg.since} ${pkg.author} | ${pkg.license} Licensed | ${pkg.homepage} + */`; + +const frontmatter = `---\npermalink: /:basename\n---\n`; + +const isProd = process.env.BUILD === 'production'; + +function cleanup() { + fs.rmSync(DIST, { recursive: true, force: true }); + console.log(`> Directory "${DIST}" has been cleaned.`); +} + +function insertFrontmatter() { + return { + name: 'insert-frontmatter', + generateBundle(_, bundle) { + for (const chunkOrAsset of Object.values(bundle)) { + if (chunkOrAsset.type === 'chunk') { + chunkOrAsset.code = frontmatter + chunkOrAsset.code; + } + } + } + }; +} + +function build(filename, { src = SRC_DEFAULT, jekyll = false } = {}) { + return { + input: `${src}/${filename}.js`, + output: { + file: `${DIST}/${filename}.min.js`, + format: 'iife', + name: 'Chirpy', + banner, + sourcemap: !isProd && !jekyll + }, + watch: { + include: `${src}/**` + }, + plugins: [ + babel({ + babelHelpers: 'bundled', + presets: ['@babel/env'], + plugins: ['@babel/plugin-transform-class-properties'] + }), + nodeResolve(), + isProd && terser(), + jekyll && insertFrontmatter() + ] + }; +} + +cleanup(); + +export default [ + build('commons'), + build('home'), + build('categories'), + build('page'), + build('post'), + build('misc'), + build('app', { src: SRC_PWA, jekyll: true }), + build('sw', { src: SRC_PWA, jekyll: true }) +]; diff --git a/tools/init.sh b/tools/init.sh new file mode 100644 index 0000000..2ad72ab --- /dev/null +++ b/tools/init.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash +# +# Init the environment for new user. + +set -eu + +# CLI Dependencies +CLI=("git" "npm") + +ACTIONS_WORKFLOW=pages-deploy.yml + +RELEASE_HASH=$(git log --grep="chore(release):" -1 --pretty="%H") + +# temporary file suffixes that make `sed -i` compatible with BSD and Linux +TEMP_SUFFIX="to-delete" + +_no_gh=false + +help() { + echo "Usage:" + echo + echo " bash /path/to/init [options]" + echo + echo "Options:" + echo " --no-gh Do not deploy to Github." + echo " -h, --help Print this help information." +} + +# BSD and GNU compatible sed +_sedi() { + regex=$1 + file=$2 + sed -i.$TEMP_SUFFIX -E "$regex" "$file" + rm -f "$file".$TEMP_SUFFIX +} + +_check_cli() { + for i in "${!CLI[@]}"; do + cli="${CLI[$i]}" + if ! command -v "$cli" &>/dev/null; then + echo "Command '$cli' not found! Hint: you should install it." + exit 1 + fi + done +} + +_check_status() { + if [[ -n $(git status . -s) ]]; then + echo "Error: Commit unstaged files first, and then run this tool again." + exit 1 + fi +} + +_check_init() { + if [[ $(git rev-parse HEAD^1) == "$RELEASE_HASH" ]]; then + echo "Already initialized." + exit 0 + fi +} + +check_env() { + _check_cli + _check_status + _check_init +} + +reset_latest() { + git reset --hard "$RELEASE_HASH" + git clean -fd + git submodule update --init --recursive +} + +init_files() { + if $_no_gh; then + rm -rf .github + else + ## Change the files of `.github/` + temp="$(mktemp -d)" + find .github/workflows -type f -name "*$ACTIONS_WORKFLOW*" -exec mv {} "$temp/$ACTIONS_WORKFLOW" \; + rm -rf .github && mkdir -p .github/workflows + mv "$temp/$ACTIONS_WORKFLOW" .github/workflows/"$ACTIONS_WORKFLOW" + rm -rf "$temp" + fi + + # Cleanup image settings in site config + _sedi "s/(^timezone:).*/\1/;s/(^.*cdn:).*/\1/;s/(^avatar:).*/\1/" _config.yml + + # remove the other files + rm -rf tools/init.sh tools/release.sh _posts/* + + # build assets + npm i && npm run build + + # track the CSS/JS output + _sedi "/.*\/dist$/d" .gitignore +} + +commit() { + git add -A + git commit -m "chore: initialize the environment" -q + echo -e "\n> Initialization successful!\n" +} + +main() { + check_env + reset_latest + init_files + commit +} + +while (($#)); do + opt="$1" + case $opt in + --no-gh) + _no_gh=true + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + # unknown option + help + exit 1 + ;; + esac +done + +main diff --git a/tools/release.sh b/tools/release.sh new file mode 100644 index 0000000..522c892 --- /dev/null +++ b/tools/release.sh @@ -0,0 +1,186 @@ +#!/usr/bin/env bash +# +# Requires: Git, NPM and RubyGems + +set -eu + +opt_pre=false # option for bump gem version +opt_pkg=false # option for building gem package + +MAIN_BRANCH="master" +RELEASE_BRANCH="production" + +GEM_SPEC="jekyll-theme-chirpy.gemspec" +NODE_SPEC="package.json" +CHANGELOG="docs/CHANGELOG.md" +CONFIG="_config.yml" + +CSS_DIST="_sass/dist" +JS_DIST="assets/js/dist" + +FILES=( + "$GEM_SPEC" + "$NODE_SPEC" + "$CHANGELOG" + "$CONFIG" +) + +TOOLS=( + "git" + "npm" + "gem" +) + +help() { + echo -e "A tool to release new version Chirpy gem.\nThis tool will:" + echo " 1. Build a new gem and publish it to RubyGems.org" + echo " 2. Merge the release branch into the default branch" + echo + echo "Usage:" + echo " bash $0 [options]" + echo + echo "Options:" + echo " --prepare Preparation for release" + echo " -p, --package Build a gem package only, for local packaging in case of auto-publishing failure" + echo " -h, --help Display this help message" +} + +_check_cli() { + for i in "${!TOOLS[@]}"; do + cli="${TOOLS[$i]}" + if ! command -v "$cli" &>/dev/null; then + echo "> Command '$cli' not found!" + exit 1 + fi + done +} + +_check_git() { + $opt_pre || ( + # ensure that changes have been committed + if [[ -n $(git status . -s) ]]; then + echo "> Abort: Commit the staged files first, and then run this tool again." + exit 1 + fi + ) + + $opt_pkg || ( + if [[ "$(git branch --show-current)" != "$RELEASE_BRANCH" ]]; then + echo "> Abort: Please run the tool in the '$RELEASE_BRANCH' branch." + exit 1 + fi + ) +} + +_check_src() { + for i in "${!FILES[@]}"; do + _src="${FILES[$i]}" + if [[ ! -f $_src && ! -d $_src ]]; then + echo -e "> Error: Missing file \"$_src\"!\n" + exit 1 + fi + done +} + +init() { + _check_cli + _check_git + _check_src + echo -e "> npm install\n" + npm i +} + +## Bump new version to gem-spec file +_bump_version() { + _version="$(grep '"version":' "$NODE_SPEC" | sed 's/.*: "//;s/".*//')" + sed -i "s/[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+/$_version/" "$GEM_SPEC" + echo "> Bump gem version to $_version" +} + +_improve_changelog() { + # Replace multiple empty lines with a single empty line + sed -i '/^$/N;/^\n$/D' "$CHANGELOG" + # Escape left angle brackets of HTML tag in the changelog as they break the markdown structure. e.g., '


' + sed -i -E 's/\s(<[a-z])/ \\\1/g' "$CHANGELOG" +} + +prepare() { + _bump_version + _improve_changelog +} + +## Build a Gem package +build_gem() { + # Remove unnecessary theme settings + sed -i -E "s/(^timezone:).*/\1/;s/(^cdn:).*/\1/;s/(^avatar:).*/\1/" $CONFIG + rm -f ./*.gem + + npm run build + # add CSS/JS distribution files to gem package + git add "$CSS_DIST" "$JS_DIST" -f + + echo -e "\n> gem build $GEM_SPEC\n" + gem build "$GEM_SPEC" + + echo -e "\n> Resume file changes ...\n" + git reset + git checkout . +} + +# Push the gem to RubyGems.org (using $GEM_HOST_API_KEY) +push_gem() { + gem push ./*.gem +} + +## Merge the release branch into the default branch +merge() { + git fetch origin "$MAIN_BRANCH" + git checkout -b "$MAIN_BRANCH" origin/"$MAIN_BRANCH" + + git merge --no-ff --no-edit "$RELEASE_BRANCH" || ( + git merge --abort + echo -e "\n> Conflict detected. Aborting merge.\n" + exit 0 + ) + + git push origin "$MAIN_BRANCH" +} + +main() { + init + + if $opt_pre; then + prepare + exit 0 + fi + + build_gem + $opt_pkg && exit 0 + push_gem + merge +} + +while (($#)); do + opt="$1" + case $opt in + --prepare) + opt_pre=true + shift + ;; + -p | --package) + opt_pkg=true + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + # unknown option + help + exit 1 + ;; + esac +done + +main diff --git a/tools/run.sh b/tools/run.sh new file mode 100644 index 0000000..0efc452 --- /dev/null +++ b/tools/run.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# +# Run jekyll serve and then launch the site + +prod=false +command="bundle exec jekyll s -l" +host="127.0.0.1" + +help() { + echo "Usage:" + echo + echo " bash /path/to/run [options]" + echo + echo "Options:" + echo " -H, --host [HOST] Host to bind to." + echo " -p, --production Run Jekyll in 'production' mode." + echo " -h, --help Print this help information." +} + +while (($#)); do + opt="$1" + case $opt in + -H | --host) + host="$2" + shift 2 + ;; + -p | --production) + prod=true + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + echo -e "> Unknown option: '$opt'\n" + help + exit 1 + ;; + esac +done + +command="$command -H $host" + +if $prod; then + command="JEKYLL_ENV=production $command" +fi + +if [ -e /proc/1/cgroup ] && grep -q docker /proc/1/cgroup; then + command="$command --force_polling" +fi + +echo -e "\n> $command\n" +eval "$command" diff --git a/tools/test.sh b/tools/test.sh new file mode 100644 index 0000000..331de1c --- /dev/null +++ b/tools/test.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# +# Build and test the site content +# +# Requirement: html-proofer, jekyll +# +# Usage: See help information + +set -eu + +SITE_DIR="_site" + +_config="_config.yml" + +_baseurl="" + +help() { + echo "Build and test the site content" + echo + echo "Usage:" + echo + echo " bash $0 [options]" + echo + echo "Options:" + echo ' -c, --config "" Specify config file(s)' + echo " -h, --help Print this information." +} + +read_baseurl() { + if [[ $_config == *","* ]]; then + # multiple config + IFS="," + read -ra config_array <<<"$_config" + + # reverse loop the config files + for ((i = ${#config_array[@]} - 1; i >= 0; i--)); do + _tmp_baseurl="$(grep '^baseurl:' "${config_array[i]}" | sed "s/.*: *//;s/['\"]//g;s/#.*//")" + + if [[ -n $_tmp_baseurl ]]; then + _baseurl="$_tmp_baseurl" + break + fi + done + + else + # single config + _baseurl="$(grep '^baseurl:' "$_config" | sed "s/.*: *//;s/['\"]//g;s/#.*//")" + fi +} + +main() { + # clean up + if [[ -d $SITE_DIR ]]; then + rm -rf "$SITE_DIR" + fi + + read_baseurl + + # build + JEKYLL_ENV=production bundle exec jekyll b \ + -d "$SITE_DIR$_baseurl" -c "$_config" + + # test + bundle exec htmlproofer "$SITE_DIR" \ + --disable-external \ + --ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/" +} + +while (($#)); do + opt="$1" + case $opt in + -c | --config) + _config="$2" + shift + shift + ;; + -h | --help) + help + exit 0 + ;; + *) + # unknown option + help + exit 1 + ;; + esac +done + +main