From 40b4d763f10b9f0270061bd986394ebb296b9bb7 Mon Sep 17 00:00:00 2001 From: ydj515 Date: Sun, 13 Oct 2024 20:25:38 +0900 Subject: [PATCH] fix --- .devcontainer/devcontainer.json | 29 -- .devcontainer/post-create.sh | 18 - .github/DISCUSSION_TEMPLATE/general.yml | 9 + .github/DISCUSSION_TEMPLATE/ideas.yml | 7 - .github/ISSUE_TEMPLATE/custom.md | 10 + .github/dependabot.yml | 14 +- .github/workflows/cd.yml | 5 +- .github/workflows/ci.yml | 5 +- .github/workflows/jekyll.yml | 64 ++++ .github/workflows/publish.yml | 5 - .github/workflows/starter/pages-deploy.yml | 2 +- .github/workflows/style-lint.yml | 4 +- .gitignore | 5 - .husky/commit-msg | 5 +- .vscode/extensions.json | 12 +- .vscode/settings.json | 11 +- .vscode/tasks.json | 64 ---- CNAME | 1 + Gemfile | 11 +- README.md | 11 +- _config.yml | 66 ++-- _data/authors.yml | 4 + _data/contact.yml | 16 +- _data/locales/ar.yml | 2 +- _data/locales/bg-BG.yml | 2 +- _data/locales/cs-CZ.yml | 2 +- _data/locales/de-DE.yml | 4 +- _data/locales/el-GR.yml | 2 +- _data/locales/en.yml | 4 +- _data/locales/es-ES.yml | 2 +- _data/locales/fi-FI.yml | 2 +- _data/locales/fr-FR.yml | 8 +- _data/locales/hu-HU.yml | 29 +- _data/locales/id-ID.yml | 2 +- _data/locales/it-IT.yml | 2 +- _data/locales/ko-KR.yml | 2 +- _data/locales/my-MM.yml | 2 +- _data/locales/pt-BR.yml | 2 +- _data/locales/ru-RU.yml | 4 +- _data/locales/sl-SI.yml | 2 +- _data/locales/sv-SE.yml | 2 +- _data/locales/th.yml | 2 +- _data/locales/tr-TR.yml | 2 +- _data/locales/uk-UA.yml | 2 +- _data/locales/vi-VN.yml | 2 +- _data/locales/zh-CN.yml | 2 +- _data/locales/zh-TW.yml | 2 +- _data/origin/basic.yml | 10 +- _data/origin/cors.yml | 44 +-- _data/share.yml | 12 - _includes/analytics/cloudflare.html | 7 - _includes/analytics/fathom.html | 7 - _includes/comments/disqus.html | 6 +- _includes/comments/giscus.html | 10 +- _includes/comments/utterances.html | 32 +- _includes/embed/audio.html | 2 +- _includes/embed/video.html | 2 +- _includes/footer.html | 2 + _includes/head.html | 40 ++- _includes/js-selector.html | 20 +- _includes/mermaid.html | 10 +- _includes/pageviews/goatcounter.html | 11 +- _includes/related-posts.html | 1 - _includes/sidebar.html | 7 +- _includes/toc-status.html | 10 - _includes/toc.html | 9 +- _javascript/_copyright | 1 + _javascript/commons.js | 2 +- _javascript/home.js | 6 +- _javascript/misc.js | 2 +- .../modules/components/category-collapse.js | 3 - _javascript/modules/components/clipboard.js | 30 +- _javascript/modules/components/img-popup.js | 51 +-- .../modules/components/search-display.js | 2 +- _javascript/modules/components/toc.js | 39 +- .../modules/components/toc/toc-desktop.js | 22 -- .../modules/components/toc/toc-mobile.js | 117 ------ .../modules/components/tooltip-loader.js | 7 +- _javascript/modules/plugins.js | 2 +- _javascript/page.js | 6 +- _javascript/post.js | 11 +- _layouts/compress.html | 4 +- _layouts/default.html | 72 ++-- _layouts/home.html | 45 +-- _layouts/post.html | 178 ++++----- _posts/2019-08-08-text-and-typography.md | 8 +- _posts/2019-08-08-write-a-new-post.md | 339 ++++++++++-------- _posts/2019-08-09-getting-started.md | 131 +++---- _sass/addon/commons.scss | 72 ++-- _sass/addon/module.scss | 32 +- _sass/addon/syntax.scss | 10 +- _sass/addon/variables.scss | 3 +- _sass/colors/syntax-dark.scss | 2 +- _sass/colors/syntax-light.scss | 6 +- _sass/colors/typography-dark.scss | 24 +- _sass/colors/typography-light.scss | 28 +- _sass/layout/categories.scss | 2 +- _sass/layout/home.scss | 4 +- _sass/layout/post.scss | 213 +---------- _sass/main.bundle.scss | 2 - aa.txt | 0 assets/404.html | 2 +- assets/css/jekyll-theme-chirpy.scss | 6 +- .../img/favicons/android-chrome-192x192.png | Bin 19952 -> 4920 bytes .../img/favicons/android-chrome-512x512.png | Bin 62557 -> 33883 bytes assets/img/favicons/apple-touch-icon.png | Bin 13867 -> 7113 bytes assets/img/favicons/favicon-16x16.png | Bin 1247 -> 326 bytes assets/img/favicons/favicon-32x32.png | Bin 2312 -> 424 bytes assets/img/favicons/favicon.ico | Bin 15086 -> 15406 bytes assets/img/favicons/site.webmanifest | 27 +- assets/js/data/swconf.js | 36 +- assets/js/dist/categories.min.js | 4 + assets/js/dist/commons.min.js | 4 + assets/js/dist/home.min.js | 4 + assets/js/dist/misc.min.js | 4 + assets/js/dist/page.min.js | 4 + assets/js/dist/post.min.js | 4 + {_javascript => assets/js}/pwa/app.js | 21 +- {_javascript => assets/js}/pwa/sw.js | 43 ++- docs/CHANGELOG.md | 81 ----- docs/SECURITY.md | 8 +- jekyll-theme-chirpy.gemspec | 4 +- package.json | 53 ++- purgecss.config.js | 23 -- rollup.config.js | 62 +--- tools/{init.sh => init} | 52 +-- tools/{release.sh => release} | 48 ++- tools/run | 5 + tools/run.sh | 54 --- tools/{test.sh => test} | 4 +- 130 files changed, 1031 insertions(+), 1705 deletions(-) delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 .devcontainer/post-create.sh delete mode 100644 .github/DISCUSSION_TEMPLATE/ideas.yml create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/workflows/jekyll.yml delete mode 100644 .vscode/tasks.json create mode 100644 CNAME delete mode 100644 _includes/analytics/cloudflare.html delete mode 100644 _includes/analytics/fathom.html delete mode 100644 _includes/toc-status.html create mode 100644 _javascript/_copyright delete mode 100644 _javascript/modules/components/toc/toc-desktop.js delete mode 100644 _javascript/modules/components/toc/toc-mobile.js delete mode 100644 _sass/main.bundle.scss delete mode 100644 aa.txt create mode 100644 assets/js/dist/categories.min.js create mode 100644 assets/js/dist/commons.min.js create mode 100644 assets/js/dist/home.min.js create mode 100644 assets/js/dist/misc.min.js create mode 100644 assets/js/dist/page.min.js create mode 100644 assets/js/dist/post.min.js rename {_javascript => assets/js}/pwa/app.js (70%) rename {_javascript => assets/js}/pwa/sw.js (69%) delete mode 100644 purgecss.config.js rename tools/{init.sh => init} (61%) rename tools/{release.sh => release} (79%) create mode 100644 tools/run delete mode 100644 tools/run.sh rename tools/{test.sh => test} (95%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 39c428d..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "Jekyll", - "image": "mcr.microsoft.com/devcontainers/jekyll:2-bullseye", - "onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}", - "postCreateCommand": "bash .devcontainer/post-create.sh", - "customizations": { - "vscode": { - "settings": { - "terminal.integrated.defaultProfile.linux": "zsh" - }, - "extensions": [ - // Liquid tags auto-complete - "killalau.vscode-liquid-snippets", - // Liquid syntax highlighting and formatting - "Shopify.theme-check-vscode", - // Shell - "timonwong.shellcheck", - "mkhl.shfmt", - // Common formatter - "EditorConfig.EditorConfig", - "esbenp.prettier-vscode", - "stylelint.vscode-stylelint", - "yzhang.markdown-all-in-one", - // Git - "mhutchie.git-graph" - ] - } - } -} diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh deleted file mode 100644 index a4bc282..0000000 --- a/.devcontainer/post-create.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -if [ -f package.json ]; then - bash -i -c "nvm install --lts && nvm install-latest-npm" - npm i - npm run build -fi - -# Install dependencies for shfmt extension -curl -sS https://webi.sh/shfmt | sh &>/dev/null - -# Add OMZ plugins -git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting -git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions -sed -i -E "s/^(plugins=\()(git)(\))/\1\2 zsh-syntax-highlighting zsh-autosuggestions\3/" ~/.zshrc - -# Avoid git log use less -echo -e "\nunset LESS" >>~/.zshrc diff --git a/.github/DISCUSSION_TEMPLATE/general.yml b/.github/DISCUSSION_TEMPLATE/general.yml index 18d0f85..4e879f9 100644 --- a/.github/DISCUSSION_TEMPLATE/general.yml +++ b/.github/DISCUSSION_TEMPLATE/general.yml @@ -9,6 +9,15 @@ body: [contributing guidelines](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md). required: true + - type: dropdown + attributes: + label: What is the topic? + options: + - Sharing tips and tricks + - Just chatting + validations: + required: true + - type: textarea attributes: label: Description diff --git a/.github/DISCUSSION_TEMPLATE/ideas.yml b/.github/DISCUSSION_TEMPLATE/ideas.yml deleted file mode 100644 index e4c987d..0000000 --- a/.github/DISCUSSION_TEMPLATE/ideas.yml +++ /dev/null @@ -1,7 +0,0 @@ -body: - - type: textarea - attributes: - label: Description - description: Please describe in detail what you want to share. - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 0000000..48d5f81 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a51f37e..bec1046 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,16 +2,18 @@ version: 2 updates: - package-ecosystem: "bundler" directory: "/" + versioning-strategy: increase + groups: + bundler: + dependency-type: "production" schedule: interval: "weekly" - package-ecosystem: "npm" directory: "/" versioning-strategy: increase groups: - prod-deps: - dependency-type: production - dev-deps: - dependency-type: development + npm: + dependency-type: "development" schedule: interval: "weekly" - package-ecosystem: "github-actions" @@ -22,7 +24,3 @@ updates: - "major" schedule: interval: "weekly" - - package-ecosystem: "devcontainers" - directory: "/" - schedule: - interval: weekly diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 4f2da0e..160750d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: latest - run: npm install - run: npx semantic-release @@ -35,6 +35,3 @@ jobs: publish: needs: release uses: ./.github/workflows/publish.yml - secrets: - GH_PAT: ${{ secrets.GH_PAT }} - BUILDER: ${{ secrets.BUILDER }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 50a158b..078e4f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,7 +3,6 @@ on: push: branches: - "master" - - "hotfix/**" paths-ignore: - ".github/**" - "!.github/workflows/ci.yml" @@ -36,10 +35,10 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: latest - name: Build Assets run: npm i && npm run build - name: Test Site - run: bash tools/test.sh + run: bash tools/test diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml new file mode 100644 index 0000000..68520b5 --- /dev/null +++ b/.github/workflows/jekyll.yml @@ -0,0 +1,64 @@ +# 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: read + 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-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Ruby + uses: ruby/setup-ruby@8575951200e472d5f2d95c625da0c7bec8217c42 # v1.161.0 + with: + ruby-version: '3.1' # Not needed with a .ruby-version file + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + cache-version: 0 # Increment this number if you need to re-download cached gems + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + - name: Build with Jekyll + # Outputs to the './_site' directory by default + run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: Upload artifact + # Automatically uploads an artifact from the './_site' directory by default + uses: actions/upload-pages-artifact@v3 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 99114ea..20e4691 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -5,11 +5,6 @@ on: branches: - docs workflow_call: - secrets: - GH_PAT: - required: true - BUILDER: - required: true jobs: launch: diff --git a/.github/workflows/starter/pages-deploy.yml b/.github/workflows/starter/pages-deploy.yml index cc28f99..3d65f75 100644 --- a/.github/workflows/starter/pages-deploy.yml +++ b/.github/workflows/starter/pages-deploy.yml @@ -53,7 +53,7 @@ jobs: - name: Test site run: | bundle exec htmlproofer _site \ - \-\-disable-external \ + \-\-disable-external=true \ \-\-ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/" - name: Upload site artifact diff --git a/.github/workflows/style-lint.yml b/.github/workflows/style-lint.yml index f84f3bc..89eeaef 100644 --- a/.github/workflows/style-lint.yml +++ b/.github/workflows/style-lint.yml @@ -2,7 +2,7 @@ name: "Style Lint" on: push: - branches: ["master", "hotfix/**"] + branches: ["master"] paths: ["_sass/**/*.scss"] pull_request: paths: ["_sass/**/*.scss"] @@ -18,6 +18,6 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: latest - run: npm i - run: npm test diff --git a/.gitignore b/.gitignore index fe9681e..d4a7eed 100644 --- a/.gitignore +++ b/.gitignore @@ -17,11 +17,6 @@ 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/.husky/commit-msg b/.husky/commit-msg index 0a4b97d..7f23494 100644 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1 +1,4 @@ -npx --no -- commitlint --edit $1 +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no -- commitlint --edit ${1} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 082bc94..52bd6fb 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,13 @@ { - "recommendations": ["ms-vscode-remote.remote-containers"] + "recommendations": [ + // Liquid tags auto-complete + "killalau.vscode-liquid-snippets", + // Liquid syntax highlighting and formatting + "Shopify.theme-check-vscode", + // Common formatter + "esbenp.prettier-vscode", + "foxundermoon.shell-format", + "stylelint.vscode-stylelint", + "yzhang.markdown-all-in-one" + ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 5e8a04f..b0e2e09 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ // Prettier "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, + "prettier.trailingComma": "none", // Shopify Liquid "files.associations": { "*.html": "liquid" @@ -14,17 +15,13 @@ "editor.defaultFormatter": "Shopify.theme-check-vscode" }, "[shellscript]": { - "editor.defaultFormatter": "mkhl.shfmt" + "editor.defaultFormatter": "foxundermoon.shell-format" }, // 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"] } - } + "stylelint.snippet": ["css", "less", "postcss", "scss"], + "stylelint.validate": ["css", "less", "postcss", "scss"] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 99ed5c5..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "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/CNAME b/CNAME new file mode 100644 index 0000000..1623e4d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +ydj515.com \ No newline at end of file diff --git a/Gemfile b/Gemfile index 66f9337..043b28e 100644 --- a/Gemfile +++ b/Gemfile @@ -4,11 +4,20 @@ source "https://rubygems.org" gemspec -gem "html-proofer", "~> 5.0", group: :test +group :test do + gem "html-proofer", "~> 4.4" +end +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. platforms :mingw, :x64_mingw, :mswin, :jruby do gem "tzinfo", ">= 1", "< 3" gem "tzinfo-data" end +# Performance-booster for watching directories on Windows gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] + +# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem +# do not have a Java counterpart. +gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] diff --git a/README.md b/README.md index 7e57b2a..747b8bc 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ 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] + [![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy?color=brightgreen)][gem]  + [![CI](https://github.com/cotes2020/jekyll-theme-chirpy/actions/workflows/ci.yml/badge.svg?branch=master&event=push)][ci]  + [![Codacy Badge](https://app.codacy.com/project/badge/Grade/4e556876a3c54d5e8f2d2857c4f43894)][codacy]  + [![GitHub license](https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy.svg)][license]  + [![996.icu](https://img.shields.io/badge/link-996.icu-%23FF4D5B.svg)](https://996.icu) [**Live Demo** →][demo] @@ -72,7 +72,6 @@ This project is published under [MIT License][license]. [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/ diff --git a/_config.yml b/_config.yml index 7a9b11a..6f7daad 100644 --- a/_config.yml +++ b/_config.yml @@ -6,40 +6,40 @@ 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: en +lang: ko # Change to your timezone › https://kevinnovak.github.io/Time-Zone-Picker -timezone: Asia/Shanghai +timezone: Asia/Seoul # jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md # ↓ -------------------------- -title: Chirpy # the main title +title: record study # the main title -tagline: A text-focused Jekyll theme # it will display as the subtitle +tagline: Backend Engineer # it will display as the sub-title description: >- # used by seo meta and the atom feed - A minimal, responsive and feature-rich Jekyll theme for technical writing. + ydj515 # Fill in the protocol & hostname for your site. -# E.g. 'https://username.github.io', note that it does not end with a '/'. -url: "" +# e.g. 'https://username.github.io', note that it does not end with a '/'. +url: "https://ydj515.github.io" github: - username: github_username # change to your GitHub username + username: ydj515 # change to your github username -twitter: - username: twitter_username # change to your Twitter 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: your_full_name - email: example@domain.com # change to your email address + name: ydj515 + email: ydj515@gmail.com # change to your email address links: # The first element serves as the copyright owner's link - - https://twitter.com/username # change to your Twitter homepage - - https://github.com/username # change to your GitHub homepage + # - https://twitter.com/username # change to your twitter homepage + - https://github.com/ydj515 # change to your github homepage # Uncomment below to add more social links # - https://www.facebook.com/username # - https://www.linkedin.com/in/username @@ -61,21 +61,17 @@ analytics: google: id: # fill in your Google Analytics ID goatcounter: - id: # fill in your GoatCounter ID + id: ydj515 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 settings pageviews: - provider: # now only supports 'goatcounter' + provider: goatcounter # now only supports 'goatcounter' # Prefer color scheme setting. # @@ -85,8 +81,8 @@ pageviews: # # Available options: # -# light — Use the light color scheme -# dark — Use the dark color scheme +# light - Use the light color scheme +# dark - Use the dark color scheme # theme_mode: # [light | dark] @@ -95,10 +91,10 @@ theme_mode: # [light | dark] # 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" +cdn: "https://media.discordapp.net/attachments" # the avatar on sidebar, support local or CORS resources -avatar: "/commons/avatar.jpg" +avatar: "1234022863946907660/1234025744926113802/avatar.jpg?ex=662f3b88&is=662dea08&hm=e94a0f2bf0d9282f58075a31640f5e8d7471668a8ee270ad9d82dc13351169ad" # 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. @@ -108,15 +104,16 @@ social_preview_image: # string, local or CORS resources toc: true comments: - # Global switch for the post-comment system. Keeping it empty means disabled. - provider: # [disqus | utterances | giscus] + # Global switch for the post comment system. Keeping it empty means disabled. + provider: utterances # [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 | ...> + repo: ydj515/ydj515.github.io # / + issue_term: title # < url | pathname | title | ...> + label: "comment" # Giscus options › https://giscus.app giscus: repo: # / @@ -138,9 +135,9 @@ assets: env: # [development | production] pwa: - enabled: true # The option for PWA feature (installable) + enabled: true # the option for PWA feature (installable) cache: - enabled: true # The option for PWA offline 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. @@ -155,7 +152,6 @@ 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 @@ -192,6 +188,10 @@ defaults: values: layout: page permalink: /:title/ + - scope: + path: assets/js/dist + values: + swcache: true sass: style: compressed @@ -212,7 +212,7 @@ exclude: - tools - README.md - LICENSE - - "*.config.js" + - rollup.config.js - package*.json jekyll-archives: diff --git a/_data/authors.yml b/_data/authors.yml index f012012..e2bb35c 100644 --- a/_data/authors.yml +++ b/_data/authors.yml @@ -15,3 +15,7 @@ sille_bille: name: Dinesh Prasanth Moluguwan Krishnamoorthy twitter: dinesh_MKD url: https://github.com/SilleBille/ + +ydj515: + name: ydj515 + url: https://github.com/ydj515 diff --git a/_data/contact.yml b/_data/contact.yml index ed40acb..5181d62 100644 --- a/_data/contact.yml +++ b/_data/contact.yml @@ -3,8 +3,8 @@ - type: github icon: "fab fa-github" -- type: twitter - icon: "fa-brands fa-x-twitter" +# - type: twitter +# icon: "fa-brands fa-x-twitter" - type: email icon: "fas fa-envelope" @@ -26,15 +26,3 @@ # - 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 index a79e020..c608298 100644 --- a/_data/locales/ar.yml +++ b/_data/locales/ar.yml @@ -43,7 +43,7 @@ copyright: meta: باستخدام :PLATFORM السمة :THEME not_found: - statement: عذرا, الرابط التالي غير صالح أو انه يشير إلى صفحة غير موجودة. + statment: عذرا, الرابط التالي غير صالح أو انه يشير إلى صفحة غير موجودة. notification: update_found: يتوفر اصدار جديد للمحتوى. diff --git a/_data/locales/bg-BG.yml b/_data/locales/bg-BG.yml index 3fb060f..3e04993 100644 --- a/_data/locales/bg-BG.yml +++ b/_data/locales/bg-BG.yml @@ -43,7 +43,7 @@ copyright: meta: Създадено чрез :PLATFORM и :THEME тема not_found: - statement: Съжалявам, но на този URL адрес няма налично съдържание. + statment: Съжалявам, но на този URL адрес няма налично съдържание. notification: update_found: Налична е нова версия на съдържанието. diff --git a/_data/locales/cs-CZ.yml b/_data/locales/cs-CZ.yml index cf93f61..e515c08 100644 --- a/_data/locales/cs-CZ.yml +++ b/_data/locales/cs-CZ.yml @@ -43,7 +43,7 @@ copyright: 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. + statment: 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. diff --git a/_data/locales/de-DE.yml b/_data/locales/de-DE.yml index 6c9d91d..6b187b4 100644 --- a/_data/locales/de-DE.yml +++ b/_data/locales/de-DE.yml @@ -42,7 +42,7 @@ copyright: meta: Powered by :PLATFORM with :THEME theme not_found: - statement: Entschuldigung, dieser Link verweist auf keine vorhandene Ressource. + statment: Entschuldigung, dieser Link verweist auf keine vorhandene Ressource. notification: update_found: Eine neue Version ist verfügbar. @@ -76,7 +76,7 @@ df: post: strftime: "%d.%m.%Y" dayjs: "DD.MM.YYYY" - + # categories page categories: category_measure: diff --git a/_data/locales/el-GR.yml b/_data/locales/el-GR.yml index b6d2a86..ab5fb0e 100644 --- a/_data/locales/el-GR.yml +++ b/_data/locales/el-GR.yml @@ -43,7 +43,7 @@ copyright: meta: Αξιοποιώντας την :PLATFORM theme :THEME not_found: - statement: Συγνώμη, έχουμε τοποθετήσει λάθος αυτήν την διεύθυνση URL ή υποδεικνύει κάτι που δεν υπάρχει. + statment: Συγνώμη, έχουμε τοποθετήσει λάθος αυτήν την διεύθυνση URL ή υποδεικνύει κάτι που δεν υπάρχει. notification: update_found: Υπάρχει διαθέσιμη μια νέα έκδοση του περιεχομένου. diff --git a/_data/locales/en.yml b/_data/locales/en.yml index 152d090..89169d4 100644 --- a/_data/locales/en.yml +++ b/_data/locales/en.yml @@ -35,7 +35,7 @@ copyright: link: https://creativecommons.org/licenses/by/4.0/ # Displayed in the footer - brief: Some rights reserved. + brief: All 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. @@ -43,7 +43,7 @@ copyright: 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. + statment: 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. diff --git a/_data/locales/es-ES.yml b/_data/locales/es-ES.yml index 8f8d149..5529230 100644 --- a/_data/locales/es-ES.yml +++ b/_data/locales/es-ES.yml @@ -43,7 +43,7 @@ copyright: meta: Hecho con :PLATFORM usando el tema :THEME not_found: - statement: Lo sentimos, hemos perdido esa URL o apunta a algo que no existe. + statment: Lo sentimos, hemos perdido esa URL o apunta a algo que no existe. notification: update_found: Hay una nueva versión de contenido disponible. diff --git a/_data/locales/fi-FI.yml b/_data/locales/fi-FI.yml index 60c9862..c817d2b 100644 --- a/_data/locales/fi-FI.yml +++ b/_data/locales/fi-FI.yml @@ -42,7 +42,7 @@ copyright: meta: Käytetään :PLATFORM iä Teema :THEME not_found: - statement: Valitettavasti tällä URL-osoitteella ei ole saatavilla sisältöä. + statment: Valitettavasti tällä URL-osoitteella ei ole saatavilla sisältöä. notification: update_found: Uusi versio sisällöstä on saatavilla. diff --git a/_data/locales/fr-FR.yml b/_data/locales/fr-FR.yml index dce83c9..72b034d 100644 --- a/_data/locales/fr-FR.yml +++ b/_data/locales/fr-FR.yml @@ -14,7 +14,7 @@ tabs: categories: Catégories tags: Tags archives: Archives - about: À propos + about: A propos de # the text displayed in the search bar & search results search: @@ -32,18 +32,18 @@ copyright: 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 + link: https://creativecommons.org/licenses/by/4.0/ # Displayed in the footer brief: Certains droits réservés. verbose: >- - Sauf mention contraire, les articles de ce site sont publiés + Sauf mention contraire, les articles de ce site sont publiés sous licence 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. + statment: 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. diff --git a/_data/locales/hu-HU.yml b/_data/locales/hu-HU.yml index be3a31b..b09f2cd 100644 --- a/_data/locales/hu-HU.yml +++ b/_data/locales/hu-HU.yml @@ -14,23 +14,24 @@ tabs: categories: Kategóriák tags: Címkék archives: Archívum - about: Bemutatkozás + about: Rólam # 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. + no_results: Oops! Nincs találat a keresésre. panel: lastmod: Legutóbb frissítve trending_tags: Népszerű Címkék toc: Tartalom + links: Blog linkek copyright: # Shown at the bottom of the post license: - template: A bejegyzést a szerző :LICENSE_NAME licenc alatt engedélyezte. + template: A bejegyzés :LICENSE_NAME licenccel rendelkezik. name: CC BY 4.0 link: https://creativecommons.org/licenses/by/4.0/ @@ -41,10 +42,10 @@ copyright: 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. +meta: Készítve :PLATFORM motorral :THEME témával not_found: - statement: Sajnáljuk, az URL-t rosszul helyeztük el, vagy valami nem létezőre mutat. + statment: 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. @@ -72,21 +73,7 @@ post: 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 + category_measure: kategória + post_measure: bejegyzés diff --git a/_data/locales/id-ID.yml b/_data/locales/id-ID.yml index d772ec3..29ad156 100644 --- a/_data/locales/id-ID.yml +++ b/_data/locales/id-ID.yml @@ -43,7 +43,7 @@ copyright: meta: Didukung oleh :PLATFORM dengan tema :THEME not_found: - statement: Maaf, kami gagal menemukan URL itu atau memang mengarah ke sesuatu yang tidak ada. + statment: Maaf, kami gagal menemukan URL itu atau memang mengarah ke sesuatu yang tidak ada. notification: update_found: Versi konten baru tersedia. diff --git a/_data/locales/it-IT.yml b/_data/locales/it-IT.yml index c8dfb44..cf7b691 100644 --- a/_data/locales/it-IT.yml +++ b/_data/locales/it-IT.yml @@ -42,7 +42,7 @@ copyright: 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. + statment: 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. diff --git a/_data/locales/ko-KR.yml b/_data/locales/ko-KR.yml index 8297634..4dd221b 100644 --- a/_data/locales/ko-KR.yml +++ b/_data/locales/ko-KR.yml @@ -43,7 +43,7 @@ copyright: meta: Powered by :PLATFORM with :THEME theme not_found: - statement: 해당 URL은 존재하지 않습니다. + statment: 해당 URL은 존재하지 않습니다. notification: update_found: 새 버전의 콘텐츠를 사용할 수 있습니다. diff --git a/_data/locales/my-MM.yml b/_data/locales/my-MM.yml index d5bf728..98848d5 100644 --- a/_data/locales/my-MM.yml +++ b/_data/locales/my-MM.yml @@ -43,7 +43,7 @@ copyright: meta: Powered by :PLATFORM with :THEME theme not_found: - statement: ဝမ်းနည်းပါသည်၊ ကျွန်ုပ်တို့သည် အဆိုပါ URL ကို မှားယွင်းစွာ နေရာချထားခြင်း သို့မဟုတ် ၎င်းသည် မရှိသောအရာကို ညွှန်ပြနေပါသည်။ + statment: ဝမ်းနည်းပါသည်၊ ကျွန်ုပ်တို့သည် အဆိုပါ URL ကို မှားယွင်းစွာ နေရာချထားခြင်း သို့မဟုတ် ၎င်းသည် မရှိသောအရာကို ညွှန်ပြနေပါသည်။ notification: update_found: အကြောင်းအရာဗားရှင်းအသစ်ကို ရနိုင်ပါပြီ။ diff --git a/_data/locales/pt-BR.yml b/_data/locales/pt-BR.yml index 7ca60a7..4cef833 100644 --- a/_data/locales/pt-BR.yml +++ b/_data/locales/pt-BR.yml @@ -43,7 +43,7 @@ copyright: meta: Feito com :PLATFORM usando o tema :THEME not_found: - statement: Desculpe, a página não foi encontrada. + statment: Desculpe, a página não foi encontrada. notification: update_found: Uma nova versão do conteúdo está disponível. diff --git a/_data/locales/ru-RU.yml b/_data/locales/ru-RU.yml index 868ba95..185407c 100644 --- a/_data/locales/ru-RU.yml +++ b/_data/locales/ru-RU.yml @@ -42,7 +42,7 @@ copyright: meta: Использует тему :THEME для :PLATFORM not_found: - statement: Извините, мы перепутали URL-адрес или он указывает на что-то несуществующее. + statment: Извините, мы перепутали URL-адрес или он указывает на что-то несуществующее. notification: update_found: Доступна новая версия контента. @@ -76,7 +76,7 @@ df: post: strftime: "%d.%m.%Y" dayjs: "DD.MM.YYYY" - + # categories page categories: category_measure: diff --git a/_data/locales/sl-SI.yml b/_data/locales/sl-SI.yml index 4d9434d..7ab18b1 100644 --- a/_data/locales/sl-SI.yml +++ b/_data/locales/sl-SI.yml @@ -43,7 +43,7 @@ copyright: 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. + statment: 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. diff --git a/_data/locales/sv-SE.yml b/_data/locales/sv-SE.yml index decb59c..7ec2ee2 100644 --- a/_data/locales/sv-SE.yml +++ b/_data/locales/sv-SE.yml @@ -43,7 +43,7 @@ copyright: 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. + statment: 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. diff --git a/_data/locales/th.yml b/_data/locales/th.yml index a3f41a0..22cb00a 100644 --- a/_data/locales/th.yml +++ b/_data/locales/th.yml @@ -43,7 +43,7 @@ copyright: meta: กำลังใช้ธีมของ :PLATFORM ชื่อ :THEME not_found: - statement: ขออภัย เราวาง URL นั้นไว้ผิดที่ หรือมันชี้ไปยังสิ่งที่ไม่มีอยู่ + statment: ขออภัย เราวาง URL นั้นไว้ผิดที่ หรือมันชี้ไปยังสิ่งที่ไม่มีอยู่ notification: update_found: มีเวอร์ชันใหม่ของเนื้อหา diff --git a/_data/locales/tr-TR.yml b/_data/locales/tr-TR.yml index 768f57c..50d8110 100644 --- a/_data/locales/tr-TR.yml +++ b/_data/locales/tr-TR.yml @@ -43,7 +43,7 @@ copyright: meta: :PLATFORM ve :THEME teması not_found: - statement: Üzgünüz, bu linki yanlış yerleştirdik veya var olmayan bir şeye işaret ediyor. + statment: Ü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. diff --git a/_data/locales/uk-UA.yml b/_data/locales/uk-UA.yml index 8fef52e..b605073 100644 --- a/_data/locales/uk-UA.yml +++ b/_data/locales/uk-UA.yml @@ -43,7 +43,7 @@ copyright: meta: Powered by :PLATFORM with :THEME theme not_found: - statement: Вибачте, це посилання вказує на ресурс, що не існує. + statment: Вибачте, це посилання вказує на ресурс, що не існує. notification: update_found: Доступна нова версія вмісту. diff --git a/_data/locales/vi-VN.yml b/_data/locales/vi-VN.yml index 6c2ceff..617431a 100644 --- a/_data/locales/vi-VN.yml +++ b/_data/locales/vi-VN.yml @@ -42,7 +42,7 @@ copyright: 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. + statment: 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. diff --git a/_data/locales/zh-CN.yml b/_data/locales/zh-CN.yml index 5c13410..f828134 100644 --- a/_data/locales/zh-CN.yml +++ b/_data/locales/zh-CN.yml @@ -42,7 +42,7 @@ copyright: meta: 本站采用 :PLATFORM 主题 :THEME not_found: - statement: 抱歉,我们放错了该 URL,或者它指向了不存在的内容。 + statment: 抱歉,我们放错了该 URL,或者它指向了不存在的内容。 notification: update_found: 发现新版本的内容。 diff --git a/_data/locales/zh-TW.yml b/_data/locales/zh-TW.yml index 33a4330..911253b 100644 --- a/_data/locales/zh-TW.yml +++ b/_data/locales/zh-TW.yml @@ -42,7 +42,7 @@ copyright: meta: 本網站使用 :PLATFORM 產生,採用 :THEME 主題 not_found: - statement: 抱歉,您可能正在存取一個已被移動的 URL,或者它從未存在。 + statment: 抱歉,您可能正在存取一個已被移動的 URL,或者它從未存在。 notification: update_found: 發現新版本更新。 diff --git a/_data/origin/basic.yml b/_data/origin/basic.yml index 2d52982..7382251 100644 --- a/_data/origin/basic.yml +++ b/_data/origin/basic.yml @@ -4,6 +4,10 @@ webfonts: /assets/lib/fonts/main.css # Libraries +bootstrap: + css: /assets/lib/bootstrap/bootstrap.min.css + js: /assets/lib/bootstrap/bootstrap.bundle.min.js + toc: css: /assets/lib/tocbot/tocbot.min.css js: /assets/lib/tocbot/tocbot.min.js @@ -20,9 +24,9 @@ mermaid: 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 + locale: /assets/lib/dayjs/locale/en.min.js + relativeTime: /assets/lib/dayjs/plugin/relativeTime.min.js + localizedFormat: /assets/lib/dayjs/plugin/localizedFormat.min.js glightbox: css: /assets/lib/glightbox/glightbox.min.css diff --git a/_data/origin/cors.yml b/_data/origin/cors.yml index afdb3d9..a10d31c 100644 --- a/_data/origin/cors.yml +++ b/_data/origin/cors.yml @@ -1,43 +1,45 @@ -# Resource Hints -resource_hints: +# CDNs + +cdns: + # Google Fonts - url: https://fonts.googleapis.com - links: - - rel: preconnect - - rel: dns-prefetch - url: https://fonts.gstatic.com - links: - - rel: preconnect - opts: [crossorigin] - - rel: dns-prefetch + args: crossorigin + - url: https://fonts.googleapis.com + # jsDelivr CDN - url: https://cdn.jsdelivr.net - links: - - rel: preconnect - - rel: dns-prefetch + # polyfill.io for math (cdnjs.cloudflare.com/polyfill) + - url: https://cdnjs.cloudflare.com + +# fonts -# 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 +bootstrap: + css: https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css + js: https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js + 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 + css: https://cdn.jsdelivr.net/npm/tocbot@4.25.0/dist/tocbot.min.css + js: https://cdn.jsdelivr.net/npm/tocbot@4.25.0/dist/tocbot.min.js fontawesome: - css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.6.0/css/all.min.css + css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.1/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 + js: https://cdn.jsdelivr.net/npm/mermaid@10.8.0/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 + common: https://cdn.jsdelivr.net/npm/dayjs@1.11.10/dayjs.min.js + locale: https://cdn.jsdelivr.net/npm/dayjs@1.11.10/locale/:LOCALE.min.js + relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.10/plugin/relativeTime.min.js + localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.10/plugin/localizedFormat.min.js glightbox: css: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css diff --git a/_data/share.yml b/_data/share.yml index 6f97568..b1d077d 100644 --- a/_data/share.yml +++ b/_data/share.yml @@ -36,15 +36,3 @@ platforms: # 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 deleted file mode 100644 index 1eeb1a9..0000000 --- a/_includes/analytics/cloudflare.html +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/_includes/analytics/fathom.html b/_includes/analytics/fathom.html deleted file mode 100644 index 4b603d3..0000000 --- a/_includes/analytics/fathom.html +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/_includes/comments/disqus.html b/_includes/comments/disqus.html index 2b889a4..bef843a 100644 --- a/_includes/comments/disqus.html +++ b/_includes/comments/disqus.html @@ -10,7 +10,7 @@ this.page.identifier = '{{ page.url }}'; }; - {%- comment -%} Lazy loading {%- endcomment -%} + /* Lazy loading */ var disqus_observer = new IntersectionObserver( function (entries) { if (entries[0].isIntersecting) { @@ -30,10 +30,10 @@ disqus_observer.observe(document.getElementById('disqus_thread')); - {%- comment -%} Auto switch theme {%- endcomment -%} + /* Auto switch theme */ function reloadDisqus() { if (event.source === window && event.data && event.data.direction === ModeToggle.ID) { - {%- comment -%} Disqus hasn't been loaded {%- endcomment -%} + /* Disqus hasn't been loaded */ if (typeof DISQUS === 'undefined') { return; } diff --git a/_includes/comments/giscus.html b/_includes/comments/giscus.html index f9becfe..f3b8a54 100644 --- a/_includes/comments/giscus.html +++ b/_includes/comments/giscus.html @@ -17,12 +17,6 @@ initTheme = darkTheme; } - let lang = '{{ site.comments.giscus.lang | default: lang }}'; - {%- comment -%} https://github.com/giscus/giscus/tree/main/locales {%- endcomment -%} - if (lang.length > 2 && !lang.startsWith('zh')) { - lang = lang.slice(0, 2); - } - let giscusAttributes = { src: 'https://giscus.app/client.js', 'data-repo': '{{ site.comments.giscus.repo}}', @@ -35,7 +29,7 @@ 'data-emit-metadata': '0', 'data-theme': initTheme, 'data-input-position': '{{ site.comments.giscus.input_position | default: 'bottom' }}', - 'data-lang': lang, + 'data-lang': '{{ site.comments.giscus.lang | default: lang }}', 'data-loading': 'lazy', crossorigin: 'anonymous', async: '' @@ -53,7 +47,7 @@ event.data && event.data.direction === ModeToggle.ID ) { - {%- comment -%} global theme mode changed {%- endcomment -%} + /* global theme mode changed */ const mode = event.data.message; const theme = mode === ModeToggle.DARK_MODE ? darkTheme : lightTheme; diff --git a/_includes/comments/utterances.html b/_includes/comments/utterances.html index 5dd78ed..933014e 100644 --- a/_includes/comments/utterances.html +++ b/_includes/comments/utterances.html @@ -3,34 +3,41 @@ src="https://utteranc.es/client.js" repo="{{ site.comments.utterances.repo }}" issue-term="{{ site.comments.utterances.issue_term }}" + label="{{ site.comments.utterances.label }}" crossorigin="anonymous" async > +{% capture script %}{{ js_dist }}{{ js }}.min.js{% endcapture %} + {% if page.math %} @@ -85,17 +88,10 @@ {% endif %} {% endif %} -{% if page.mermaid %} - {% include mermaid.html %} -{% endif %} - {% if jekyll.environment == 'production' %} {% if site.pwa.enabled %} - + {% endif %} diff --git a/_includes/mermaid.html b/_includes/mermaid.html index a3a83ed..72dcacb 100644 --- a/_includes/mermaid.html +++ b/_includes/mermaid.html @@ -11,9 +11,7 @@ let expectedTheme = mode === ModeToggle.DARK_MODE ? 'dark' : 'default'; let config = { theme: expectedTheme }; - {%- comment -%} - Re-render the SVG › - {%- endcomment -%} + /* Re-render the SVG › */ const mermaidList = document.getElementsByClassName('mermaid'); [...mermaidList].forEach((elem) => { @@ -39,16 +37,16 @@ } let mermaidConf = { - theme: initTheme {%- comment -%} {%- endcomment -%} + theme: initTheme /* */ }; - {%- comment -%} Create mermaid tag {%- endcomment -%} + /* Create mermaid tag */ const basicList = document.getElementsByClassName('language-mermaid'); [...basicList].forEach((elem) => { const svgCode = elem.textContent; const backup = elem.parentElement; backup.classList.add('d-none'); - {%- comment -%} create mermaid node {%- endcomment -%} + /* create mermaid node */ let mermaid = document.createElement('pre'); mermaid.classList.add('mermaid'); const text = document.createTextNode(svgCode); diff --git a/_includes/pageviews/goatcounter.html b/_includes/pageviews/goatcounter.html index e62fd69..1b1bfaa 100644 --- a/_includes/pageviews/goatcounter.html +++ b/_includes/pageviews/goatcounter.html @@ -1,19 +1,18 @@ diff --git a/_includes/related-posts.html b/_includes/related-posts.html index 37a295b..ae39da4 100644 --- a/_includes/related-posts.html +++ b/_includes/related-posts.html @@ -21,7 +21,6 @@ {% 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: '' %} diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 569585f..012cf0a 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -11,8 +11,11 @@ {%- endif -%} - {{ site.title }} -

{{ site.tagline }}

+

+ ydj515 +

+

{{ site.tagline }}

+

Tools in hand, brain in gear

diff --git a/_includes/toc-status.html b/_includes/toc-status.html deleted file mode 100644 index 4b71cae..0000000 --- a/_includes/toc-status.html +++ /dev/null @@ -1,10 +0,0 @@ -{% 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 -}}

+

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

{% endif %} diff --git a/_javascript/_copyright b/_javascript/_copyright new file mode 100644 index 0000000..60a706b --- /dev/null +++ b/_javascript/_copyright @@ -0,0 +1 @@ +Chirpy v<%= pkg.version %> | © 2019 <%= pkg.author %> | <%= pkg.license %> Licensed | <%= pkg.homepage %> diff --git a/_javascript/commons.js b/_javascript/commons.js index 6a17fb9..05a9765 100644 --- a/_javascript/commons.js +++ b/_javascript/commons.js @@ -1,5 +1,5 @@ import { basic, initSidebar, initTopbar } from './modules/layouts'; +basic(); initSidebar(); initTopbar(); -basic(); diff --git a/_javascript/home.js b/_javascript/home.js index ef22cb9..02948c9 100644 --- a/_javascript/home.js +++ b/_javascript/home.js @@ -1,8 +1,8 @@ import { basic, initSidebar, initTopbar } from './modules/layouts'; import { initLocaleDatetime, loadImg } from './modules/plugins'; -loadImg(); -initLocaleDatetime(); +basic(); initSidebar(); initTopbar(); -basic(); +initLocaleDatetime(); +loadImg(); diff --git a/_javascript/misc.js b/_javascript/misc.js index 52b4043..c7a19d6 100644 --- a/_javascript/misc.js +++ b/_javascript/misc.js @@ -1,7 +1,7 @@ import { basic, initSidebar, initTopbar } from './modules/layouts'; import { initLocaleDatetime } from './modules/plugins'; +basic(); initSidebar(); initTopbar(); initLocaleDatetime(); -basic(); diff --git a/_javascript/modules/components/category-collapse.js b/_javascript/modules/components/category-collapse.js index 0c53cb4..b530626 100644 --- a/_javascript/modules/components/category-collapse.js +++ b/_javascript/modules/components/category-collapse.js @@ -1,9 +1,6 @@ /** * Tab 'Categories' expand/close effect. */ - -import 'bootstrap/js/src/collapse.js'; - const childPrefix = 'l_'; const parentPrefix = 'h_'; const children = document.getElementsByClassName('collapse'); diff --git a/_javascript/modules/components/clipboard.js b/_javascript/modules/components/clipboard.js index 9566e9d..8d4b23f 100644 --- a/_javascript/modules/components/clipboard.js +++ b/_javascript/modules/components/clipboard.js @@ -2,11 +2,10 @@ * Clipboard functions * * Dependencies: - * clipboard.js (https://github.com/zenorocha/clipboard.js) + * - popper.js (https://github.com/popperjs/popper-core) + * - 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'; @@ -39,11 +38,11 @@ function unlock(node) { function showTooltip(btn) { const succeedTitle = btn.getAttribute(ATTR_TITLE_SUCCEED); btn.setAttribute(ATTR_TITLE_ORIGIN, succeedTitle); - Tooltip.getInstance(btn).show(); + bootstrap.Tooltip.getInstance(btn).show(); } function hideTooltip(btn) { - Tooltip.getInstance(btn).hide(); + bootstrap.Tooltip.getInstance(btn).hide(); btn.removeAttribute(ATTR_TITLE_ORIGIN); } @@ -57,7 +56,7 @@ function resumeIcon(btn) { icon.setAttribute('class', ICON_DEFAULT); } -function setCodeClipboard() { +export function initClipboard() { const clipboardList = document.querySelectorAll(clipboardSelector); if (clipboardList.length === 0) { @@ -74,7 +73,7 @@ function setCodeClipboard() { [...clipboardList].map( (elem) => - new Tooltip(elem, { + new bootstrap.Tooltip(elem, { placement: 'left' }) ); @@ -98,14 +97,10 @@ function setCodeClipboard() { unlock(trigger); }, TIMEOUT); }); -} -function setLinkClipboard() { - const btnCopyLink = document.getElementById('copy-link'); + /* --- Post link sharing --- */ - if (btnCopyLink === null) { - return; - } + const btnCopyLink = document.getElementById('copy-link'); btnCopyLink.addEventListener('click', (e) => { const target = e.target; @@ -121,7 +116,7 @@ function setLinkClipboard() { // Switch tooltip title target.setAttribute(ATTR_TITLE_ORIGIN, succeedTitle); - Tooltip.getInstance(target).show(); + bootstrap.Tooltip.getInstance(target).show(); lock(target); @@ -133,11 +128,6 @@ function setLinkClipboard() { }); btnCopyLink.addEventListener('mouseleave', (e) => { - Tooltip.getInstance(e.target).hide(); + bootstrap.Tooltip.getInstance(e.target).hide(); }); } - -export function initClipboard() { - setCodeClipboard(); - setLinkClipboard(); -} diff --git a/_javascript/modules/components/img-popup.js b/_javascript/modules/components/img-popup.js index ac12043..b5c7c6e 100644 --- a/_javascript/modules/components/img-popup.js +++ b/_javascript/modules/components/img-popup.js @@ -4,57 +4,12 @@ * 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]; -} +const IMG_CLASS = 'popup'; export function imgPopup() { - if (document.querySelector('.popup') === null) { + if (document.getElementsByClassName(IMG_CLASS).length === 0) { 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); - } - }); - } + GLightbox({ selector: `.${IMG_CLASS}` }); } diff --git a/_javascript/modules/components/search-display.js b/_javascript/modules/components/search-display.js index 40059ac..21d634e 100644 --- a/_javascript/modules/components/search-display.js +++ b/_javascript/modules/components/search-display.js @@ -1,5 +1,5 @@ /** - * This script make #search-result-wrapper switch to unload or shown automatically. + * This script make #search-result-wrapper switch to unloaded or shown automatically. */ const btnSbTrigger = document.getElementById('sidebar-trigger'); diff --git a/_javascript/modules/components/toc.js b/_javascript/modules/components/toc.js index 765336a..b397813 100644 --- a/_javascript/modules/components/toc.js +++ b/_javascript/modules/components/toc.js @@ -1,30 +1,13 @@ -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) { - mobile.hidePopup(); - desktop.refresh(); - } else { - mobile.refresh(); +export function toc() { + if (document.querySelector('main h2, main h3')) { + // see: https://github.com/tscanlin/tocbot#usage + tocbot.init({ + tocSelector: '#toc', + contentSelector: '.content', + ignoreSelector: '[data-toc-skip]', + headingSelector: 'h2, h3, h4', + orderedList: false, + scrollSmooth: false + }); } } - -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 deleted file mode 100644 index 5021a72..0000000 --- a/_javascript/modules/components/toc/toc-desktop.js +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 48b372d..0000000 --- a/_javascript/modules/components/toc/toc-mobile.js +++ /dev/null @@ -1,117 +0,0 @@ -/** - * 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 showPopup() { - TocMobile.lockScroll(true); - $popup.showModal(); - const activeItem = $popup.querySelector('li.is-active-li'); - activeItem.scrollIntoView({ block: 'center' }); - } - - static hidePopup() { - if (!$popup.open) { - return; - } - - $popup.toggleAttribute(CLOSING); - - $popup.addEventListener( - 'animationend', - () => { - $popup.toggleAttribute(CLOSING); - $popup.close(); - }, - { once: true } - ); - - TocMobile.lockScroll(false); - } - - static lockScroll(enable) { - document.documentElement.classList.toggle(SCROLL_LOCK, enable); - document.body.classList.toggle(SCROLL_LOCK, enable); - } - - static clickBackdrop(event) { - const rect = event.target.getBoundingClientRect(); - if ( - event.clientX < rect.left || - event.clientX > rect.right || - event.clientY < rect.top || - event.clientY > rect.bottom - ) { - TocMobile.hidePopup(); - } - } - - static initComponents() { - this.initBar(); - - [...$triggers].forEach((trigger) => { - trigger.onclick = this.showPopup; - }); - - $popup.onclick = this.clickBackdrop; - $btnClose.onclick = $popup.oncancel = 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 index c36c879..a906600 100644 --- a/_javascript/modules/components/tooltip-loader.js +++ b/_javascript/modules/components/tooltip-loader.js @@ -1,11 +1,12 @@ -import Tooltip from 'bootstrap/js/src/tooltip'; - +/** + * Initial Bootstrap Tooltip. + */ export function loadTooptip() { const tooltipTriggerList = document.querySelectorAll( '[data-bs-toggle="tooltip"]' ); [...tooltipTriggerList].map( - (tooltipTriggerEl) => new Tooltip(tooltipTriggerEl) + (tooltipTriggerEl) => new bootstrap.Tooltip(tooltipTriggerEl) ); } diff --git a/_javascript/modules/plugins.js b/_javascript/modules/plugins.js index cc95c1b..fb892e2 100644 --- a/_javascript/modules/plugins.js +++ b/_javascript/modules/plugins.js @@ -3,4 +3,4 @@ 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'; +export { toc } from './components/toc'; diff --git a/_javascript/page.js b/_javascript/page.js index 76e8ce9..f13bd2f 100644 --- a/_javascript/page.js +++ b/_javascript/page.js @@ -1,9 +1,9 @@ import { basic, initSidebar, initTopbar } from './modules/layouts'; import { loadImg, imgPopup, initClipboard } from './modules/plugins'; -loadImg(); -imgPopup(); +basic(); initSidebar(); initTopbar(); +loadImg(); +imgPopup(); initClipboard(); -basic(); diff --git a/_javascript/post.js b/_javascript/post.js index 1c616ec..86ea32b 100644 --- a/_javascript/post.js +++ b/_javascript/post.js @@ -1,18 +1,17 @@ -import { basic, initTopbar, initSidebar } from './modules/layouts'; - +import { basic, initSidebar, initTopbar } from './modules/layouts'; import { loadImg, imgPopup, initLocaleDatetime, initClipboard, - initToc + toc } from './modules/plugins'; +initSidebar(); +initTopbar(); loadImg(); -initToc(); imgPopup(); -initSidebar(); initLocaleDatetime(); initClipboard(); -initTopbar(); +toc(); basic(); diff --git a/_layouts/compress.html b/_layouts/compress.html index 2779e92..bb34487 100644 --- a/_layouts/compress.html +++ b/_layouts/compress.html @@ -1,10 +1,10 @@ --- # Jekyll layout that compresses HTML -# v3.2.0 +# v3.1.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 %} +{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ 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 index ea438fe..a94aa24 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -2,18 +2,19 @@ layout: compress --- - + -{% include origin-type.html %} - -{% include lang.html %} - -{% if site.theme_mode %} - {% capture prefer_mode %}data-mode="{{ site.theme_mode }}"{% endcapture %} -{% endif %} +{% include origin-type.html %} {% include lang.html %} {% if site.theme_mode %} +{% capture prefer_mode %}data-mode="{{ site.theme_mode }}"{% endcapture %} {% +endif %} - + {% include head.html %} @@ -24,37 +25,38 @@ {% include topbar.html lang=lang %}
-
- {% if layout.refactor or layout.layout == 'default' %} - {% include refactor-content.html content=content lang=lang %} - {% else %} - {{ content }} - {% endif %} +
+ {% 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 %} + {% for _include in layout.tail_includes %} {% assign _include_path = + _include | append: '.html' %} {% include {{ _include_path }} + lang=lang %} {% endfor %} {% include_cached footer.html lang=lang %}
@@ -62,7 +64,11 @@ @@ -70,13 +76,13 @@
- {% if site.pwa.enabled %} - {% include_cached notification.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 %} + {% include js-selector.html lang=lang %} {% if page.mermaid %} {% include + mermaid.html %} {% endif %} {% include_cached search-loader.html lang=lang + %} diff --git a/_layouts/home.html b/_layouts/home.html index 451e391..e44efe8 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -5,45 +5,38 @@ {% 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 pinned = site.posts | where: 'pin', 'true' %} +{% assign default = 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 %} +{% assign offset = paginator.page | minus: 1 | times: paginator.per_page %} +{% assign pinned_num = pinned.size | minus: offset %} -{% 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] %} +{% if pinned_num > 0 %} + {% for i in (offset..pinned.size) limit: pinned_num %} + {% assign posts = posts | push: pinned[i] %} {% endfor %} {% else %} - {% assign pinned_size = 0 %} + {% assign pinned_num = 0 %} {% endif %} - + -{% assign normal_size = paginator.posts | size | minus: pinned_size %} +{% assign default_beg = offset | 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 %} +{% if default_beg < 0 %} + {% assign default_beg = 0 %} +{% endif %} - {% assign normal_end = normal_start | plus: normal_size | minus: 1 %} +{% assign default_num = paginator.posts | size | minus: pinned_num %} +{% assign default_end = default_beg | plus: default_num | minus: 1 %} - {% for i in (normal_start..normal_end) %} - {% assign posts = posts | push: all_normal[i] %} +{% if default_num > 0 %} + {% for i in (default_beg..default_end) %} + {% assign posts = posts | push: default[i] %} {% endfor %} {% endif %} diff --git a/_layouts/post.html b/_layouts/post.html index bcc133f..093594b 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -11,83 +11,76 @@ {% include lang.html %} -{% include toc-status.html %} - -
+

{{ page.title }}

{% if page.description %} -

{{ page.description }}

+

{{ page.description }}

{% endif %}
- {% if enable_toc %} - - - - - -
-
{{- page.title -}}
- -
-
-
- {% endif %} - -
- {{ content }} -
+
{{ content }}
{% if page.categories.size > 0 %} - + {% endif %} {% if page.tags.size > 0 %} - + {% endif %}
- {% if site.data.locales[lang].copyright.license.template %} - {% capture _replacement %} + {% 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 %} + {% endcapture %} {{ site.data.locales[lang].copyright.license.template | + replace: ':LICENSE_NAME', _replacement }} {% endif %}
{% include post-sharing.html lang=lang %} diff --git a/_posts/2019-08-08-text-and-typography.md b/_posts/2019-08-08-text-and-typography.md index a8db26a..7064d5d 100644 --- a/_posts/2019-08-08-text-and-typography.md +++ b/_posts/2019-08-08-text-and-typography.md @@ -18,16 +18,16 @@ image: -# H1 — heading +# H1 - heading {: .mt-4 .mb-0 } -## H2 — heading +## H2 - heading {: data-toc-skip='' .mt-4 .mb-0 } -### H3 — heading +### H3 - heading {: data-toc-skip='' .mt-4 .mb-0 } -#### H4 — heading +#### H4 - heading {: data-toc-skip='' .mt-4 } diff --git a/_posts/2019-08-08-write-a-new-post.md b/_posts/2019-08-08-write-a-new-post.md index 69eaf34..0492b02 100644 --- a/_posts/2019-08-08-write-a-new-post.md +++ b/_posts/2019-08-08-write-a-new-post.md @@ -31,7 +31,7 @@ tags: [TAG] # TAG names should always be lowercase ### Timezone of Date -To accurately record the release date of a post, you should not only set up the `timezone` of `_config.yml`{: .filepath} but also provide the post's timezone in variable `date` of its Front Matter block. Format: `+/-TTTT`, e.g. `+0800`. +In order to accurately record the release date of a post, you should not only set up the `timezone` of `_config.yml`{: .filepath} but also provide the post's timezone in variable `date` of its Front Matter block. Format: `+/-TTTT`, e.g. `+0800`. ### Categories and Tags @@ -107,35 +107,76 @@ comments: false --- ``` -## Media +## Mathematics -We refer to images, audio and video as media resources in _Chirpy_. +We use [**MathJax**][mathjax] to generate mathematics. For website performance reasons, the mathematical feature won't be loaded by default. But it can be enabled by: -### URL Prefix +[mathjax]: https://www.mathjax.org/ -From time to time we have to define duplicate URL prefixes for multiple resources in a post, which is a boring task that you can avoid by setting two parameters. +```yaml +--- +math: true +--- +``` -- If you are using a CDN to host media files, you can specify the `cdn` in `_config.yml`{: .filepath }. The URLs of media resources for site avatar and posts are then prefixed with the CDN domain name. +After enabling the mathematical feature, you can add math equations with the following syntax: - ```yaml - cdn: https://cdn.com - ``` - {: file='_config.yml' .nolineno } +- **Block math** should be added with `$$ math $$` with **mandatory** blank lines before and after `$$` + - **Inserting equation numbering** should be added with `$$\begin{equation} math \end{equation}$$` + - **Referencing equation numbering** should be done with `\label{eq:label_name}` in the equation block and `\eqref{eq:label_name}` inline with text (see example below) +- **Inline math** (in lines) should be added with `$$ math $$` without any blank line before or after `$$` +- **Inline math** (in lists) should be added with `\$$ math $$` -- To specify the resource path prefix for the current post/page range, set `media_subpath` in the _front matter_ of the post: +```markdown + - ```yaml - --- - media_subpath: /path/to/media/ - --- - ``` - {: .nolineno } +$$ +LaTeX_math_expression +$$ + + + +$$ +\begin{equation} + LaTeX_math_expression + \label{eq:label_name} +\end{equation} +$$ -The option `site.cdn` and `page.media_subpath` can be used individually or in combination to flexibly compose the final resource URL: `[site.cdn/][page.media_subpath/]file.ext` +Can be referenced as \eqref{eq:label_name}. + + + +"Lorem ipsum dolor sit amet, $$ LaTeX_math_expression $$ consectetur adipiscing elit." + + + +1. \$$ LaTeX_math_expression $$ +2. \$$ LaTeX_math_expression $$ +3. \$$ LaTeX_math_expression $$ +``` + +> Starting with `v7.0.0`, configuration options for **MathJax** have been moved to file `assets/js/data/mathjax.js`{: .filepath }, and you can change the options as needed, such as adding [extensions][mathjax-exts]. +> If you are building the site via `chirpy-starter`, copy that file from the gem installation directory (check with command `bundle info --path jekyll-theme-chirpy`) to the same directory in your repository. +{: .prompt-tip } + +[mathjax-exts]: https://docs.mathjax.org/en/latest/input/tex/extensions/index.html + +## Mermaid + +[**Mermaid**](https://github.com/mermaid-js/mermaid) is a great diagram generation tool. To enable it on your post, add the following to the YAML block: + +```yaml +--- +mermaid: true +--- +``` + +Then you can use it like other markdown languages: surround the graph code with ```` ```mermaid ```` and ```` ``` ````. -### Images +## Images -#### Caption +### Caption Add italics to the next line of an image, then it will become the caption and appear at the bottom of the image: @@ -145,9 +186,9 @@ _Image Caption_ ``` {: .nolineno} -#### Size +### Size -To prevent the page content layout from shifting when the image is loaded, we should set the width and height for each image. +In order to prevent the page content layout from shifting when the image is loaded, we should set the width and height for each image. ```markdown ![Desktop View](/assets/img/sample/mockup.png){: width="700" height="400" } @@ -164,7 +205,7 @@ Starting from _Chirpy v5.0.0_, `height` and `width` support abbreviations (`heig ``` {: .nolineno} -#### Position +### Position By default, the image is centered, but you can specify the position by using one of the classes `normal`, `left`, and `right`. @@ -194,7 +235,7 @@ By default, the image is centered, but you can specify the position by using one ``` {: .nolineno} -#### Dark/Light mode +### Dark/Light mode You can make images follow theme preferences in dark/light mode. This requires you to prepare two images, one for dark mode and one for light mode, and then assign them a specific class (`dark` or `light`): @@ -203,7 +244,7 @@ You can make images follow theme preferences in dark/light mode. This requires y ![Dark mode only](/path/to/dark-mode.png){: .dark } ``` -#### Shadow +### Shadow The screenshots of the program window can be considered to show the shadow effect: @@ -212,7 +253,56 @@ The screenshots of the program window can be considered to show the shadow effec ``` {: .nolineno} -#### Preview Image +### CDN URL + +If you host the media resources on the CDN, you can save the time of repeatedly writing the CDN URL by assigning the variable `cdn` of `_config.yml`{: .filepath} file: + +```yaml +cdn: https://cdn.com +``` +{: file='_config.yml' .nolineno} + +Once `cdn` is assigned, the CDN URL will be added to the path of all media resources (site avatar, posts' images, audio and video files) starting with `/`. + +For instance, when using images: + +```markdown +![The flower](/path/to/flower.png) +``` +{: .nolineno} + +The parsing result will automatically add the CDN prefix `https://cdn.com` before the image path: + +```html +The flower +``` +{: .nolineno } + +### Media Subpath + +When a post contains many images, it will be a time-consuming task to repeatedly define the path of the media resources. To solve this, we can define this path in the YAML block of the post: + +```yml +--- +media_subpath: /img/path/ +--- +``` + +And then, the image source of Markdown can write the file name directly: + +```md +![The flower](flower.png) +``` +{: .nolineno } + +The output will be: + +```html +The flower +``` +{: .nolineno } + +### Preview Image If you want to add an image at the top of the post, please provide an image with a resolution of `1200 x 630`. Please note that if the image aspect ratio does not meet `1.91 : 1`, the image will be scaled and cropped. @@ -226,7 +316,7 @@ image: --- ``` -Note that the [`media_subpath`](#url-prefix) can also be passed to the preview image, that is, when it has been set, the attribute `path` only needs the image file name. +Note that the [`media_subpath`](#media-subpath) can also be passed to the preview image, that is, when it has been set, the attribute `path` only needs the image file name. For simple use, you can also just use `image` to define the path. @@ -236,7 +326,7 @@ image: /path/to/image --- ``` -#### LQIP +### LQIP For preview images: @@ -247,7 +337,7 @@ image: --- ``` -> You can observe LQIP in the preview image of post \"[Text and Typography](../text-and-typography/)\". +> You can observe LQIP in the preview image of post [_Text and Typography_](/posts/text-and-typography/). For normal images: @@ -256,86 +346,6 @@ For normal images: ``` {: .nolineno } -### Video - -#### Social Media Platform - -You can embed videos from social media platforms with the following syntax: - -```liquid -{% include embed/{Platform}.html id='{ID}' %} -``` - -Where `Platform` is the lowercase of the platform name, and `ID` is the video ID. - -The following table shows how to get the two parameters we need in a given video URL, and you can also know the currently supported video platforms. - -| Video URL | Platform | ID | -| -------------------------------------------------------------------------------------------------- | ---------- | :------------- | -| [https://www.**youtube**.com/watch?v=**H-B46URT4mg**](https://www.youtube.com/watch?v=H-B46URT4mg) | `youtube` | `H-B46URT4mg` | -| [https://www.**twitch**.tv/videos/**1634779211**](https://www.twitch.tv/videos/1634779211) | `twitch` | `1634779211` | -| [https://www.**bilibili**.com/video/**BV1Q44y1B7Wf**](https://www.bilibili.com/video/BV1Q44y1B7Wf) | `bilibili` | `BV1Q44y1B7Wf` | - -#### Video Files - -If you want to embed a video file directly, use the following syntax: - -```liquid -{% include embed/video.html src='{URL}' %} -``` - -Where `URL` is a URL to a video file e.g. `/path/to/sample/video.mp4`. - -You can also specify additional attributes for the embedded video file. Here is a full list of attributes allowed. - -- `poster='/path/to/poster.png'` — poster image for a video that is shown while video is downloading -- `title='Text'` — title for a video that appears below the video and looks same as for images -- `autoplay=true` — video automatically begins to play back as soon as it can -- `loop=true` — automatically seek back to the start upon reaching the end of the video -- `muted=true` — audio will be initially silenced -- `types` — specify the extensions of additional video formats separated by `|`. Ensure these files exist in the same directory as your primary video file. - -Consider an example using all of the above: - -```liquid -{% - include embed/video.html - src='/path/to/video.mp4' - types='ogg|mov' - poster='poster.png' - title='Demo video' - autoplay=true - loop=true - muted=true -%} -``` - -### Audios - -If you want to embed an audio file directly, use the following syntax: - -```liquid -{% include embed/audio.html src='{URL}' %} -``` - -Where `URL` is a URL to an audio file e.g. `/path/to/audio.mp3`. - -You can also specify additional attributes for the embedded audio file. Here is a full list of attributes allowed. - -- `title='Text'` — title for an audio that appears below the audio and looks same as for images -- `types` — specify the extensions of additional audio formats separated by `|`. Ensure these files exist in the same directory as your primary audio file. - -Consider an example using all of the above: - -```liquid -{% - include embed/audio.html - src='/path/to/audio.mp3' - types='ogg|wav|aac' - title='Demo audio' -%} -``` - ## Pinned Posts You can pin one or more posts to the top of the home page, and the fixed posts are sorted in reverse order according to their release date. Enable by: @@ -365,7 +375,7 @@ There are several types of prompts: `tip`, `info`, `warning`, and `danger`. They ``` {: .nolineno } -### Filepath Highlight +### Filepath Hightlight ```md `/path/to/a/file.extend`{: .filepath} @@ -433,72 +443,95 @@ If you want to display the **Liquid** snippet, surround the liquid code with `{% Or adding `render_with_liquid: false` (Requires Jekyll 4.0 or higher) to the post's YAML block. -## Mathematics +## Videos -We use [**MathJax**][mathjax] to generate mathematics. For website performance reasons, the mathematical feature won't be loaded by default. But it can be enabled by: +### Video Sharing Platform -[mathjax]: https://www.mathjax.org/ +You can embed a video with the following syntax: -```yaml ---- -math: true ---- +```liquid +{% include embed/{Platform}.html id='{ID}' %} ``` -After enabling the mathematical feature, you can add math equations with the following syntax: +Where `Platform` is the lowercase of the platform name, and `ID` is the video ID. -- **Block math** should be added with `$$ math $$` with **mandatory** blank lines before and after `$$` - - **Inserting equation numbering** should be added with `$$\begin{equation} math \end{equation}$$` - - **Referencing equation numbering** should be done with `\label{eq:label_name}` in the equation block and `\eqref{eq:label_name}` inline with text (see example below) -- **Inline math** (in lines) should be added with `$$ math $$` without any blank line before or after `$$` -- **Inline math** (in lists) should be added with `\$$ math $$` +The following table shows how to get the two parameters we need in a given video URL, and you can also know the currently supported video platforms. -```markdown - +| Video URL | Platform | ID | +| -------------------------------------------------------------------------------------------------- | ---------- | :------------- | +| [https://www.**youtube**.com/watch?v=**H-B46URT4mg**](https://www.youtube.com/watch?v=H-B46URT4mg) | `youtube` | `H-B46URT4mg` | +| [https://www.**twitch**.tv/videos/**1634779211**](https://www.twitch.tv/videos/1634779211) | `twitch` | `1634779211` | +| [https://www.**bilibili**.com/video/**BV1Q44y1B7Wf**](https://www.bilibili.com/video/BV1Q44y1B7Wf) | `bilibili` | `BV1Q44y1B7Wf` | -$$ -LaTeX_math_expression -$$ +### Video File - +If you want to embed a video file directly, use the following syntax: -$$ -\begin{equation} - LaTeX_math_expression - \label{eq:label_name} -\end{equation} -$$ +```liquid +{% include embed/video.html src='{URL}' %} +``` -Can be referenced as \eqref{eq:label_name}. +Where `URL` is an URL to a video file e.g. `/assets/img/sample/video.mp4`. - +You can also specify additional attributes for the embedded video file. Here is a full list of attributes allowed. -"Lorem ipsum dolor sit amet, $$ LaTeX_math_expression $$ consectetur adipiscing elit." +- `poster='/path/to/poster.png'` - poster image for a video that is shown while video is downloading +- `title='Text'` - title for a video that appears below the video and looks same as for images +- `autoplay=true` - video automatically begins to play back as soon as it can +- `loop=true` - automatically seek back to the start upon reaching the end of the video +- `muted=true` - audio will be initially silenced +- `types` - specify the extensions of additional video formats separated by `|`. Ensure these files exist in the same directory as your primary video file. - +Consider an example utilizing all of the above: -1. \$$ LaTeX_math_expression $$ -2. \$$ LaTeX_math_expression $$ -3. \$$ LaTeX_math_expression $$ +```liquid +{% + include embed/video.html + src='/path/to/video/video.mp4' + types='ogg|mov' + poster='poster.png' + title='Demo video' + autoplay=true + loop=true + muted=true +%} ``` -> Starting with `v7.0.0`, configuration options for **MathJax** have been moved to file `assets/js/data/mathjax.js`{: .filepath }, and you can change the options as needed, such as adding [extensions][mathjax-exts]. -> If you are building the site via `chirpy-starter`, copy that file from the gem installation directory (check with command `bundle info --path jekyll-theme-chirpy`) to the same directory in your repository. -{: .prompt-tip } +> It's not recommended to host video files in `assets` folder as they cannot be cached by PWA and may cause issues. +> Instead, use CDN to host video files. Alternatively, use a separate folder that is excluded from PWA (see `pwa.deny_paths` setting in `_config.yml`). +{: .prompt-warning } -[mathjax-exts]: https://docs.mathjax.org/en/latest/input/tex/extensions/index.html +## Audios -## Mermaid +### Audio File -[**Mermaid**](https://github.com/mermaid-js/mermaid) is a great diagram generation tool. To enable it on your post, add the following to the YAML block: +If you want to embed an audio file directly, use the following syntax: -```yaml ---- -mermaid: true ---- +```liquid +{% include embed/audio.html src='{URL}' %} ``` -Then you can use it like other markdown languages: surround the graph code with ```` ```mermaid ```` and ```` ``` ````. +Where `URL` is an URL to an audio file e.g. `/assets/img/sample/audio.mp3`. + +You can also specify additional attributes for the embedded audio file. Here is a full list of attributes allowed. + +- `title='Text'` - title for an audio that appears below the audio and looks same as for images +- `types` - specify the extensions of additional audio formats separated by `|`. Ensure these files exist in the same directory as your primary audio file. + +Consider an example utilizing all of the above: + +```liquid +{% + include embed/audio.html + src='/path/to/audio/audio.mp3' + types='ogg|wav|aac' + title='Demo audio' +%} +``` + +> It's not recommended to host audio files in `assets` folder as they cannot be cached by PWA and may cause issues. +> Instead, use CDN to host audio files. Alternatively, use a separate folder that is excluded from PWA (see `pwa.deny_paths` setting in `_config.yml`). +{: .prompt-warning } ## Learn More diff --git a/_posts/2019-08-09-getting-started.md b/_posts/2019-08-09-getting-started.md index 3b41a3c..6653c62 100644 --- a/_posts/2019-08-09-getting-started.md +++ b/_posts/2019-08-09-getting-started.md @@ -11,74 +11,56 @@ pin: true media_subpath: '/posts/20180809' --- -## Creating a Site Repository +## Prerequisites -When creating your site repository, you have two options depending on your needs: +Follow the instructions in the [Jekyll Docs](https://jekyllrb.com/docs/installation/) to complete the installation of the basic environment. [Git](https://git-scm.com/) also needs to be installed. -### Option 1. Using the Starter (Recommended) +## Installation -This approach simplifies upgrades, isolates unnecessary files, and is perfect for users who want to focus on writing with minimal configuration. +### Creating a New Site -1. Sign in to GitHub and navigate to the [**starter**][starter]. -2. Click the Use this template button and then select Create a new repository. -3. Name the new repository `.github.io`, replacing `username` with your lowercase GitHub username. +There are two ways to create a new repository for this theme: -### Option 2. Forking the Theme +- [**Using the Chirpy Starter**](#option-1-using-the-chirpy-starter) - Easy to upgrade, isolates irrelevant project files so you can focus on writing. +- [**GitHub Fork**](#option-2-github-fork) - Convenient for custom development, but difficult to upgrade. Unless you are familiar with Jekyll and are determined to tweak or contribute to this project, this approach is not recommended. -This approach is convenient for modifying features or UI design, but presents challenges during upgrades. So don't try this unless you are familiar with Jekyll and plan to heavily modify this theme. +#### Option 1. Using the Chirpy Starter -1. Sign in to GitHub. -2. [Fork the theme repository](https://github.com/cotes2020/jekyll-theme-chirpy/fork). -3. Name the new repository `.github.io`, replacing `username` with your lowercase GitHub username. +Sign in to GitHub and browse to [**Chirpy Starter**][starter], click the button Use this template > Create a new repository, and name the new repository `USERNAME.github.io`, where `USERNAME` represents your GitHub username. -## Setting up the Environment +#### Option 2. GitHub Fork -Once your repository is created, it's time to set up your development environment. There are two primary methods: +Sign in to GitHub to [fork **Chirpy**](https://github.com/cotes2020/jekyll-theme-chirpy/fork), and then rename it to `USERNAME.github.io` (`USERNAME` means your username). -### Using Dev Containers (Recommended for Windows) +Next, clone your site to local machine. In order to build JavaScript files later, we need to install [Node.js][nodejs], and then run the tool: -Dev Containers offer an isolated environment using Docker, which prevents conflicts with your system and ensures all dependencies are managed within the container. - -**Steps**: - -1. Install Docker: - - On Windows/macOS, install [Docker Desktop][docker-desktop]. - - On Linux, install [Docker Engine][docker-engine]. -2. Install [VS Code][vscode] and the [Dev Containers extension][dev-containers]. -3. Clone your repository: - - For Docker Desktop: Start VS Code and [clone your repo in a container volume][dc-clone-in-vol]. - - For Docker Engine: Clone your repo locally, then [open it in a container][dc-open-in-container] via VS Code. -4. Wait for the Dev Containers setup to complete. - -### Setting up Natively (Recommended for Unix-like OS) - -For Unix-like systems, you can set up the environment natively for optimal performance, though you can also use Dev Containers as an alternative. +```console +$ bash tools/init +``` -**Steps**: +> If you don't want to deploy your site on GitHub Pages, append option `--no-gh` at the end of the above command. +{: .prompt-info } -1. Follow the [Jekyll installation guide](https://jekyllrb.com/docs/installation/) to install Jekyll and ensure [Git](https://git-scm.com/) is installed. -2. Clone your repository to your local machine. -3. If you forked the theme, install [Node.js][nodejs] and run `bash tools/init.sh` in the root directory to initialize the repository. -4. Run command `bundle` in the root of your repository to install the dependencies. +The above command will: -## Usage +1. Check out the code to the [latest tag][latest-tag] (to ensure the stability of your site: as the code for the default branch is under development). +2. Remove non-essential sample files and take care of GitHub-related files. +3. Build JavaScript files and export to `assets/js/dist/`{: .filepath }, then make them tracked by Git. +4. Automatically create a new commit to save the changes above. -### Start the Jekyll Server +### Installing Dependencies -To run the site locally, use the following command: +Before running local server for the first time, go to the root directory of your site and run: -```terminal -$ bundle exec jekyll s +```console +$ bundle ``` -> If you are using Dev Containers, you must run that command in the **VS Code** Terminal. -{: .prompt-info } - -After a few seconds, the local server will be available at . +## Usage ### Configuration -Update the variables in `_config.yml`{: .filepath} as needed. Some typical options include: +Update the variables of `_config.yml`{: .filepath} as needed. Some of them are typical options: - `url` - `avatar` @@ -87,65 +69,70 @@ Update the variables in `_config.yml`{: .filepath} as needed. Some typical optio ### Social Contact Options -Social contact options are displayed at the bottom of the sidebar. You can enable or disable specific contacts in the `_data/contact.yml`{: .filepath} file. +Social contact options are displayed at the bottom of the sidebar. You can turn on/off the specified contacts in file `_data/contact.yml`{: .filepath }. + +### Customizing Stylesheet + +If you need to customize the stylesheet, copy the theme's `assets/css/jekyll-theme-chirpy.scss`{: .filepath} to the same path on your Jekyll site, and then add the custom style at the end of it. -### Customizing the Stylesheet +Starting with version `6.2.0`, if you want to overwrite the SASS variables defined in `_sass/addon/variables.scss`{: .filepath}, copy the main sass file `_sass/main.scss`{: .filepath} into the `_sass`{: .filepath} directory in your site's source, then create a new file `_sass/variables-hook.scss`{: .filepath} and assign new value. -To customize the stylesheet, copy the theme's `assets/css/jekyll-theme-chirpy.scss`{: .filepath} file to the same path in your Jekyll site, and add your custom styles at the end of the file. +### Customing Static Assets -Starting with version `6.2.0`, if you want to overwrite the SASS variables defined in `_sass/addon/variables.scss`{: .filepath}, copy the main SASS file `_sass/main.scss`{: .filepath} to the `_sass`{: .filepath} directory in your site's source, then create a new file `_sass/variables-hook.scss`{: .filepath} and assign your new values there. +Static assets configuration was introduced in version `5.1.0`. The CDN of the static assets is defined by file `_data/origin/cors.yml`{: .filepath }, and you can replace some of them according to the network conditions in the region where your website is published. -### Customizing Static Assets +Also, if you'd like to self-host the static assets, please refer to the [_chirpy-static-assets_](https://github.com/cotes2020/chirpy-static-assets#readme). -Static assets configuration was introduced in version `5.1.0`. The CDN of the static assets is defined in `_data/origin/cors.yml`{: .filepath }. You can replace some of them based on the network conditions in the region where your website is published. +### Running Local Server + +You may want to preview the site contents before publishing, so just run it by: + +```console +$ bundle exec jekyll s +``` -If you prefer to self-host the static assets, refer to the [_chirpy-static-assets_](https://github.com/cotes2020/chirpy-static-assets#readme) repository. +After a few seconds, the local service will be published at __. ## Deployment -Before deploying, check the `_config.yml`{: .filepath} file and ensure the `url` is configured correctly. If you prefer a [**project site**](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and don't use a custom domain, or if you want to visit your website with a base URL on a web server other than **GitHub Pages**, remember to set the `baseurl` to your project name, starting with a slash, e.g., `/project-name`. +Before the deployment begins, check out the file `_config.yml`{: .filepath} and make sure the `url` is configured correctly. Furthermore, if you prefer the [**project site**](https://help.github.com/en/github/working-with-github-pages/about-github-pages#types-of-github-pages-sites) and don't use a custom domain, or you want to visit your website with a base URL on a web server other than **GitHub Pages**, remember to change the `baseurl` to your project name that starts with a slash, e.g, `/project-name`. Now you can choose _ONE_ of the following methods to deploy your Jekyll site. -### Deploy Using Github Actions +### Deploy by Using GitHub Actions -Prepare the following: +There are a few things to get ready for. - If you're on the GitHub Free plan, keep your site repository public. -- If you have committed `Gemfile.lock`{: .filepath} to the repository, and your local machine is not running Linux, update the platform list of the lock file: +- If you have committed `Gemfile.lock`{: .filepath} to the repository, and your local machine is not running Linux, go to the root of your site and update the platform list of the lock-file: ```console $ bundle lock --add-platform x86_64-linux ``` -Next, configure the _Pages_ service: +Next, configure the _Pages_ service. -1. Go to your repository on GitHub. Select the _Settings_ tab, then click _Pages_ in the left navigation bar. In the **Source** section (under _Build and deployment_), select [**GitHub Actions**][pages-workflow-src] from the dropdown menu. - ![Build source](pages-source-light.png){: .light .border .normal w='375' h='140' } - ![Build source](pages-source-dark.png){: .dark .normal w='375' h='140' } +1. Browse to your repository on GitHub. Select the tab _Settings_, then click _Pages_ in the left navigation bar. Then, in the **Source** section (under _Build and deployment_), select [**GitHub Actions**][pages-workflow-src] from the dropdown menu. +![Build source](pages-source-light.png){: .light .border .normal w='375' h='140' } +![Build source](pages-source-dark.png){: .dark .normal w='375' h='140' } 2. Push any commits to GitHub to trigger the _Actions_ workflow. In the _Actions_ tab of your repository, you should see the workflow _Build and Deploy_ running. Once the build is complete and successful, the site will be deployed automatically. -You can now visit the URL provided by GitHub to access your site. +At this point, you can go to the URL indicated by GitHub to access your site. -### Manual Build and Deployment +### Manually Build and Deploy -For self-hosted servers, you will need to build the site on your local machine and then upload the site files to the server. +On self-hosted servers, you cannot enjoy the convenience of **GitHub Actions**. Therefore, you should build the site on your local machine and then upload the site files to the server. -Navigate to the root of the source project, and build your site with the following command: +Go to the root of the source project, and build your site as follows: ```console $ JEKYLL_ENV=production bundle exec jekyll b ``` -Unless you specified the output path, the generated site files will be placed in the `_site`{: .filepath} folder of the project's root directory. Upload these files to your target server. +Unless you specified the output path, the generated site files will be placed in folder `_site`{: .filepath} of the project's root directory. Now you should upload those files to the target server. [nodejs]: https://nodejs.org/ [starter]: https://github.com/cotes2020/chirpy-starter [pages-workflow-src]: https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#publishing-with-a-custom-github-actions-workflow -[docker-desktop]: https://www.docker.com/products/docker-desktop/ -[docker-engine]: https://docs.docker.com/engine/install/ -[vscode]: https://code.visualstudio.com/ -[dev-containers]: https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers -[dc-clone-in-vol]: https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-a-git-repository-or-github-pr-in-an-isolated-container-volume -[dc-open-in-container]: https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-an-existing-folder-in-a-container +[latest-tag]: https://github.com/cotes2020/jekyll-theme-chirpy/tags diff --git a/_sass/addon/commons.scss b/_sass/addon/commons.scss index e332f21..f00e782 100644 --- a/_sass/addon/commons.scss +++ b/_sass/addon/commons.scss @@ -1,8 +1,6 @@ /* The common styles */ html { - font-size: 16px; - @media (prefers-color-scheme: light) { &:not([data-mode]), &[data-mode='light'] { @@ -24,6 +22,8 @@ html { @include light-scheme; } } + + font-size: 16px; } body { @@ -42,29 +42,20 @@ body { @extend %heading; @if $i > 1 { + @extend %section; @extend %anchor; } @if $i < 5 { - $size-factor: 0.25rem; - - @if $i > 1 { - $size-factor: 0.18rem; + $factor: 0.18rem; - main & { - @if $i == 2 { - margin: 2.5rem 0 1.25rem; - } @else { - margin: 2rem 0 1rem; - } - } + @if $i == 1 { + $factor: 0.23rem; } - & { - font-size: 1rem + (5 - $i) * $size-factor; - } + font-size: 1rem + (5 - $i) * $factor; } @else { - font-size: 1.05rem; + font-size: 1rem; } } } @@ -89,10 +80,9 @@ img { } blockquote { - border-left: 0.125rem solid var(--blockquote-border-color); + border-left: 5px solid var(--blockquote-border-color); padding-left: 1rem; color: var(--blockquote-text-color); - margin-top: 0.5rem; > p:last-child { margin-bottom: 0; @@ -117,14 +107,14 @@ blockquote { } } - @include prompt('tip', '\f0eb', $fa-style: 'regular'); - @include prompt('info', '\f06a', $rotate: 180); + @include prompt('tip', '\f0eb', 'regular'); + @include prompt('info', '\f06a'); @include prompt('warning', '\f06a'); @include prompt('danger', '\f071'); } kbd { - font-family: Lato, sans-serif; + font-family: inherit; display: inline-block; vertical-align: middle; line-height: 1.3rem; @@ -134,7 +124,7 @@ kbd { padding-top: 0.1rem; color: var(--kbd-text-color); background-color: var(--kbd-bg-color); - border-radius: $radius-sm; + border-radius: 0.25rem; border: solid 1px var(--kbd-wrap-color); box-shadow: inset 0 -2px 0 var(--kbd-wrap-color); } @@ -221,6 +211,8 @@ i { margin: 0 0.35rem 0.5rem 0; &:hover { + border-color: #7f52ff !important; + background-color: #7f52ff; transition: all 0.3s ease-in; } } @@ -228,13 +220,13 @@ i { #access-lastmod { a { - color: inherit; - &:hover { @extend %link-hover; } @extend %no-bottom-border; + + color: inherit; } } @@ -692,15 +684,15 @@ $btn-mb: 0.5rem; 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; } + /* Hide scrollbar for IE, Edge and Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + %sidebar-link-hover { &:hover { color: var(--sidebar-active-color); @@ -738,9 +730,6 @@ $btn-mb: 0.5rem; } .site-title { - @extend %clickable-transition; - @extend %sidebar-link-hover; - font-family: inherit; font-weight: 900; font-size: 1.75rem; @@ -748,8 +737,13 @@ $btn-mb: 0.5rem; letter-spacing: 0.25px; margin-top: 1.25rem; margin-bottom: 0.5rem; - width: fit-content; - color: var(--site-title-color); + + a { + @extend %clickable-transition; + @extend %sidebar-link-hover; + + color: var(--site-title-color); + } } .site-subtitle { @@ -908,7 +902,9 @@ $btn-mb: 0.5rem; } #topbar { - @extend %btn-color; + button i { + color: #999999; + } #breadcrumb { font-size: 1rem; @@ -1042,9 +1038,6 @@ search { padding-bottom: 3rem; a { - font-size: 1.4rem; - line-height: 2.5rem; - &:hover { @extend %link-hover; } @@ -1052,6 +1045,9 @@ search { @extend %link-color; @extend %no-bottom-border; @extend %heading; + + font-size: 1.4rem; + line-height: 2.5rem; } > article { diff --git a/_sass/addon/module.scss b/_sass/addon/module.scss index 34ac67b..006ead9 100644 --- a/_sass/addon/module.scss +++ b/_sass/addon/module.scss @@ -8,7 +8,17 @@ color: var(--heading-color); font-weight: 400; font-family: $font-family-heading; - scroll-margin-top: 3.5rem; +} + +%section { + main & { + margin-top: 2.5rem; + margin-bottom: 1.25rem; + + &:focus { + outline: none; /* avoid outline in Safari */ + } + } } %anchor { @@ -45,8 +55,8 @@ } %link-hover { - color: #d2603a !important; - border-bottom: 1px solid #d2603a; + color: #7f52ff !important; + border-bottom: 1px solid #7f52ff; text-decoration: none; } @@ -82,7 +92,7 @@ } %rounded { - border-radius: $radius-lg; + border-radius: $base-radius; } %img-caption { @@ -113,7 +123,7 @@ } %text-highlight { - color: var(--text-muted-highlight-color); + color: var(--text-muted-hightlight-color); font-weight: 600; } @@ -135,12 +145,6 @@ } } -%btn-color { - button i { - color: #999999; - } -} - /* ---------- scss mixin --------- */ @mixin mt-mb($value) { @@ -183,7 +187,7 @@ transform: translateX(-50%); } -@mixin prompt($type, $fa-content, $fa-style: 'solid', $rotate: 0) { +@mixin prompt($type, $fa-content, $fa-style: 'solid') { &.prompt-#{$type} { background-color: var(--prompt-#{$type}-bg); @@ -191,10 +195,6 @@ 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 index 6bd7b40..68796f2 100644 --- a/_sass/addon/syntax.scss +++ b/_sass/addon/syntax.scss @@ -50,13 +50,13 @@ html { @extend %rounded; @extend %code-snippet-bg; - overflow: auto; - padding-bottom: 0.75rem; - @at-root figure#{&} { @extend %code-snippet-bg; } + overflow: auto; + padding-bottom: 0.75rem; + pre { margin-bottom: 0; font-size: $code-font-size; @@ -104,7 +104,7 @@ code { font-size: $code-font-size; padding: 3px 5px; word-break: break-word; - border-radius: $radius-sm; + border-radius: 4px; background-color: var(--inline-code-bg); } @@ -261,7 +261,7 @@ div { .content > & { @include ml-mr(0); - border-radius: $radius-lg; + border-radius: $base-radius; } .code-header { diff --git a/_sass/addon/variables.scss b/_sass/addon/variables.scss index 1d51cb1..8924a00 100644 --- a/_sass/addon/variables.scss +++ b/_sass/addon/variables.scss @@ -16,8 +16,7 @@ $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; +$base-radius: 0.625rem !default; $back2top-size: 2.75rem !default; /* syntax highlight */ diff --git a/_sass/colors/syntax-dark.scss b/_sass/colors/syntax-dark.scss index eb92204..d898c65 100644 --- a/_sass/colors/syntax-dark.scss +++ b/_sass/colors/syntax-dark.scss @@ -7,7 +7,7 @@ --highlight-bg-color: #151515; --highlighter-rouge-color: #c9def1; --highlight-lineno-color: #808080; - --inline-code-bg: rgba(255, 255, 255, 0.05); + --inline-code-bg: #323238; --code-color: #b0b0b0; --code-header-text-color: #6a6a6a; --code-header-muted-color: #353535; diff --git a/_sass/colors/syntax-light.scss b/_sass/colors/syntax-light.scss index 76aa669..6562c76 100644 --- a/_sass/colors/syntax-light.scss +++ b/_sass/colors/syntax-light.scss @@ -8,13 +8,17 @@ --highlight-bg-color: #f6f8fa; --highlighter-rouge-color: #3f596f; --highlight-lineno-color: #9e9e9e; - --inline-code-bg: rgba(25, 25, 28, 0.05); + --inline-code-bg: #f6f6f7; --code-color: #3a3a3a; --code-header-text-color: #a3a3a3; --code-header-muted-color: #e5e5e5; --code-header-icon-color: #c9c8c8; --clipboard-checked-color: #43c743; + [class^='prompt-'] { + --inline-code-bg: #fbfafa; + } + /* --- Syntax highlight theme from `rougify style github` --- */ .highlight table td { diff --git a/_sass/colors/typography-dark.scss b/_sass/colors/typography-dark.scss index 664c936..d9d90fb 100644 --- a/_sass/colors/typography-dark.scss +++ b/_sass/colors/typography-dark.scss @@ -11,17 +11,18 @@ /* Common color */ --text-color: rgb(175, 176, 177); --text-muted-color: #868686; - --text-muted-highlight-color: #aeaeae; + --text-muted-hightlight-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); + --link-color: rgb(175, 176, 177); + --link-underline-color: rgb(175, 176, 177); --button-bg: #1e1e1e; --btn-border-color: #2e2f31; --btn-backtotop-color: var(--text-color); --btn-backtotop-border-color: #212122; + --btn-box-shadow: var(--main-bg); --card-header-bg: #292929; --checkbox-color: rgb(118, 120, 121); --checkbox-checked-color: var(--link-color); @@ -58,15 +59,14 @@ --btn-paginator-hover-color: #2e2e2e; /* Posts */ - --toc-highlight: rgb(116, 178, 243); - --toc-popup-border-color: #373737; + --toc-highlight: #b893f3; --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; + --btn-share-hover-color: #b893f3; --card-bg: #1e1e1e; --card-hovor-bg: #464d51; --card-shadow: rgb(21, 21, 21, 0.72) 0 6px 18px 0, @@ -84,29 +84,27 @@ --prompt-danger-bg: rgb(86, 28, 8, 0.8); --prompt-danger-icon-color: #cd0202; - /* Tags */ + /* 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 */ --categories-border: rgb(64, 66, 69, 0.5); --categories-hover-bg: rgb(73, 75, 76); --categories-icon-hover-color: white; - /* Archive */ + /* archives */ --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 */ .categories.card, .list-group-item { background-color: var(--card-bg); @@ -140,6 +138,8 @@ ); } + color-scheme: dark; + /* stylelint-disable-next-line selector-id-pattern */ #disqus_thread { color-scheme: none; diff --git a/_sass/colors/typography-light.scss b/_sass/colors/typography-light.scss index b6fc561..b29711c 100644 --- a/_sass/colors/typography-light.scss +++ b/_sass/colors/typography-light.scss @@ -11,19 +11,20 @@ /* Common color */ --text-color: #34343c; --text-muted-color: #757575; - --text-muted-highlight-color: inherit; + --text-muted-hightlight-color: inherit; --heading-color: #2a2a2a; --label-color: #585858; --blockquote-border-color: #eeeeee; --blockquote-text-color: #757575; - --link-color: #0056b2; + --link-color: #34343c; --link-underline-color: #dee2e6; --button-bg: #ffffff; --btn-border-color: #e9ecef; --btn-backtotop-color: #686868; --btn-backtotop-border-color: #f1f1f1; + --btn-box-shadow: #eaeaea; --checkbox-color: #c5c5c5; - --checkbox-checked-color: #07a8f7; + --checkbox-checked-color: #7f52ff; --img-bg: radial-gradient( circle, rgb(255, 255, 255) 0%, @@ -61,10 +62,9 @@ --btn-paginator-hover-color: var(--sidebar-bg); /* Posts */ - --toc-highlight: #0550ae; - --toc-popup-border-color: lightgray; + --toc-highlight: #7f52ff; --btn-share-color: gray; - --btn-share-hover-color: #0d6efd; + --btn-share-hover-color: #7f52ff; --card-bg: white; --card-hovor-bg: #e2e2e2; --card-shadow: rgb(104, 104, 104, 0.05) 0 2px 6px 0, @@ -92,6 +92,14 @@ --tag-hover: rgb(222, 226, 230); --search-tag-bg: #f8f9fa; + [class^='prompt-'] { + --link-underline-color: rgb(219, 216, 216); + } + + .dark { + display: none; + } + /* Categories */ --categories-border: rgba(0, 0, 0, 0.125); --categories-hover-bg: var(--btn-border-color); @@ -101,12 +109,4 @@ --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/categories.scss b/_sass/layout/categories.scss index f12b963..330d3d3 100644 --- a/_sass/layout/categories.scss +++ b/_sass/layout/categories.scss @@ -16,7 +16,7 @@ } .card-header { - $radius: calc($radius-lg - 1px); + $radius: calc($base-radius - 1px); padding: 0.75rem; border-radius: $radius; diff --git a/_sass/layout/home.scss b/_sass/layout/home.scss index 0d95d7b..7f9fd2e 100644 --- a/_sass/layout/home.scss +++ b/_sass/layout/home.scss @@ -20,7 +20,7 @@ background: none; %img-radius { - border-radius: $radius-lg $radius-lg 0 0; + border-radius: $base-radius $base-radius 0 0; } .preview-img { @@ -131,7 +131,7 @@ /* Tablet */ @media all and (min-width: 768px) { %img-radius { - border-radius: 0 $radius-lg $radius-lg 0; + border-radius: 0 $base-radius $base-radius 0; } #post-list { diff --git a/_sass/layout/post.scss b/_sass/layout/post.scss index be72700..112541d 100644 --- a/_sass/layout/post.scss +++ b/_sass/layout/post.scss @@ -173,12 +173,12 @@ header { } &:first-child { - border-radius: $radius-lg 0 0 $radius-lg; + border-radius: $base-radius 0 0 $base-radius; left: 0.5px; } &:last-child { - border-radius: 0 $radius-lg $radius-lg 0; + border-radius: 0 $base-radius $base-radius 0; right: 0.5px; } } @@ -228,7 +228,6 @@ header { } } -/* TOC panel */ #toc-wrapper { border-left: 1px solid rgba(158, 158, 158, 0.17); position: -webkit-sticky; @@ -291,201 +290,6 @@ header { } } -/* --- 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; - - border-color: var(--toc-popup-border-color); - border-width: 1px; - border-radius: $radius-lg; - color: var(--text-color); - background: var(--main-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: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: blur(5px); - backdrop-filter: blur(5px); - } - - &::backdrop { - -webkit-backdrop-filter: blur(5px); - backdrop-filter: blur(5px); - } - - &::after { - display: flex; - content: ''; - position: relative; - background: linear-gradient(transparent, var(--main-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 { @@ -564,16 +368,3 @@ header { margin-right: -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/main.bundle.scss b/_sass/main.bundle.scss deleted file mode 100644 index 52e893f..0000000 --- a/_sass/main.bundle.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import 'dist/bootstrap'; -@import 'main'; diff --git a/aa.txt b/aa.txt deleted file mode 100644 index e69de29..0000000 diff --git a/assets/404.html b/assets/404.html index af89d6d..5b46cc8 100644 --- a/assets/404.html +++ b/assets/404.html @@ -11,4 +11,4 @@ {% include lang.html %} -

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

+

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

diff --git a/assets/css/jekyll-theme-chirpy.scss b/assets/css/jekyll-theme-chirpy.scss index d20545b..1280b9e 100644 --- a/assets/css/jekyll-theme-chirpy.scss +++ b/assets/css/jekyll-theme-chirpy.scss @@ -1,10 +1,6 @@ --- --- -@import 'main -{%- if jekyll.environment == 'production' -%} - .bundle -{%- endif -%} -'; +@import 'main'; /* append your custom style below */ diff --git a/assets/img/favicons/android-chrome-192x192.png b/assets/img/favicons/android-chrome-192x192.png index a949d2fe5d15c0764e5570b1ba8477a8961bef9e..3f53c989294e1f5b866e5cd8e16505c4e3f87f67 100644 GIT binary patch literal 4920 zcmd5=_g7O}x7~+8r~xeW7Nsc004gB8iV6sXB1jJ+y+x%-jVK@@S3ne`84wT@0+&ls zKoUT%3eqIfkzEG1pvkuYJ}&YwsA0;UxqMKMMc=p?mp) z32h|*e3;<0x5B zl}P)%!=Q9aK5I2*LUC76$Zw(KpBO=di4cj|G2ix5zvRNIgvnj8re|{Kr{Iuy$-8&l z+!~zNgy7N9BD@H@^%pwT3jFNyyZ(YS1{qLzXswS9u2DSbbHWE)6PPMzV8h#04;g+3 zCGzbati0g8KPjUI!g>+9xn)4me3xyMeS7{ZaD4e)J8LqSD&LtOLjVuh z`wBeN?(w7lvjFIV2YEp-Lia-D6CXaj-p-o_4r(holw+59KpOLDfQL#X8>HUKu$3qD z-FIg^mGR+4)-Km;4zg+f_w!q7Z>t`mw=4;b7q1m`aBQSSsbP4vjq5ZV0@1b_XI3@F zToQMLI+&Uc>oKxMZk4Yc)x&1t!1#`m7w14*=`8x21ZWiC^{#gXFPYiSW2dmP(Ze9> z2rtS!B|s2=EQvJ*G)uT&w%DmcXp2~TeZq`Jf2FpBvLMzE3a-@LnHK$e$RQ|u>2i<5K>92yWPm1c~$K#{Nbc9+^bVr z(}hQMR9Rs;ZvSnBDJjgP?lYa?MOaWpmm{wO5KKKuzV{k^c=Q~@Uoye>LZYrfyae)>5Av>ME&XkO-~};8 z{%P9l=2J6_WL*1+ZMvoRkXD7N52QA7^8NB%{3A>V|c-J z<8kgk6mdW)@es;<&Fpj&jYbH2t%8$=h`aE&f^JLt(8uPoE;%&~O-I;8oG$~vm?P}^ z0-*lw`>cu{&;QmpAcshRCLYd~!SjQk!gD8UZA^rO5iy0-8rLWdcbk%WOJ*K5BWIxYq0z$S{s-^qi{Osi7quH0IYEPi{dhca~29a%h>Q9Cxf zFt&J2_wJQD*|R-A9H&qF!GYXybv9!Qo6x()HnYn%%?F7a2P8#hg~Lgh8p>pcylV8$$E+Lk+3u7g@qKGH z{&DLVx^9-9#88U=MO-2ZOx4e+< zupxgwF(D|aCwXON?JUW2B{#+EPgbNL0*~SJ5~WIclVB7dW}9ucEq2F5-f8W6x~C*| zD%UnAxT>g3*0}kifM2uE6S15z`<%!=H_1;oqSlndey3Gb+hlfWb8+F4&MMk2Yk$Lz zoaKARIfhit;ZTEr6`71r8nNvy^e7=w7BdwBvsD^xE$a0ViPWFtJz=CY4VeY ztO6$U*xPQ|Dygt;D%^iuP%XU6;b~u|A9Gjt;FAaPebQ30*6?a>?AWRjnx0nR!n9TO z05@JXbZYaZP}o%TCbeM5uSIZ;oMG=`XHY0J{gQX8!tpF%!~2{riGn+TvhNe6eZwy| zyM^x_?>0A7&cRpTZ27Q%wEj=z+uIbgJZ zndhk2C>a4@ggAdnZ|KijbrJ9pVDtt9F#L^-VJ$zmt~GTHL#4~Nj8s`#cXVG;WoPE~ zYrc@oCFt2;*vRrk|7iAaxpxr#F((+l7%=L_*}v?QtubBJ&{h*-Yw~a-&2KNY?`UB` zVM!7NnTUA6{1a^*1AU@_5#dwO!S1~IU-`%L2*(I4>o|;8EH9lqD5OI!$A3cFrgoP+ z=f|h}#``)2wDe3M;{3W&To?s}L8D(LhZTnq%nK9(a+*V1XdXOwZ*qy4~e-LIX*zjq`CoIL20S7nbp z4JSWT#+S)G(G`uF`MS$`F=i3yifn0FO&kVTi&MOI>({$Knvi>n_{AS7p(EMeqv-de zppts**RCrPe+kg!px6$>;-9i7+6A%(nulF|kJ0X~qR8Y#7{75av#*@pL*6(8%%OM_ zVO6taXCaWYJ16k<>{WltgJ9hmr?zI&Wx9*AiIE9&u@P8I;aNET-rnI2E|l3)#`RRf zWMjPew1{?AmFx+OSS?I!Z&dojk}!BbrnjIIw=+&>$Br#tq3twfjDau{{lv@>pl+P3PjV1}B$`9LJ1q8nX z)h%J3J!zfNnb_+<_Hj8{ZNy&yPcrpt9d4xCUb z`P8f0lW;t=WH8DFSbKzIBmSnNHoKfTaJ%xNh5lYGpNDn3MZ~~%Htky`p9eL${0EHw z(Mx7=HsMjH@A<5)i-_+V9e&EZ{Zg#*HxU9H5co41p2S^b4R;y#TU~#5n|h#Rzi+TG zN+30TTbKV65CMivf9uB`0Y6}Dw64*X zBUN|@qHNz+ta&CyNQs2SU$s9Mj}n}-lSGFHqet!XjLc+dy)Z`THe z%Cdq-F#$|#!<7tzg7tSH>PKD`bC*K70Vr_>8EF@LYlq1JtO5K7rOTRZV;g*ZU~?3P zy*Dy{XlhpHwa+4ui2bVaqhA^CLhu18GS8r;mUHeyK*sF?t%(Le*DpTeJ6^y^;mAjX zoK@QRjz1$Oko1e!3VqTaZ??m-_VIuv$&69*C>UyNl=$>O#s+mYD3CFJ&}0VLxG64R znJPC3ef9HZEf4b!HSSt6!sW+Q*{S7AckzS#M1LRl^{)Jm7i||)+W^x#wP~dniuc7g z>)jqW8E;L?8Ip1j)$GEk@%7kWsFs^AHE0}ccnk;e^a~zP!1%6M_G27f*!2oe30E1Q zrTVrs#17;cU$5SmwPrbxs4T1F^SIlK9ePT{g)zX zU=lkR6@;QK|_D6&1S^Nf@eqmZ&Q0USLI!*R#N5DJ3DE;X~f-Xz=zq;}hbW$f1W`WF zC2>IxDvs%r`Zty|4tqBIBM3;4*R0yN3s<&?y%JkV1s+itfByn%Q(eqGQ@L#x!@cd8 zwFGY5*$Br*n1USW3-B`!zz@J1D}5GxeoXP_x1CZjol8aX&ZsaHwGGcng^Y>L$M z2qA}*$zRlYW;--+r)mo|q+=h>t~*sl^xm^>5M3Y-wMYr3&xUYGr>+t^VG04bGj~@{ z;Pyp{Pgmu@Sq9{JheC=c6O~R%f3xr!0i}9BmLbHBJkBfSg4^=h+^qwygW{H|bXzXL zs_f}fBFxX+iljT8ZZ}d^Z=oL37g?`oDkssw2|WEuQyJ7Ct66cImf;yd{61>7Ul%(F zoqZ46yhuo{-xlW-c{ssfJR78@CP~flY?|V$YHrTPf37F3u}&SklGnnz?>kU4*CvHs zAxe!}-I+cQ&ccBL<&|bAx0y|y@vvj4q;VJ&y?sT&gP4+G8-&lgM@op|}lfsy0VzYJkH?ZOD zCn=$m!j=U@bVhm-y!GY~4dD2}HUeO%|Bmg~==%8>4QH)#!h z^1_6;zr4Spv&Hjhjy=8)HT@$T1>Swm&XLz~wNJ9gdV-t{z3sgr77g$EYXt^}`gq23 zq4++Uf`cM3CJ~p?$Db8y{BMav0G?u}OFFQI@TX8W2iEeC`O-}uJ+h#S`t*bPO&(zR z`Q?cU7!7OJ@Qg813wMxxvZ21w8P50CBp#{qmX*B(R?W#}Ubva*v~fY>>For zLFof{AZz3NjSYV}ninKQH5aBroYR~%4DR{WbKtnpb#Q@S>K}KSgEkHG|CzKjN|6#V zae9aEm8G~Ba~U4ubS-gOrrgetY_;5Ae9S>w@lCx1a4jNYlyGD}F;u>VlDKwAEC)lL#CB zq!B+bcE0x~pz!&}Do^b!&VlT~7a{EB1jS}DI@>7sBNqbiI%%Q%i<-@bFZ7fu(G^@! zCg~~t;-S8tGM&Du1EXrT8lC@T;ZTYbwvY!wb0Nxpw5uVm|C6hs^Pmtx3v|FpzUtw0 Uefi=G+Ep0P)iJz4)WSym2d~5b8UO$Q literal 19952 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 T@p2WDqs_j@9{YEPdY~Eiua1s!mG%jNb@7!! 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 literal 62557 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%0AKd}u#mAizaXi! zzk%MdI2O%RF3BgCIkeO$bQFeKsaIZOP$KzI{n#yeb1kc#Lp`${wnT?Uo+T`XPoi}YiVeeYX zrVx@rT>if+!*te~snZTeGlGFEjpPjmfE!-nZz#{-Ey7v=i|2hN80!ac~EBX3-<0#C*63Sc_K{YhdnD| zi!JJ2_!@C_*{>wYa2P7gMI?EU_W=}J7zO*YgbSGxk#gXe54wt!Af>90AFU*?hQmlT z<%n<=Bj?tMF&}*2Ythu7Nav#{Z%FG1&$S44*60!s~F{QRyg*I5Gi&ch_sy{D7)XM+dB;bsb z&d7mxDz3%c6*dBJZ5g~=*KJA6! zwb5v%9(6kx-N$F1bI10iWPk=D@+TFh$dOnkIE*o2L{jS9Qjgz=#1yhizjI*3MM;qr zMwR;kL+w$3`4+!AlO=;420fG`F=(DMQ@l}Rl%0aD&E;mUz0Je=!8e8-21k^ioJVa2 zb|{FFW%wIMGE#<6klxk2sf{iwcDm=Y7Cpb%Gwd1MrXT0(HZu%aJLZ$0B9fZQc=1I4 zbxXzI51k#iMbsqJpq3C02oCOJ8F_puu36`AIu5CxzQJDngSRCb*L|0~IxD2_n@mT01V-JOAh~A{& zQ9dRF4T@@#q=%jN@>JDqvovK2EB-@-6!Y&_KMA&qZ> zO|kRp@_1=^tvE&-=6@d`!Q>Z}mPHcwLP)Vc$gENjxuh_d8N@!!tFqaBvP*cD$+Upq z#my(Q;d061WqcB^^jNL-`0dtWa0ccLm6V~8ip!Zcgl=@)5kWCWMgsTnR3gV&K7I5$ zo%CRT^7G?wO|CmXSpPEnJj-A8FJZ+|Nrw zE^;KFTG}>?-6lc#xi|IW2sop9S&ZpxTzOa=O3EvPEV}Oe(no=-=if@-^J+ab71ZL6 z+;X1(*-X6uK^`&f0- z$C?zF+yAg-2j4L#M!tG7@N0=wbSDFC;~Tf|bt3|bL{EduCRpXe#7L4GQHo6zKW?Ot zmTv~-RV5@ZfB${KOih-=?Pk{}QC^2;$}j!G)QkQ6sJdR^jmmt$;u`x&%Kg)(Z;&0pB912ehx+{2nCjTnW$`6^k{0V z;i$&}c*dzi>hr%pHn#q8$dgv-75}x~f9o;-2*Wl)u|$<5KC77DQLnH%_#>TEO-u&I zXNqglRT?T)@&c0(spx+g2CO|p`;LviWaM{NZ^{-%1W^m~Hv_4jvfJ?`*yw~ps920K zp_~y0jAfdn5vnyY(~O(uJfnV|VaiX+EO>AN_h>WMzetA17O`L{bpFPV3ZgtXzStA# z+d5w~2&&BYb`6`K^ygn0P{?6;NJvOaL&dyYECf`+r?1@OuW*#=n5#5KXXG=r`YJTt z4C6Spir7C`2*mflPqE#KlOJaA)Bf~fg+9Tn4>FIFl!FzAFkqlZZ=>VWU!aC165oaq ztx1WpVW5UlnnrI5lbD1{KJ>6<P>vZj!*rizDL9tV)%@ip0^%z=cEJ90%G@CtyV{;~Mk&#y3Z36GYkpIqDU` zm3nOWk@MOPd=03O&ol4(BJ_WM-RJ+~dqF?%(dvqK*KfJ#d4Q!w>mjA%VPWcFDPZnq z32q=xc1{i!c5W6e8vHUyK8QIMBKuyR75YO=;Bk!PNdq4N$w?_oRwGTq F{tp(By7K@4 diff --git a/assets/img/favicons/favicon-16x16.png b/assets/img/favicons/favicon-16x16.png index f44237a9a42f93a98c435c3fc958cc9a52c2e38c..64a411c9432f45411317602b1f68c2d956d2f567 100644 GIT binary patch delta 310 zcmV-60m=T~3C04D8Gi-<001BJ|6u?C00DDSM?wIu&K&6g0096=L_t(IPo$fQi3J>Kq*NVpqx@dj#NPj91tQsX5Rk!^H+HA zi1t4dCOKpcOpKR8eT3>8smI>v0I!51fxSRs#R19|mOG@p3x8M;<}>&TJ)jcMSE~lz z8>nspUR|fa0d$1r50oinDXf9)7U0!I0WBN^o)Y-YfWgzB3EMzj2 zLfe8inPIU&buU|p9m~eQ0XCWf#v(naz(!NR*ryr<{Pmar0=6lT5zFQny#N3J07*qo IM6N<$g2*C>*Z=?k literal 1247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>YRSpT$B!RBc<^9PPY+N*S63I%ZFY8c zWo2cjPoH*ianaDwsIRYYsBf4%ckbcChbK&!z{SfhAi%@M!45PbJUm=bP%x+4yW7Xl zPhMMDKvcs-cCt&rNsp`;YqOv(2cVgidERRZlk*Ea7&IAX9?iV^e=@%~pQ4tes=kbw zr{>~|g>z2i0Dao9))(l_$@`P197yrcGRm3k6kBVV+2uCvaN5Lui8GI8fx=;(A5cx} zrr^4j{%xB>dUwVEg9Rc8Br6tq=1p~}UFnlE$q7gTRo1Ton&}G+cA(3FUenUj0(x!s z?AceYTmgCw7&89;{+^zmz_{4Fd2?lDWl&I%gM)*Qj}I_pmMvT6dZ*~uuJ9?G;p&rS2#igev$wwjJ=t0k-RjftT|)dbe^xNF zu{-Qpp(4%B!YEm=d}?d&x`R2zq6)iy{QG@Vjoq$n_QqWsXO~&CXwLGN90NPZ!4!iOb0e z2?;4v!UIxLLW05)Q<8w(q@*Q&-OKA04+s*Ddbe=9-$ne|{!h`^3(2j*m-BAf<_uqqXH6CwIR<8+V6` z+u7c}PSIA*j-yA_Rn%0MFIm><&A_U1+1P0FrsAT{pSZcYmozY4I;y(#^E3U39V^!C zSro+fBL3#8SF>*In)Ivf*s^D0mTU~uW|=--XIj_*^s;J+YeY#(Vo9o1a#1RfVlXl= zGSoFN(KRv)F*LI>Ft9SQ&^9mvGD6KA{7^LH=BH$)RpQp5lJ(;gP(yfCNJL3cV!1*= zQGQxxPO3slWkIS!W2I`Q&6e6=(&6r>mdKI;Vst0Gj@< AT>t<8 diff --git a/assets/img/favicons/favicon-32x32.png b/assets/img/favicons/favicon-32x32.png index d5d021d85c808e4ae23408203e5e34223d752de2..fc065030c0d7057de0cd047f401704c1a59e893b 100644 GIT binary patch delta 398 zcmV;90df9_5~u@^B!2;OQb$4nuFf3k0004ENkl0d;YTj~eTD__ zgd30G4!G&)%>Ea)Z^%#I4z@Zl$4vwlz(YsjPY0_t@^x;2nSa2Gz${eQ!N$RIjcoos zz#iB-XlY%*w}bZ*c8MK0@s9R@mf!<;Eup1#0k;B=CEOO@LUhbOPuo zF2Fp&p8;ssYJayMPoMz|uhgY{2WTc}@HR{U=x0LTEf_07Y#4bx;JXE5O?VD~sALOx zz?8rMv!ggRT2oDE0N9sN>LQ|psLy^-PeJM`rlYtwK&*+5@A<|vXG6-`imw1e=zw0| sv)A-24;WLE{iBivkUBM?_pbm4V`3yQ?kB9*00000Ne4wvM6N<$f_x#gU;qFB literal 2312 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 literal 15086 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 Xzm)TfVf8Kqig90xcU%sOkih=~MJbl= diff --git a/assets/img/favicons/site.webmanifest b/assets/img/favicons/site.webmanifest index 03c6113..45dc8a2 100644 --- a/assets/img/favicons/site.webmanifest +++ b/assets/img/favicons/site.webmanifest @@ -1,26 +1 @@ ---- -layout: compress ---- - -{% assign favicon_path = "/assets/img/favicons" | relative_url %} - -{ - "name": "{{ site.title }}", - "short_name": "{{ site.title }}", - "description": "{{ site.description }}", - "icons": [ - { - "src": "{{ favicon_path }}/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "{{ favicon_path }}/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - }], - "start_url": "{{ '/index.html' | relative_url }}", - "theme_color": "#2a1e6b", - "background_color": "#ffffff", - "display": "fullscreen" -} +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/assets/js/data/swconf.js b/assets/js/data/swconf.js index 798888a..c02638f 100644 --- a/assets/js/data/swconf.js +++ b/assets/js/data/swconf.js @@ -22,24 +22,28 @@ const swconf = { {% 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 -%} The request url with below domain will be cached. {%- endcomment -%} + allowHosts: [ + {% if site.cdn and site.cdn contains '//' %} + '{{ site.cdn | split: '//' | last | split: '/' | first }}', + {% endif %} - {%- 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 %} - ] - }, + {%- unless site.assets.self_host.enabled -%} + {% for cdn in site.data.origin["cors"].cdns %} + '{{ cdn.url | split: "//" | last }}' + {%- unless forloop.last -%},{%- endunless -%} + {% endfor %} + {% endunless %} + ], + {%- comment -%} The request url with below path will not be cached. {%- endcomment -%} + denyPaths: [ + {% for path in site.pwa.cache.deny_paths %} + {% unless path == empty %} + '{{ path | relative_url }}'{%- unless forloop.last -%},{%- endunless -%} + {% endunless %} + {% endfor %} + ], purge: false {% else %} purge: true diff --git a/assets/js/dist/categories.min.js b/assets/js/dist/categories.min.js new file mode 100644 index 0000000..af8bd30 --- /dev/null +++ b/assets/js/dist/categories.min.js @@ -0,0 +1,4 @@ +/*! + * Chirpy v6.5.5 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/ + */ +!function(){"use strict";const e=document.getElementById("mode-toggle");function t(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var s=e[Symbol.toPrimitive];if(void 0!==s){var o=s.call(e,t||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}function s(e,s,o){return(s=t(s))in e?Object.defineProperty(e,s,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[s]=o,e}const o="sidebar-display";class a{static toggle(){!1===a.isExpanded?document.body.setAttribute(o,""):document.body.removeAttribute(o),a.isExpanded=!a.isExpanded}}s(a,"isExpanded",!1);const n=document.getElementById("sidebar-trigger"),r=document.getElementById("search-trigger"),i=document.getElementById("search-cancel"),d=document.querySelectorAll("#main-wrapper>.container>.row"),c=document.getElementById("topbar-title"),l=document.getElementById("search"),m=document.getElementById("search-result-wrapper"),u=document.getElementById("search-results"),f=document.getElementById("search-input"),g=document.getElementById("search-hints"),L="d-block",v="d-none",E="input-focus",b="d-flex";class p{static on(){n.classList.add(v),c.classList.add(v),r.classList.add(v),l.classList.add(b),i.classList.add(L)}static off(){i.classList.remove(L),l.classList.remove(b),n.classList.remove(v),c.classList.remove(v),r.classList.remove(v)}}class y{static on(){this.resultVisible||(m.classList.remove(v),d.forEach((e=>{e.classList.add(v)})),this.resultVisible=!0)}static off(){this.resultVisible&&(u.innerHTML="",g.classList.contains(v)&&g.classList.remove(v),m.classList.add(v),d.forEach((e=>{e.classList.remove(v)})),f.textContent="",this.resultVisible=!1)}}function h(){return i.classList.contains(L)}s(y,"resultVisible",!1);const w=document.getElementsByClassName("collapse");!function(){const e=document.getElementById("back-to-top");window.addEventListener("scroll",(()=>{window.scrollY>50?e.classList.add("show"):e.classList.remove("show")})),e.addEventListener("click",(()=>{window.scrollTo({top:0})}))}(),[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].map((e=>new bootstrap.Tooltip(e))),e&&e.addEventListener("click",(()=>{modeToggle.flipMode()})),document.getElementById("sidebar-trigger").addEventListener("click",a.toggle),document.getElementById("mask").addEventListener("click",a.toggle),r.addEventListener("click",(()=>{p.on(),y.on(),f.focus()})),i.addEventListener("click",(()=>{p.off(),y.off()})),f.addEventListener("focus",(()=>{l.classList.add(E)})),f.addEventListener("focusout",(()=>{l.classList.remove(E)})),f.addEventListener("input",(()=>{""===f.value?h()?g.classList.remove(v):y.off():(y.on(),h()&&g.classList.add(v))})),[...w].forEach((e=>{const t="h_"+e.id.substring(2),s=document.getElementById(t);e.addEventListener("hide.bs.collapse",(()=>{s&&(s.querySelector(".far.fa-folder-open").className="far fa-folder fa-fw",s.querySelector(".fas.fa-angle-down").classList.add("rotate"),s.classList.remove("hide-border-bottom"))})),e.addEventListener("show.bs.collapse",(()=>{s&&(s.querySelector(".far.fa-folder").className="far fa-folder-open fa-fw",s.querySelector(".fas.fa-angle-down").classList.remove("rotate"),s.classList.add("hide-border-bottom"))}))}))}(); diff --git a/assets/js/dist/commons.min.js b/assets/js/dist/commons.min.js new file mode 100644 index 0000000..6d839dc --- /dev/null +++ b/assets/js/dist/commons.min.js @@ -0,0 +1,4 @@ +/*! + * Chirpy v6.5.5 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/ + */ +!function(){"use strict";const e=document.getElementById("mode-toggle");function t(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var s=e[Symbol.toPrimitive];if(void 0!==s){var i=s.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}function s(e,s,i){return(s=t(s))in e?Object.defineProperty(e,s,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[s]=i,e}const i="sidebar-display";class n{static toggle(){!1===n.isExpanded?document.body.setAttribute(i,""):document.body.removeAttribute(i),n.isExpanded=!n.isExpanded}}s(n,"isExpanded",!1);const o=document.getElementById("sidebar-trigger"),c=document.getElementById("search-trigger"),r=document.getElementById("search-cancel"),d=document.querySelectorAll("#main-wrapper>.container>.row"),a=document.getElementById("topbar-title"),l=document.getElementById("search"),u=document.getElementById("search-result-wrapper"),m=document.getElementById("search-results"),g=document.getElementById("search-input"),L=document.getElementById("search-hints"),f="d-block",v="d-none",E="input-focus",b="d-flex";class p{static on(){o.classList.add(v),a.classList.add(v),c.classList.add(v),l.classList.add(b),r.classList.add(f)}static off(){r.classList.remove(f),l.classList.remove(b),o.classList.remove(v),a.classList.remove(v),c.classList.remove(v)}}class y{static on(){this.resultVisible||(u.classList.remove(v),d.forEach((e=>{e.classList.add(v)})),this.resultVisible=!0)}static off(){this.resultVisible&&(m.innerHTML="",L.classList.contains(v)&&L.classList.remove(v),u.classList.add(v),d.forEach((e=>{e.classList.remove(v)})),g.textContent="",this.resultVisible=!1)}}function h(){return r.classList.contains(f)}s(y,"resultVisible",!1),function(){const e=document.getElementById("back-to-top");window.addEventListener("scroll",(()=>{window.scrollY>50?e.classList.add("show"):e.classList.remove("show")})),e.addEventListener("click",(()=>{window.scrollTo({top:0})}))}(),[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].map((e=>new bootstrap.Tooltip(e))),e&&e.addEventListener("click",(()=>{modeToggle.flipMode()})),document.getElementById("sidebar-trigger").addEventListener("click",n.toggle),document.getElementById("mask").addEventListener("click",n.toggle),c.addEventListener("click",(()=>{p.on(),y.on(),g.focus()})),r.addEventListener("click",(()=>{p.off(),y.off()})),g.addEventListener("focus",(()=>{l.classList.add(E)})),g.addEventListener("focusout",(()=>{l.classList.remove(E)})),g.addEventListener("input",(()=>{""===g.value?h()?L.classList.remove(v):y.off():(y.on(),h()&&L.classList.add(v))}))}(); diff --git a/assets/js/dist/home.min.js b/assets/js/dist/home.min.js new file mode 100644 index 0000000..0eb9cf6 --- /dev/null +++ b/assets/js/dist/home.min.js @@ -0,0 +1,4 @@ +/*! + * Chirpy v6.5.5 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/ + */ +!function(){"use strict";const t=document.getElementById("mode-toggle");function e(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var a=s.call(t,e||"default");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}function s(t,s,a){return(s=e(s))in t?Object.defineProperty(t,s,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[s]=a,t}const a="sidebar-display";class i{static toggle(){!1===i.isExpanded?document.body.setAttribute(a,""):document.body.removeAttribute(a),i.isExpanded=!i.isExpanded}}s(i,"isExpanded",!1);const r=document.getElementById("sidebar-trigger"),o=document.getElementById("search-trigger"),n=document.getElementById("search-cancel"),c=document.querySelectorAll("#main-wrapper>.container>.row"),l=document.getElementById("topbar-title"),d=document.getElementById("search"),m=document.getElementById("search-result-wrapper"),u=document.getElementById("search-results"),g=document.getElementById("search-input"),f=document.getElementById("search-hints"),b="d-block",E="d-none",p="input-focus",L="d-flex";class v{static on(){r.classList.add(E),l.classList.add(E),o.classList.add(E),d.classList.add(L),n.classList.add(b)}static off(){n.classList.remove(b),d.classList.remove(L),r.classList.remove(E),l.classList.remove(E),o.classList.remove(E)}}class h{static on(){this.resultVisible||(m.classList.remove(E),c.forEach((t=>{t.classList.add(E)})),this.resultVisible=!0)}static off(){this.resultVisible&&(u.innerHTML="",f.classList.contains(E)&&f.classList.remove(E),m.classList.add(E),c.forEach((t=>{t.classList.remove(E)})),g.textContent="",this.resultVisible=!1)}}function y(){return n.classList.contains(b)}s(h,"resultVisible",!1),document.getElementsByClassName("collapse");const A="data-src",w="data-lqip",I={SHIMMER:"shimmer",BLUR:"blur"};function B(t){this.parentElement.classList.remove(t)}function S(){this.complete&&(this.hasAttribute(w)?B.call(this,I.BLUR):B.call(this,I.SHIMMER))}function T(){const t=this.getAttribute(A);this.setAttribute("src",encodeURI(t)),this.removeAttribute(A)}class k{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(t){return Number(t.getAttribute(this.attrTimestamp))}static getDateFormat(t){return t.getAttribute(this.attrDateFormat)}}!function(){const t=document.getElementById("back-to-top");window.addEventListener("scroll",(()=>{window.scrollY>50?t.classList.add("show"):t.classList.remove("show")})),t.addEventListener("click",(()=>{window.scrollTo({top:0})}))}(),[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].map((t=>new bootstrap.Tooltip(t))),t&&t.addEventListener("click",(()=>{modeToggle.flipMode()})),document.getElementById("sidebar-trigger").addEventListener("click",i.toggle),document.getElementById("mask").addEventListener("click",i.toggle),o.addEventListener("click",(()=>{v.on(),h.on(),g.focus()})),n.addEventListener("click",(()=>{v.off(),h.off()})),g.addEventListener("focus",(()=>{d.classList.add(p)})),g.addEventListener("focusout",(()=>{d.classList.remove(p)})),g.addEventListener("input",(()=>{""===g.value?y()?f.classList.remove(E):h.off():(h.on(),y()&&f.classList.add(E))})),dayjs.locale(k.locale),dayjs.extend(window.dayjs_plugin_localizedFormat),document.querySelectorAll("[".concat(k.attrTimestamp,"]")).forEach((t=>{const e=dayjs.unix(k.getTimestamp(t)),s=e.format(k.getDateFormat(t));if(t.textContent=s,t.removeAttribute(k.attrTimestamp),t.removeAttribute(k.attrDateFormat),t.hasAttribute("data-bs-toggle")&&"tooltip"===t.getAttribute("data-bs-toggle")){const s=e.format("llll");t.setAttribute("data-bs-title",s)}})),function(){const t=document.querySelectorAll("article img");if(0===t.length)return;t.forEach((t=>{t.addEventListener("load",S)})),document.querySelectorAll('article img[loading="lazy"]').forEach((t=>{t.complete&&B.call(t,I.SHIMMER)}));const e=document.querySelectorAll("article img[".concat(w,'="true"]'));e.length&&e.forEach((t=>{T.call(t)}))}()}(); diff --git a/assets/js/dist/misc.min.js b/assets/js/dist/misc.min.js new file mode 100644 index 0000000..dea62e9 --- /dev/null +++ b/assets/js/dist/misc.min.js @@ -0,0 +1,4 @@ +/*! + * Chirpy v6.5.5 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/ + */ +!function(){"use strict";const t=document.getElementById("mode-toggle");function e(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var a=s.call(t,e||"default");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}function s(t,s,a){return(s=e(s))in t?Object.defineProperty(t,s,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[s]=a,t}const a="sidebar-display";class i{static toggle(){!1===i.isExpanded?document.body.setAttribute(a,""):document.body.removeAttribute(a),i.isExpanded=!i.isExpanded}}s(i,"isExpanded",!1);const o=document.getElementById("sidebar-trigger"),r=document.getElementById("search-trigger"),n=document.getElementById("search-cancel"),c=document.querySelectorAll("#main-wrapper>.container>.row"),l=document.getElementById("topbar-title"),d=document.getElementById("search"),m=document.getElementById("search-result-wrapper"),u=document.getElementById("search-results"),g=document.getElementById("search-input"),b=document.getElementById("search-hints"),f="d-block",p="d-none",v="input-focus",L="d-flex";class E{static on(){o.classList.add(p),l.classList.add(p),r.classList.add(p),d.classList.add(L),n.classList.add(f)}static off(){n.classList.remove(f),d.classList.remove(L),o.classList.remove(p),l.classList.remove(p),r.classList.remove(p)}}class y{static on(){this.resultVisible||(m.classList.remove(p),c.forEach((t=>{t.classList.add(p)})),this.resultVisible=!0)}static off(){this.resultVisible&&(u.innerHTML="",b.classList.contains(p)&&b.classList.remove(p),m.classList.add(p),c.forEach((t=>{t.classList.remove(p)})),g.textContent="",this.resultVisible=!1)}}function h(){return n.classList.contains(f)}s(y,"resultVisible",!1),document.getElementsByClassName("collapse");class w{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(t){return Number(t.getAttribute(this.attrTimestamp))}static getDateFormat(t){return t.getAttribute(this.attrDateFormat)}}!function(){const t=document.getElementById("back-to-top");window.addEventListener("scroll",(()=>{window.scrollY>50?t.classList.add("show"):t.classList.remove("show")})),t.addEventListener("click",(()=>{window.scrollTo({top:0})}))}(),[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].map((t=>new bootstrap.Tooltip(t))),t&&t.addEventListener("click",(()=>{modeToggle.flipMode()})),document.getElementById("sidebar-trigger").addEventListener("click",i.toggle),document.getElementById("mask").addEventListener("click",i.toggle),r.addEventListener("click",(()=>{E.on(),y.on(),g.focus()})),n.addEventListener("click",(()=>{E.off(),y.off()})),g.addEventListener("focus",(()=>{d.classList.add(v)})),g.addEventListener("focusout",(()=>{d.classList.remove(v)})),g.addEventListener("input",(()=>{""===g.value?h()?b.classList.remove(p):y.off():(y.on(),h()&&b.classList.add(p))})),dayjs.locale(w.locale),dayjs.extend(window.dayjs_plugin_localizedFormat),document.querySelectorAll("[".concat(w.attrTimestamp,"]")).forEach((t=>{const e=dayjs.unix(w.getTimestamp(t)),s=e.format(w.getDateFormat(t));if(t.textContent=s,t.removeAttribute(w.attrTimestamp),t.removeAttribute(w.attrDateFormat),t.hasAttribute("data-bs-toggle")&&"tooltip"===t.getAttribute("data-bs-toggle")){const s=e.format("llll");t.setAttribute("data-bs-title",s)}}))}(); diff --git a/assets/js/dist/page.min.js b/assets/js/dist/page.min.js new file mode 100644 index 0000000..cabfae4 --- /dev/null +++ b/assets/js/dist/page.min.js @@ -0,0 +1,4 @@ +/*! + * Chirpy v6.5.5 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/ + */ +!function(){"use strict";const t=document.getElementById("mode-toggle");function e(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var o=s.call(t,e||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}function s(t,s,o){return(s=e(s))in t?Object.defineProperty(t,s,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[s]=o,t}const o="sidebar-display";class n{static toggle(){!1===n.isExpanded?document.body.setAttribute(o,""):document.body.removeAttribute(o),n.isExpanded=!n.isExpanded}}s(n,"isExpanded",!1);const i=document.getElementById("sidebar-trigger"),c=document.getElementById("search-trigger"),r=document.getElementById("search-cancel"),l=document.querySelectorAll("#main-wrapper>.container>.row"),a=document.getElementById("topbar-title"),d=document.getElementById("search"),u=document.getElementById("search-result-wrapper"),m=document.getElementById("search-results"),g=document.getElementById("search-input"),b=document.getElementById("search-hints"),f="d-block",p="d-none",h="input-focus",E="d-flex";class v{static on(){i.classList.add(p),a.classList.add(p),c.classList.add(p),d.classList.add(E),r.classList.add(f)}static off(){r.classList.remove(f),d.classList.remove(E),i.classList.remove(p),a.classList.remove(p),c.classList.remove(p)}}class L{static on(){this.resultVisible||(u.classList.remove(p),l.forEach((t=>{t.classList.add(p)})),this.resultVisible=!0)}static off(){this.resultVisible&&(m.innerHTML="",b.classList.contains(p)&&b.classList.remove(p),u.classList.add(p),l.forEach((t=>{t.classList.remove(p)})),g.textContent="",this.resultVisible=!1)}}function y(){return r.classList.contains(f)}s(L,"resultVisible",!1),document.getElementsByClassName("collapse");const A=".code-header>button",w="far fa-clipboard",I="fas fa-check",B="timeout",S="data-title-succeed",T="data-bs-original-title",k=2e3;function x(t){if(t.hasAttribute(B)){let e=t.getAttribute(B);if(Number(e)>Date.now())return!0}return!1}function q(t){t.setAttribute(B,Date.now()+k)}function M(t){t.removeAttribute(B)}const R="data-src",N="data-lqip",V={SHIMMER:"shimmer",BLUR:"blur"};function C(t){this.parentElement.classList.remove(t)}function H(){this.complete&&(this.hasAttribute(N)?C.call(this,V.BLUR):C.call(this,V.SHIMMER))}function j(){const t=this.getAttribute(R);this.setAttribute("src",encodeURI(t)),this.removeAttribute(R)}const P="popup";!function(){const t=document.getElementById("back-to-top");window.addEventListener("scroll",(()=>{window.scrollY>50?t.classList.add("show"):t.classList.remove("show")})),t.addEventListener("click",(()=>{window.scrollTo({top:0})}))}(),[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].map((t=>new bootstrap.Tooltip(t))),t&&t.addEventListener("click",(()=>{modeToggle.flipMode()})),document.getElementById("sidebar-trigger").addEventListener("click",n.toggle),document.getElementById("mask").addEventListener("click",n.toggle),c.addEventListener("click",(()=>{v.on(),L.on(),g.focus()})),r.addEventListener("click",(()=>{v.off(),L.off()})),g.addEventListener("focus",(()=>{d.classList.add(h)})),g.addEventListener("focusout",(()=>{d.classList.remove(h)})),g.addEventListener("input",(()=>{""===g.value?y()?b.classList.remove(p):L.off():(L.on(),y()&&b.classList.add(p))})),function(){const t=document.querySelectorAll("article img");if(0===t.length)return;t.forEach((t=>{t.addEventListener("load",H)})),document.querySelectorAll('article img[loading="lazy"]').forEach((t=>{t.complete&&C.call(t,V.SHIMMER)}));const e=document.querySelectorAll("article img[".concat(N,'="true"]'));e.length&&e.forEach((t=>{j.call(t)}))}(),0!==document.getElementsByClassName(P).length&&GLightbox({selector:".".concat(P)}),function(){const t=document.querySelectorAll(A);if(0===t.length)return;const e=new ClipboardJS(A,{target:t=>t.parentNode.nextElementSibling.querySelector("code .rouge-code")});[...t].map((t=>new bootstrap.Tooltip(t,{placement:"left"}))),e.on("success",(t=>{const e=t.trigger;(t.clearSelection(),x(e))||(e.children[0].setAttribute("class",I),function(t){const e=t.getAttribute(S);t.setAttribute(T,e),bootstrap.Tooltip.getInstance(t).show()}(e),q(e),setTimeout((()=>{!function(t){bootstrap.Tooltip.getInstance(t).hide(),t.removeAttribute(T)}(e),function(t){t.children[0].setAttribute("class",w)}(e),M(e)}),k))}));const s=document.getElementById("copy-link");s.addEventListener("click",(t=>{const e=t.target;x(e)||navigator.clipboard.writeText(window.location.href).then((()=>{const t=e.getAttribute(T),s=e.getAttribute(S);e.setAttribute(T,s),bootstrap.Tooltip.getInstance(e).show(),q(e),setTimeout((()=>{e.setAttribute(T,t),M(e)}),k)}))})),s.addEventListener("mouseleave",(t=>{bootstrap.Tooltip.getInstance(t.target).hide()}))}()}(); diff --git a/assets/js/dist/post.min.js b/assets/js/dist/post.min.js new file mode 100644 index 0000000..12d741d --- /dev/null +++ b/assets/js/dist/post.min.js @@ -0,0 +1,4 @@ +/*! + * Chirpy v6.5.5 | © 2019 Cotes Chung | MIT Licensed | https://github.com/cotes2020/jekyll-theme-chirpy/ + */ +!function(){"use strict";const t=document.getElementById("mode-toggle");function e(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var o=t[Symbol.toPrimitive];if(void 0!==o){var s=o.call(t,e||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}function o(t,o,s){return(o=e(o))in t?Object.defineProperty(t,o,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[o]=s,t}const s="sidebar-display";class n{static toggle(){!1===n.isExpanded?document.body.setAttribute(s,""):document.body.removeAttribute(s),n.isExpanded=!n.isExpanded}}o(n,"isExpanded",!1);const i=document.getElementById("sidebar-trigger"),r=document.getElementById("search-trigger"),a=document.getElementById("search-cancel"),c=document.querySelectorAll("#main-wrapper>.container>.row"),l=document.getElementById("topbar-title"),d=document.getElementById("search"),u=document.getElementById("search-result-wrapper"),m=document.getElementById("search-results"),g=document.getElementById("search-input"),b=document.getElementById("search-hints"),f="d-block",p="d-none",h="input-focus",E="d-flex";class v{static on(){i.classList.add(p),l.classList.add(p),r.classList.add(p),d.classList.add(E),a.classList.add(f)}static off(){a.classList.remove(f),d.classList.remove(E),i.classList.remove(p),l.classList.remove(p),r.classList.remove(p)}}class L{static on(){this.resultVisible||(u.classList.remove(p),c.forEach((t=>{t.classList.add(p)})),this.resultVisible=!0)}static off(){this.resultVisible&&(m.innerHTML="",b.classList.contains(p)&&b.classList.remove(p),u.classList.add(p),c.forEach((t=>{t.classList.remove(p)})),g.textContent="",this.resultVisible=!1)}}function y(){return a.classList.contains(f)}o(L,"resultVisible",!1),document.getElementsByClassName("collapse");const A=".code-header>button",w="far fa-clipboard",I="fas fa-check",S="timeout",T="data-title-succeed",B="data-bs-original-title",k=2e3;function x(t){if(t.hasAttribute(S)){let e=t.getAttribute(S);if(Number(e)>Date.now())return!0}return!1}function q(t){t.setAttribute(S,Date.now()+k)}function M(t){t.removeAttribute(S)}const j="data-src",D="data-lqip",F={SHIMMER:"shimmer",BLUR:"blur"};function N(t){this.parentElement.classList.remove(t)}function R(){this.complete&&(this.hasAttribute(D)?N.call(this,F.BLUR):N.call(this,F.SHIMMER))}function C(){const t=this.getAttribute(j);this.setAttribute("src",encodeURI(t)),this.removeAttribute(j)}const V="popup";class H{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(t){return Number(t.getAttribute(this.attrTimestamp))}static getDateFormat(t){return t.getAttribute(this.attrDateFormat)}}t&&t.addEventListener("click",(()=>{modeToggle.flipMode()})),document.getElementById("sidebar-trigger").addEventListener("click",n.toggle),document.getElementById("mask").addEventListener("click",n.toggle),r.addEventListener("click",(()=>{v.on(),L.on(),g.focus()})),a.addEventListener("click",(()=>{v.off(),L.off()})),g.addEventListener("focus",(()=>{d.classList.add(h)})),g.addEventListener("focusout",(()=>{d.classList.remove(h)})),g.addEventListener("input",(()=>{""===g.value?y()?b.classList.remove(p):L.off():(L.on(),y()&&b.classList.add(p))})),function(){const t=document.querySelectorAll("article img");if(0===t.length)return;t.forEach((t=>{t.addEventListener("load",R)})),document.querySelectorAll('article img[loading="lazy"]').forEach((t=>{t.complete&&N.call(t,F.SHIMMER)}));const e=document.querySelectorAll("article img[".concat(D,'="true"]'));e.length&&e.forEach((t=>{C.call(t)}))}(),0!==document.getElementsByClassName(V).length&&GLightbox({selector:".".concat(V)}),dayjs.locale(H.locale),dayjs.extend(window.dayjs_plugin_localizedFormat),document.querySelectorAll("[".concat(H.attrTimestamp,"]")).forEach((t=>{const e=dayjs.unix(H.getTimestamp(t)),o=e.format(H.getDateFormat(t));if(t.textContent=o,t.removeAttribute(H.attrTimestamp),t.removeAttribute(H.attrDateFormat),t.hasAttribute("data-bs-toggle")&&"tooltip"===t.getAttribute("data-bs-toggle")){const o=e.format("llll");t.setAttribute("data-bs-title",o)}})),function(){const t=document.querySelectorAll(A);if(0===t.length)return;const e=new ClipboardJS(A,{target:t=>t.parentNode.nextElementSibling.querySelector("code .rouge-code")});[...t].map((t=>new bootstrap.Tooltip(t,{placement:"left"}))),e.on("success",(t=>{const e=t.trigger;(t.clearSelection(),x(e))||(e.children[0].setAttribute("class",I),function(t){const e=t.getAttribute(T);t.setAttribute(B,e),bootstrap.Tooltip.getInstance(t).show()}(e),q(e),setTimeout((()=>{!function(t){bootstrap.Tooltip.getInstance(t).hide(),t.removeAttribute(B)}(e),function(t){t.children[0].setAttribute("class",w)}(e),M(e)}),k))}));const o=document.getElementById("copy-link");o.addEventListener("click",(t=>{const e=t.target;x(e)||navigator.clipboard.writeText(window.location.href).then((()=>{const t=e.getAttribute(B),o=e.getAttribute(T);e.setAttribute(B,o),bootstrap.Tooltip.getInstance(e).show(),q(e),setTimeout((()=>{e.setAttribute(B,t),M(e)}),k)}))})),o.addEventListener("mouseleave",(t=>{bootstrap.Tooltip.getInstance(t.target).hide()}))}(),document.querySelector("main h2, main h3")&&tocbot.init({tocSelector:"#toc",contentSelector:".content",ignoreSelector:"[data-toc-skip]",headingSelector:"h2, h3, h4",orderedList:!1,scrollSmooth:!1}),function(){const t=document.getElementById("back-to-top");window.addEventListener("scroll",(()=>{window.scrollY>50?t.classList.add("show"):t.classList.remove("show")})),t.addEventListener("click",(()=>{window.scrollTo({top:0})}))}(),[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].map((t=>new bootstrap.Tooltip(t)))}(); diff --git a/_javascript/pwa/app.js b/assets/js/pwa/app.js similarity index 70% rename from _javascript/pwa/app.js rename to assets/js/pwa/app.js index 3c0ded2..173ea29 100644 --- a/_javascript/pwa/app.js +++ b/assets/js/pwa/app.js @@ -1,19 +1,19 @@ -import Toast from 'bootstrap/js/src/toast'; +--- +layout: compress +permalink: /assets/js/dist/:basename.min.js +--- 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'); + const isEnabled = '{{ site.pwa.enabled }}' === 'true'; - if (register) { - const swUrl = `${baseUrl}/sw.min.js`; + if (isEnabled) { + const swUrl = '{{ '/sw.min.js' | relative_url }}'; const notification = document.getElementById('notification'); const btnRefresh = notification.querySelector('.toast-body>button'); - const popupWindow = Toast.getOrCreateInstance(notification); + const popupWindow = bootstrap.Toast.getOrCreateInstance(notification); navigator.serviceWorker.register(swUrl).then((registration) => { - // Restore the update window that was last manually closed by the user + {% comment %}In case the user ignores the notification{% endcomment %} if (registration.waiting) { popupWindow.show(); } @@ -32,13 +32,14 @@ if ('serviceWorker' in navigator) { if (registration.waiting) { registration.waiting.postMessage('SKIP_WAITING'); } + popupWindow.hide(); }); }); let refreshing = false; - // Detect controller change and refresh all the opened tabs + {% comment %}Detect controller change and refresh all the opened tabs{% endcomment %} navigator.serviceWorker.addEventListener('controllerchange', () => { if (!refreshing) { window.location.reload(); diff --git a/_javascript/pwa/sw.js b/assets/js/pwa/sw.js similarity index 69% rename from _javascript/pwa/sw.js rename to assets/js/pwa/sw.js index ff9125d..adc707e 100644 --- a/_javascript/pwa/sw.js +++ b/assets/js/pwa/sw.js @@ -1,23 +1,32 @@ -importScripts('./assets/js/data/swconf.js'); +--- +layout: compress +permalink: /:basename.min.js +# PWA service worker +--- +const swconfUrl = '{{ '/assets/js/data/swconf.js' | relative_url }}'; + +importScripts(swconfUrl); const purge = swconf.purge; -const interceptor = swconf.interceptor; -function verifyUrl(url) { - const requestUrl = new URL(url); - const requestPath = requestUrl.pathname; +function verifyHost(url) { + for (const host of swconf.allowHosts) { + const regex = RegExp(`^http(s)?://${host}/`); + if (regex.test(url)) { + return true; + } + } + return false; +} - if (!requestUrl.protocol.startsWith('http')) { +function verifyUrl(url) { + if (!verifyHost(url)) { return false; } - for (const prefix of interceptor.urlPrefixes) { - if (requestUrl.href.startsWith(prefix)) { - return false; - } - } + const requestPath = new URL(url).pathname; - for (const path of interceptor.paths) { + for (const path of swconf.denyPaths) { if (requestPath.startsWith(path)) { return false; } @@ -25,6 +34,10 @@ function verifyUrl(url) { return true; } +if (!purge) { + swconf.allowHosts.push(location.host); +} + self.addEventListener('install', (event) => { if (purge) { return; @@ -62,10 +75,6 @@ self.addEventListener('message', (event) => { }); self.addEventListener('fetch', (event) => { - if (event.request.headers.has('range')) { - return; - } - event.respondWith( caches.match(event.request).then((response) => { if (response) { @@ -79,7 +88,7 @@ self.addEventListener('fetch', (event) => { return response; } - // See: + {% comment %}See: {% endcomment %} let responseToCache = response.clone(); caches.open(swconf.cacheName).then((cache) => { diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3c59cef..8f28580 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,86 +1,5 @@ # Changelog -## [7.1.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.1.0...v7.1.1) (2024-09-23) - -### Bug Fixes - -* **i18n:** correct fr-FR translations ([#1949](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1949)) ([367262e](https://github.com/cotes2020/jekyll-theme-chirpy/commit/367262e74d1005bddf1328bb2b3a2b9e152c0086)) -* **pwa:** site baseurl not passed to `app.js` ([#1955](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1955)) ([5a63244](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5a63244721d21b1ad3a0ae83420723a2f0379e8b)) - -## [7.1.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.0.1...v7.1.0) (2024-08-27) - -### Features - -* add Bluesky social links ([#1759](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1759)) ([0102aba](https://github.com/cotes2020/jekyll-theme-chirpy/commit/0102abae062be24ec289fb7facb11950aca79e3f)) -* add Reddit social option ([#1836](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1836)) ([8673e13](https://github.com/cotes2020/jekyll-theme-chirpy/commit/8673e1335f0771eac364d0a2866f27476d61a58b)) -* add Threads social links ([#1837](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1837)) ([e3a78b6](https://github.com/cotes2020/jekyll-theme-chirpy/commit/e3a78b6243f7056105d72185bb6e94b436834e5b)) -* **analytics:** add fathom analytics ([#1913](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1913)) ([befc4ce](https://github.com/cotes2020/jekyll-theme-chirpy/commit/befc4ce9c5026f67f99bce66e223d056229f0bdb)) -* **dev:** add vscode tasks ([#1843](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1843)) ([e4db1a1](https://github.com/cotes2020/jekyll-theme-chirpy/commit/e4db1a176f3f69f676cbc0bf27b1d5a657ece05e)) -* **dev:** support vscode dev-container ([#1781](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1781)) ([1e3d4a6](https://github.com/cotes2020/jekyll-theme-chirpy/commit/1e3d4a6323ba3eed06a57f8bf1b2edefd890b127)) -* **ui:** improve block quote layout ([80bd792](https://github.com/cotes2020/jekyll-theme-chirpy/commit/80bd7928a02c75c843a550bd377d11b574e8bfda)) -* **ui:** improve visibility of inline code ([#1831](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1831)) ([c876731](https://github.com/cotes2020/jekyll-theme-chirpy/commit/c876731901784a72ef9d2e9e2936df65ddff5f61)) -* **ui:** make `info-prompt` icon looks like the letter "i" ([#1835](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1835)) ([a07a57e](https://github.com/cotes2020/jekyll-theme-chirpy/commit/a07a57ec922249d3a22da56fbcb30d83eadef728)) -* **ui:** set `` font to 'Lato' ([64c7262](https://github.com/cotes2020/jekyll-theme-chirpy/commit/64c7262245e878534971a2e3a2630b614daf72f3)) - -### Bug Fixes - -* adapt the giscus localization parameter ([#1810](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1810)) ([0709854](https://github.com/cotes2020/jekyll-theme-chirpy/commit/0709854dc8f6099d38c2578967a02f73b4be0dc8)) -* avoid caching pageviews data ([#1849](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1849)) ([979f86c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/979f86cf64e1fcace4231fb070c7e6398fd4e5ec)) -* remove extra dual-mode images from lightbox ([#1883](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1883)) ([5c5910f](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5c5910f1fc661ec3dce203ac961c7f64f1991895)) - -## [7.0.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.0.0...v7.0.1) (2024-05-18) - -### Bug Fixes - -* **analytics:** goatcounter pv greater than 1K cannot be converted to numbers ([#1762](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1762)) ([33a1fa7](https://github.com/cotes2020/jekyll-theme-chirpy/commit/33a1fa7cae2181625e2f335708d59de4dd20ee7d)) -* audio/video path apply variable `media_subpath` ([#1745](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1745)) ([00a27a1](https://github.com/cotes2020/jekyll-theme-chirpy/commit/00a27a1b85f665d0642b77babd54c6903fbdeb22)) - -## [7.0.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v6.5.5...v7.0.0) (2024-05-11) - -### ⚠ BREAKING CHANGES - -* optimize the resource hints (#1717) -* rename media-url file and related parameters (#1651) -* rename comment setting parameter (#1563) -* **analytics:** add post pageviews for GoatCounter (#1543) - -### Features - -* add cloudflare web analytics ([#1723](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1723)) ([c17fba4](https://github.com/cotes2020/jekyll-theme-chirpy/commit/c17fba44f53767c9dfaa8d92cfc6e275e5977f8a)) -* add support for embed video files ([#1558](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1558)) ([9592146](https://github.com/cotes2020/jekyll-theme-chirpy/commit/9592146ca392236e69ee358412ecc32ef1662127)) -* add support for giscus strict title matching ([#1614](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1614)) ([700fd5b](https://github.com/cotes2020/jekyll-theme-chirpy/commit/700fd5bad7272dd950f861e8550215cd8fafb413)) -* **analytics:** add post pageviews for GoatCounter ([#1543](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1543)) ([b641b3f](https://github.com/cotes2020/jekyll-theme-chirpy/commit/b641b3f1f2e54bcfe96d8dff46d4f94186492d98)) -* **analytics:** add Umami and Matomo tracking codes ([#1658](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1658)) ([61bdca2](https://github.com/cotes2020/jekyll-theme-chirpy/commit/61bdca2db45179cd0d1b4b885a4c4864e3ffa3c1)) -* change site verification settings ([#1561](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1561)) ([e436387](https://github.com/cotes2020/jekyll-theme-chirpy/commit/e4363871b5be0608d2b92b8aff482825a8044c1b)) -* **deps:** move `MathJax` configuration to a separate file ([#1670](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1670)) ([44f552c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/44f552cbcee83d037de0e59496bf6bb19eea2691)) -* display theme version in footer ([#1611](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1611)) ([8349314](https://github.com/cotes2020/jekyll-theme-chirpy/commit/834931486dc3e5ed544ce4ff47cd1b2bc45f42fd)) -* **i18n:** allow `page.lang` to override `site.lang` ([#1586](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1586)) ([547b95c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/547b95cc7ae35018dadcc01b6eb1dc8c8943e67e)) -* make post description customizable ([#1602](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1602)) ([f865336](https://github.com/cotes2020/jekyll-theme-chirpy/commit/f865336c896e0db34edf8482a53e0e5d8f07ff95)) -* **media:** support audio and video tag with multi sources ([#1618](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1618)) ([23be416](https://github.com/cotes2020/jekyll-theme-chirpy/commit/23be4162b3f8598db14dc5b39726932ccf2cdc23)) - -### Bug Fixes - -* make TOC title and entries visible at the same time ([#1711](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1711)) ([e0950fc](https://github.com/cotes2020/jekyll-theme-chirpy/commit/e0950fc973d029dc65d0bc1bd68f3d11242527c8)) -* mode toggle not outlined when receiving keyboard focus ([#1690](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1690)) ([cd37f63](https://github.com/cotes2020/jekyll-theme-chirpy/commit/cd37f63a0144e0499ea991d3309da064ad5eccea)) -* prevent footnote back arrow from becoming an emoji ([#1716](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1716)) ([8608147](https://github.com/cotes2020/jekyll-theme-chirpy/commit/8608147fb5037804695d93496c62f96b9c41e9cd)) -* **pwa:** skip range requests in service worker ([#1672](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1672)) ([76d58fe](https://github.com/cotes2020/jekyll-theme-chirpy/commit/76d58fe0ffdc4bd1df35b60815e97560c3564700)) -* search result prompt is empty ([#1583](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1583)) ([8a2afae](https://github.com/cotes2020/jekyll-theme-chirpy/commit/8a2afae6cab8fc9639be0a866b71699c8a80084c)) -* use `https` for Weibo sharing URL ([#1612](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1612)) ([8e5fbb7](https://github.com/cotes2020/jekyll-theme-chirpy/commit/8e5fbb7a74d04a4b3cdde69bcc821f8ccd1a3bc0)) - -### Improvements - -* improve \
visibility in dark mode ([#1565](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1565)) ([4ddd5c4](https://github.com/cotes2020/jekyll-theme-chirpy/commit/4ddd5c437046a1e70cf396113e2351c452a25493)) -* lean bootstrap javascript ([#1734](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1734)) ([ddb48ed](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ddb48eda52827aae16aff720212d7b6d2d8647f9)) -* rename comment setting parameter ([#1563](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1563)) ([f8390d4](https://github.com/cotes2020/jekyll-theme-chirpy/commit/f8390d4384600fb015728b1b186570fa58ca216f)) -* replace jQuery with Vanilla JS ([#1681](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1681)) ([fe7afa3](https://github.com/cotes2020/jekyll-theme-chirpy/commit/fe7afa379f0af0ca98a207f85bdc0fa98575b1ad)) -* simplify mode toggle script ([#1692](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1692)) ([d4a6d64](https://github.com/cotes2020/jekyll-theme-chirpy/commit/d4a6d640bd6d4ab185faf96c0255369a9903ee1d)) -* tree shaking Bootstrap CSS ([#1736](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1736)) ([363a3d9](https://github.com/cotes2020/jekyll-theme-chirpy/commit/363a3d936bbd688fa4f28527e85ef7dd3fe3a79b)) - -### Changes - -* optimize the resource hints ([#1717](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1717)) ([dcb0add](https://github.com/cotes2020/jekyll-theme-chirpy/commit/dcb0add47bf1adf92215514f1ccfa4661d5215be)) -* rename media-url file and related parameters ([#1651](https://github.com/cotes2020/jekyll-theme-chirpy/issues/1651)) ([9f8aeaa](https://github.com/cotes2020/jekyll-theme-chirpy/commit/9f8aeaadbfef9967a9b0a9dd323d8bed46e14d9f)) - ## [6.5.5](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v6.5.4...v6.5.5) (2024-03-23) ### Bug Fixes diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 8d357fe..5a07d26 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -2,10 +2,10 @@ ## Supported Versions -| Version | Supported | -| :--------- | :-------: | -| >= `7.0.0` | ✓ | -| <= `6.0.0` | ✗ | +| Version | Supported | +|:----------|:---------:| +| `6.x` | ✓ | +| < `6.0.0` | ✗ | ## Reporting a Vulnerability diff --git a/jekyll-theme-chirpy.gemspec b/jekyll-theme-chirpy.gemspec index 9de7dd0..3b2335a 100644 --- a/jekyll-theme-chirpy.gemspec +++ b/jekyll-theme-chirpy.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |spec| spec.name = "jekyll-theme-chirpy" - spec.version = "7.1.1" + spec.version = "6.5.5" spec.authors = ["Cotes Chung"] spec.email = ["cotes.chung@gmail.com"] @@ -23,7 +23,7 @@ Gem::Specification.new do |spec| "plugin_type" => "theme" } - spec.required_ruby_version = "~> 3.1" + spec.required_ruby_version = ">= 3.0" spec.add_runtime_dependency "jekyll", "~> 4.3" spec.add_runtime_dependency "jekyll-paginate", "~> 1.1" diff --git a/package.json b/package.json index f93e76b..db95254 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jekyll-theme-chirpy", - "version": "7.1.1", + "version": "6.5.5", "description": "A minimal, responsive, and feature-rich Jekyll theme for technical writing.", "repository": { "type": "git", @@ -8,44 +8,36 @@ }, "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" + "prebuild": "npx rimraf assets/js/dist", + "build": "cross-env NODE_ENV=production npx rollup -c --bundleConfigAsCjs", + "prewatch": "npx rimraf assets/js/dist", + "watch": "npx rollup -c --bundleConfigAsCjs -w", + "test": "npx stylelint _sass/**/*.scss", + "fixlint": "npm run test -- --fix" }, "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", + "@babel/core": "^7.24.4", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/preset-env": "^7.24.4", + "@commitlint/cli": "^19.2.2", + "@commitlint/config-conventional": "^19.2.2", "@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", + "conventional-changelog-conventionalcommits": "^7.0.2", + "husky": "^9.0.11", + "rimraf": "^5.0.5", + "rollup": "^4.15.0", + "rollup-plugin-license": "^3.3.1", + "semantic-release": "^23.0.8", + "stylelint": "^16.3.1", "stylelint-config-standard-scss": "^13.1.0" }, "prettier": { @@ -156,8 +148,8 @@ [ "@semantic-release/exec", { - "prepareCmd": "bash tools/release.sh --prepare", - "publishCmd": "bash tools/release.sh" + "prepareCmd": "bash tools/release --prepare", + "publishCmd": "bash tools/release" } ], [ @@ -173,5 +165,8 @@ ], "@semantic-release/github" ] + }, + "dependencies": { + "cross-env": "^7.0.3" } } diff --git a/purgecss.config.js b/purgecss.config.js deleted file mode 100644 index de370de..0000000 --- a/purgecss.config.js +++ /dev/null @@ -1,23 +0,0 @@ -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 index 19ba4da..6226080 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,51 +1,23 @@ 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'; +import license from 'rollup-plugin-license'; +import path from 'path'; const SRC_DEFAULT = '_javascript'; -const SRC_PWA = `${SRC_DEFAULT}/pwa`; -const DIST = 'assets/js/dist'; +const DIST_DEFAULT = 'assets/js/dist'; +const isProd = process.env.NODE_ENV === 'production'; -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() { +function build(filename) { 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`, + input: [`${SRC_DEFAULT}/${filename}.js`], output: { - file: `${DIST}/${filename}.min.js`, + file: `${DIST_DEFAULT}/${filename}.min.js`, format: 'iife', name: 'Chirpy', - banner, - sourcemap: !isProd && !jekyll + sourcemap: !isProd }, watch: { - include: `${src}/**` + include: `${SRC_DEFAULT}/**` }, plugins: [ babel({ @@ -53,22 +25,22 @@ function build(filename, { src = SRC_DEFAULT, jekyll = false } = {}) { presets: ['@babel/env'], plugins: ['@babel/plugin-transform-class-properties'] }), - nodeResolve(), - isProd && terser(), - jekyll && insertFrontmatter() + license({ + banner: { + commentStyle: 'ignored', + content: { file: path.join(__dirname, SRC_DEFAULT, '_copyright') } + } + }), + isProd && terser() ] }; } -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 }) + build('misc') ]; diff --git a/tools/init.sh b/tools/init similarity index 61% rename from tools/init.sh rename to tools/init index 2ad72ab..dd15c69 100644 --- a/tools/init.sh +++ b/tools/init @@ -9,8 +9,6 @@ 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" @@ -30,7 +28,7 @@ help() { _sedi() { regex=$1 file=$2 - sed -i.$TEMP_SUFFIX -E "$regex" "$file" + sed -i.$TEMP_SUFFIX "$regex" "$file" rm -f "$file".$TEMP_SUFFIX } @@ -52,7 +50,22 @@ _check_status() { } _check_init() { - if [[ $(git rev-parse HEAD^1) == "$RELEASE_HASH" ]]; then + local _has_inited=false + + if [[ ! -d .github ]]; then # using option `--no-gh` + _has_inited=true + else + if [[ -f .github/workflows/$ACTIONS_WORKFLOW ]]; then + # on BSD, the `wc` could contains blank + local _count + _count=$(find .github/workflows/ -type f -name "*.yml" | wc -l) + if [[ ${_count//[[:blank:]]/} == 1 ]]; then + _has_inited=true + fi + fi + fi + + if $_has_inited; then echo "Already initialized." exit 0 fi @@ -64,46 +77,43 @@ check_env() { _check_init } -reset_latest() { - git reset --hard "$RELEASE_HASH" - git clean -fd - git submodule update --init --recursive +checkout_latest_release() { + hash=$(git log --grep="chore(release):" -1 --pretty="%H") + git reset --hard "$hash" } 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" \; + ## Change the files of `.github` + mv .github/workflows/starter/$ACTIONS_WORKFLOW . rm -rf .github && mkdir -p .github/workflows - mv "$temp/$ACTIONS_WORKFLOW" .github/workflows/"$ACTIONS_WORKFLOW" - rm -rf "$temp" - fi + mv ./$ACTIONS_WORKFLOW .github/workflows/${ACTIONS_WORKFLOW} - # Cleanup image settings in site config - _sedi "s/(^timezone:).*/\1/;s/(^.*cdn:).*/\1/;s/(^avatar:).*/\1/" _config.yml + ## Cleanup image settings in site config + _sedi "s/^cdn:.*/cdn:/;s/^avatar:.*/avatar:/" _config.yml + fi # remove the other files - rm -rf tools/init.sh tools/release.sh _posts/* + rm -rf _posts/* # build assets npm i && npm run build - # track the CSS/JS output - _sedi "/.*\/dist$/d" .gitignore + # track the js output + _sedi "/^assets.*\/dist/d" .gitignore } commit() { git add -A git commit -m "chore: initialize the environment" -q - echo -e "\n> Initialization successful!\n" + echo -e "\n[INFO] Initialization successful!\n" } main() { check_env - reset_latest + checkout_latest_release init_files commit } diff --git a/tools/release.sh b/tools/release similarity index 79% rename from tools/release.sh rename to tools/release index 522c892..90b1823 100644 --- a/tools/release.sh +++ b/tools/release @@ -15,7 +15,6 @@ NODE_SPEC="package.json" CHANGELOG="docs/CHANGELOG.md" CONFIG="_config.yml" -CSS_DIST="_sass/dist" JS_DIST="assets/js/dist" FILES=( @@ -37,7 +36,7 @@ help() { echo " 2. Merge the release branch into the default branch" echo echo "Usage:" - echo " bash $0 [options]" + echo " bash ./tools/release [options]" echo echo "Options:" echo " --prepare Preparation for release" @@ -56,13 +55,11 @@ _check_cli() { } _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 - ) + # 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 @@ -82,12 +79,17 @@ _check_src() { done } -init() { +_check_node_packages() { + if [[ ! -d node_modules || "$(du node_modules | awk '{print $1}')" == "0" ]]; then + npm i + fi +} + +check() { _check_cli _check_git _check_src - echo -e "> npm install\n" - npm i + _check_node_packages } ## Bump new version to gem-spec file @@ -111,20 +113,28 @@ prepare() { ## Build a Gem package build_gem() { + if $opt_pkg; then + BACKUP_PATH="$(mktemp -d)" + cp "$JS_DIST"/* "$BACKUP_PATH" + fi + # Remove unnecessary theme settings - sed -i -E "s/(^timezone:).*/\1/;s/(^cdn:).*/\1/;s/(^avatar:).*/\1/" $CONFIG + sed -i "s/^cdn:.*/cdn:/;s/^avatar:.*/avatar:/" $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" + git add "$JS_DIST" -f # add JS distribution files to gem gem build "$GEM_SPEC" - echo -e "\n> Resume file changes ...\n" + # resume the settings git reset git checkout . + + if $opt_pkg; then + # restore the dist files for future development + mkdir -p "$JS_DIST" && cp "$BACKUP_PATH"/* "$JS_DIST" + rm -rf "$BACKUP_PATH" + fi } # Push the gem to RubyGems.org (using $GEM_HOST_API_KEY) @@ -147,7 +157,7 @@ merge() { } main() { - init + check if $opt_pre; then prepare diff --git a/tools/run b/tools/run new file mode 100644 index 0000000..8072e41 --- /dev/null +++ b/tools/run @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +# +# Run jekyll serve and then launch the site + +bundle exec jekyll s -H 0.0.0.0 -l diff --git a/tools/run.sh b/tools/run.sh deleted file mode 100644 index 0efc452..0000000 --- a/tools/run.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/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 similarity index 95% rename from tools/test.sh rename to tools/test index 331de1c..9fa02ad 100644 --- a/tools/test.sh +++ b/tools/test @@ -19,7 +19,7 @@ help() { echo echo "Usage:" echo - echo " bash $0 [options]" + echo " bash ./tools/test [options]" echo echo "Options:" echo ' -c, --config "" Specify config file(s)' @@ -62,7 +62,7 @@ main() { # test bundle exec htmlproofer "$SITE_DIR" \ - --disable-external \ + --disable-external=true \ --ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/" }