master 9adb7e352b7d cached
219 files
395.1 KB
124.1k tokens
102 symbols
1 requests
Download .txt
Showing preview only (440K chars total). Download the full file or copy to clipboard to get everything.
Repository: cotes2020/jekyll-theme-chirpy
Branch: master
Commit: 9adb7e352b7d
Files: 219
Total size: 395.1 KB

Directory structure:
gitextract_gso752j0/

├── .devcontainer/
│   ├── devcontainer.json
│   └── post-create.sh
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── DISCUSSION_TEMPLATE/
│   │   ├── general.yml
│   │   ├── ideas.yml
│   │   └── q-a.yml
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── codeql/
│   │   └── codeql-config.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── cd.yml
│       ├── ci.yml
│       ├── codeql.yml
│       ├── commitlint.yml
│       ├── lint-js.yml
│       ├── lint-scss.yml
│       ├── pr-filter.yml
│       ├── publish.yml
│       ├── scripts/
│       │   └── pr-filter.js
│       ├── stale.yml
│       └── starter/
│           └── pages-deploy.yml
├── .gitignore
├── .gitmodules
├── .husky/
│   └── commit-msg
├── .markdownlint.json
├── .nojekyll
├── .stylelintrc.json
├── .vscode/
│   ├── extensions.json
│   ├── settings.json
│   └── tasks.json
├── Gemfile
├── LICENSE
├── README.md
├── _config.yml
├── _data/
│   ├── authors.yml
│   ├── contact.yml
│   ├── locales/
│   │   ├── ar.yml
│   │   ├── bg-BG.yml
│   │   ├── ca-ES.yml
│   │   ├── cs-CZ.yml
│   │   ├── da-DK.yml
│   │   ├── de-DE.yml
│   │   ├── dv‑MV.yml
│   │   ├── el-GR.yml
│   │   ├── en.yml
│   │   ├── es-ES.yml
│   │   ├── fa-IR.yml
│   │   ├── fi-FI.yml
│   │   ├── fr-FR.yml
│   │   ├── hu-HU.yml
│   │   ├── id-ID.yml
│   │   ├── it-IT.yml
│   │   ├── ja-JP.yml
│   │   ├── ko-KR.yml
│   │   ├── ku-IQ.yml
│   │   ├── my-MM.yml
│   │   ├── nl-NL.yml
│   │   ├── ps‑AF.yml
│   │   ├── pt-BR.yml
│   │   ├── ru-RU.yml
│   │   ├── sl-SI.yml
│   │   ├── sv-SE.yml
│   │   ├── th.yml
│   │   ├── tr-TR.yml
│   │   ├── uk-UA.yml
│   │   ├── ur-PK.yml
│   │   ├── vi-VN.yml
│   │   ├── zh-CN.yml
│   │   └── zh-TW.yml
│   ├── media.yml
│   ├── origin/
│   │   ├── basic.yml
│   │   └── cors.yml
│   └── share.yml
├── _includes/
│   ├── analytics/
│   │   ├── cloudflare.html
│   │   ├── fathom.html
│   │   ├── goatcounter.html
│   │   ├── google.html
│   │   ├── matomo.html
│   │   └── umami.html
│   ├── comment.html
│   ├── comments/
│   │   ├── disqus.html
│   │   ├── giscus.html
│   │   └── utterances.html
│   ├── datetime.html
│   ├── embed/
│   │   ├── audio.html
│   │   ├── bilibili.html
│   │   ├── spotify.html
│   │   ├── twitch.html
│   │   ├── video.html
│   │   └── youtube.html
│   ├── favicons.html
│   ├── footer.html
│   ├── head.html
│   ├── js-selector.html
│   ├── jsdelivr-combine.html
│   ├── lang.html
│   ├── language-alias.html
│   ├── media-url.html
│   ├── metadata-hook.html
│   ├── notification.html
│   ├── origin-type.html
│   ├── pageviews/
│   │   └── goatcounter.html
│   ├── post-nav.html
│   ├── post-paginator.html
│   ├── post-sharing.html
│   ├── post-summary.html
│   ├── read-time.html
│   ├── refactor-content.html
│   ├── related-posts.html
│   ├── search-loader.html
│   ├── search-results.html
│   ├── sidebar.html
│   ├── toc-status.html
│   ├── toc.html
│   ├── topbar.html
│   ├── trending-tags.html
│   └── update-list.html
├── _javascript/
│   ├── categories.js
│   ├── commons.js
│   ├── home.js
│   ├── misc.js
│   ├── modules/
│   │   ├── components/
│   │   │   ├── back-to-top.js
│   │   │   ├── category-collapse.js
│   │   │   ├── clipboard.js
│   │   │   ├── img-loading.js
│   │   │   ├── img-popup.js
│   │   │   ├── locale-datetime.js
│   │   │   ├── mermaid.js
│   │   │   ├── mode-toggle.js
│   │   │   ├── search-display.js
│   │   │   ├── toc/
│   │   │   │   ├── toc-desktop.js
│   │   │   │   └── toc-mobile.js
│   │   │   ├── toc.js
│   │   │   └── tooltip-loader.js
│   │   ├── components.js
│   │   ├── layouts/
│   │   │   ├── basic.js
│   │   │   ├── sidebar.js
│   │   │   └── topbar.js
│   │   └── layouts.js
│   ├── page.js
│   ├── post.js
│   ├── pwa/
│   │   ├── app.js
│   │   └── sw.js
│   └── theme.js
├── _layouts/
│   ├── archives.html
│   ├── categories.html
│   ├── category.html
│   ├── compress.html
│   ├── default.html
│   ├── home.html
│   ├── page.html
│   ├── post.html
│   ├── tag.html
│   └── tags.html
├── _plugins/
│   └── posts-lastmod-hook.rb
├── _posts/
│   ├── 2019-08-08-text-and-typography.md
│   ├── 2019-08-08-write-a-new-post.md
│   ├── 2019-08-09-getting-started.md
│   └── 2019-08-11-customize-the-favicon.md
├── _sass/
│   ├── abstracts/
│   │   ├── _breakpoints.scss
│   │   ├── _index.scss
│   │   ├── _mixins.scss
│   │   ├── _placeholders.scss
│   │   └── _variables.scss
│   ├── base/
│   │   ├── _base.scss
│   │   ├── _index.scss
│   │   ├── _reset.scss
│   │   ├── _syntax.scss
│   │   └── _typography.scss
│   ├── components/
│   │   ├── _buttons.scss
│   │   ├── _index.scss
│   │   └── _popups.scss
│   ├── layout/
│   │   ├── _footer.scss
│   │   ├── _index.scss
│   │   ├── _panel.scss
│   │   ├── _sidebar.scss
│   │   └── _topbar.scss
│   ├── main.bundle.scss
│   ├── main.scss
│   ├── pages/
│   │   ├── _archives.scss
│   │   ├── _categories.scss
│   │   ├── _category-tag.scss
│   │   ├── _home.scss
│   │   ├── _index.scss
│   │   ├── _post.scss
│   │   ├── _search.scss
│   │   └── _tags.scss
│   └── themes/
│       ├── _dark.scss
│       └── _light.scss
├── _tabs/
│   ├── about.md
│   ├── archives.md
│   ├── categories.md
│   └── tags.md
├── assets/
│   ├── 404.html
│   ├── css/
│   │   └── jekyll-theme-chirpy.scss
│   ├── feed.xml
│   ├── img/
│   │   └── favicons/
│   │       └── site.webmanifest
│   ├── js/
│   │   └── data/
│   │       ├── mathjax.js
│   │       ├── search.json
│   │       └── swconf.js
│   └── robots.txt
├── docs/
│   ├── CHANGELOG.md
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   └── SECURITY.md
├── eslint.config.js
├── index.html
├── jekyll-theme-chirpy.gemspec
├── package.json
├── purgecss.js
├── rollup.config.js
└── tools/
    ├── init.sh
    ├── release.sh
    ├── run.sh
    └── test.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
  "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"
      ]
    }
  }
}


================================================
FILE: .devcontainer/post-create.sh
================================================
#!/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


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
# Unix-style newlines with a newline ending every file
end_of_line = lf
insert_final_newline = true

[*.{js,css,scss}]
quote_type = single

[*.{yml,yaml}]
quote_type = double

[*.md]
trim_trailing_whitespace = false


================================================
FILE: .gitattributes
================================================
# Set default behavior to automatically normalize line endings.
* text=auto

# Force bash scripts to always use LF line endings so that if a repo is accessed
# in Unix via a file share from Windows, the scripts will work.
*.sh text eol=lf

# Force batch scripts to always use CRLF line endings so that if a repo is accessed
# in Windows via a file share from Linux, the scripts will work.
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.ico binary


================================================
FILE: .github/DISCUSSION_TEMPLATE/general.yml
================================================
body:
  - type: checkboxes
    attributes:
      label: Checklist
      description: Following the guidelines can make you more likely to get responses.
      options:
        - label: >-
            I have read and accepted the
            [contributing guidelines](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md).
          required: true

  - type: textarea
    attributes:
      label: Description
      description: Please describe in detail what you want to share.
    validations:
      required: true


================================================
FILE: .github/DISCUSSION_TEMPLATE/ideas.yml
================================================
body:
  - type: textarea
    attributes:
      label: Description
      description: Please describe in detail what you want to share.
    validations:
      required: true


================================================
FILE: .github/DISCUSSION_TEMPLATE/q-a.yml
================================================
body:
  - type: checkboxes
    attributes:
      label: Checklist
      description: Following the guidelines can make you more likely to get responses.
      options:
        - label: >-
            I have read and accepted the
            [contributing guidelines](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md).
          required: true

  - type: dropdown
    id: download
    attributes:
      label: How did you create the site?
      options:
        - Generated from `chirpy-starter`
        - Built from `jekyll-theme-chirpy`
    validations:
      required: true

  - type: textarea
    attributes:
      label: Description
      description: Please describe your need in detail.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Operations you have already tried
      description: Describe the effort you went through.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Anything else?
      description: |
        Links? References? Or logs? Anything that will give us more context about the issue you are encountering!


================================================
FILE: .github/FUNDING.yml
================================================
ko_fi: coteschung


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Create a report to help us improve
body:
  - type: checkboxes
    attributes:
      label: Checklist
      description: Following the guidelines can make you more likely to get responses.
      options:
        - label: >-
            I have read and accepted the
            [contributing guidelines](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md).
          required: true

  - type: dropdown
    id: download
    attributes:
      label: How did you create the site?
      options:
        - Generated from `chirpy-starter`
        - Built from `jekyll-theme-chirpy`
    validations:
      required: true

  - type: textarea
    attributes:
      label: Describe the bug
      description: A clear and concise description of what the bug is.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Steps To Reproduce
      description: Steps to reproduce the behavior.
      placeholder: |
        1. In this environment...
        2. With this config...
        3. Run '...'
        4. See error...
    validations:
      required: true

  - type: textarea
    attributes:
      label: Expected Behavior
      description: A concise description of what you expected to happen.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Environment
      value: |
        - Ruby: <!-- run `ruby -v` -->
        - Jekyll: <!-- run `bundle exec jekyll -v` -->
        - Chirpy: <!-- run `bundle info jekyll-theme-chirpy` -->
    validations:
      required: true

  - type: textarea
    attributes:
      label: Anything else?
      description: |
        Links? References? Or logs? Anything that will give us more context about the issue you are encountering!


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Ask the community for help
    url: https://github.com/cotes2020/jekyll-theme-chirpy/discussions
    about: Please ask and answer questions here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest an idea for this project
labels:
  - enhancement
body:
  - type: checkboxes
    attributes:
      label: Checklist
      description: Following the guidelines can make you more likely to get responses.
      options:
        - label: >-
            I have read and accepted the
            [contributing guidelines](https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md).
          required: true

  - type: textarea
    attributes:
      label: Is your feature request related to a problem? Please describe
      description: A clear and concise description of what the problem is.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Describe the solution you'd like
      description: A clear and concise description of what you want to happen.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Describe alternatives you've considered
      description: A clear and concise description of any alternative solutions or features you've considered.

  - type: textarea
    attributes:
      label: Additional context
      description: Add any other context or screenshots about the feature request here.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Type of change
<!-- Please select the desired item checkbox and change it from `[ ]` to `[x]` and then delete the irrelevant options. -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Improvement (refactoring and improving code)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update

## Description
<!--
  Please include a summary of the change and which issue is fixed. 
  Please also include relevant motivation and context. 
  List any dependencies that are required for this change.
-->

## Additional context
<!-- e.g. Fixes #(issue) -->


================================================
FILE: .github/codeql/codeql-config.yml
================================================
paths-ignore:
  - "assets/js"


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "bundler"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "npm"
    directory: "/"
    versioning-strategy: increase
    groups:
      prod-deps:
        dependency-type: production
      dev-deps:
        dependency-type: development
    schedule:
      interval: "weekly"
  - package-ecosystem: "github-actions"
    directories:
      - "/.github/workflows/**"
    groups:
      gh-actions:
        update-types:
          - "major"
    schedule:
      interval: "weekly"
  - package-ecosystem: "devcontainers"
    directory: "/"
    schedule:
      interval: weekly


================================================
FILE: .github/workflows/cd.yml
================================================
name: CD

on:
  push:
    branches: [production]
    tags-ignore: ["**"]

jobs:
  release:
    if: ${{ ! startsWith(github.event.head_commit.message, 'chore(release)') }}
    permissions:
      contents: write
      issues: write
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.4
          bundler-cache: true

      - uses: actions/setup-node@v6
        with:
          node-version: lts/*

      - run: npm install
      - run: npx semantic-release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GEM_HOST_API_KEY: ${{ secrets.GEM_HOST_API_KEY }}

  publish:
    needs: release
    uses: ./.github/workflows/publish.yml
    secrets:
      GH_PAT: ${{ secrets.GH_PAT }}
      BUILDER: ${{ secrets.BUILDER }}


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches:
      - master
      - "hotfix/*"
    paths-ignore:
      - ".github/**"
      - "!.github/workflows/ci.yml"
      - .gitignore
      - "docs/**"
      - README.md
      - LICENSE
  pull_request:
    paths-ignore:
      - ".github/**"
      - "!.github/workflows/ci.yml"
      - .gitignore
      - "docs/**"
      - README.md
      - LICENSE

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        ruby: ["3.3", "3.4"]

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0 # for posts's lastmod

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true

      - name: Setup Node
        uses: actions/setup-node@v6
        with:
          node-version: lts/*

      - name: Build Assets
        run: npm i && npm run build

      - name: Test Site
        run: bash tools/test.sh


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"

on:
  push:
    branches: ["master"]
    paths: ["_javascript/**/*.js"]
  pull_request:
    paths: ["_javascript/**/*.js"]

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: ["javascript"]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: "${{ matrix.language }}"
          config-file: .github/codeql/codeql-config.yml

      # Autobuild attempts to build any compiled languages  (C/C++, C#, Go, or Java).
      # If this step fails, then you should remove it and run the build manually (see below)
      - name: Autobuild
        uses: github/codeql-action/autobuild@v4

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:${{ matrix.language }}"


================================================
FILE: .github/workflows/commitlint.yml
================================================
name: Lint Commit Messages

on:
  push:
    branches:
      - master
      - "hotfix/*"
  pull_request:

jobs:
  commitlint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: wagoid/commitlint-github-action@v6


================================================
FILE: .github/workflows/lint-js.yml
================================================
name: Lint JS

on:
  push:
    paths:
      - "_javascript/**/*.js"
      - ".github/workflows/scripts/**/*.js"
      - "*.js"
  pull_request:
    paths:
      - "_javascript/**/*.js"
      - ".github/workflows/scripts/*.js"
      - "*.js"

jobs:
  lint-js:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: lts/*

      - name: Install Dependencies
        run: npm i

      - name: Lint JS
        run: npm run lint:js


================================================
FILE: .github/workflows/lint-scss.yml
================================================
name: Lint SCSS

on:
  push:
    paths:
      - "_sass/**/*.scss"
  pull_request:
    paths:
      - "_sass/**/*.scss"

jobs:
  lint-scss:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: lts/*

      - name: Install Dependencies
        run: npm i

      - name: Lint SCSS
        run: npm run lint:scss


================================================
FILE: .github/workflows/pr-filter.yml
================================================
name: PR Filter

on:
  pull_request_target:
    types: [opened, reopened]

jobs:
  check-template:
    if: github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write

    steps:
      - name: Checkout Code
        uses: actions/checkout@v6

      - name: Check PR Content
        id: intercept
        uses: actions/github-script@v8
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const { default: filter } = await import('${{ github.workspace }}/.github/workflows/scripts/pr-filter.js');
            await filter({ github, context, core });


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish

on:
  push:
    branches:
      - docs
  workflow_call:
    secrets:
      GH_PAT:
        required: true
      BUILDER:
        required: true
  workflow_dispatch:

jobs:
  launch:
    runs-on: ubuntu-latest
    steps:
      - run: |
          curl -X POST -H "Accept: application/vnd.github+json" \
            -H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
            https://api.github.com/repos/${{ secrets.BUILDER }}/dispatches \
            -d '{"event_type":"deploy", "client_payload":{"branch": "${{ github.ref_name }}"}}'


================================================
FILE: .github/workflows/scripts/pr-filter.js
================================================
function hasTypes(markdown) {
  return /## Type of change/.test(markdown) && /-\s\[x\]/i.test(markdown);
}

function hasDescription(markdown) {
  return (
    /## Description/.test(markdown) &&
    !/## Description\s*\n\s*(##|\s*$)/.test(markdown)
  );
}

export default async ({ github, context, core }) => {
  const pr = context.payload.pull_request;
  const body = pr.body === null ? '' : pr.body;
  const markdown = body.replace(/<!--[\s\S]*?-->/g, '');
  const action = context.payload.action;

  const isValid =
    markdown !== '' && hasTypes(markdown) && hasDescription(markdown);

  if (!isValid) {
    await github.rest.pulls.update({
      ...context.repo,
      pull_number: pr.number,
      state: 'closed'
    });

    await github.rest.issues.createComment({
      ...context.repo,
      issue_number: pr.number,
      body: `Oops, it seems you've ${action} an invalid pull request. No worries, we'll close it for you.`
    });

    core.setFailed('PR content does not meet template requirements.');
  }
};


================================================
FILE: .github/workflows/stale.yml
================================================
name: "Close stale issues and PRs"

on:
  schedule:
    - cron: "0 0 * * *" # every day at 00:00 UTC

permissions:
  issues: write
  pull-requests: write

env:
  STALE_LABEL: inactive
  EXEMPT_LABELS: "pending,planning,in progress"
  MESSAGE: >
    This conversation has been automatically marked as stale because it has not had recent activity.
    It will be closed if no further activity occurs.
    Thank you for your contributions.

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          # 60 days before marking issues/PRs stale
          days-before-close: -1 # does not close automatically
          stale-issue-label: ${{ env.STALE_LABEL }}
          exempt-issue-labels: ${{ env.EXEMPT_LABELS }}
          stale-issue-message: ${{ env.MESSAGE }}
          stale-pr-label: ${{ env.STALE_LABEL }}
          exempt-pr-labels: ${{ env.EXEMPT_LABELS }}
          stale-pr-message: ${{ env.MESSAGE }}


================================================
FILE: .github/workflows/starter/pages-deploy.yml
================================================
name: "Build and Deploy"
on:
  push:
    branches:
      - main
      - master
    paths-ignore:
      - .gitignore
      - README.md
      - LICENSE

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

# Allow one concurrent deployment
concurrency:
  group: "pages"
  cancel-in-progress: true

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          # submodules: true
          # If using the 'assets' git submodule from Chirpy Starter, uncomment above
          # (See: https://github.com/cotes2020/chirpy-starter/tree/main/assets)

      - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v5

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.4
          bundler-cache: true

      - name: Build site
        run: bundle exec jekyll b -d "_site${{ steps.pages.outputs.base_path }}"
        env:
          JEKYLL_ENV: "production"

      - name: Test site
        run: |
          bundle exec htmlproofer _site \
            \-\-disable-external \
            \-\-ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/"

      - name: Upload site artifact
        uses: actions/upload-pages-artifact@v4
        with:
          path: "_site${{ steps.pages.outputs.base_path }}"

  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


================================================
FILE: .gitignore
================================================
# Bundler cache
.bundle
vendor
Gemfile.lock

# Jekyll cache
.jekyll-cache
.jekyll-metadata
_site

# RubyGems
*.gem

# NPM dependencies
node_modules
package-lock.json

# IDE configurations
.idea
.vscode/*
!.vscode/settings.json
!.vscode/extensions.json
!.vscode/tasks.json

# Misc
_sass/vendors
assets/js/dist


================================================
FILE: .gitmodules
================================================
[submodule "assets/lib"]
	path = assets/lib
	url = https://github.com/cotes2020/chirpy-static-assets.git


================================================
FILE: .husky/commit-msg
================================================
npx --no -- commitlint --edit $1


================================================
FILE: .markdownlint.json
================================================
{
  "commands-show-output": false,
  "blanks-around-fences": false,
  "line-length": false,
  "no-inline-html": {
    "allowed_elements": ["kbd", "sub"]
  }
}


================================================
FILE: .nojekyll
================================================


================================================
FILE: .stylelintrc.json
================================================
{
  "ignoreFiles": ["_sass/vendors/**"],
  "extends": "stylelint-config-standard-scss",
  "rules": {
    "no-descending-specificity": null,
    "shorthand-property-no-redundant-values": null,
    "at-rule-no-vendor-prefix": null,
    "property-no-vendor-prefix": null,
    "selector-no-vendor-prefix": null,
    "value-no-vendor-prefix": null,
    "selector-not-notation": "simple",
    "color-hex-length": "long",
    "declaration-block-single-line-max-declarations": 3,
    "scss/operator-no-newline-after": null,
    "rule-empty-line-before": [
      "always",
      {
        "ignore": ["after-comment", "first-nested"]
      }
    ],
    "value-keyword-case": [
      "lower",
      {
        "ignoreProperties": ["/^\\$/"]
      }
    ],
    "media-feature-range-notation": "prefix"
  }
}


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": ["ms-vscode-remote.remote-containers"]
}


================================================
FILE: .vscode/settings.json
================================================
{
  // Prettier
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  // Shopify Liquid
  "files.associations": {
    "*.html": "liquid"
  },
  "[markdown]": {
    "editor.defaultFormatter": "yzhang.markdown-all-in-one"
  },
  // Formatter
  "[html][liquid]": {
    "editor.defaultFormatter": "Shopify.theme-check-vscode"
  },
  "[shellscript]": {
    "editor.defaultFormatter": "mkhl.shfmt"
  },
  // Disable vscode built-in stylelint
  "css.validate": false,
  "scss.validate": false,
  "less.validate": false,
  // Stylint extension settings
  "stylelint.snippet": ["css", "scss"],
  "stylelint.validate": ["css", "scss"],
  // Run tasks in macOS
  "terminal.integrated.profiles.osx": {
    "zsh": { "path": "/bin/zsh", "args": ["-l", "-i"] }
  }
}


================================================
FILE: .vscode/tasks.json
================================================
{
  "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."
    }
  ]
}


================================================
FILE: Gemfile
================================================
# frozen_string_literal: true

source "https://rubygems.org"

gemspec

gem "html-proofer", "~> 5.0", group: :test

platforms :windows, :jruby do
  gem "tzinfo", ">= 1", "< 3"
  gem "tzinfo-data"
end

gem "wdm", "~> 0.2.0", :platforms => [:windows]


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2019 Cotes Chung

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<!-- markdownlint-disable-next-line -->
<div align="center">

  <!-- markdownlint-disable-next-line -->
  # Chirpy Jekyll Theme

  A minimal, responsive, and feature-rich Jekyll theme for technical writing.

  [![CI](https://img.shields.io/github/actions/workflow/status/cotes2020/jekyll-theme-chirpy/ci.yml?logo=github)][ci]&nbsp;
  [![Codacy Badge](https://img.shields.io/codacy/grade/4e556876a3c54d5e8f2d2857c4f43894?logo=codacy)][codacy]&nbsp;
  [![GitHub license](https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy?color=goldenrod)][license]&nbsp;
  [![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy?&logo=RubyGems&logoColor=ghostwhite&label=gem&color=orange)][gem]&nbsp;
  [![Open in Dev Containers](https://img.shields.io/badge/Dev_Containers-Open-deepskyblue?logo=linuxcontainers)][open-container]

  [**Live Demo** →][demo]

  [![Devices Mockup](https://chirpy-img.netlify.app/commons/devices-mockup.png)][demo]

</div>

## Features

- Dark Theme
- Localized UI language
- Pinned Posts on Home Page
- Hierarchical Categories
- Trending Tags
- Table of Contents
- Last Modified Date
- Syntax Highlighting
- Mathematical Expressions
- Mermaid Diagrams & Flowcharts
- Dark Mode Images
- Embed Media
- Comment Systems
- Built-in Search
- Atom Feeds
- PWA
- Web Analytics
- SEO & Performance Optimization

## Documentation

To learn how to use, develop, and upgrade the project, please refer to the [Wiki][wiki].

## Contributing

Contributions (_pull requests_, _issues_, and _discussions_) are what make the open-source community such an amazing place
to learn, inspire, and create. Any contributions you make are greatly appreciated.
For details, see the "[Contributing Guidelines][contribute-guide]".

## Credits

### Contributors

Thanks to [all the contributors][contributors] involved in the development of the project!

[![all-contributors](https://contrib.rocks/image?repo=cotes2020/jekyll-theme-chirpy&columns=16)][contributors]
<sub> — Made with [contrib.rocks](https://contrib.rocks)</sub>

### Third-Party Assets

This project is built on the [Jekyll][jekyllrb] ecosystem and some [great libraries][lib], and is developed using [VS Code][vscode] as well as tools provided by [JetBrains][jetbrains] under a non-commercial open-source software license.

The avatar and favicon for the project's website are from [ClipartMAX][clipartmax].

## License

This project is published under [MIT License][license].

[gem]: https://rubygems.org/gems/jekyll-theme-chirpy
[ci]: https://github.com/cotes2020/jekyll-theme-chirpy/actions/workflows/ci.yml?query=event%3Apush+branch%3Amaster
[codacy]: https://app.codacy.com/gh/cotes2020/jekyll-theme-chirpy/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade
[license]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/LICENSE
[open-container]: https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/cotes2020/jekyll-theme-chirpy
[jekyllrb]: https://jekyllrb.com/
[clipartmax]: https://www.clipartmax.com/middle/m2i8b1m2K9Z5m2K9_ant-clipart-childrens-ant-cute/
[demo]: https://cotes2020.github.io/chirpy-demo/
[wiki]: https://github.com/cotes2020/jekyll-theme-chirpy/wiki
[contribute-guide]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md
[contributors]: https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors
[lib]: https://github.com/cotes2020/chirpy-static-assets
[vscode]: https://code.visualstudio.com/
[jetbrains]: https://www.jetbrains.com/?from=jekyll-theme-chirpy


================================================
FILE: _config.yml
================================================
# The Site Configuration

# Import the theme
theme: jekyll-theme-chirpy

# The language of the webpage › http://www.lingoes.net/en/translator/langcode.htm
# If it has the same name as one of the files in folder `_data/locales`, the layout language will also be changed,
# otherwise, the layout language will use the default value of 'en'.
lang: en

# Change to your timezone › https://zones.arilyn.cc
timezone: Asia/Shanghai

# jekyll-seo-tag settings › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
# ↓ --------------------------

title: Chirpy # the main title

tagline: A text-focused Jekyll theme # it will display as the subtitle

description: >- # used by seo meta and the atom feed
  A minimal, responsive and feature-rich Jekyll theme for technical writing.

# Fill in the protocol & hostname for your site.
# E.g. 'https://username.github.io', note that it does not end with a '/'.
url: ""

github:
  username: github_username # change to your GitHub username

twitter:
  username: twitter_username # change to your Twitter username

social:
  # Change to your full name.
  # It will be displayed as the default author of the posts and the copyright owner in the Footer
  name: your_full_name
  email: example@domain.com # change to your email address
  fediverse_handle: # fill in your fediverse handle. E.g. "@username@domain.com"
  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
    # Uncomment below to add more social links
    # - https://www.facebook.com/username
    # - https://www.linkedin.com/in/username

# Site Verification Settings
webmaster_verifications:
  google: # fill in your Google verification code
  bing: # fill in your Bing verification code
  alexa: # fill in your Alexa verification code
  yandex: # fill in your Yandex verification code
  baidu: # fill in your Baidu verification code
  facebook: # fill in your Facebook verification code

# ↑ --------------------------
# The end of `jekyll-seo-tag` settings

# Web Analytics Settings
analytics:
  google:
    id: # fill in your Google Analytics ID
  goatcounter:
    id: # fill in your GoatCounter ID
  umami:
    id: # fill in your Umami ID
    domain: # fill in your Umami domain
  matomo:
    id: # fill in your Matomo ID
    domain: # fill in your Matomo domain
  cloudflare:
    id: # fill in your Cloudflare Web Analytics token
  fathom:
    id: # fill in your Fathom Site ID

# Page views settings
pageviews:
  provider: # now only supports 'goatcounter'

# Prefer color scheme setting.
#
# Note: Keep empty will follow the system prefer color by default,
# and there will be a toggle to switch the theme between dark and light
# on the bottom left of the sidebar.
#
# Available options:
#
#     light — Use the light color scheme
#     dark — Use the dark color scheme
#
theme_mode: # [light | dark]

# The CDN endpoint for media resources.
# Notice that once it is assigned, the CDN url
# will be added to all media resources (site avatar, posts' images, audio and video files) paths starting with '/'
#
# e.g. 'https://cdn.com'
cdn: "https://chirpy-img.netlify.app"

# the avatar on sidebar, support local or CORS resources
avatar: "/commons/avatar.jpg"

# The URL of the site-wide social preview image used in SEO `og:image` meta tag.
# It can be overridden by a customized `page.image` in front matter.
social_preview_image: # string, local or CORS resources

# boolean type, the global switch for TOC in posts.
toc: true

comments:
  # Global switch for the post-comment system. Keeping it empty means disabled.
  provider: # [disqus | utterances | giscus]
  # The provider options are as follows:
  disqus:
    shortname: # fill with the Disqus shortname. › https://help.disqus.com/en/articles/1717111-what-s-a-shortname
  # utterances settings › https://utteranc.es/
  utterances:
    repo: # <gh-username>/<repo>
    issue_term: # < url | pathname | title | ...>
  # Giscus options › https://giscus.app
  giscus:
    repo: # <gh-username>/<repo>
    repo_id:
    category:
    category_id:
    mapping: # optional, default to 'pathname'
    strict: # optional, default to '0'
    input_position: # optional, default to 'bottom'
    lang: # optional, default to the value of `site.lang`
    reactions_enabled: # optional, default to the value of `1`

# Self-hosted static assets, optional › https://github.com/cotes2020/chirpy-static-assets
assets:
  self_host:
    enabled: # boolean, keep empty means false
    # specify the Jekyll environment, empty means both
    # only works if `assets.self_host.enabled` is 'true'
    env: # [development | production]

pwa:
  enabled: true # The option for PWA feature (installable)
  cache:
    enabled: true # The option for PWA offline cache
    # Paths defined here will be excluded from the PWA cache.
    # Usually its value is the `baseurl` of another website that
    # shares the same domain name as the current website.
    deny_paths:
      # - "/example"  # URLs match `<SITE_URL>/example/*` will not be cached by the PWA

paginate: 10

# The base URL of your site
baseurl: ""

# ------------ The following options are not recommended to be modified ------------------

kramdown:
  footnote_backlink: "&#8617;&#xfe0e;"
  syntax_highlighter: rouge
  syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options
    css_class: highlight
    # default_lang: console
    span:
      line_numbers: false
    block:
      line_numbers: true
      start_line: 1

collections:
  tabs:
    output: true
    sort_by: order

defaults:
  - scope:
      path: "" # An empty string here means all files in the project
      type: posts
    values:
      layout: post
      comments: true # Enable comments in posts.
      toc: true # Display TOC column in posts.
      # DO NOT modify the following parameter unless you are confident enough
      # to update the code of all other post links in this project.
      permalink: /posts/:title/
  - scope:
      path: _drafts
    values:
      comments: false
  - scope:
      path: ""
      type: tabs # see `site.collections`
    values:
      layout: page
      permalink: /:title/

sass:
  style: compressed

compress_html:
  clippings: all
  comments: all
  endings: all
  profile: false
  blanklines: false
  ignore:
    envs: [development]

exclude:
  - "*.gem"
  - "*.gemspec"
  - docs
  - tools
  - README.md
  - LICENSE
  - purgecss.js
  - "*.config.js"
  - "package*.json"

jekyll-archives:
  enabled: [categories, tags]
  layouts:
    category: category
    tag: tag
  permalinks:
    tag: /tags/:name/
    category: /categories/:name/


================================================
FILE: _data/authors.yml
================================================
## Template › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/advanced-usage.md#setting-author-url
# -------------------------------------
# {author_id}:
#   name: {full name}
#   twitter: {twitter_of_author}
#   url: {homepage_of_author}
# -------------------------------------

cotes:
  name: Cotes Chung
  twitter: cotes2020
  url: https://github.com/cotes2020/

sille_bille:
  name: Dinesh Prasanth Moluguwan Krishnamoorthy
  twitter: dinesh_MKD
  url: https://github.com/SilleBille/


================================================
FILE: _data/contact.yml
================================================
#  The contact options.

- type: github
  icon: "fab fa-github"

- type: twitter
  icon: "fa-brands fa-x-twitter"

- type: email
  icon: "fas fa-envelope"
  noblank: true # open link in current tab

- type: rss
  icon: "fas fa-rss"
  noblank: true
# Uncomment and complete the url below to enable more contact options
#
# - type: mastodon
#   icon: 'fab fa-mastodon'   # icons powered by <https://fontawesome.com/>
#   url:  ''                  # Fill with your Mastodon account page, rel="me" will be applied for verification
#
# - type: linkedin
#   icon: 'fab fa-linkedin'   # icons powered by <https://fontawesome.com/>
#   url:  ''                  # Fill with your Linkedin homepage
#
# - type: stack-overflow
#   icon: 'fab fa-stack-overflow'
#   url:  ''                  # Fill with your stackoverflow homepage
#
# - type: bluesky
#   icon: 'fa-brands fa-bluesky'
#   url: ''                   # Fill with your Bluesky profile link
#
# - type: reddit
#   icon: 'fa-brands fa-reddit'
#   url: ''                   # Fill with your Reddit profile link
#
# - type: threads
#   icon: 'fa-brands fa-threads'
#   url: ''                   # Fill with your Threads profile link


================================================
FILE: _data/locales/ar.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: منشور
  category: فئة
  tag: وسم

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: الرئيسية
  categories: الفئات
  tags: الوسوم
  archives: الأرشيف
  about: حول

# the text displayed in the search bar & search results
search:
  hint: بحث
  cancel: إلغاء
  no_results: نأسف! لا يوجد نتائج.

panel:
  lastmod: المحدثة مؤخرا
  trending_tags: الوسوم الشائعة
  toc: محتويات

copyright:
  # Shown at the bottom of the post
  license:
    template: هذا المنشور تحت ترخيص :LICENSE_NAME بواسطة المؤلف.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: بعض الحقوق محفوظة.
  verbose: >-
    ما لم يذكر خلاف ذلك ، يتم ترخيص منشورات المدونة على هذا الموقع
    بموجب ترخيص Creative Commons Attribution 4.0 International (CC BY 4.0) من قبل المؤلف.

meta: باستخدام :PLATFORM السمة :THEME

not_found:
  statement: عذرا, الرابط التالي غير صالح أو انه يشير إلى صفحة غير موجودة.

notification:
  update_found: يتوفر اصدار جديد للمحتوى.
  update: تحديث

# ----- Posts related labels -----

post:
  written_by: بواسطة
  posted: نشّر
  updated: حدّث
  words: كلمات
  pageview_measure: مشاهدات
  read_time:
    unit: دقيقة
    prompt: قراءة
  relate_posts: إقرأ المزيد
  share: شارك
  button:
    next: الأجدد
    previous: الأقدم
    copy_code:
      succeed: تم النسخ!
    share_link:
      title: أنسخ الرابط
      succeed: تم نسخ الرابط بنجاح!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: فئة
    plural: فئات
  post_measure:
    singular: منشور
    plural: منشورات


================================================
FILE: _data/locales/bg-BG.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Публикация
  category: Категория
  tag: Таг

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Начало
  categories: Категории
  tags: Тагове
  archives: Архив
  about: За мен

# the text displayed in the search bar & search results
search:
  hint: търси
  cancel: Отмени
  no_results: Упс! Не са намерени резултати.

panel:
  lastmod: Наскоро обновени
  trending_tags: Популярни тагове
  toc: Съдържание

copyright:
  # Shown at the bottom of the post
  license:
    template: Тази публикация е лицензирана под :LICENSE_NAME от автора.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Някои права запазени.
  verbose: >-
    Освен ако не е посочено друго, публикациите в блога на този сайт са лицензирани
    под лиценза Creative Commons Attribution 4.0 (CC BY 4.0) от автора.

meta: Създадено чрез :PLATFORM и :THEME тема

not_found:
  statement: Съжалявам, но на този URL адрес няма налично съдържание.

notification:
  update_found: Налична е нова версия на съдържанието.
  update: Обнови

# ----- Posts related labels -----

post:
  written_by: Автор
  posted: Публикувана
  updated: Обновена
  words: думи
  pageview_measure: преглеждания
  read_time:
    unit: мин
    prompt: четиво
  relate_posts: Още за четене
  share: Споделете
  button:
    next: По-нови
    previous: По-стари
    copy_code:
      succeed: Копирано!
    share_link:
      title: Копирай линк
      succeed: Линкът е копиран успешно!

# categories page
categories:
  category_measure:
    singular: категория
    plural: категории
  post_measure:
    singular: публикация
    plural: публикации


================================================
FILE: _data/locales/ca-ES.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Entrada
  category: Categoria
  tag: Etiqueta

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Inici
  categories: Categories
  tags: Etiquetes
  archives: Arxiu
  about: Sobre

# the text displayed in the search bar & search results
search:
  hint: Cercar
  cancel: Cancel·lar
  no_results: Ups! No s'han trobat resultats.

panel:
  lastmod: Actualitzat recentment
  trending_tags: Etiquetes populars
  toc: Taula de continguts

copyright:
  # Shown at the bottom of the post
  license:
    template: Aquesta entrada està llicenciada sota :LICENSE_NAME per l'autor.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Alguns drets reservats.
  verbose: >-
    Excepte que s'indiqui explícitament, les entrades d'aquest blog estan llicenciades
    sota la llicència Creative Commons Attribution 4.0 International (CC BY 4.0) per l'autor.

meta: Fet amb :PLATFORM utilitzant el tema :THEME

not_found:
  statement: Ho sentim, hem perdut aquesta URL o apunta a alguna cosa que no existeix.

notification:
  update_found: Hi ha una nova versió de contingut disponible.
  update: Actualitzar

# ----- Posts related labels -----

post:
  written_by: Per
  posted: Publicat
  updated: Actualitzat
  words: paraules
  pageview_measure: visites
  read_time:
    unit: min
    prompt: " de lectura"
  relate_posts: Entrades relacionades
  share: Compartir
  button:
    next: Següent
    previous: Anterior
    copy_code:
      succeed: Copiat!
    share_link:
      title: Copiar enllaç
      succeed: Enllaç copiat!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%Y/%m/%d"
    dayjs: "YYYY/MM/DD"

# categories page
categories:
  category_measure: categories
  post_measure: entrades


================================================
FILE: _data/locales/cs-CZ.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Příspěvek
  category: Kategorie
  tag: Štítek

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Domů
  categories: Kategorie
  tags: Štítky
  archives: Archivy
  about: O mně

# the text displayed in the search bar & search results
search:
  hint: hledat
  cancel: Zrušit
  no_results: Ups! Žádný výsledek nenalezen.

panel:
  lastmod: Nedávno aktualizováno
  trending_tags: Trendy štítky
  toc: Obsah

copyright:
  # Shown at the bottom of the post
  license:
    template: Tento příspěvek je licencován pod :LICENSE_NAME autorem.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Některá práva vyhrazena.
  verbose: >-
    Pokud není uvedeno jinak, jsou příspěvky na tomto webu licencovány
    pod licencí Creative Commons Attribution 4.0 International (CC BY 4.0) Licence autora.

meta: Použití :PLATFORM s motivem :THEME

not_found:
  statement: Omlouváme se, adresu URL jsme špatně umístili nebo odkazuje na něco, co neexistuje.

notification:
  update_found: Je k dispozici nová verze obsahu.
  update: Aktualizace

# ----- Posts related labels -----

post:
  written_by: Od
  posted: Zveřejněno
  updated: Aktualizováno
  words: slova
  pageview_measure: zhlednutí
  read_time:
    unit: minut
    prompt: čtení
  relate_posts: Další čtení
  share: Sdílet
  button:
    next: Novější
    previous: Starší
    copy_code:
      succeed: Zkopírováno!
    share_link:
      title: Kopírovat odkaz
      succeed: Zkopírováno!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure: kategorie
  post_measure:
    singular: příspěvěk
    plural: příspěvky


================================================
FILE: _data/locales/da-DK.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Opslag
  category: Kategori
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Hjem
  categories: Kategorier
  tags: Tags
  archives: Arkiv
  about: Om siden

# the text displayed in the search bar & search results
search:
  hint: søg
  cancel: Afbryd
  no_results: Ups! Ingen resultater fundet.

panel:
  lastmod: Senest opdateret
  trending_tags: Populære tags
  toc: Indhold

copyright:
  # Shown at the bottom of the post
  license:
    template: Dette opslag er licenseret under :LICENSE_NAME af forfatteren.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Nogle rettigheder forbeholdes.
  verbose: >-
    Medmindre andet er angivet, er opslag på denne side beskyttet
    under Creative Commons Attribution 4.0 International (CC BY 4.0) licensen af forfatteren.

# meta: Using the :THEME theme for :PLATFORM.

not_found:
  statement: Beklager, vi har malpaceret denne URL, eller den peger på et sted, som ikke findes.

notification:
  update_found: En ny version af indholdet er fundet!
  update: Opdater

# ----- Posts related labels -----

post:
  written_by: Af
  posted: Udgivet
  updated: Opdateret
  words: ord
  pageview_measure: visninger
  read_time:
    unit: min
    prompt: læsetid
  relate_posts: Læs videre
  share: Del
  button:
    next: Nyere
    previous: Ældre
    copy_code:
      succeed: Kopieret!
    share_link:
      title: Kopier link
      succeed: Link kopieret!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%Y/%m/%d"
    dayjs: "YYYY/MM/DD"

# categories page
categories:
  category_measure:
    singular: kategori
    plural: kategorier
  post_measure: opslag


================================================
FILE: _data/locales/de-DE.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Eintrag
  category: Kategorie
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Startseite
  categories: Kategorien
  tags: Tags
  archives: Archiv
  about: Über

# the text displayed in the search bar & search results
search:
  hint: Suche
  cancel: Abbrechen
  no_results: Ups! Keine Einträge gefunden.

panel:
  lastmod: Kürzlich aktualisiert
  trending_tags: Beliebte Tags
  toc: Inhalt

copyright:
  # Shown at the bottom of the post
  license:
    template: Dieser Eintrag ist vom Autor unter :LICENSE_NAME lizensiert.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Einige Rechte vorbehalten.
  verbose: >-
    Alle Einträge auf dieser Seite stehen, soweit nicht anders angegeben, unter der Lizenz Creative Commons Attribution 4.0 (CC BY 4.0).

meta: Powered by :PLATFORM with :THEME theme

not_found:
  statement: Entschuldigung, dieser Link verweist auf keine vorhandene Ressource.

notification:
  update_found: Eine neue Version ist verfügbar.
  update: Neue Version

# ----- Posts related labels -----

post:
  written_by: Von
  posted: Veröffentlicht
  updated: Aktualisiert
  words: Wörter
  pageview_measure: Aufrufe
  read_time:
    unit: Minuten
    prompt: Lesezeit
  relate_posts: Weiterlesen
  share: Teilen
  button:
    next: Nächster Eintrag
    previous: Eintrag vorher
    copy_code:
      succeed: Kopiert!
    share_link:
      title: Link kopieren
      succeed: Link erfolgreich kopiert!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%d.%m.%Y"
    dayjs: "DD.MM.YYYY"

# categories page
categories:
  category_measure:
    singular: Kategorie
    plural: Kategorien
  post_measure:
    singular: Eintrag
    plural: Einträge


================================================
FILE: _data/locales/dv‑MV.yml
================================================
# The layout text of site in Dhivehi (Maldives)

# ----- Commons label -----

layout:
  post: ޕޯސްޓް
  category: ނަތީޖާ
  tag: ޓެގް

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: ހުންނަ
  categories: ނަތީޖާތައް
  tags: ޓެގްތައް
  archives: އާރޗިވްސް
  about: އިންސާން

# the text displayed in the search bar & search results
search:
  hint: ސާރޗް
  cancel: ކެންސަލް
  no_results: އޮޕްސް! އެއްވެސް ނުފެނުނީ.

panel:
  lastmod: އާދަމާ އޮޕްޑޭޓްކުރި
  trending_tags: މަރާހު ޓެގްތައް
  toc: ކޮންޓެންސް

copyright:
  # Shown at the bottom of the post
  license:
    template: މި ޕޯސްޓް :LICENSE_NAME އިން ލައިސަންސްކުރާ ނުވަތަ މުޤައްރާއަށް.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: އެކީ ބާރަށް ހުށަހަޅާ.
  verbose: >-
    އަދި އެ ރަނގަޅުގައި ނުލާހެވެސް، މި ސައިޓުގެ ޕޯސްޓްތައް
    މުޤައްރާއަށް Creative Commons Attribution 4.0 International (CC BY 4.0) ލައިސަންސްކުރަނީ.

meta: :PLATFORM އަށް :THEME ތީމް ބަލާލާށެވެ.

not_found:
  statement: ސޯރީ، މި ޔޫ.އާރއެލް މަށެވެއްނެ ނުވަތަ އެކަމެއް ނުވެއެވެ.

notification:
  update_found: ޔޫ ވާރޝަން ހުރިހާ.
  update: އޮޕްޑޭޓް

# ----- Posts related labels -----

post:
  written_by: ލެކްއޯލް
  posted: ޕޯސްޓްކުރެވި
  updated: އޮޕްޑޭޓްކުރެވި
  words: ބަސް
  pageview_measure: ބަނޑުކުރާ
  read_time:
    unit: މިނެޓް
    prompt: އިސްކާރު
  relate_posts: އެއްޗެހި ފަހުރަށްދަން
  share: ސެއާރް
  button:
    next: އަދާވަނަ
    previous: ކޮނޯނި
    copy_code:
      succeed: ކޮޕީ ކުރެވި!
    share_link:
      title: ލިންކް ކޮޕީ ކުރު
      succeed: ލިންކް ހަދަންކުރެވި!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

categories:
  category_measure:
    singular: ނަތީޖާ
    plural: ނަތީޖާތައް
  post_measure:
    singular: ޕޯސްޓް
    plural: ޕޯސްޓްތައް


================================================
FILE: _data/locales/el-GR.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Δημοσίευση
  category: Κατηγορία
  tag: Ετικέτα

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Home
  categories: Κατηγορίες
  tags: Ετικέτες
  archives: Αρχεία
  about: Σχετικά

# the text displayed in the search bar & search results
search:
  hint: αναζήτηση
  cancel: Ακύρωση
  no_results: Oops! Κανένα αποτέλεσμα δεν βρέθηκε.

panel:
  lastmod: Σχετικά ενημερωμένα
  trending_tags: Ετικέτες τάσης
  toc: Περιεχόμενα

copyright:
  # Shown at the bottom of the post
  license:
    template: Η δημοσίευση αυτή βρίσκεται υπο την άδεια :LICENSE_NAME Greekforce1821.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Ορισμένα δικαιώματα reserved.
  verbose: >-
    Εκτός αλλού ή οπουδήποτε αλλού, τα blog posts σε αυτήν την σελίδα βρίσκονται υπο την άδεια
    Creative Commons Attribution 4.0 International (CC BY 4.0) του δημιουργού.

meta: Αξιοποιώντας την :PLATFORM theme :THEME

not_found:
  statement: Συγνώμη, έχουμε τοποθετήσει λάθος αυτήν την διεύθυνση URL ή υποδεικνύει κάτι που δεν υπάρχει.

notification:
  update_found: Υπάρχει διαθέσιμη μια νέα έκδοση του περιεχομένου.
  update: Ενημέρωση

# ----- Posts related labels -----

post:
  written_by: Από
  posted: Δημοσιεύθηκε
  updated: Ενημερώθηκε
  words: λέξεις
  pageview_measure: προβολές
  read_time:
    unit: Λεπτά
    prompt: διαβάσματος
  relate_posts: Περισσότερα
  share: Κοινοποιήστε
  button:
    next: Νεότερα
    previous: Παλαιότερα
    copy_code:
      succeed: Αντιγράφθηκε!
    share_link:
      title: Αντιγραφή συνδέσμου
      succeed: Η διεύθυνση αντιγράφθηκε με επιτυχία!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: Κατηγορία
    plural: Κατηγορίες
  post_measure:
    singular: Δημοσίευση
    plural: Δημοσιεύσεις


================================================
FILE: _data/locales/en.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Post
  category: Category
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Home
  categories: Categories
  tags: Tags
  archives: Archives
  about: About

# the text displayed in the search bar & search results
search:
  hint: search
  cancel: Cancel
  no_results: Oops! No results found.

panel:
  lastmod: Recently Updated
  trending_tags: Trending Tags
  toc: Contents

copyright:
  # Shown at the bottom of the post
  license:
    template: This post is licensed under :LICENSE_NAME by the author.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Some rights reserved.
  verbose: >-
    Except where otherwise noted, the blog posts on this site are licensed
    under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.

meta: Using the :THEME theme for :PLATFORM.

not_found:
  statement: Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.

notification:
  update_found: A new version of content is available.
  update: Update

# ----- Posts related labels -----

post:
  written_by: By
  posted: Posted
  updated: Updated
  words: words
  pageview_measure: views
  read_time:
    unit: min
    prompt: read
  relate_posts: Further Reading
  share: Share
  button:
    next: Newer
    previous: Older
    copy_code:
      succeed: Copied!
    share_link:
      title: Copy link
      succeed: Link copied successfully!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: category
    plural: categories
  post_measure:
    singular: post
    plural: posts


================================================
FILE: _data/locales/es-ES.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Entrada
  category: Categoría
  tag: Etiqueta

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Inicio
  categories: Categorías
  tags: Etiquetas
  archives: Archivo
  about: Acerca de

# the text displayed in the search bar & search results
search:
  hint: Buscar
  cancel: Cancelar
  no_results: ¡Oops! No se encuentran resultados.

panel:
  lastmod: Actualizado recientemente
  trending_tags: Etiquetas populares
  toc: Contenido

copyright:
  # Shown at the bottom of the post
  license:
    template: Esta entrada está licenciada bajo :LICENSE_NAME por el autor.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Algunos derechos reservados.
  verbose: >-
    Salvo que se indique explícitamente, las entradas de este blog están licenciadas
    bajo la Creative Commons Attribution 4.0 International (CC BY 4.0) License por el autor.

meta: Hecho con :PLATFORM usando el tema :THEME

not_found:
  statement: Lo sentimos, hemos perdido esa URL o apunta a algo que no existe.

notification:
  update_found: Hay una nueva versión de contenido disponible.
  update: Actualizar

# ----- Posts related labels -----

post:
  written_by: Por
  posted: Publicado
  updated: Actualizado
  words: palabras
  pageview_measure: visitas
  read_time:
    unit: min
    prompt: " de lectura"
  relate_posts: Lecturas adicionales
  share: Compartir
  button:
    next: Nuevo
    previous: Anterior
    copy_code:
      succeed: ¡Copiado!
    share_link:
      title: Copiar enlace
      succeed: ¡Enlace copiado!

# categories page
categories:
  category_measure: categorias
  post_measure: entradas


================================================
FILE: _data/locales/fa-IR.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: پست
  category: دسته‌بندی
  tag: برچسب

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: خانه
  categories: دسته‌بندی‌ها
  tags: برچسب‌ها
  archives: آرشیو
  about: درباره

# the text displayed in the search bar & search results
search:
  hint: جستجو
  cancel: لغو
  no_results: متأسفیم! هیچ نتیجه‌ای یافت نشد.

panel:
  lastmod: آخرین به‌روزرسانی
  trending_tags: برچسب‌های پرطرفدار
  toc: فهرست مطالب

copyright:
  # Shown at the bottom of the post
  license:
    template: این پست تحت مجوز :LICENSE_NAME توسط نویسنده منتشر شده است.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: برخی حقوق محفوظ است.
  verbose: >-
    به‌جز مواردی که خلاف آن ذکر شده باشد، محتوای پست‌های این وبلاگ
    تحت مجوز Creative Commons Attribution 4.0 International (CC BY 4.0) توسط نویسنده منتشر شده‌اند.

meta: با استفاده از قالب :THEME برای :PLATFORM

not_found:
  statement: متأسفیم، لینک زیر معتبر نیست یا به صفحه‌ای که وجود ندارد اشاره می‌کند.

notification:
  update_found: نسخه جدیدی از محتوا موجود است.
  update: به‌روزرسانی

# ----- Posts related labels -----

post:
  written_by: نوشته شده توسط
  posted: منتشر شده
  updated: به‌روزرسانی شده
  words: کلمه
  pageview_measure: بازدید
  read_time:
    unit: "دقیقه "
    prompt: " زمان مطالعه"
  relate_posts: بیشتر بخوانید
  share: اشتراک‌گذاری
  button:
    next: جدیدتر
    previous: قدیمی‌تر
    copy_code:
      succeed: کپی شد!
    share_link:
      title: کپی لینک
      succeed: لینک با موفقیت کپی شد!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: دسته‌بندی
    plural: دسته‌بندی‌
  post_measure:
    singular: پست
    plural: پست‌


================================================
FILE: _data/locales/fi-FI.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Julkaisu
  category: Kateogoria
  tag: Tagi

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Koti
  categories: Kateogoriat
  tags: Tagit
  archives: Arkistot
  about: Minusta

# the text displayed in the search bar & search results
search:
  hint: etsi
  cancel: Peruuta
  no_results: Hups! Ei tuloksia.

panel:
  lastmod: Viimeksi päivitetty
  trending_tags: Trendaavat tagit
  toc: Sisältö

copyright:
  # Shown at the bottom of the post
  license:
    template: Tämä julkaisu on lisenssoitu :LICENSE_NAME julkaisijan toimesta.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Jotkut oikeudet pidätetään.
  verbose: >-
    Paitsi jos erikseen mainitaan on kaikki sisältö Creative Commons Attribution 4.0 International (CC BY 4.0) Lisensoitu kirjoittajan toimesta.

meta: Käytetään :PLATFORM iä Teema :THEME

not_found:
  statement: Valitettavasti tällä URL-osoitteella ei ole saatavilla sisältöä.

notification:
  update_found: Uusi versio sisällöstä on saatavilla.
  update: Päivitä

# ----- Posts related labels -----

post:
  written_by: Kirjoittaja
  posted: Julkaistu
  updated: Päivitetty
  words: sanaa
  pageview_measure: katselukertoja
  read_time:
    unit: minuuttia
    prompt: lukea
  relate_posts: Jatka lukemista
  share: Jaa
  button:
    next: Uudempi
    previous: Vanhempi
    copy_code:
      succeed: Kopiotu!
    share_link:
      title: Kopioi linkki
      succeed: Linkki kopioitu onnistuneesti!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: kategoria
    plural: kategoriat
  post_measure:
    singular: julkaisu
    plural: julkaisut


================================================
FILE: _data/locales/fr-FR.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Post
  category: Catégorie
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Accueil
  categories: Catégories
  tags: Tags
  archives: Archives
  about: À propos

# the text displayed in the search bar & search results
search:
  hint: recherche
  cancel: Annuler
  no_results: Oups ! Aucun résultat trouvé.

panel:
  lastmod: Récemment mis à jour
  trending_tags: Tags tendance
  toc: Contenu

copyright:
  # Shown at the bottom of the post
  license:
    template: Cet article est sous licence :LICENSE_NAME par l'auteur.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/deed.fr

  # Displayed in the footer
  brief: Certains droits réservés.
  verbose: >-
    Sauf mention contraire, les articles de ce site sont publiés
    sous la licence Creative Commons Attribution 4.0 International (CC BY 4.0) par l'auteur.

meta: Propulsé par :PLATFORM avec le thème :THEME

not_found:
  statement: Désolé, nous avons égaré cette URL ou elle pointe vers quelque chose qui n'existe pas.

notification:
  update_found: Une nouvelle version du contenu est disponible.
  update: Mise à jour

# ----- Posts related labels -----

post:
  written_by: Par
  posted: Posté
  updated: Mis à jour
  words: mots
  pageview_measure: vues
  read_time:
    unit: min
    prompt: lire
  relate_posts: Autres lectures
  share: Partager
  button:
    next: Plus récent
    previous: Plus ancien
    copy_code:
      succeed: Copié !
    share_link:
      title: Copier le lien
      succeed: Lien copié avec succès !

# categories page
categories:
  category_measure: catégories
  post_measure: posts


================================================
FILE: _data/locales/hu-HU.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Bejegyzés
  category: Kategória
  tag: Címke

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Kezdőlap
  categories: Kategóriák
  tags: Címkék
  archives: Archívum
  about: Bemutatkozás

# the text displayed in the search bar & search results
search:
  hint: keresés
  cancel: Mégse
  no_results: Hoppá! Nincs találat a keresésre.

panel:
  lastmod: Legutóbb frissítve
  trending_tags: Népszerű Címkék
  toc: Tartalom

copyright:
  # Shown at the bottom of the post
  license:
    template: A bejegyzést a szerző :LICENSE_NAME licenc alatt engedélyezte.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Néhány jog fenntartva.
  verbose: >-
    Az oldalon található tartalmak
    Creative Commons Attribution 4.0 International (CC BY 4.0) licenccel rendelkeznek,
    hacsak másképp nincs jelezve.

meta: Készítve :THEME témával a :PLATFORM platformra.

not_found:
  statement: Sajnáljuk, az URL-t rosszul helyeztük el, vagy valami nem létezőre mutat.

notification:
  update_found: Elérhető a tartalom új verziója.
  update: Frissítés

# ----- Posts related labels -----

post:
  written_by: Szerző
  posted: Létrehozva
  updated: Frissítve
  words: szó
  pageview_measure: látogató
  read_time:
    unit: perc
    prompt: elolvasni
  relate_posts: További olvasnivaló
  share: Megosztás
  button:
    next: Újabb
    previous: Régebbi
    copy_code:
      succeed: Másolva!
    share_link:
      title: Link másolása
      succeed: Link sikeresen másolva!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
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


================================================
FILE: _data/locales/id-ID.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Postingan
  category: Kategori
  tag: Tagar

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Beranda
  categories: Kategori
  tags: Tagar
  archives: Arsip
  about: Tentang

# the text displayed in the search bar & search results
search:
  hint: Cari
  cancel: Batal
  no_results: Ups! Tidak ada hasil yang ditemukan.

panel:
  lastmod: Postingan Terbaru
  trending_tags: Tagar Terpopuler
  toc: Konten

copyright:
  # Shown at the bottom of the post
  license:
    template: Postingan ini dilisensikan di bawah :LICENSE_NAME oleh penulis.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Sebagian konten dilindungi.
  verbose: >-
    Kecuali jika dinyatakan, Postingan blog di situs ini dilisensikan
    di bawah Lisensi Creative Commons Attribution 4.0 International (CC BY 4.0) oleh penulis.

meta: Didukung oleh :PLATFORM dengan tema :THEME

not_found:
  statement: Maaf, kami gagal menemukan URL itu atau memang mengarah ke sesuatu yang tidak ada.

notification:
  update_found: Versi konten baru tersedia.
  update: Perbarui

# ----- Posts related labels -----

post:
  written_by: Oleh
  posted: Diterbitkan
  updated: Diperbarui
  words: kata
  pageview_measure: dilihat
  read_time:
    unit: menit
    prompt: baca
  relate_posts: Postingan Lainya
  share: Bagikan
  button:
    next: Terbaru
    previous: Terlama
    copy_code:
      succeed: Disalin!
    share_link:
      title: Salin tautan
      succeed: Tautan berhasil disalin!

# categories page
categories:
  category_measure: kategori
  post_measure: Postingan


================================================
FILE: _data/locales/it-IT.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Post
  category: Categoria
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Pagina principale
  categories: Categorie
  tags: Tags
  archives: Archivio
  about: Informazioni

# the text displayed in the search bar & search results
search:
  hint: ricerca
  cancel: Cancella
  no_results: Oops! La ricerca non ha fornito risultati.

panel:
  lastmod: Aggiornati recentemente
  trending_tags: Tags più cliccati
  toc: Contenuti

copyright:
  # Shown at the bottom of the post
  license:
    template: Questo post è sotto licenza :LICENSE_NAME a nome dell'autore.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Alcuni diritti riservati.
  verbose: >-
    Eccetto quando esplicitamente menzionato, i post di questo blog sono da ritenersi sotto
    i termini di licenza Creative Commons Attribution 4.0 International (CC BY 4.0).

meta: Servizio offerto da :PLATFORM con tema :THEME
not_found:
  statement: Ci scusiamo, non è stato possibile trovare l'URL in questione. Potrebbe puntare ad una pagina non esistente.

notification:
  update_found: Nuova versione del contenuto disponibile.
  update: Aggiornamento

# ----- Posts related labels -----

post:
  written_by: Da
  posted: Postato
  updated: Aggiornato
  words: parole
  pageview_measure: visioni
  read_time:
    unit: min
    prompt: lettura
  relate_posts: Continua a leggere
  share: Condividi
  button:
    next: Più recenti
    previous: Meno recenti
    copy_code:
      succeed: Copiato!
    share_link:
      title: Copia link
      succeed: Link copiato con successo!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: categoria
    plural: categorie
  post_measure:
    singular: post
    plural: posts


================================================
FILE: _data/locales/ja-JP.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: 投稿
  category: カテゴリー
  tag: タグ

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: ホーム
  categories: カテゴリー
  tags: タグ
  archives: アーカイブ
  about: このサイトについて

# the text displayed in the search bar & search results
search:
  hint: 検索
  cancel: キャンセル
  no_results: 該当なし

panel:
  lastmod: 最近更新された投稿
  trending_tags: トレンドのタグ
  toc: コンテンツ

copyright:
  # Shown at the bottom of the post
  license:
    template: この投稿は投稿者によって :LICENSE_NAME の下でライセンスされています。
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Some rights reserved.
  verbose: >-
    Except where otherwise noted, the blog posts on this site are licensed
    under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.

meta: :PLATFORM 用の :THEME を使用しています。

not_found:
  statement: このURLは存在しないものを指し示しています。

notification:
  update_found: 新しいバージョンが利用可能です。
  update: 更新

# ----- Posts related labels -----

post:
  written_by: 投稿者
  posted: 投稿日
  updated: 更新日
  words: 語
  pageview_measure: 回閲覧
  read_time:
    unit: 分
    prompt: で読めます
  relate_posts: さらに読む
  share: シェア
  button:
    next: 次
    previous: 前
    copy_code:
      succeed: コピーしました
    share_link:
      title: リンクをコピー
      succeed: リンクをコピーしました

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%Y/%m/%d"
    dayjs: "YYYY/MM/DD"

# categories page
categories:
  category_measure: カテゴリー
  post_measure: 投稿


================================================
FILE: _data/locales/ko-KR.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: 포스트
  category: 카테고리
  tag: 태그

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: 홈
  categories: 카테고리
  tags: 태그
  archives: 아카이브
  about: 정보

# the text displayed in the search bar & search results
search:
  hint: 검색
  cancel: 취소
  no_results: 검색 결과가 없습니다.

panel:
  lastmod: 최근 업데이트
  trending_tags: 인기 태그
  toc: 바로가기

copyright:
  # Shown at the bottom of the post
  license:
    template: 이 기사는 저작권자의 :LICENSE_NAME 라이센스를 따릅니다.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: 일부 권리 보유
  verbose: >-
    명시되지 않는 한 이 사이트의 블로그 게시물은 작성자의
    Creative Commons Attribution 4.0 International(CC BY 4.0) 라이선스에 따라 사용이 허가되었습니다.

meta: Powered by :PLATFORM with :THEME theme

not_found:
  statement: 해당 URL은 존재하지 않습니다.

notification:
  update_found: 새 버전의 콘텐츠를 사용할 수 있습니다.
  update: 업데이트

# ----- Posts related labels -----

post:
  written_by: By
  posted: 게시
  updated: 업데이트
  words: 단어
  pageview_measure: 조회
  read_time:
    unit: 분
    prompt: 읽는 시간
  relate_posts: 관련된 글
  share: 공유하기
  button:
    next: 다음 글
    previous: 이전 글
    copy_code:
      succeed: 복사되었습니다!
    share_link:
      title: 링크 복사하기
      succeed: 링크가 복사되었습니다!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%Y/%m/%d"
    dayjs: "YYYY/MM/DD"

# categories page
categories:
  category_measure: 카테고리
  post_measure: 포스트


================================================
FILE: _data/locales/ku-IQ.yml
================================================
# The layout text of site in Kurdish (Sorani)

# ----- Commons label -----

layout:
  post: بابەت
  category: هاوپۆل
  tag: تاگ

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: سەرەکی
  categories: هاوپۆلەکان
  tags: تاگەکان
  archives: ئەرشیف
  about: دەربارە

# the text displayed in the search bar & search results
search:
  hint: گەڕان
  cancel: هەڵوەشاندنەوە
  no_results: ببوورە! هیچ ئەنجامێک نەدۆزرایەوە.

panel:
  lastmod: دوایین نوێکردنەوەکان
  trending_tags: تاگە باوەکان
  toc: ناوەڕۆک

copyright:
  # Shown at the bottom of the post
  license:
    template: ئەم بابەتە لەلایەن نووسەرەوە بە مۆڵەتی :LICENSE_NAME بڵاوکراوەتەوە.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: هەندێک مافی پارێزراوە.
  verbose: >-
    تەنها لەو شوێنانەی کە بە پێچەوانەوە ئاماژەی پێدراوە، بابەتەکانی بڵۆگ لەم سایتەدا
    لەژێر مۆڵەتی Creative Commons Attribution 4.0 International (CC BY 4.0) لەلایەن نووسەرەوە مۆڵەتیان پێدراوە.

meta: بە بەکارهێنانی :PLATFORM لەگەڵ ڕووکاری :THEME

not_found:
  statement: ببوورە، ئەم بەستەرە نادۆزرێتەوە یان ئاماژە بە شتێک دەکات کە بوونی نییە.

notification:
  update_found: وەشانێکی نوێی ناوەڕۆک بەردەستە.
  update: نوێکردنەوە

# ----- Posts related labels -----

post:
  written_by: نووسەر
  posted: بڵاوکراوەتەوە
  updated: نوێکراوەتەوە
  words: وشە
  pageview_measure: بینین
  read_time:
    unit: خولەک
    prompt: خوێندنەوە
  relate_posts: بابەتی پەیوەندیدار
  share: بڵاوکردنەوە
  button:
    next: نوێتر
    previous: کۆنتر
    copy_code:
      succeed: کۆپی کرا!
    share_link:
      title: کۆپی بەستەر
      succeed: بەستەر بە سەرکەوتوویی کۆپی کرا!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%d %b, %Y"
    dayjs: "DD MMM, YYYY"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: هاوپۆل
    plural: هاوپۆل
  post_measure:
    singular: بابەت
    plural: بابەت


================================================
FILE: _data/locales/my-MM.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: ပို့စ်
  category: ကဏ္ဍ
  tag: နာမ(တက်ဂ်)

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: အဓိကစာမျက်နှာ
  categories: ကဏ္ဍများ
  tags: နာမ(တက်ဂ်)များ
  archives: မှတ်တမ်း​တိုက်
  about: အကြောင်းအရာ

# the text displayed in the search bar & search results
search:
  hint: ရှာဖွေမည်
  cancel: ဖျက်သိမ်းမည်
  no_results: အိုး! ဘာမှမရှိပါ

panel:
  lastmod: မကြာသေးမီကမွမ်းမံထားသည်
  trending_tags: ခေတ်စားနေသည့်တက်ဂ်များ
  toc: အကြောင်းအရာများ

copyright:
  # Shown at the bottom of the post
  license:
    template: ဤပို့စ်သည်စာရေးသူ၏ :LICENSE_NAME လိုင်စင်ရထားသည်။
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: မူပိုင်ခွင့်အချို့ကို လက်ဝယ်ထားသည်။
  verbose: >-
    အခြားမှတ်သားထားချက်များမှလွဲ၍ ဤဆိုက်ရှိ ဘလော့ဂ်ပို့စ်များသည် စာရေးသူ၏
    Creative Commons Attribution 4.0 International (CC BY 4.0) အောက်တွင် လိုင်စင်ရထားပါသည်။

meta: Powered by :PLATFORM with :THEME theme

not_found:
  statement: ဝမ်းနည်းပါသည်၊ ကျွန်ုပ်တို့သည် အဆိုပါ URL ကို မှားယွင်းစွာ နေရာချထားခြင်း သို့မဟုတ် ၎င်းသည် မရှိသောအရာကို ညွှန်ပြနေပါသည်။

notification:
  update_found: အကြောင်းအရာဗားရှင်းအသစ်ကို ရနိုင်ပါပြီ။
  update: အပ်ဒိတ်

# ----- Posts related labels -----

post:
  written_by: ကရေးသားခဲ့သည်။
  posted: တင်ထားခဲ့သည်။
  updated: မွမ်းမံထားခဲ့သည်။
  words: စကားလုံးများ
  pageview_measure: အမြင်များ
  read_time:
    unit: မိနစ်
    prompt: ဖတ်ပါမည်
  relate_posts: နောက်ထပ်ဖတ်ရန်
  share: မျှဝေရန်
  button:
    next: အသစ်များ
    previous: အဟောင်းများ
    copy_code:
      succeed: ကူးယူလိုက်ပြီ။
    share_link:
      title: လင့်ခ်ကို ကူးယူရန်
      succeed: လင့်ခ်ကို ကူးယူလိုက်ပြီ။

# categories page
categories:
  category_measure: ကဏ္ဍများ
  post_measure: ပို့စ်များ


================================================
FILE: _data/locales/nl-NL.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Post
  category: Categorie
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Startpagina
  categories: Categorieën
  tags: Tags
  archives: Archief
  about: Over

# the text displayed in the search bar & search results
search:
  hint: Zoek
  cancel: Annuleer
  no_results: Oops! Geen resultaat gevonden.

panel:
  lastmod: Recent Bijgewerkt
  trending_tags: Trending Tags
  toc: Inhoud

copyright:
  # Shown at the bottom of the post
  license:
    template: Alle posts zijn onder :LICENSE_NAME gepubliceerd door de auteur.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Sommige rechten voorbehouden.
  verbose: >-
    Tenzij anders vermeld, alle posts zijn onder de
    Creative Commons Attribution 4.0 International (CC BY 4.0) gepubliceerd door de auteur.

meta: Gebruikt :THEME

not_found:
  statement: Sorry, we hebben de URL verkeerd geplaatst of hij verwijst naar iets dat niet bestaat.

notification:
  update_found: Nieuwe versie van inhoud beschikbaar.
  update: Update

# ----- Posts related labels -----
post:
  written_by: Door
  posted: Posted
  updated: Bijgewerkt
  words: woorden
  pageview_measure: Gelezen
  read_time:
    unit: min
    prompt: lees
  relate_posts: Verder Lezen
  share: Deel
  button:
    next: Volgende
    previous: Vorige
    copy_code:
      succeed: Gekopieerd!
    share_link:
      title: Link kopiëren
      succeed: Succesvol gekopieerd!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: categorie
    plural: categorieën
  post_measure:
    singular: post
    plural: posts


================================================
FILE: _data/locales/ps‑AF.yml
================================================
# The layout text of site in Pashto (Afghanistan)

# ----- Commons label -----

layout:
  post: لیکنه
  category: وېشنيزه
  tag: ټګ

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: کورپاڼه
  categories: وېشنيزې
  tags: ټګونه
  archives: آرشيف
  about: په اړه

# the text displayed in the search bar & search results
search:
  hint: لټون
  cancel: لغوه
  no_results: ها! هېڅ پایله ونه موندل شوه.

panel:
  lastmod: وروستی تازه
  trending_tags: مشهور ټګونه
  toc: منځپانګه

copyright:
  # Shown at the bottom of the post
  license:
    template: دا لیکنه د :LICENSE_NAME جواز لاندې د لیکوال له خوا خپره شوې ده.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: ځینې حقونه خوندي دي.
  verbose: >-
    تر هغه ځایه چې بل ډول نه وي یاد شوي، د دې سایټ لیکنې
    د لیکوال له خوا د کریټېو کامنز د انتساب 4.0 نړیوال (CC BY 4.0) جواز لاندې خپرېږي.

meta: د :PLATFORM لپاره د :THEME موضوع کاروي.

not_found:
  statement: بښنه غواړو، دغه URL ناسم دی یا هغه څه ته اشاره کوي چې شتون نه لري.

notification:
  update_found: نوې نسخه شتون لري.
  update: تازه

# ----- Posts related labels -----

post:
  written_by: لیکوال
  posted: خپره شوې
  updated: تازه شوې
  words: کلمې
  pageview_measure: کتنې
  read_time:
    unit: دقیقې
    prompt: لوستل
  relate_posts: نوره لوستنه
  share: شریکول
  button:
    next: نوی
    previous: زوړ
    copy_code:
      succeed: کاپي شو!
    share_link:
      title: لینک کاپي کړئ
      succeed: لینک بریالي کاپي شو!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

categories:
  category_measure:
    singular: وېشنيزه
    plural: وېشنيزې
  post_measure:
    singular: لیکنه
    plural: لیکنې


================================================
FILE: _data/locales/pt-BR.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Post
  category: Categoria
  tag: Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Home
  categories: Categorias
  tags: Tags
  archives: Arquivos
  about: Sobre

# the text displayed in the search bar & search results
search:
  hint: Buscar
  cancel: Cancelar
  no_results: Oops! Nenhum resultado encontrado.

panel:
  lastmod: Atualizados recentemente
  trending_tags: Trending Tags
  toc: Conteúdo

copyright:
  # Shown at the bottom of the post
  license:
    template: Esta postagem está licenciada sob :LICENSE_NAME pelo autor.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Alguns direitos reservados.
  verbose: >-
    Exceto onde indicado de outra forma, as postagens do blog neste site são licenciadas sob a
    Creative Commons Attribution 4.0 International (CC BY 4.0) License pelo autor.

meta: Feito com :PLATFORM usando o tema :THEME

not_found:
  statement: Desculpe, a página não foi encontrada.

notification:
  update_found: Uma nova versão do conteúdo está disponível.
  update: atualização

# ----- Posts related labels -----

post:
  written_by: Por
  posted: Postado em
  updated: Atualizado
  words: palavras
  pageview_measure: visualizações
  read_time:
    unit: min
    prompt: " de leitura"
  relate_posts: Leia também
  share: Compartilhar
  button:
    next: Próximo
    previous: Anterior
    copy_code:
      succeed: Copiado!
    share_link:
      title: Copie o link
      succeed: Link copiado com sucesso!

# categories page
categories:
  category_measure: categorias
  post_measure: posts


================================================
FILE: _data/locales/ru-RU.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Пост
  category: Категория
  tag: Тег

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Главная
  categories: Категории
  tags: Теги
  archives: Архив
  about: О сайте

# the text displayed in the search bar & search results
search:
  hint: поиск
  cancel: Отмена
  no_results: Упс! Ничего не найдено.

panel:
  lastmod: Недавно обновлено
  trending_tags: Популярные теги
  toc: Содержание

copyright:
  # Shown at the bottom of the post
  license:
    template: Авторский пост защищен лицензией :LICENSE_NAME.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Некоторые права защищены.
  verbose: >-
    Если не указано иное, авторские посты на этом сайте защищены лицензией Creative Commons Attribution 4.0 International (CC BY 4.0).

meta: Использует тему :THEME для :PLATFORM

not_found:
  statement: Извините, мы перепутали URL-адрес или он указывает на что-то несуществующее.

notification:
  update_found: Доступна новая версия контента.
  update: Обновить

# ----- Posts related labels -----

post:
  written_by: Автор
  posted: Опубликовано
  updated: Обновлено
  words: слов
  pageview_measure: просмотров
  read_time:
    unit: мин.
    prompt: чтения
  relate_posts: Похожие посты
  share: Поделиться
  button:
    next: Следующий пост
    previous: Предыдущий пост
    copy_code:
      succeed: Скопировано!
    share_link:
      title: Скопировать ссылку
      succeed: Ссылка успешно скопирована!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%d.%m.%Y"
    dayjs: "DD.MM.YYYY"

# categories page
categories:
  category_measure:
    singular: категория
    plural: категории
  post_measure:
    singular: пост
    plural: посты


================================================
FILE: _data/locales/sl-SI.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Objava #Post
  category: Kategorija #Category
  tag: Oznaka #Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Domov #Home
  categories: Kategorije #Categories
  tags: Oznake #Tags
  archives: Arhiv #Archives
  about: O meni #About

# the text displayed in the search bar & search results
search:
  hint: išči #search
  cancel: Prekliči #Cancel
  no_results: Ups! Vsebina ni bila najdena #Oops! No results found.

panel:
  lastmod: Nedavno Posodobljeno #Recently Updated
  trending_tags: Priljubljene Oznake #Trending Tags
  toc: Vsebina #Contents

copyright:
  # Shown at the bottom of the post
  license:
    template: Ta objava je licencirana pod :LICENCE_NAME s strani avtorja. #This post is licensed under :LICENSE_NAME by the author.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Nekatere pravice pridržane. #Some rights reserved.
  verbose: >-
    Razen kjer navedeno drugače, vse objave spletnega dnevnika so licencirane
    pod Creative Commons Attribution 4.0 International (CC BY 4.0) s strani avtorja.

meta: Uporabljena :PLATFORM tema :THEME #Using the :PLATFORM theme :THEME

not_found:
  statement: Oprostite, hiperpovezava je neustrezna ali vsebina ne obstajata. #Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.

notification:
  update_found: Novejša različica vsebine je na voljo. #A new version of content is available.
  update: Posodobi #Update

# ----- Posts related labels -----

post:
  written_by: Od #By
  posted: Objavljeno #Posted
  updated: Posodobljeno #Updated
  words: besede #words
  pageview_measure: ogledi #views
  read_time:
    unit: min
    prompt: beri #read
  relate_posts: Nadaljnje branje #Further Reading
  share: Deli #Share
  button:
    next: Novejše #Newer
    previous: Starejše #Older
    copy_code:
      succeed: Kopirano! #Copied!
    share_link:
      title: Kopiraj povezavo #Copy link
      succeed: Povezava uspešno kopirana! #Link copied successfully!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%e %b, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: kategorija #category
    plural: kategorije #categories
  post_measure:
    singular: objava #post
    plural: objave #posts


================================================
FILE: _data/locales/sv-SE.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Inlägg #Post
  category: Kategori #Category
  tag: Tagga #Tag

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Hem #Home
  categories: Kategorier #Categories
  tags: Taggar #Tags
  archives: Arkiv #Archives
  about: Om #About

# the text displayed in the search bar & search results
search:
  hint: sök
  cancel: Avbryt
  no_results: Hoppsan! Hittade inga sökträffar.

panel:
  lastmod: Senast uppdaterad
  trending_tags: Trendande taggar
  toc: Innehåll

copyright:
  # Shown at the bottom of the post
  license:
    template: Den här posten är publicerad under licensen :LICENSE_NAME av författaren.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Vissa rättigheter är reserverade.
  verbose: >-
    Om inte annat anges är blogginläggen på denna webbplats licensierade
     under Creative Commons Attribution 4.0 International (CC BY 4.0) av författaren.

meta: Byggd med :PLATFORM och temat :THEME

not_found:
  statement: Ursäkta, vi har tappat bort den här webbadressen eller så pekar den på något som inte längre finns.

notification:
  update_found: Det finns en ny version av innehållet.
  update: Uppdatera sidan

# ----- Posts related labels -----

post:
  written_by: Av
  posted: Postad
  updated: Uppdaterad
  words: ord
  pageview_measure: visningar
  read_time:
    unit: min
    prompt: läsning
  relate_posts: Mer läsning
  share: Dela
  button:
    next: Nyare
    previous: Äldre
    copy_code:
      succeed: Kopierat!
    share_link:
      title: Kopiera länk
      succeed: Länken har kopierats!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: kategori
    plural: kategorier
  post_measure:
    singular: inlägg
    plural: inlägg


================================================
FILE: _data/locales/th.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: โพสต์
  category: หมวดหมู่
  tag: แท็ก

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: หน้าแรก
  categories: หมวดหมู่
  tags: แท็ก
  archives: คลังเก็บ
  about: เกี่ยวกับ

# the text displayed in the search bar & search results
search:
  hint: ค้นหา
  cancel: ยกเลิก
  no_results: โอ๊ะ! ไม่พบผลลัพธ์

panel:
  lastmod: อัปเดตล่าสุด
  trending_tags: แท็กยอดนิยม
  toc: เนื้อหา

copyright:
  # Shown at the bottom of the post
  license:
    template: โพสต์นี้อยู่ภายใต้การอนุญาต :LICENSE_NAME โดยผู้เขียน
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: สงวนลิขสิทธิ์เป็นบางส่วน
  verbose: >-
    เว้นแต่ว่าจะระบุเป็นอย่างอื่น โพสต์บนเว็บไซต์นี้อยู่ภายใต้
    สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบ 4.0 นานาชาติ (CC BY 4.0) โดยผู้เขียน

meta: กำลังใช้ธีมของ :PLATFORM ชื่อ :THEME

not_found:
  statement: ขออภัย เราวาง URL นั้นไว้ผิดที่ หรือมันชี้ไปยังสิ่งที่ไม่มีอยู่

notification:
  update_found: มีเวอร์ชันใหม่ของเนื้อหา
  update: อัปเดต

# ----- Posts related labels -----

post:
  written_by: โดย
  posted: โพสต์เมื่อ
  updated: อัปเดตเมื่อ
  words: คำ
  pageview_measure: ครั้ง
  read_time:
    unit: นาที
    prompt: อ่าน
  relate_posts: อ่านต่อ
  share: แชร์
  button:
    next: ใหม่กว่า
    previous: เก่ากว่า
    copy_code:
      succeed: คัดลอกแล้ว!
    share_link:
      title: คัดลอกลิงก์
      succeed: คัดลอกลิงก์เรียบร้อยแล้ว!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

# categories page
categories:
  category_measure:
    singular: หมวดหมู่
    plural: หมวดหมู่
  post_measure:
    singular: โพสต์
    plural: โพสต์


================================================
FILE: _data/locales/tr-TR.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Gönderi
  category: Kategori
  tag: Etiket

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Ana Sayfa
  categories: Kategoriler
  tags: Etiketler
  archives: Arşiv
  about: Hakkında

# the text displayed in the search bar & search results
search:
  hint: Ara...
  cancel: İptal
  no_results: Hop! Öyle bir şey bulamadım.

panel:
  lastmod: Son Güncellenenler
  trending_tags: Yükselen Etiketler
  toc: İçindekiler

copyright:
  # Shown at the bottom of the post
  license:
    template: Bu gönderi :LICENSE_NAME lisansı altındadır.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/deed.tr

  # Displayed in the footer
  brief: Bazı hakları saklıdır.
  verbose: >-
    Aksi belirtilmediği sürece, bu sitedeki gönderiler Creative Commons Atıf 4.0 Uluslararası (CC BY 4.0) Lisansı altındadır.
    Kısaca sayfa linkini vererek değiştirebilir / paylaşabilirsiniz.

meta: :PLATFORM ve :THEME teması

not_found:
  statement: Üzgünüz, bu linki yanlış yerleştirdik veya var olmayan bir şeye işaret ediyor.

notification:
  update_found: İçeriğin yeni bir sürümü mevcut.
  update: Güncelle

# ----- Posts related labels -----

post:
  written_by: Yazan
  posted: Gönderim
  updated: Güncelleme
  words: sözcük
  pageview_measure: görüntülenme
  read_time:
    unit: dakikada
    prompt: okunabilir
  relate_posts: Benzer Gönderiler
  share: Paylaş
  button:
    next: İleri
    previous: Geri
    copy_code:
      succeed: Kopyalandı.
    share_link:
      title: Linki kopyala
      succeed: Link kopyalandı.

# categories page
categories:
  category_measure: kategori
  post_measure: gönderi


================================================
FILE: _data/locales/uk-UA.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Публікація
  category: Категорія
  tag: Тег

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Домашня сторінка
  categories: Категорії
  tags: Теги
  archives: Архів
  about: Про сайт

# the text displayed in the search bar & search results
search:
  hint: пошук
  cancel: Скасувати
  no_results: Ох! Нічого не знайдено.

panel:
  lastmod: Нещодавно оновлено
  trending_tags: Популярні теги
  toc: Зміст

copyright:
  # Shown at the bottom of the post
  license:
    template: Публікація захищена ліцензією :LICENSE_NAME.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Деякі права захищено.
  verbose: >-
    Публікації на сайті захищено ліцензією Creative Commons Attribution 4.0 International (CC BY 4.0),
    якщо інше не вказано в тексті.

meta: Powered by :PLATFORM with :THEME theme

not_found:
  statement: Вибачте, це посилання вказує на ресурс, що не існує.

notification:
  update_found: Доступна нова версія вмісту.
  update: Оновлення

# ----- Posts related labels -----

post:
  written_by: Автор
  posted: Час публікації
  updated: Оновлено
  words: слів
  pageview_measure: переглядів
  read_time:
    unit: хвилин
    prompt: читання
  relate_posts: Вас також може зацікавити
  share: Поділитися
  button:
    next: Попередня публікація
    previous: Наступна публікація
    copy_code:
      succeed: Успішно скопійовано!
    share_link:
      title: Скопіювати посилання
      succeed: Посилання успішно скопійовано!

# categories page
categories:
  category_measure: категорії
  post_measure: публікації


================================================
FILE: _data/locales/ur-PK.yml
================================================
# The layout text of site in Urdu (Pakistan)

# ----- Commons label -----

layout:
  post: تحریر
  category: زمرہ
  tag: ٹیگ

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: گھر
  categories: زمروں
  tags: ٹیگز
  archives: محفوظات
  about: تعارف

# the text displayed in the search bar & search results
search:
  hint: تلاش
  cancel: منسوخ
  no_results: اوہ! کوئی نتیجہ نہیں ملا۔

panel:
  lastmod: حال ہی میں اپ ڈیٹ
  trending_tags: مقبول ٹیگز
  toc: مواد

copyright:
  # Shown at the bottom of the post
  license:
    template: یہ تحریر :LICENSE_NAME کے تحت مصنف کی جانب سے لائسنس یافتہ ہے۔
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: کچھ حقوق محفوظ ہیں۔
  verbose: >-
    جب تک کہ دوسری صورت میں ذکر نہ ہو، اس سائٹ کی تحریریں
    مصنف کی جانب سے تخلیقی العام انتساب 4.0 بین الاقوامی (CC BY 4.0) لائسنس کے تحت دستیاب ہیں۔

meta: :PLATFORM کے لیے :THEME تھیم استعمال کیا جا رہا ہے۔

not_found:
  statement: معذرت، یہ URL غلط ہے یا جس چیز کی طرف اشارہ کر رہا ہے وہ موجود نہیں۔

notification:
  update_found: نیا مواد دستیاب ہے۔
  update: اپ ڈیٹ

# ----- Posts related labels -----

post:
  written_by: از
  posted: شائع شدہ
  updated: اپ ڈیٹ شدہ
  words: لفظ
  pageview_measure: مشاہدات
  read_time:
    unit: منٹ
    prompt: پڑھیں
  relate_posts: مزید مطالعہ
  share: شیئر
  button:
    next: نیا
    previous: پرانا
    copy_code:
      succeed: کاپی ہو گیا!
    share_link:
      title: لنک کاپی کریں
      succeed: لنک کامیابی سے کاپی ہو گیا!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%b %e, %Y"
    dayjs: "ll"
  archives:
    strftime: "%b"
    dayjs: "MMM"

categories:
  category_measure:
    singular: زمرہ
    plural: زمروں
  post_measure:
    singular: تحریر
    plural: تحریریں


================================================
FILE: _data/locales/vi-VN.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: Bài viết
  category: Danh mục
  tag: Thẻ

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: Trang chủ
  categories: Các danh mục
  tags: Các thẻ
  archives: Lưu trữ
  about: Giới thiệu

# the text displayed in the search bar & search results
search:
  hint: tìm kiếm
  cancel: Hủy
  no_results: Không có kết quả tìm kiếm.

panel:
  lastmod: Mới cập nhật
  trending_tags: Các thẻ thịnh hành
  toc: Mục lục

copyright:
  # Shown at the bottom of the post
  license:
    template: Bài viết này được cấp phép bởi tác giả theo giấy phép :LICENSE_NAME.
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: Một số quyền được bảo lưu.
  verbose: >-
    Trừ khi có ghi chú khác, các bài viết đăng trên trang này được cấp phép bởi tác giả theo giấy phép Creative Commons Attribution 4.0 International (CC BY 4.0).

meta: Trang web này được tạo bởi :PLATFORM với chủ đề :THEME

not_found:
  statement: Xin lỗi, chúng tôi đã đặt nhầm URL hoặc đường dẫn trỏ đến một trang nào đó không tồn tại.

notification:
  update_found: Đã có phiên bản mới của nội dung.
  update: Cập nhật

# ----- Posts related labels -----

post:
  written_by: Viết bởi
  posted: Đăng lúc
  updated: Cập nhật lúc
  words: từ
  pageview_measure: lượt xem
  read_time:
    unit: phút
    prompt: đọc
  relate_posts: Bài viết liên quan
  share: Chia sẻ
  button:
    next: Mới hơn
    previous: Cũ hơn
    copy_code:
      succeed: Đã sao chép!
    share_link:
      title: Sao chép đường dẫn
      succeed: Đã sao chép đường dẫn thành công!

# categories page
categories:
  category_measure: danh mục
  post_measure: bài viết


================================================
FILE: _data/locales/zh-CN.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: 文章
  category: 分类
  tag: 标签

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: 首页
  categories: 分类
  tags: 标签
  archives: 归档
  about: 关于

# the text displayed in the search bar & search results
search:
  hint: 搜索
  cancel: 取消
  no_results: 搜索结果为空

panel:
  lastmod: 最近更新
  trending_tags: 热门标签
  toc: 文章内容

copyright:
  # Shown at the bottom of the post
  license:
    template: 本文由作者按照 :LICENSE_NAME 进行授权
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: 保留部分权利。
  verbose: >-
    除非另有说明,本网站上的博客文章均由作者按照知识共享署名 4.0 国际 (CC BY 4.0) 许可协议进行授权。

meta: 本站采用 :PLATFORM 主题 :THEME

not_found:
  statement: 抱歉,我们放错了该 URL,或者它指向了不存在的内容。

notification:
  update_found: 发现新版本的内容。
  update: 更新

# ----- Posts related labels -----

post:
  written_by: 作者
  posted: 发表于
  updated: 更新于
  words: 字
  pageview_measure: 次浏览
  read_time:
    unit: 分钟
    prompt: 阅读
  relate_posts: 相关文章
  share: 分享
  button:
    next: 下一篇
    previous: 上一篇
    copy_code:
      succeed: 已复制!
    share_link:
      title: 分享链接
      succeed: 链接已复制!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%Y/%m/%d"
    dayjs: "YYYY/MM/DD"

# categories page
categories:
  category_measure: 个分类
  post_measure: 篇文章


================================================
FILE: _data/locales/zh-TW.yml
================================================
# The layout text of site

# ----- Commons label -----

layout:
  post: 文章
  category: 分類
  tag: 標籤

# The tabs of sidebar
tabs:
  # format: <filename_without_extension>: <value>
  home: 首頁
  categories: 分類
  tags: 標籤
  archives: 封存
  about: 關於

# the text displayed in the search bar & search results
search:
  hint: 搜尋
  cancel: 取消
  no_results: 沒有搜尋結果

panel:
  lastmod: 最近更新
  trending_tags: 熱門標籤
  toc: 文章摘要

copyright:
  # Shown at the bottom of the post
  license:
    template: 本文章以 :LICENSE_NAME 授權
    name: CC BY 4.0
    link: https://creativecommons.org/licenses/by/4.0/

  # Displayed in the footer
  brief: 保留部份權利。
  verbose: >-
    除非另有說明,否則本網誌的文章均由作者按照姓名標示 4.0 國際 (CC BY 4.0) 授權條款進行授權。

meta: 本網站使用 :PLATFORM 產生,採用 :THEME 主題

not_found:
  statement: 抱歉,您可能正在存取一個已被移動的 URL,或者它從未存在。

notification:
  update_found: 發現新版本更新。
  update: 更新

# ----- Posts related labels -----

post:
  written_by: 作者
  posted: 發布於
  updated: 更新於
  words: 字
  pageview_measure: 次瀏覽
  read_time:
    unit: 分鐘
    prompt: 閱讀
  relate_posts: 相關文章
  share: 分享
  button:
    next: 下一篇
    previous: 上一篇
    copy_code:
      succeed: 已複製!
    share_link:
      title: 分享連結
      succeed: 已複製連結!

# Date time format.
# See: <http://strftime.net/>, <https://day.js.org/docs/en/display/format>
df:
  post:
    strftime: "%Y/%m/%d"
    dayjs: "YYYY/MM/DD"

# categories page
categories:
  category_measure: 個分類
  post_measure: 篇文章


================================================
FILE: _data/media.yml
================================================
- extension: mp3
  mime_type: mpeg
- extension: mov
  mime_type: quicktime
- extension: avi
  mime_type: x-msvideo
- extension: mkv
  mime_type: x-matroska
- extension: ogv
  mime_type: ogg
- extension: weba
  mime_type: webm
- extension: 3gp
  mime_type: 3gpp
- extension: 3g2
  mime_type: 3gpp2
- extension: mid
  mime_type: midi


================================================
FILE: _data/origin/basic.yml
================================================
# fonts

webfonts: /assets/lib/fonts/main.css

# Libraries

toc:
  css: /assets/lib/tocbot/tocbot.min.css
  js: /assets/lib/tocbot/tocbot.min.js

fontawesome:
  css: /assets/lib/fontawesome-free/css/all.min.css

search:
  js: /assets/lib/simple-jekyll-search/simple-jekyll-search.min.js

mermaid:
  js: /assets/lib/mermaid/mermaid.min.js

dayjs:
  js:
    common: /assets/lib/dayjs/dayjs.min.js
    locale: /assets/lib/dayjs/locale/en.js
    relativeTime: /assets/lib/dayjs/plugin/relativeTime.js
    localizedFormat: /assets/lib/dayjs/plugin/localizedFormat.js

glightbox:
  css: /assets/lib/glightbox/glightbox.min.css
  js: /assets/lib/glightbox/glightbox.min.js

lazy-polyfill:
  css: /assets/lib/loading-attribute-polyfill/loading-attribute-polyfill.min.css
  js: /assets/lib/loading-attribute-polyfill/loading-attribute-polyfill.umd.min.js

clipboard:
  js: /assets/lib/clipboard/clipboard.min.js

mathjax:
  js: /assets/lib/mathjax/tex-chtml.js


================================================
FILE: _data/origin/cors.yml
================================================
# Resource Hints
resource_hints:
  - url: https://fonts.googleapis.com
    links:
      - rel: preconnect
      - rel: dns-prefetch
  - url: https://fonts.gstatic.com
    links:
      - rel: preconnect
        opts: [crossorigin]
      - rel: dns-prefetch
  - url: https://cdn.jsdelivr.net
    links:
      - rel: preconnect
      - rel: dns-prefetch

# Web Fonts
webfonts: https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap

# Libraries

toc:
  css: https://cdn.jsdelivr.net/npm/tocbot@4.36.4/dist/tocbot.min.css
  js: https://cdn.jsdelivr.net/npm/tocbot@4.36.4/dist/tocbot.min.js

fontawesome:
  css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.2.0/css/all.min.css

search:
  js: https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js

mermaid:
  js: https://cdn.jsdelivr.net/npm/mermaid@11.13.0/dist/mermaid.min.js

dayjs:
  js:
    common: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/dayjs.min.js
    locale: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/locale/:LOCALE.js
    relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/plugin/relativeTime.js
    localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/plugin/localizedFormat.js

glightbox:
  css: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css
  js: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js

lazy-polyfill:
  css: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2.1.1/dist/loading-attribute-polyfill.min.css
  js: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2.1.1/dist/loading-attribute-polyfill.umd.min.js

clipboard:
  js: https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js

mathjax:
  js: https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-chtml.js


================================================
FILE: _data/share.yml
================================================
#  Sharing options at the bottom of the post.
#  Icons from <https://fontawesome.com/>

platforms:
  - type: Twitter
    icon: "fa-brands fa-square-x-twitter"
    link: "https://twitter.com/intent/tweet?text=TITLE&url=URL"

  - type: Facebook
    icon: "fab fa-facebook-square"
    link: "https://www.facebook.com/sharer/sharer.php?title=TITLE&u=URL"

  - type: Telegram
    icon: "fab fa-telegram"
    link: "https://t.me/share/url?url=URL&text=TITLE"

  # Uncomment below if you need to.
  #
  # - type: Linkedin
  #   icon: "fab fa-linkedin"
  #   link: "https://www.linkedin.com/feed/?shareActive=true&shareUrl=URL"
  #
  # - type: Weibo
  #   icon: "fab fa-weibo"
  #   link: "https://service.weibo.com/share/share.php?title=TITLE&url=URL"
  #
  # - type: Mastodon
  #   icon: "fa-brands fa-mastodon"
  #   # See: https://github.com/justinribeiro/share-to-mastodon#properties
  #   instances:
  #     - label: mastodon.social
  #       link: "https://mastodon.social/"
  #     - label: mastodon.online
  #       link: "https://mastodon.online/"
  #     - label: fosstodon.org
  #       link: "https://fosstodon.org/"
  #     - label: photog.social
  #       link: "https://photog.social/"
  #
  # - type: Bluesky
  #   icon: "fa-brands fa-bluesky"
  #   link: "https://bsky.app/intent/compose?text=TITLE%20URL"
  #
  # - type: Reddit
  #   icon: "fa-brands fa-square-reddit"
  #   link: "https://www.reddit.com/submit?url=URL&title=TITLE"
  #
  # - type: Threads
  #   icon: "fa-brands fa-square-threads"
  #   link: "https://www.threads.net/intent/post?text=TITLE%20URL"


================================================
FILE: _includes/analytics/cloudflare.html
================================================
<!-- Cloudflare Web Analytics -->
<script
  defer
  src="https://static.cloudflareinsights.com/beacon.min.js"
  data-cf-beacon='{"token": "{{ site.analytics.cloudflare.id }}"}'
></script>


================================================
FILE: _includes/analytics/fathom.html
================================================
<!-- Fathom -->
<script
  src="https://cdn.usefathom.com/script.js"
  data-site="{{ site.analytics.fathom.id }}"
  defer
></script>


================================================
FILE: _includes/analytics/goatcounter.html
================================================
<!-- GoatCounter -->
<script
  async
  src="https://gc.zgo.at/count.js"
  data-goatcounter="https://{{ site.analytics.goatcounter.id }}.goatcounter.com/count"
></script>


================================================
FILE: _includes/analytics/google.html
================================================
<!-- Global site tag (gtag.js) - Google Analytics -->
<script defer src="https://www.googletagmanager.com/gtag/js?id={{ site.analytics.google.id }}"></script>
<script>
  document.addEventListener('DOMContentLoaded', () => {
    window.dataLayer = window.dataLayer || [];
    function gtag() {
      dataLayer.push(arguments);
    }

    gtag('js', new Date());
    gtag('config', '{{ site.analytics.google.id }}');
  });
</script>


================================================
FILE: _includes/analytics/matomo.html
================================================
<!-- Matomo -->
<script>
  document.addEventListener('DOMContentLoaded', () => {
    var _paq = (window._paq = window._paq || []);
    _paq.push(['trackPageView']);
    _paq.push(['enableLinkTracking']);
    var u="//{{ site.analytics.matomo.domain }}/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', {{ site.analytics.matomo.id }}]);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  });
</script>


================================================
FILE: _includes/analytics/umami.html
================================================
<!-- Umami -->
<script
  defer
  src="{{ site.analytics.umami.domain }}/script.js"
  data-website-id="{{ site.analytics.umami.id }}"
></script>


================================================
FILE: _includes/comment.html
================================================
<!-- The comments switcher -->
{% if page.comments and site.comments.provider %}
  {% capture path %}comments/{{ site.comments.provider }}.html{% endcapture %}
  {% include {{ path }} %}
{% endif %}


================================================
FILE: _includes/comments/disqus.html
================================================
<script>
  var disqus_config = function () {
    this.page.url = '{{ page.url | absolute_url }}';
    this.page.identifier = '{{ page.url }}';
  };

  function addDisqus() {
    let disqusThread = document.createElement('div');
    let paragraph = document.createElement('p');

    disqusThread.id = 'disqus_thread';
    paragraph.className = 'text-center text-muted small';
    paragraph.innerHTML = 'Comments powered by <a href="https://disqus.com/">Disqus</a>.';
    disqusThread.appendChild(paragraph);

    const footer = document.querySelector('footer');
    footer.insertAdjacentElement("beforebegin", disqusThread);
  }

  {%- comment -%} Auto switch theme {%- endcomment -%}
  function reloadDisqus(event) {
    if (event.source === window && event.data && event.data.id === Theme.ID) {
      {%- comment -%} Disqus hasn't been loaded {%- endcomment -%}
      if (typeof DISQUS === 'undefined') {
        return;
      }

      if (document.readyState == 'complete') {
        DISQUS.reset({ reload: true, config: disqus_config });
      }
    }
  }

  addDisqus();

  if (Theme.switchable) {
    addEventListener('message', reloadDisqus);
  }

  {%- comment -%} Lazy loading {%- endcomment -%}
  var disqusObserver = new IntersectionObserver(
    function (entries) {
      if (entries[0].isIntersecting) {
        var d = document,
          s = d.createElement('script');
        s.src = 'https://{{ site.comments.disqus.shortname }}.disqus.com/embed.js';
        s.setAttribute('data-timestamp', +new Date());
        (d.head || d.body).appendChild(s);

        disqusObserver.disconnect();
      }
    },
    { threshold: [0] }
  );

  disqusObserver.observe(document.getElementById('disqus_thread'));
</script>


================================================
FILE: _includes/comments/giscus.html
================================================
<!-- https://giscus.app/ -->
<script>
  (function () {
    const themeMapper = Theme.getThemeMapper('light', 'dark_dimmed');
    const initTheme = themeMapper[Theme.visualState];

    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}}',
      'data-repo-id': '{{ site.comments.giscus.repo_id }}',
      'data-category': '{{ site.comments.giscus.category }}',
      'data-category-id': '{{ site.comments.giscus.category_id }}',
      'data-mapping': '{{ site.comments.giscus.mapping | default: 'pathname' }}',
      'data-strict' : '{{ site.comments.giscus.strict | default: '0' }}',
      'data-reactions-enabled': '{{ site.comments.giscus.reactions_enabled | default: '1' }}',
      'data-emit-metadata': '0',
      'data-theme': initTheme,
      'data-input-position': '{{ site.comments.giscus.input_position | default: 'bottom' }}',
      'data-lang': lang,
      'data-loading': 'lazy',
      crossorigin: 'anonymous',
      async: ''
    };

    let giscusNode = document.createElement('script');
    Object.entries(giscusAttributes).forEach(([key, value]) =>
      giscusNode.setAttribute(key, value)
    );

    const $footer = document.querySelector('footer');
    $footer.insertAdjacentElement("beforebegin", giscusNode);

    addEventListener('message', (event) => {
      if (event.source === window && event.data && event.data.id === Theme.ID) {
        const newTheme = themeMapper[Theme.visualState];

        const message = {
          setConfig: {
            theme: newTheme
          }
        };

        const giscus =
          document.getElementsByClassName('giscus-frame')[0].contentWindow;
        giscus.postMessage({ giscus: message }, 'https://giscus.app');
      }
    });
  })();
</script>


================================================
FILE: _includes/comments/utterances.html
================================================
<!-- https://utteranc.es/ -->
<script>
  (function () {
    const origin = 'https://utteranc.es';
    const themeMapper = Theme.getThemeMapper('github-light', 'github-dark');
    const initTheme = themeMapper[Theme.visualState];

    let script = document.createElement('script');
    script.src = 'https://utteranc.es/client.js';
    script.setAttribute('repo', '{{ site.comments.utterances.repo }}');
    script.setAttribute('issue-term', '{{ site.comments.utterances.issue_term }}');
    script.setAttribute('theme', initTheme);
    script.crossOrigin = 'anonymous';
    script.async = true;

    const $footer = document.querySelector('footer');
    $footer.insertAdjacentElement('beforebegin', script);

    addEventListener('message', (event) => {
      let newTheme;

      {%- comment -%}
        Credit to <https://github.com/utterance/utterances/issues/170#issuecomment-594036347>
      {%- endcomment -%}
      if (event.source === window && event.data && event.data.id === Theme.ID) {
        newTheme = themeMapper[Theme.visualState];

        const message = {
          type: 'set-theme',
          theme: newTheme
        };

        const utterances = document.querySelector('.utterances-frame').contentWindow;
        utterances.postMessage(message, origin);
      }
    });
  })();
</script>


================================================
FILE: _includes/datetime.html
================================================
<!--
  Date format snippet
  See: ${JS_ROOT}/modules/components/locale-datetime.js
-->

{% assign df_strftime = site.data.locales[include.lang].df.post.strftime | default: '%d/%m/%Y' %}
{% assign df_dayjs = site.data.locales[include.lang].df.post.dayjs | default: 'DD/MM/YYYY' %}

<time
  {% if include.class %}
    class="{{ include.class }}"
  {% endif %}
  data-ts="{{ include.date | date: '%s' }}"
  data-df="{{ df_dayjs }}"
  {% if include.tooltip %}
    data-bs-toggle="tooltip" data-bs-placement="bottom"
  {% endif %}
>
  {{ include.date | date: df_strftime }}
</time>


================================================
FILE: _includes/embed/audio.html
================================================
{% assign src = include.src | strip %}
{% assign title = include.title | strip %}
{% assign types = include.types | default: '' | strip | split: '|' %}

{% unless src contains '://' %}
  {%- capture src -%}
    {% include media-url.html src=src subpath=page.media_subpath %}
  {%- endcapture -%}
{% endunless %}

<p>
  <audio class="embed-audio file" controls>
    {% assign extension = src | split: '.' | last %}
    {% assign types = extension | concat: types %}

    {% assign ext_size = extension | size %}
    {% assign src_size = src | size %}
    {% assign slice_size = src_size | minus: ext_size %}

    {% assign filepath = src | slice: 0, slice_size %}

    {% for type in types %}
      {% assign src = filepath | append: type %}
      {% assign media_item = site.data.media | find: 'extension', type %}
      {% assign mime_type = media_item.mime_type | default: type %}
      <source src="{{ src }}" type="audio/{{ mime_type }}">
    {% endfor %}

    Your browser does not support the audio tag. Here is a
    <a href="{{ src | strip }}">link to the audio file</a> instead.
  </audio>
  {% if title %}
    <em>{{ title }}</em>
  {% endif %}
</p>


================================================
FILE: _includes/embed/bilibili.html
================================================
<iframe
  class="embed-video"
  loading="lazy"
  src="https://player.bilibili.com/player.html?bvid={{ include.id }}"
  scrolling="no"
  frameborder="0"
  framespacing="0"
  allowfullscreen="true"
></iframe>


================================================
FILE: _includes/embed/spotify.html
================================================
{% assign size = 352 %}
{% assign theme = '' %}

{% if include.compact %}
  {% assign size = 152 %}
{% endif %}

{% if include.dark %}
  {% assign theme = '?theme=0' %}
{% endif %}

<iframe
  class="embed-audio spotify"
  src="https://open.spotify.com/embed/track/{{ include.id | append: theme }}"
  height="{{ size }}"
  frameBorder="0"
  allowfullscreen=""
  allowtransparency="true"
  allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"
  loading="lazy"
>
</iframe>


================================================
FILE: _includes/embed/twitch.html
================================================
<iframe
  class="embed-video twitch"
  loading="lazy"
  src="https://player.twitch.tv/?video={{ include.id }}&parent={{ site.url | split: '://' | last | remove: '/' }}"
  frameborder="0"
  allowfullscreen="true"
  scrolling="no"
></iframe>


================================================
FILE: _includes/embed/video.html
================================================
{% assign video_url = include.src %}
{% assign title = include.title %}
{% assign poster_url = include.poster %}
{% assign types = include.types | default: '' | strip | split: '|' %}

{% unless video_url contains '://' %}
  {%- capture video_url -%}
    {% include media-url.html src=video_url subpath=page.media_subpath %}
  {%- endcapture -%}
{% endunless %}

{% if poster_url %}
  {% unless poster_url contains '://' %}
    {%- capture poster_url -%}
      {% include media-url.html src=poster_url subpath=page.media_subpath %}
    {%- endcapture -%}
  {% endunless %}
  {% assign poster = 'poster="' | append: poster_url | append: '"' %}
{% endif %}

{% assign attributes = 'controls' %}

{% if include.autoplay %}
  {% assign attributes = attributes | append: ' ' | append: 'autoplay' %}
{% endif %}

{% if include.loop %}
  {% assign attributes = attributes | append: ' ' | append: 'loop' %}
{% endif %}

{% if include.muted %}
  {% assign attributes = attributes | append: ' ' | append: 'muted' %}
{% endif %}

<p>
  <video class="embed-video file" {{ poster }} {{ attributes }}>
    {% assign extension = video_url | split: '.' | last %}
    {% assign types = extension | concat: types %}

    {% assign ext_size = extension | size %}
    {% assign src_size = video_url | size %}
    {% assign slice_size = src_size | minus: ext_size %}

    {% assign filepath = video_url | slice: 0, slice_size %}

    {% for type in types %}
      {% assign src = filepath | append: type %}
      {% assign media_item = site.data.media | find: 'extension', type %}
      {% assign mime_type = media_item.mime_type | default: type %}
      <source src="{{ src }}" type="video/{{ mime_type }}">
    {% endfor %}

    Your browser does not support the video tag. Here is a
    <a href="{{ video_url | strip }}">link to the video file</a> instead.
  </video>
  {% if title %}
    <em>{{ title }}</em>
  {% endif %}
</p>


================================================
FILE: _includes/embed/youtube.html
================================================
<iframe
  class="embed-video"
  loading="lazy"
  src="https://www.youtube.com/embed/{{ include.id }}"
  title="YouTube video player"
  frameborder="0"
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  allowfullscreen
></iframe>


================================================
FILE: _includes/favicons.html
================================================
<!--
  The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps
  Generated by: https://realfavicongenerator.net/
-->

{% capture favicon_path %}{{ '/assets/img/favicons' | relative_url }}{% endcapture %}

<link rel="icon" type="image/png" href="{{ favicon_path }}/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/svg+xml" href="{{ favicon_path }}/favicon.svg">
<link rel="shortcut icon" href="{{ favicon_path }}/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="{{ favicon_path }}/apple-touch-icon.png">
{% if site.pwa.enabled %}
  <link rel="manifest" href="{{ favicon_path }}/site.webmanifest">
{% endif %}


================================================
FILE: _includes/footer.html
================================================
<!-- The Footer -->

<footer
  aria-label="Site Info"
  class="
    d-flex flex-column justify-content-center text-muted
    flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
  "
>
  <p>
    {{- '©' }}
    <time>{{ 'now' | date: '%Y' }}</time>

    {% if site.social.links %}
      <a href="{{ site.social.links[0] }}">{{ site.social.name }}</a>.
    {% else %}
      <em class="fst-normal">{{ site.social.name }}</em>.
    {% endif %}

    {% if site.data.locales[include.lang].copyright.brief %}
      <span
        data-bs-toggle="tooltip"
        data-bs-placement="top"
        title="{{ site.data.locales[include.lang].copyright.verbose }}"
      >
        {{- site.data.locales[include.lang].copyright.brief -}}
      </span>
    {% endif %}
  </p>

  <p>
    {%- capture _platform -%}
      <a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a>
    {%- endcapture -%}

    {%- capture _theme -%}
      <a
        data-bs-toggle="tooltip"
        data-bs-placement="top"
        title="v{{ theme.version }}"
        href="https://github.com/cotes2020/jekyll-theme-chirpy"
        target="_blank"
        rel="noopener"
      >Chirpy</a>
    {%- endcapture -%}

    {{ site.data.locales[include.lang].meta | replace: ':PLATFORM', _platform | replace: ':THEME', _theme }}
  </p>
</footer>


================================================
FILE: _includes/head.html
================================================
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
  <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
  <meta name="mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <meta
    name="viewport"
    content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
  >

  {%- capture seo_tags -%}
    {% seo title=false %}
  {%- endcapture -%}

  <!-- Setup Open Graph image -->

  {% if page.image %}
    {% assign src = page.image.path | default: page.image %}

    {% unless src contains '://' %}
      {%- capture img_url -%}
        {% include media-url.html src=src subpath=page.media_subpath absolute=true %}
      {%- endcapture -%}

      {%- capture old_url -%}{{ src | absolute_url }}{%- endcapture -%}
      {%- capture new_url -%}{{ img_url }}{%- endcapture -%}

      {% assign seo_tags = seo_tags | replace: old_url, new_url %}
    {% endunless %}

  {% elsif site.social_preview_image %}
    {%- capture img_url -%}
      {% include media-url.html src=site.social_preview_image absolute=true %}
    {%- endcapture -%}

    {%- capture og_image -%}
      <meta property="og:image" content="{{ img_url }}" />
    {%- endcapture -%}

    {%- capture twitter_image -%}
      <meta name="twitter:card" content="summary_large_image" />
      <meta property="twitter:image" content="{{ img_url }}" />
    {%- endcapture -%}

    {% assign old_meta_clip = '<meta name="twitter:card" content="summary" />' %}
    {% assign new_meta_clip = og_image | append: twitter_image %}
    {% assign seo_tags = seo_tags | replace: old_meta_clip, new_meta_clip %}
  {% endif %}

  {{ seo_tags }}

  {%- if site.social.fediverse_handle %}
    <!-- Fediverse handle/creator -->
    <meta name="fediverse:creator" content="{{ site.social.fediverse_handle }}">
  {% endif %}

  <title>
    {%- unless page.layout == 'home' -%}
      {%- capture title -%}
        {%- if page.collection == 'tabs' -%}
          {%- assign tab_key = page.title | downcase -%}
          {{- site.data.locales[include.lang].tabs[tab_key] -}}
        {%- else -%}
          {{- page.title -}}
        {%- endif -%}
      {%- endcapture -%}
      {{- title | append: ' | ' -}}
    {%- endunless -%}
    {{- site.title -}}
  </title>

  {% include_cached favicons.html %}

  <!-- Resource Hints -->
  {% unless site.assets.self_host.enabled %}
    {% for hint in site.data.origin.cors.resource_hints %}
      {% for link in hint.links %}
        <link rel="{{ link.rel }}" href="{{ hint.url }}" {{ link.opts | join: ' ' }}>
      {% endfor %}
    {% endfor %}
  {% endunless %}

  <!-- Bootstrap -->
  {% unless jekyll.environment == 'production' %}
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css">
  {% endunless %}

  <!-- Theme style -->
  <link rel="stylesheet" href="{{ '/assets/css/:THEME.css' | replace: ':THEME', site.theme | relative_url }}">

  <!-- Web Font -->
  <link rel="stylesheet" href="{{ site.data.origin[type].webfonts | relative_url }}">

  <!-- Font Awesome Icons -->
  <link rel="stylesheet" href="{{ site.data.origin[type].fontawesome.css | relative_url }}">

  <!-- 3rd-party Dependencies -->

  {% if site.toc and page.toc %}
    <link rel="stylesheet" href="{{ site.data.origin[type].toc.css | relative_url }}">
  {% endif %}

  {% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %}
    <link rel="stylesheet" href="{{ site.data.origin[type]['lazy-polyfill'].css | relative_url }}">
  {% endif %}

  {% if page.layout == 'page' or page.layout == 'post' %}
    <!-- Image Popup -->
    <link rel="stylesheet" href="{{ site.data.origin[type].glightbox.css | relative_url }}">
  {% endif %}

  <!-- Scripts -->

  <script src="{{ '/assets/js/dist/theme.min.js' | relative_url }}"></script>

  {% include js-selector.html lang=lang %}

  {% if jekyll.environment == 'production' %}
    <!-- PWA -->
    {% if site.pwa.enabled %}
      <script
        defer
        src="{{ '/app.min.js' | relative_url }}?baseurl={{ site.baseurl | default: '' }}&register={{ site.pwa.cache.enabled }}"
      ></script>
    {% endif %}

    <!-- Web Analytics -->
    {% for analytics in site.analytics %}
      {% capture str %}{{ analytics }}{% endcapture %}
      {% assign platform = str | split: '{' | first %}
      {% if site.analytics[platform].id and site.analytics[platform].id != empty %}
        {% include analytics/{{ platform }}.html %}
      {% endif %}
    {% endfor %}
  {% endif %}

  {% include metadata-hook.html %}
</head>


================================================
FILE: _includes/js-selector.html
================================================
<!-- JS selector for site. -->

<!-- commons -->

{% assign urls = site.data.origin[type].search.js %}

<!-- layout specified -->

{% if page.layout == 'post' or page.layout == 'page' or page.layout == 'home' %}
  {% assign urls = urls | append: ',' | append: site.data.origin[type]['lazy-polyfill'].js %}

  {% unless page.layout == 'home' %}
    <!-- image lazy-loading & popup & clipboard -->
    {% assign urls = urls
      | append: ','
      | append: site.data.origin[type].glightbox.js
      | append: ','
      | append: site.data.origin[type].clipboard.js
    %}
  {% endunless %}
{% endif %}

{% if page.layout == 'home'
  or page.layout == 'post'
  or page.layout == 'archives'
  or page.layout == 'category'
  or page.layout == 'tag'
%}
  {% assign locale = include.lang | split: '-' | first %}

  {% assign urls = urls
    | append: ','
    | append: site.data.origin[type].dayjs.js.common
    | append: ','
    | append: site.data.origin[type].dayjs.js.locale
    | replace: ':LOCALE', locale
    | append: ','
    | append: site.data.origin[type].dayjs.js.relativeTime
    | append: ','
    | append: site.data.origin[type].dayjs.js.localizedFormat
  %}
{% endif %}

{% if page.content contains '<h2' or page.content contains '<h3' and site.toc and page.toc %}
  {% assign urls = urls | append: ',' | append: site.data.origin[type].toc.js %}
{% endif %}

{% if page.mermaid %}
  {% assign urls = urls | append: ',' | append: site.data.origin[type].mermaid.js %}
{% endif %}

{% include jsdelivr-combine.html urls=urls %}

{% case page.layout %}
  {% when 'home', 'categories', 'post', 'page' %}
    {% assign js = page.layout %}
  {% when 'archives', 'category', 'tag' %}
    {% assign js = 'misc' %}
  {% else %}
    {% assign js = 'commons' %}
{% endcase %}

{% capture script %}/assets/js/dist/{{ js }}.min.js{% endcapture %}

<script defer src="{{ script | relative_url }}"></script>

{% if page.math %}
  <!-- MathJax -->
  <script src="{{ '/assets/js/data/mathjax.js' | relative_url }}"></script>
  <script async src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
  <script id="MathJax-script" async src="{{ site.data.origin[type].mathjax.js | relative_url }}"></script>
{% endif %}

<!-- Pageviews -->
{% if page.layout == 'post' %}
  {% assign provider = site.pageviews.provider %}

  {% if provider and provider != empty %}
    {% case provider %}
      {% when 'goatcounter' %}
        {% if site.analytics[provider].id != empty and site.analytics[provider].id %}
          {% include pageviews/{{ provider }}.html %}
        {% endif %}
    {% endcase %}
  {% endif %}
{% endif %}


================================================
FILE: _includes/jsdelivr-combine.html
================================================
{% assign urls = include.urls | split: ',' %}

{% assign combined_urls = null %}

{% assign domain = 'https://cdn.jsdelivr.net/' %}

{% for url in urls %}
  {% if url contains domain %}
    {% assign url_snippet = url | slice: domain.size, url.size %}

    {% if combined_urls %}
      {% assign combined_urls = combined_urls | append: ',' | append: url_snippet %}
    {% else %}
      {% assign combined_urls = domain | append: 'combine/' | append: url_snippet %}
    {% endif %}

  {% elsif url contains '//' %}
    <script defer src="{{ url }}"></script>
  {% else %}
    <script defer src="{{ url | relative_url }}"></script>
  {% endif %}
{% endfor %}

{% if combined_urls %}
  <script defer src="{{ combined_urls }}"></script>
{% endif %}


================================================
FILE: _includes/lang.html
================================================
{% comment %}
  Detect appearance language and return it through variable "lang"
{% endcomment %}
{% if site.data.locales[page.lang] %}
  {% assign lang = page.lang %}
{% elsif site.data.locales[site.lang] %}
  {% assign lang = site.lang %}
{% else %}
  {% assign lang = 'en' %}
{% endif %}


================================================
FILE: _includes/language-alias.html
================================================
{% comment %}
  Convert the alias of the syntax language to the official name

  See: <https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers>
{% endcomment %}

{% assign _lang = include.language | default: '' %}

{% case _lang %}
  {% when 'actionscript', 'as', 'as3' %}
    {{ 'ActionScript' }}
  {% when 'applescript' %}
    {{ 'AppleScript' }}
  {% when 'brightscript', 'bs', 'brs' %}
    {{ 'BrightScript' }}
  {% when 'cfscript', 'cfc' %}
    {{ 'CFScript' }}
  {% when 'coffeescript', 'coffee', 'coffee-script' %}
    {{ 'CoffeeScript' }}
  {% when 'cs', 'csharp' %}
    {{ 'C#' }}
  {% when 'erl' %}
    {{ 'Erlang' }}
  {% when 'graphql' %}
    {{ 'GraphQL' }}
  {% when 'haskell', 'hs' %}
    {{ 'Haskell' }}
  {% when 'javascript', 'js' %}
    {{ 'JavaScript' }}
  {% when 'make', 'mf', 'gnumake', 'bsdmake' %}
    {{ 'Makefile' }}
  {% when 'md', 'mkd' %}
    {{ 'Markdown' }}
  {% when 'm' %}
    {{ 'Matlab' }}
  {% when 'objective_c', 'objc', 'obj-c', 'obj_c', 'objectivec' %}
    {{ 'Objective-C' }}
  {% when 'perl', 'pl' %}
    {{ 'Perl' }}
  {% when 'php', 'php3', 'php4', 'php5' %}
    {{ 'PHP' }}
  {% when 'py' %}
    {{ 'Python' }}
  {% when 'rb' %}
    {{ 'Ruby' }}
  {% when 'rs', 'no_run', 'ignore', 'should_panic' %}
    {{ 'Rust' }}
  {% when 'bash', 'zsh', 'ksh', 'sh' %}
    {{ 'Shell' }}
  {% when 'st', 'squeak' %}
    {{ 'Smalltalk' }}
  {% when 'tex' %}
    {{ 'TeX' }}
  {% when 'latex' %}
    {{ 'LaTeX' }}
  {% when 'ts', 'typescript' %}
    {{ 'TypeScript' }}
  {% when 'vb', 'visualbasic' %}
    {{ 'Visual Basic' }}
  {% when 'vue', 'vuejs' %}
    {{ 'Vue.js' }}
  {% when 'yml' %}
    {{ 'YAML' }}
  {% when 'css', 'html', 'scss', 'ssh', 'toml', 'xml', 'yaml', 'json' %}
    {{ _lang | upcase }}
  {% else %}
    {{ _lang | capitalize }}
{% endcase %}


================================================
FILE: _includes/media-url.html
================================================
{%- comment -%}
  Generate media resource final URL based on `site.cdn`, `page.media_subpath`

  Arguments:
    src - required, basic media resources path
    subpath - optional, relative path of media resources
    absolute - optional, boolean, if true, generate absolute URL

  Return:
    media resources URL
{%- endcomment -%}

{% assign url = include.src %}

{%- if url -%}
  {% unless url contains ':' %}
    {%- comment -%} Add media resources subpath prefix {%- endcomment -%}
    {% assign url = include.subpath | default: '' | append: '/' | append: url %}

    {%- comment -%} Prepend CDN URL {%- endcomment -%}
    {% if site.cdn %}
      {% assign url = site.cdn | append: '/' | append: url %}
    {% endif %}

    {% assign url = url | replace: '///', '/' | replace: '//', '/' | replace: ':/', '://' %}

    {% unless url contains '://' %}
      {% if include.absolute %}
        {% assign url = site.url | append: site.baseurl | append: url %}
      {% else %}
        {% assign url = site.baseurl | append: url %}
      {% endif %}
    {% endunless %}
  {% endunless %}
{%- endif -%}

{{- url -}}


================================================
FILE: _includes/metadata-hook.html
================================================
<!-- A placeholder to allow defining custom metadata -->


================================================
FILE: _includes/notification.html
================================================
<aside
  id="notification"
  class="toast"
  role="alert"
  aria-live="assertive"
  aria-atomic="true"
  data-bs-animation="true"
  data-bs-autohide="false"
>
  <div class="toast-header">
    <button
      type="button"
      class="btn-close ms-auto"
      data-bs-dismiss="toast"
      aria-label="Close"
    ></button>
  </div>
  <div class="toast-body text-center pt-0">
    <p class="px-2 mb-3">{{ site.data.locales[include.lang].notification.update_found }}</p>
    <button type="button" class="btn btn-primary" aria-label="Update">
      {{ site.data.locales[include.lang].notification.update }}
    </button>
  </div>
</aside>


================================================
FILE: _includes/origin-type.html
================================================
{% comment %} Site static assets origin type {% endcomment %}

{% assign type = 'cors' %}

{% if site.assets.self_host.enabled %}
  {% if site.assets.self_host.env %}
    {% if site.assets.self_host.env == jekyll.environment %}
      {% assign type = 'basic' %}
    {% endif %}
  {% else %}
    {% assign type = 'basic' %}
  {% endif %}
{% endif %}


================================================
FILE: _includes/pageviews/goatcounter.html
================================================
<!-- Display GoatCounter pageviews -->
<script>
  document.addEventListener('DOMContentLoaded', () => {
    const pv = document.getElementById('pageviews');

    if (pv !== null) {
      const uri = location.pathname.replace(/\/$/, '');
      const url = `https://{{ site.analytics.goatcounter.id }}.goatcounter.com/counter/${encodeURIComponent(uri)}.json`;

      fetch(url)
        .then((response) => response.json())
        .then((data) => {
          const count = data.count.replace(/\D/g, '');
          pv.innerText = new Intl.NumberFormat().format(count);
        })
        .catch((error) => {
          pv.innerText = '1';
        });
    }
  });
</script>


================================================
FILE: _includes/post-nav.html
================================================
<!-- Navigation buttons at the bottom of the post. -->

<nav class="post-navigation d-flex justify-content-between" aria-label="Post Navigation">
  {% assign previous = site.data.locales[include.lang].post.button.previous %}
  {% assign next = site.data.locales[include.lang].post.button.next %}

  {% if page.previous.url %}
    <a
      href="{{ site.baseurl }}{{ page.previous.url }}"
      class="btn btn-outline-primary"
      aria-label="{{ previous }}"
    >
      <p>{{ page.previous.title }}</p>
    </a>
  {% else %}
    <div class="btn btn-outline-primary disabled" aria-label="{{ previous }}">
      <p>-</p>
    </div>
  {% endif %}

  {% if page.next.url %}
    <a
      href="{{ site.baseurl }}{{page.next.url}}"
      class="btn btn-outline-primary"
      aria-label="{{ next }}"
    >
      <p>{{ page.next.title }}</p>
    </a>
  {% else %}
    <div class="btn btn-outline-primary disabled" aria-label="{{ next }}">
      <p>-</p>
    </div>
  {% endif %}
</nav>


================================================
FILE: _includes/post-paginator.html
================================================
<!-- The paginator for post list on HomePage. -->

<nav aria-label="Page Navigation">
  <ul class="pagination align-items-center mt-4 mb-0">
    <!-- left arrow -->
    {% if paginator.previous_page %}
      {% assign prev_url = paginator.previous_page_path | relative_url %}
    {% else %}
      {% assign prev_url = '#' %}
    {% endif %}

    <li class="page-item {% unless paginator.previous_page %}disabled{% endunless %}">
      <a class="page-link" href="{{ prev_url }}" aria-label="previous-page">
        <i class="fas fa-angle-left"></i>
      </a>
    </li>

    <!-- page numbers -->
    {% assign left_ellipsis = false %}
    {% assign right_ellipsis = false %}

    {% for i in (1..paginator.total_pages) %}
      {% assign pre = paginator.page | minus: 1 %}
      {% assign next = paginator.page | plus: 1 %}
      {% assign pre_less = pre | minus: 1 %}
      {% assign next_more = next | plus: 1 %}
      {% assign show = false %}

      {% if paginator.page == 1 %}
        {% if i <= 3 or i == paginator.total_pages %}
          {% assign show = true %}
        {% endif %}
      {% elsif paginator.page == paginator.total_pages %}
        {% if i == 1 or i >= pre_less %}
          {% assign show = true %}
        {% endif %}
      {% else %}
        {% if i == 1 or i == paginator.total_pages %}
          {% assign show = true %}
        {% elsif i >= pre and i <= next %}
          {% assign show = true %}
        {% endif %}
      {% endif %}

      {% if show %}
        <!-- show number -->
        <li class="page-item {% if i == paginator.page %} active{% endif %}">
          <a
            class="page-link"
            href="{% if i > 1 %}{{ site.paginate_path | replace: ':num', i | relative_url }}{% else %}{{ '/' | relative_url }}{% endif %}"
          >
            {{- i -}}
          </a>
        </li>
      {% else %}
        <!-- hide number -->
        {% if i < pre and left_ellipsis == false %}
          <li class="page-item disabled">
            <span class="page-link">...</span>
          </li>
          {% assign left_ellipsis = true %}
        {% elsif i > next and right_ellipsis == false %}
          <li class="page-item disabled">
            <span class="page-link">...</span>
          </li>
          {% assign right_ellipsis = true %}
        {% endif %}
      {% endif %}
    {% endfor %}

    <!-- mobile pagination -->
    <li class="page-index align-middle">
      <span>{{ paginator.page }}</span>
      <span class="text-muted">/ {{ paginator.total_pages }}</span>
    </li>

    <!-- right arrow -->
    {% if paginator.next_page_path %}
      {% assign next_url = paginator.next_page_path | relative_url %}
    {% else %}
      {% assign next_url = '#' %}
    {% endif %}

    <li class="page-item {% unless paginator.next_page_path %}disabled{% endunless %}">
      <a class="page-link" href="{{ next_url }}" aria-label="next-page">
        <i class="fas fa-angle-right"></i>
      </a>
    </li>
  </ul>
</nav>
<!-- .pagination -->


================================================
FILE: _includes/post-sharing.html
================================================
<!-- Post sharing snippet -->

<div class="share-wrapper d-flex align-items-center">
  <span class="share-label text-muted">{{ site.data.locales[include.lang].post.share }}</span>
  <span class="share-icons">
    {% capture title %}{{ page.title }} - {{ site.title }}{% endcapture %}
    {% assign title = title | uri_escape %}
    {% assign url = page.url | absolute_url | url_encode %}

    {% for share in site.data.share.platforms -%}
      {%- capture tooltip -%}
        data-bs-toggle="tooltip" data-bs-placement="top" title="{{ share.type }}" aria-label="{{ share.type }}"
      {%- endcapture -%}

      {% if share.type == 'Mastodon' %}
        <script defer type="module" src="https://cdn.jsdelivr.net/npm/@justinribeiro/share-to-mastodon/+esm"></script>
        <button class="btn text-start" {{ tooltip }}>
          <share-to-mastodon
            class="share-mastodon"
            message="{{ title }}"
            url="{{ url }}"
            {%- if share.instances -%}
              customInstanceList="{{ share.instances | jsonify | xml_escape }}"
            {%- endif %}
          >
            <i class="fa-fw {{ share.icon }}"></i>
          </share-to-mastodon>
        </button>

        {% continue %}
      {% endif %}

      {% assign link = share.link | replace: 'TITLE', title | replace: 'URL', url %}

      <a href="{{ link }}" target="_blank" rel="noopener" {{ tooltip }}>
        <i class="fa-fw {{ share.icon }}"></i>
      </a>
    {% endfor %}

    <button
      id="copy-link"
      aria-label="Copy link"
      class="btn small"
      data-bs-toggle="tooltip"
      data-bs-placement="top"
      title="{{ site.data.locales[include.lang].post.button.share_link.title }}"
      data-title-succeed="{{ site.data.locales[include.lang].post.button.share_link.succeed }}"
    >
      <i class="fa-fw fas fa-link pe-none fs-6"></i>
    </button>
  </span>
</div>


================================================
FILE: _includes/post-summary.html
================================================
{%- comment -%}
  Get the post's description or body content.

  Arguments:
    full_text: If true, return the full content. Default is false.
    max_length: The maximum length of the returned content. Default is 200.
{%- endcomment -%}

{%- if post.description and include.full_text != true -%}
  {{- post.description -}}
{%- else -%}
  {%- comment -%} Remove the line numbers from the code snippet. {%- endcomment -%}

  {%- assign content = post.content -%}

  {%- if content contains '<td class="rouge-gutter gl"><pre class="lineno">' -%}
    {%- assign content = content
      | replace: '<td class="rouge-gutter gl"><pre class="lineno">',
        '<!-- <td class="rouge-gutter gl"><pre class="lineno">'
    -%}
    {%- assign content = content | replace: '</td><td class="rouge-code">', '</td> --><td class="rouge-code">' -%}
  {%- endif -%}

  {%- assign content = content
    | markdownify
    | strip_html
    | newline_to_br
    | replace: '<br />', ' '
    | strip_newlines
    | strip
  -%}

  {%- unless include.full_text -%}
    {%- assign max_length = include.max_length | default: 200 -%}
    {%- assign content = content | truncate: max_length -%}
  {%- endunless -%}

  {{- content -}}
{%- endif -%}


================================================
FILE: _includes/read-time.html
================================================
<!-- Calculate the post's reading time, and display the word count in tooltip -->

{% assign words = include.content | strip_html | number_of_words: 'auto' %}

<!-- words per minute -->

{% assign wpm = 180 %}
{% assign min_time = 1 %}

{% assign read_time = words | divided_by: wpm %}

{% unless read_time > 0 %}
  {% assign read_time = min_time %}
{% endunless %}

{% capture read_prompt %}
  {{- site.data.locales[include.lang].post.read_time.prompt -}}
{% endcapture %}

<!-- return element -->
<span
  class="readtime"
  data-bs-toggle="tooltip"
  data-bs-placement="bottom"
  title="{{ words }} {{ site.data.locales[include.lang].post.words }}"
>
  <em>
    {{- read_time -}}
    {{ ' ' }}
    {{- site.data.locales[include.lang].post.read_time.unit -}}
  </em>
  {%- if include.prompt -%}
    {%- assign _prompt_words = read_prompt | number_of_words: 'auto' -%}
    {%- unless _prompt_words > 1 -%}{{ ' ' }}{%- endunless -%}
    {{ read_prompt }}
  {%- endif -%}
</span>


================================================
FILE: _includes/refactor-content.html
================================================
<!-- Refactor the HTML structure -->

{% assign _content = include.content %}

<!--
  In order to allow a wide table to scroll horizontally,
  we suround the markdown table with `<div class="table-wrapper">` and `</div>`
-->

{% if _content contains '<table' %}
  {% assign _content = _content
    | replace: '<table', '<div class="table-wrapper"><table'
    | replace: '</table>', '</table></div>'
    | replace: '<code><div class="table-wrapper">', '<code>'
    | replace: '</table></div></code>', '</table></code>'
  %}
{% endif %}

<!--
  Fixed kramdown code highlight rendering:
  https://github.com/penibelst/jekyll-compress-html/issues/101
  https://github.com/penibelst/jekyll-compress-html/issues/71#issuecomment-188144901
-->

{% if _content contains '<pre class="highlight">' %}
  {% assign _content = _content
    | replace: '<div class="highlight"><pre class="highlight"><code', '<div class="highlight"><code'
    | replace: '</code></pre></div>', '</code></div>'
  %}
{% endif %}

<!-- Change the icon of checkbox -->

{% if _content contains '<input type="checkbox"' %}
  {% assign _content = _content
    | replace: '<input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />',
      '<i class="fas fa-check-circle fa-fw checked"></i>'
    | replace: '<input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />',
      '<i class="far fa-circle fa-fw"></i>'
  %}
{% endif %}

<!-- Handle images -->

{% assign IMG_TAG = '<img ' %}

{% if _content contains IMG_TAG %}
  {% assign _img_content = null %}
  {% assign _img_snippets = _content | split: IMG_TAG %}

  {% for _img_snippet in _img_snippets %}
    {% if forloop.first %}
      {% assign _img_content = _img_snippet %}
      {% continue %}
    {% endif %}

    {% assign _left = _img_snippet | split: '>' | first %}
    {% assign _right = _img_snippet | remove: _left %}

    {% unless _left contains 'src=' %}
      {% continue %}
    {% endunless %}

    {% assign _left = _left | remove: ' /' | replace: ' w=', ' width=' | replace: ' h=', ' height=' %}
    {% assign _attrs = _left | split: '" ' %}

    {% assign _src = null %}
    {% assign _lqip = null %}
    {% assign _class = null %}

    {% for _attr in _attrs %}
      {% unless _attr contains '=' %}
        {% continue %}
      {% endunless %}

      {% assign _pair = _attr | split: '="' %}
      {% capture _key %}{{ _pair | first }}{% endcapture %}
      {% capture _value %}{{ _pair | last | remove: '"' }}{% endcapture %}

      {% case _key %}
        {% when 'src' %}
          {% assign _src = _value %}
        {% when 'lqip' %}
          {% assign _lqip = _value %}
        {% when 'class' %}
          {% assign _class = _value %}
      {% endcase %}
    {% endfor %}

    <!-- take out classes -->
    {% assign _wrapper_class = '' %}

    {% if _class %}
      {% assign _remain = _class %}
      {% assign _class_array = _class | split: ' ' %}

      {% for c in _class_array %}
        {% assign _pick = false %}

        {% case c %}
          {% when 'preview-img', 'normal', 'left', 'right', 'light', 'dark' %}
            {% assign _pick = true %}
          {% else %}
            {% if c contains '-' %}
              {% assign start = c | split: '-' | first %}
              {% if start == 'w' %}
                {% assign _pick = true %}
              {% endif %}
            {% endif %}
        {% endcase %}

        {% if _pick %}
          {% assign _remain = _remain | remove: c | strip %}
          {% assign _wrapper_class = _wrapper_class | append: ' ' | append: c %}
        {% endif %}
      {% endfor %}

      {% unless _wrapper_class == '' %}
        {% capture _old_class %}class="{{ _class }}"{% endcapture %}
        {% assign _left = _left | remove: _old_class %}
        {% unless _remain == '' %}
          {% capture _new_class %}class="{{ _remain }}"{% endcapture %}
          {% assign _left = _left | append: _new_class %}
        {% endunless %}
      {% endunless %}
    {% endif %}

    {% assign _final_src = null %}
    {% assign _lazyload = true %}

    {%- capture _img_url -%}
      {% include media-url.html src=_src subpath=page.media_subpath %}
    {%- endcapture -%}

    {% assign _path_prefix = _img_url | remove: _src %}

    {% unless _src contains '//' %}
      {% assign _final_src = _path_prefix | append: _src %}
      {% assign _src_alt = 'src="' | append: _path_prefix %}
      {% assign _left = _left | replace: 'src="', _src_alt %}
    {% endunless %}

    {% if _lqip %}
      {% assign _lazyload = false %}
      {% assign _wrapper_class = _wrapper_class | append: ' blur' %}

      {% unless _lqip contains 'data:' %}
        {% assign _lqip_alt = 'lqip="' | append: _path_prefix %}
        {% assign _left = _left | replace: 'lqip="', _lqip_alt %}
      {% endunless %}

      <!-- add image placeholder -->
      {% assign _left = _left | replace: 'src=', 'data-src=' | replace: ' lqip=', ' data-lqip="true" src=' %}

    {% else %}
      {% assign _wrapper_class = _wrapper_class | append: ' shimmer' %}
    {% endif %}

    <!-- lazy-load images -->
    {% if _lazyload %}
      {% assign _left = _left | append: ' loading="lazy"' %}
    {% endif %}

    {% if page.layout == 'home' %}
      <!-- create the image wrapper -->
      {% assign _wrapper_start = '<div class="preview-img ' | append: _wrapper_class | append: '">' %}

      {% assign _img_content = _img_content | append: _wrapper_start %}
      {% assign _right = _right | prepend: '></div' %}

    {% else %}
      <!-- make sure the `<img>` is wrapped by `<a>` -->
      {% assign _parent = _right | slice: 1, 4 %}

      {% if _parent == '</a>' %}
        <!-- add class to existing <a> tag -->
        {% assign _size = _img_content | size | minus: 1 %}
        {% capture _class %}
          class="img-link{% unless _lqip %} shimmer{% endunless %}"
        {% endcapture %}
        {% assign _img_content = _img_content | slice: 0, _size | append: _class | append: '>' %}

      {% else %}
        <!-- create the image wrapper -->
        {% assign _wrapper_start = _final_src
          | default: _src
          | prepend: '<a href="'
          | append: '" class="popup img-link'
          | append: _wrapper_class
          | append: '">'
        %}

        {% assign _img_content = _img_content | append: _wrapper_start %}
        {% assign _right = '></a' | append: _right %}
      {% endif %}
    {% endif %}

    <!-- combine -->
    {% assign _img_content = _img_content | append: IMG_TAG | append: _left | append: _right %}
  {% endfor %}

  {% if _img_content %}
    {% assign _content = _img_content %}
  {% endif %}
{% endif %}

<!-- Add header for code snippets -->

{% if _content contains '<div class="highlight"><code>' %}
  {% assign _code_spippets = _content | split: '<div class="highlight"><code>' %}
  {% assign _new_content = '' %}

  {% for _snippet in _code_spippets %}
    {% if forloop.last %}
      {% assign _new_content = _new_content | append: _snippet %}

    {% else %}
      {% assign _left = _snippet | split: '><' | last %}

      {% if _left contains 'file="' %}
        {% assign _label_text = _left | split: 'file="' | last | split: '"' | first %}
        {% assign _label_icon = 'far fa-file-code fa-fw' %}
      {% else %}
        {% assign _lang = _left | split: 'language-' | last | split: ' ' | first %}
        {% capture _label_text %}{% include language-alias.html language=_lang %}{% endcapture %}
        {% assign _label_icon = 'fas fa-code fa-fw small' %}
      {% endif %}

      {% capture _label %}
        <span data-label-text="{{ _label_text | strip }}"><i class="{{ _label_icon }}"></i></span>
      {% endcapture %}

      {% assign _new_content = _new_content
        | append: _snippet
        | append: '<div class="code-header">'
        | append: _label
        | append: '<button aria-label="copy" data-title-succeed="'
        | append: site.data.locales[include.lang].post.button.copy_code.succeed
        | append: '"><i class="far fa-clipboard"></i></button></div>'
        | append: '<div class="highlight"><code>'
      %}
    {% endif %}
  {% endfor %}

  {% assign _content = _new_content %}
{% endif %}

<!-- Create heading anchors -->

{% assign heading_levels = '2,3,4,5' | split: ',' %}
{% assign _heading_content = _content %}

{% for level in heading_levels %}
  {% assign mark_start = '<h' | append: level | append: ' id="' %}
  {% assign mark_end = '</h' | append: level | append: '>' %}

  {% if _heading_content contains mark_start %}
    {% assign _new_content = null %}
    {% assign heading_snippets = _heading_content | split: mark_start %}

    {% for snippet in heading_snippets %}
      {% if forloop.first %}
        {% assign _new_content = snippet %}
        {% continue %}
      {% endif %}

      {% assign id = snippet | split: '"' | first %}
      {% assign anchor = '<a href="#'
        | append: id
        | append: '" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>'
      %}

      {% assign left = snippet | split: mark_end | first %}
      {% assign right = snippet | slice: left.size, snippet.size %}
      {% assign left = left | replace_first: '">', '"><span class="me-2">' | append: '</span>' %}

      {% assign _new_content = _new_content | append: mark_start | append: left | append: anchor | append: right %}
    {% endfor %}

    {% assign _heading_content = _new_content %}
  {% endif %}
{% endfor %}

{% assign _content = _heading_content %}

<!-- return -->
{{ _content }}


================================================
FILE: _includes/related-posts.html
================================================
<!-- Recommend the other 3 posts according to the tags and categories of the current post. -->

<!-- The total size of related posts -->
{% assign TOTAL_SIZE = 3 %}

<!-- An random integer that bigger than 0 -->
{% assign TAG_SCORE = 1 %}

<!-- Equals to TAG_SCORE / {max_categories_hierarchy} -->
{% assign CATEGORY_SCORE = 0.5 %}

{% assign SEPARATOR = ':' %}

{% assign match_posts = '' | split: '' %}

{% for category in page.categories %}
  {% assign match_posts = match_posts | push: site.categories[category] | uniq %}
{% endfor %}

{% for tag in page.tags %}
  {% assign match_posts = match_posts | push: site.tags[tag] | uniq %}
{% endfor %}

{% assign match_posts = match_posts | reverse %}
{% assign last_index = match_posts.size | minus: 1 %}
{% assign score_list = '' | split: '' %}

{% for i in (0..last_index) %}
  {% assign post = match_posts[i] %}

  {% if post.url == page.url %}
    {% continue %}
  {% endif %}

  {% assign score = 0 %}

  {% for tag in post.tags %}
    {% if page.tags contains tag %}
      {% assign score = score | plus: TAG_SCORE %}
    {% endif %}
  {% endfor %}

  {% for category in post.categories %}
    {% if page.categories contains category %}
      {% assign score = score | plus: CATEGORY_SCORE %}
    {% endif %}
  {% endfor %}

  {% if score > 0 %}
    {% capture score_item %}{{ score }}{{ SEPARATOR }}{{ i }}{% endcapture %}
    {% assign score_list = score_list | push: score_item %}
  {% endif %}
{% endfor %}

{% assign index_list = '' | split: '' %}

{% if score_list.size > 0 %}
  {% assign score_list = score_list | sort | reverse %}
  {% for entry in score_list limit: TOTAL_SIZE %}
    {% assign index = entry | split: SEPARATOR | last %}
    {% assign index_list = index_list | push: index %}
  {% endfor %}
{% endif %}

{% assign relate_posts = '' | split: '' %}

{% for index in index_list %}
  {% assign i = index | to_integer %}
  {% assign relate_posts = relate_posts | push: match_posts[i] %}
{% endfor %}

{% if relate_posts.size > 0 %}
  <aside id="related-posts" aria-labelledby="related-label">
    <h3 class="mb-4" id="related-label">
      {{- site.data.locales[include.lang].post.relate_posts -}}
    </h3>
    <nav class="row row-cols-1 row-cols-md-2 row-cols-xl-3 g-4 mb-4">
      {% for post in relate_posts %}
        <article class="col">
          <a href="{{ post.url | relative_url }}" class="post-preview card h-100">
            <div class="card-body">
              {% include datetime.html date=post.date lang=include.lang %}
              <h4 class="pt-0 my-2">{{ post.title }}</h4>
              <div class="text-muted">
                <p>{% include post-summary.html %}</p>
              </div>
            </div>
          </a>
        </article>
      {% endfor %}
    </nav>
  </aside>
  <!-- #related-posts -->
{% endif %}


================================================
FILE: _includes/search-loader.html
================================================
<!--
  Jekyll Simple Search loader
  See: <https://github.com/christian-fei/Simple-Jekyll-Search>
-->

{% capture result_elem %}
  <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
    <header>
      <h2><a href="{url}">{title}</a></h2>
      <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
        {categories}
        {tags}
      </div>
    </header>
    <p>{content}</p>
  </article>
{% endcapture %}

{% capture not_found %}<p class="mt-5">{{ site.data.locales[include.lang].search.no_results }}</p>{% endcapture %}

<script>
  {% comment %} Note: dependent library will be loaded in `js-selector.html` {% endcomment %}
  document.addEventListener('DOMContentLoaded', () => {
    SimpleJekyllSearch({
      searchInput: document.getElementById('search-input'),
      resultsContainer: document.getElementById('search-results'),
      json: '{{ '/assets/js/data/search.json' | relative_url }}',
      searchResultTemplate: '{{ result_elem | strip_newlines }}',
      noResultsText: '{{ not_found }}',
      templateMiddleware: function(prop, value, template) {
        if (prop === 'categories') {
          if (value === '') {
            return `${value}`;
          } else {
            return `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${value}</div>`;
          }
        }

        if (prop === 'tags') {
          if (value === '') {
            return `${value}`;
          } else {
            return `<div><i class="fa fa-tag fa-fw"></i>${value}</div>`;
          }
        }
      }
    });
  });
</script>


================================================
FILE: _includes/search-results.html
================================================
<!-- The Search results -->

<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
  <div class="col-11 content">
    <div id="search-hints">
      {% include_cached trending-tags.html lang=include.lang %}
    </div>
    <div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
  </div>
</div>


================================================
FILE: _includes/sidebar.html
================================================
<!-- The Side Bar -->

<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
  <header class="profile-wrapper">
    <a href="{{ '/' | relative_url }}" id="avatar" class="rounded-circle">
      {%- if site.avatar != empty and site.avatar -%}
        {%- capture avatar_url -%}
          {% include media-url.html src=site.avatar %}
        {%- endcapture -%}
        <img src="{{- avatar_url -}}" width="112" height="112" alt="avatar" onerror="this.style.display='none'">
      {%- endif -%}
    </a>

    <a class="site-title d-block" href="{{ '/' | relative_url }}">{{ site.title }}</a>
    <p class="site-subtitle fst-italic mb-0">{{ site.tagline }}</p>
  </header>
  <!-- .profile-wrapper -->

  <nav class="flex-column flex-grow-1 w-100 ps-0">
    <ul class="nav">
      <!-- home -->
      <li class="nav-item{% if page.layout == 'home' %}{{ " active" }}{% endif %}">
        <a href="{{ '/' | relative_url }}" class="nav-link">
          <i class="fa-fw fas fa-home"></i>
          <span>{{ site.data.locales[include.lang].tabs.home | upcase }}</span>
        </a>
      </li>
      <!-- the real tabs -->
      {% for tab in site.tabs %}
        <li class="nav-item{% if tab.url == page.url %}{{ " active" }}{% endif %}">
          <a href="{{ tab.url | relative_url }}" class="nav-link">
            <i class="fa-fw {{ tab.icon }}"></i>
            {% capture tab_name %}{{ tab.url | split: '/' }}{% endcapture %}

            <span>{{ site.data.locales[include.lang].tabs.[tab_name] | default: tab.title | upcase }}</span>
          </a>
        </li>
        <!-- .nav-item -->
      {% endfor %}
    </ul>
  </nav>

  <div class="sidebar-bottom d-flex flex-wrap  align-items-center w-100">
    {% unless site.theme_mode %}
      <button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
        <i class="fas fa-adjust"></i>
      </button>

      {% if site.data.contact.size > 0 %}
        <span class="icon-border"></span>
      {% endif %}
    {% endunless %}

    {% for entry in site.data.contact %}
      {%- assign url = null -%}

      {% case entry.type %}
        {% when 'github', 'twitter' %}
          {%- unless site[entry.type].username -%}
            {%- continue -%}
          {%- endunless -%}
          {%- capture url -%}
            https://{{ entry.type }}.com/{{ site[entry.type].username }}
          {%- endcapture -%}
        {% when 'email' %}
          {%- unless site.social.email -%}
            {%- continue -%}
          {%- endunless -%}
          {%- assign email = site.social.email | split: '@' -%}
          {%- capture url -%}
            javascript:location.href = 'mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@')
          {%- endcapture -%}
        {% when 'rss' %}
          {% assign url = '/feed.xml' | relative_url %}
        {% else %}
          {% assign url = entry.url %}
      {% endcase %}

      {% if url %}
        <a
          href="{{ url }}"
          aria-label="{{ entry.type }}"
          {% assign link_types = '' %}

          {% unless entry.noblank %}
            target="_blank"
            {% assign link_types = 'noopener noreferrer' %}
          {% endunless %}

          {% if entry.type == 'mastodon' %}
            {% assign link_types = link_types | append: ' me' | strip %}
          {% endif %}

          {% unless link_types == empty %}
            rel="{{ link_types }}"
          {% endunless %}
        >
          <i class="{{ entry.icon }}"></i>
        </a>
      {% endif %}
    {% endfor %}
  </div>
  <!-- .sidebar-bottom -->
</aside>
<!-- #sidebar -->


================================================
FILE: _includes/toc-status.html
================================================
{% 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 '<h2' or page.content contains '<h3' %}
    {% assign enable_toc = true %}
  {% endif %}
{% endif %}


================================================
FILE: _includes/toc.html
================================================
{% include toc-status.html %}

{% if enable_toc %}
  <div class="toc-border-cover z-3"></div>
  <section id="toc-wrapper" class="invisible position-sticky ps-0 pe-4 pb-4">
    <h2 class="panel-heading ps-3 pb-2 mb-0">{{- site.data.locales[include.lang].panel.toc -}}</h2>
    <nav id="toc"></nav>
  </section>
{% endif %}


================================================
FILE: _includes/topbar.html
================================================
<!-- The Top Bar -->

<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
  <div
    id="topbar"
    class="d-flex align-items-center justify-content-between px-lg-3 h-100"
  >
    <nav id="breadcrumb" aria-label="Breadcrumb">
      {% assign paths = page.url | split: '/' %}

      {% if paths.size == 0 or page.layout == 'home' %}
        <!-- index page -->
        <span>{{ site.data.locales[include.lang].tabs.home | capitalize }}</span>

      {% else %}
        {% for item in paths %}
          {% if forloop.first %}
            <span>
              <a href="{{ '/' | relative_url }}">
                {{- site.data.locales[include.lang].tabs.home | capitalize -}}
              </a>
            </span>

          {% elsif forloop.last %}
            {% if page.collection == 'tabs' %}
              <span>{{ site.data.locales[include.lang].tabs[item] | default: page.title }}</span>
            {% else %}
              <span>{{ page.title }}</span>
            {% endif %}

          {% elsif page.layout == 'category' or page.layout == 'tag' %}
            <span>
              <a href="{{ item | append: '/' | relative_url }}">
                {{- site.data.locales[include.lang].tabs[item] | default: page.title -}}
              </a>
            </span>
          {% endif %}
        {% endfor %}
      {% endif %}
    </nav>
    <!-- endof #breadcrumb -->

    <button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
      <i class="fas fa-bars fa-fw"></i>
    </button>

    <div id="topbar-title">
      {% if page.layout == 'home' %}
        {{- site.data.locales[include.lang].title | default: site.title -}}
      {% elsif page.collection == 'tabs' or page.layout == 'page' %}
        {%- capture tab_key -%}{{ page.url | split: '/' }}{%- endcapture -%}
        {{- site.data.locales[include.lang].tabs[tab_key] | default: page.title -}}
      {% else %}
        {{- site.data.locales[include.lang].layout[page.layout] | default: page.layout | capitalize -}}
      {% endif %}
    </div>

    <button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
      <i class="fas fa-search fa-fw"></i>
    </button>

    <search id="search" class="align-items-center ms-3 ms-lg-0">
      <i class="fas fa-search fa-fw"></i>
      <input
        class="form-control"
        id="search-input"
        type="search"
        aria-label="search"
        autocomplete="off"
        placeholder="{{ site.data.locales[include.lang].search.hint | capitalize }}..."
      >
    </search>
    <button type="button" class="btn btn-link text-decoration-none" id="search-cancel">
      {{- site.data.locales[include.lang].search.cancel -}}
    </button>
  </div>
</header>


================================================
FILE: _includes/trending-tags.html
================================================
<!-- The trending tags list -->

{% assign MAX = 10 %}

{% assign size_list = '' | split: '' %}
{% assign tag_list = '' | split: '' %}

{% for tag in site.tags %}
  {% assign size = tag | last | size %}
  {% assign size_list = size_list | push: size %}

  {% assign tag_str = tag | first | append: '::' | append: size %}
  {% assign tag_list = tag_list | push: tag_str %}
{% endfor %}

{% assign size_list = size_list | sort | reverse %}

{% assign tag_list = tag_list | sort_natural %}

{% assign trending_tags = '' | split: '' %}

{% for size in size_list limit: MAX %}
  {% for tag_str in tag_list %}
    {% assign tag = tag_str | split: '::' %}
    {% assign tag_name = tag | first %}
    {% assign tag_size = tag | last | plus: 0 %}
    {% if tag_size == size %}
      {% unless trending_tags contains tag_name %}
        {% assign trending_tags = trending_tags | push: tag_name %}
        {% break %}
      {% endunless %}
    {% endif %}
  {% endfor %}
{% endfor %}

{% if trending_tags.size > 0 %}
  <section>
    <h2 class="panel-heading">{{- site.data.locales[include.lang].panel.trending_tags -}}</h2>
    <div class="d-flex flex-wrap mt-3 mb-1 me-3">
      {% for tag_name in trending_tags %}
        {% assign url = tag_name | slugify | url_encode | prepend: '/tags/' | append: '/' %}
        <a class="post-tag btn btn-outline-primary" href="{{ url | relative_url }}">{{ tag_name }}</a>
      {% endfor %}
    </div>
  </section>
{% endif %}


================================================
FILE: _includes/update-list.html
================================================
<!-- Get 5 last posted/updated posts -->

{% assign MAX_SIZE = 5 %}

{% assign all_list = '' | split: '' %}

{% for post in site.posts %}
  {% assign datetime = post.last_modified_at | default: post.date %}

  {% capture elem %}
    {{- datetime | date: "%Y%m%d%H%M%S" -}}::{{- forloop.index0 -}}
  {% endcapture %}

  {% assign all_list = all_list | push: elem %}
{% endfor %}

{% assign all_list = all_list | sort | reverse %}

{% assign update_list = '' | split: '' %}

{% for entry in all_list limit: MAX_SIZE %}
  {% assign update_list = update_list | push: entry %}
{% endfor %}

{% if update_list.size > 0 %}
  <section id="access-lastmod">
    <h2 class="panel-heading">{{- site.data.locales[include.lang].panel.lastmod -}}</h2>
    <ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
      {% for item in update_list %}
        {% assign index = item | split: '::' | last | plus: 0 %}
        {% assign post = site.posts[index] %}
        {% assign url = post.url | relative_url %}
        <li class="text-truncate lh-lg">
          <a href="{{ url }}">{{ post.title }}</a>
        </li>
      {% endfor %}
    </ul>
  </section>
  <!-- #access-lastmod -->
{% endif %}


================================================
FILE: _javascript/categories.js
================================================
import { basic, initSidebar, initTopbar } from './modules/layouts';
import { categoryCollapse } from './modules/components';

basic();
initSidebar();
initTopbar();
categoryCollapse();


================================================
FILE: _javascript/commons.js
================================================
import { basic, initSidebar, initTopbar } from './modules/layouts';

initSidebar();
initTopbar();
basic();


================================================
FILE: _javascript/home.js
================================================
import { basic, initSidebar, initTopbar } from './modules/layouts';
import { initLocaleDatetime, loadImg } from './modules/components';

loadImg();
initLocaleDatetime();
initSidebar();
initTopbar();
basic();


================================================
FILE: _javascript/misc.js
================================================
import { basic, initSidebar, initTopbar } from './modules/layouts';
import { initLocaleDatetime } from './modules/components';

initSidebar();
initTopbar();
initLocaleDatetime();
basic();


================================================
FILE: _javascript/modules/components/back-to-top.js
================================================
/**
 * Reference: https://bootsnipp.com/snippets/featured/link-to-top-page
 */

export function back2top() {
  const btn = document.getElementById('back-to-top');

  window.addEventListener('scroll', () => {
    if (window.scrollY > 50) {
      btn.classList.add('show');
    } else {
      btn.classList.remove('show');
    }
  });

  btn.addEventListener('click', () => {
    window.scrollTo({ top: 0 });
  });
}


================================================
FILE: _javascript/modules/components/category-collapse.js
================================================
/**
 * Tab 'Categories' expand/close effect.
 */

import 'bootstrap/js/src/collapse.js';

const childPrefix = 'l_';
const parentPrefix = 'h_';
const children = document.getElementsByClassName('collapse');

export function categoryCollapse() {
  [...children].forEach((elem) => {
    const id = parentPrefix + elem.id.substring(childPrefix.length);
    const parent = document.getElementById(id);

    // collapse sub-categories
    elem.addEventListener('hide.bs.collapse', () => {
      if (parent) {
        parent.querySelector('.far.fa-folder-open').className =
          'far fa-folder fa-fw';
        parent.querySelector('.fas.fa-angle-down').classList.add('rotate');
        parent.classList.remove('hide-border-bottom');
      }
    });

    // expand sub-categories
    elem.addEventListener('show.bs.collapse', () => {
      if (parent) {
        parent.querySelector('.far.fa-folder').className =
          'far fa-folder-open fa-fw';
        parent.querySelector('.fas.fa-angle-down').classList.remove('rotate');
        parent.classList.add('hide-border-bottom');
      }
    });
  });
}


================================================
FILE: _javascript/modules/components/clipboard.js
================================================
/**
 * Clipboard functions
 *
 * Dependencies:
 *    clipboard.js (https://github.com/zenorocha/clipboard.js)
 */

import Tooltip from 'bootstrap/js/src/tooltip';

const clipboardSelector = '.code-header>button';

const ICON_DEFAULT = 'far fa-clipboard';
const ICON_SUCCESS = 'fas fa-check';

const ATTR_TIMEOUT = 'timeout';
const ATTR_TITLE_SUCCEED = 'data-title-succeed';
const ATTR_TITLE_ORIGIN = 'data-bs-original-title';
const TIMEOUT = 2000; // in milliseconds

function isLocked(node) {
  if (node.hasAttribute(ATTR_TIMEOUT)) {
    let timeout = node.getAttribute(ATTR_TIMEOUT);
    if (Number(timeout) > Date.now()) {
      return true;
    }
  }

  return false;
}

function lock(node) {
  node.setAttribute(ATTR_TIMEOUT, Date.now() + TIMEOUT);
}

function unlock(node) {
  node.removeAttribute(ATTR_TIMEOUT);
}

function showTooltip(btn) {
  const succeedTitle = btn.getAttribute(ATTR_TITLE_SUCCEED);
  btn.setAttribute(ATTR_TITLE_ORIGIN, succeedTitle);
  Tooltip.getInstance(btn).show();
}

function hideTooltip(btn) {
  Tooltip.getInstance(btn).hide();
  btn.removeAttribute(ATTR_TITLE_ORIGIN);
}

function setSuccessIcon(btn) {
  const icon = btn.children[0];
  icon.setAttribute('class', ICON_SUCCESS);
}

function resumeIcon(btn) {
  const icon = btn.children[0];
  icon.setAttribute('class', ICON_DEFAULT);
}

function setCodeClipboard() {
  const clipboardList = document.querySelectorAll(clipboardSelector);

  if (clipboardList.length === 0) {
    return;
  }

  // Initial the clipboard.js object
  const clipboard = new ClipboardJS(clipboardSelector, {
    target: (trigger) => {
      const codeBlock = trigger.parentNode.nextElementSibling;
      return codeBlock.querySelector('code .rouge-code');
    }
  });

  [...clipboardList].map(
    (elem) =>
      new Tooltip(elem, {
        placement: 'left'
      })
  );

  clipboard.on('success', (e) => {
    const trigger = e.trigger;

    e.clearSelection();

    if (isLocked(trigger)) {
      return;
    }

    setSuccessIcon(trigger);
    showTooltip(trigger);
    lock(trigger);

    setTimeout(() => {
      hideTooltip(trigger);
      resumeIcon(trigger);
      unlock(trigger);
    }, TIMEOUT);
  });
}

function setLinkClipboard() {
  const btnCopyLink = document.getElementById('copy-link');

  if (btnCopyLink === null) {
    return;
  }

  btnCopyLink.addEventListener('click', (e) => {
    const target = e.target;

    if (isLocked(target)) {
      return;
    }

    // Copy URL to clipboard
    navigator.clipboard.writeText(window.location.href).then(() => {
      const defaultTitle = target.getAttribute(ATTR_TITLE_ORIGIN);
      const succeedTitle = target.getAttribute(ATTR_TITLE_SUCCEED);

      // Switch tooltip title
      target.setAttribute(ATTR_TITLE_ORIGIN, succeedTitle);
      Tooltip.getInstance(target).show();

      lock(target);

      setTimeout(() => {
        target.setAttribute(ATTR_TITLE_ORIGIN, defaultTitle);
        unlock(target);
      }, TIMEOUT);
    });
  });

  btnCopyLink.addEventListener('mouseleave', (e) => {
    Tooltip.getInstance(e.target).hide();
  });
}

export function initClipboard() {
  setCodeClipboard();
  setLinkClipboard();
}


================================================
FILE: _javascript/modules/components/img-loading.js
================================================
/**
 * Setting up image lazy loading and LQIP switching
 */

const ATTR_DATA_SRC = 'data-src';
const ATTR_DATA_LQIP = 'data-lqip';

const cover = {
  SHIMMER: 'shimmer',
  BLUR: 'blur'
};

function removeCover(clzss) {
  this.parentElement.classList.remove(clzss);
}

function handleImage() {
  if (!this.complete) {
    return;
  }

  if (this.hasAttribute(ATTR_DATA_LQIP)) {
    removeCover.call(this, cover.BLUR);
  } else {
    removeCover.call(this, cover.SHIMMER);
  }
}

/**
 * Switches the LQIP with the real image URL.
 */
function switchLQIP() {
  const src = this.getAttribute(ATTR_DATA_SRC);
  this.setAttribute('src', encodeURI(src));
  this.removeAttribute(ATTR_DATA_SRC);
}

export function loadImg() {
  const images = document.querySelectorAll('article img');

  if (images.length === 0) {
    return;
  }

  images.forEach((img) => {
    img.addEventListener('load', handleImage);
  });

  // Images loaded from the browser cache do not trigger the 'load' event
  document.querySelectorAll('article img[loading="lazy"]').forEach((img) => {
    if (img.complete) {
      removeCover.call(img, cover.SHIMMER);
    }
  });

  // LQIPs set by the data URI or WebP will not trigger the 'load' event,
  // so manually convert the URI to the URL of a high-resolution image.
  const lqips = document.querySelectorAll(
    `article img[${ATTR_DATA_LQIP}="true"]`
  );

  if (lqips.length) {
    lqips.forEach((lqip) => {
      switchLQIP.call(lqip);
    });
  }
}


================================================
FILE: _javascript/modules/components/img-popup.js
================================================
/**
 * Set up image popup
 *
 * Dependencies: https://github.com/biati-digital/glightbox
 */

const lightImages = '.popup:not(.dark)';
const darkImages = '.popup:not(.light)';
let selector = lightImages;

function swapImages(current, reverse) {
  if (selector === lightImages) {
    selector = darkImages;
  } else {
    selector = lightImages;
  }

  if (reverse === null) {
    reverse = GLightbox({ selector: `${selector}` });
  }

  return [reverse, current];
}

export function imgPopup() {
  if (document.querySelector('.popup') === null) {
    return;
  }

  const hasDualImages = !(
    document.querySelector('.popup.light') === null &&
    document.querySelector('.popup.dark') === null
  );

  if (Theme.visualState === Theme.DARK) {
    selector = darkImages;
  }

  let current = GLightbox({ selector: `${selector}` });

  if (hasDualImages && Theme.switchable) {
    let reverse = null;

    window.addEventListener('message', (event) => {
      if (event.source === window && event.data && event.data.id === Theme.ID) {
        [current, reverse] = swapImages(current, reverse);
      }
    });
  }
}


================================================
FILE: _javascript/modules/components/locale-datetime.js
================================================
/**
 * Update month/day to locale datetime
 *
 * Requirement: <https://github.com/iamkun/dayjs>
 */

/* A tool for locale datetime */
class LocaleHelper {
  static get attrTimestamp() {
    return 'data-ts';
  }

  static get attrDateFormat() {
    return 'data-df';
  }

  static get locale() {
    return document.documentElement.getAttribute('lang').substring(0, 2);
  }

  static getTimestamp(elem) {
    return Number(elem.getAttribute(this.attrTimestamp)); // unix timestamp
  }

  static getDateFormat(elem) {
    return elem.getAttribute(this.attrDateFormat);
  }
}

export function initLocaleDatetime() {
  dayjs.locale(LocaleHelper.locale);
  dayjs.extend(window.dayjs_plugin_localizedFormat);

  document
    .querySelectorAll(`[${LocaleHelper.attrTimestamp}]`)
    .forEach((elem) => {
      const date = dayjs.unix(LocaleHelper.getTimestamp(elem));
      const text = date.format(LocaleHelper.getDateFormat(elem));
      elem.textContent = text;
      elem.removeAttribute(LocaleHelper.attrTimestamp);
      elem.removeAttribute(LocaleHelper.attrDateFormat);

      // setup tooltips
      if (
        elem.hasAttribute('data-bs-toggle') &&
        elem.getAttribute('data-bs-toggle') === 'tooltip'
      ) {
        // see: https://day.js.org/docs/en/display/format#list-of-localized-formats
        const tooltipText = date.format('llll');
        elem.setAttribute('data-bs-title', tooltipText);
      }
    });
}


================================================
FILE: _javascript/modules/components/mermaid.js
================================================
/**
 * Mermaid-js loader
 */

const MERMAID = 'mermaid';
const themeMapper = Theme.getThemeMapper('default', 'dark');

function refreshTheme(event) {
  if (event.source === window && event.data && event.data.id === Theme.ID) {
    // Re-render the SVG › <https://github.com/mermaid-js/mermaid/issues/311#issuecomment-332557344>
    const mermaidList = document.getElementsByClassName(MERMAID);

    [...mermaidList].forEach((elem) => {
      const svgCode = elem.previousSibling.children.item(0).textContent;
      elem.textContent = svgCode;
      elem.removeAttribute('data-processed');
    });

    const newTheme = themeMapper[Theme.visualState];

    mermaid.initialize({ theme: newTheme });
    mermaid.init(null, `.${MERMAID}`);
  }
}

function setNode(elem) {
  const svgCode = elem.textContent;
  const backup = elem.parentElement;
  backup.classList.add('d-none');
  // Create mermaid node
  const mermaid = document.createElement('pre');
  mermaid.classList.add(MERMAID);
  const text = document.createTextNode(svgCode);
  mermaid.appendChild(text);
  backup.after(mermaid);
}

export function loadMermaid() {
  if (
    typeof mermaid === 'undefined' ||
    typeof mermaid.initialize !== 'function'
  ) {
    return;
  }

  const initTheme = themeMapper[Theme.visualState];

  let mermaidConf = {
    theme: initTheme
  };

  const basicList = document.getElementsByClassName('language-mermaid');
  [...basicList].forEach(setNode);

  mermaid.initialize(mermaidConf);

  if (Theme.switchable) {
    window.addEventListener('message', refreshTheme);
  }
}


================================================
FILE: _javascript/modules/components/mode-toggle.js
================================================
/**
 * Add listener for theme mode toggle
 */

const $toggle = document.getElementById('mode-toggle');

export function modeWatcher() {
  if (!$toggle) {
    return;
  }

  $toggle.addEventListener('click', () => {
    Theme.flip();
  });
}


================================================
FILE: _javascript/modules/components/search-display.js
================================================
/**
 * This script makes #search-result-wrapper switch to unload or shown automatically.
 */

const btnSbTrigger = document.getElementById('sidebar-trigger');
const btnSearchTrigger = document.getElementById('search-trigger');
const btnCancel = document.getElementById('search-cancel');
const content = document.querySelectorAll('#main-wrapper>.container>.row');
const topbarTitle = document.getElementById('topbar-title');
const search = document.getElementById('search');
const resultWrapper = document.getElementById('search-result-wrapper');
const results = document.getElementById('search-results');
const input = document.getElementById('search-input');
const hints = document.getElementById('search-hints');

// CSS class names
const LOADED = 'd-block';
const UNLOADED = 'd-none';
const FOCUS = 'input-focus';
const FLEX = 'd-flex';

/* Actions in mobile screens (Sidebar hidden) */
class MobileSearchBar {
  static on() {
    btnSbTrigger.classList.add(UNLOADED);
    topbarTitle.classList.add(UNLOADED);
    btnSearchTrigger.classList.add(UNLOADED);
    search.classList.add(FLEX);
    btnCancel.classList.add(LOADED);
  }

  static off() {
    btnCancel.classList.remove(LOADED);
    search.classList.remove(FLEX);
    btnSbTrigger.classList.remove(UNLOADED);
    topbarTitle.classList.remove(UNLOADED);
    btnSearchTrigger.classList.remove(UNLOADED);
  }
}

class ResultSwitch {
  static resultVisible = false;

  static on() {
    if (!this.resultVisible) {
      resultWrapper.classList.remove(UNLOADED);
      content.forEach((el) => {
        el.classList.add(UNLOADED);
      });
      this.resultVisible = true;
    }
  }

  static off() {
    if (this.resultVisible) {
      results.innerHTML = '';

      if (hints.classList.contains(UNLOADED)) {
        hints.classList.remove(UNLOADED);
      }

      resultWrapper.classList.add(UNLOADED);
      content.forEach((el) => {
        el.classList.remove(UNLOADED);
      });
      input.textContent = '';
      this.resultVisible = false;
    }
  }
}

function isMobileView() {
  return btnCancel.classList.contains(LOADED);
}

export function displaySearch() {
  btnSearchTrigger.addEventListener('click', () => {
    MobileSearchBar.on();
    ResultSwitch.on();
    input.focus();
  });

  btnCancel.addEventListener('click', () => {
    MobileSearchBar.off();
    ResultSwitch.off();
  });

  input.addEventListener('focus', () => {
    search.classList.add(FOCUS);
  });

  input.addEventListener('focusout', () => {
    search.classList.remove(FOCUS);
  });

  input.addEventListener('input', () => {
    if (input.value === '') {
      if (isMobileView()) {
        hints.classList.remove(UNLOADED);
      } else {
        ResultSwitch.off();
      }
    } else {
      ResultSwitch.on();
      if (isMobileView()) {
        hints.classList.add(UNLOADED);
      }
    }
  });
}


================================================
FILE: _javascript/modules/components/toc/toc-desktop.js
================================================
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() {
    tocbot.init(this.options);
  }
}


================================================
FILE: _javascript/modules/components/toc/toc-mobile.js
================================================
/**
 * TOC button, topbar and popup for mobile devices
 */

const $tocBar = document.getElementById('toc-bar');
const $soloTrigger = document.getElementById('toc-solo-trigger');
const $triggers = document.getElementsByClassName('toc-trigger');
const $popup = document.getElementById('toc-popup');
const $btnClose = document.getElementById('toc-popup-close');

const SCROLL_LOCK = 'overflow-hidden';
const CLOSING = 'closing';

export class TocMobile {
  static #invisible = true;
  static #barHeight = 16 * 3; // 3rem

  static options = {
    tocSelector: '#toc-popup-content',
    contentSelector: '.content',
    ignoreSelector: '[data-toc-skip]',
    headingSelector: 'h2, h3, h4',
    orderedList: false,
    scrollSmooth: false,
    collapseDepth: 4,
    headingsOffset: this.#barHeight
  };

  static initBar() {
    const observer = new IntersectionObserver(
      (entries) => {
        entries.forEach((entry) => {
          $tocBar.classList.toggle('invisible', entry.isIntersecting);
        });
      },
      { rootMargin: `-${this.#barHeight}px 0px 0px 0px` }
    );

    observer.observe($soloTrigger);
    this.#invisible = false;
  }

  static listenAnchors() {
    const $anchors = document.getElementsByClassName('toc-link');
    [...$anchors].forEach((anchor) => {
      anchor.onclick = () => this.hidePopup();
    });
  }

  static refresh() {
    if (this.#invisible) {
      this.initComponents();
    }
    tocbot.refresh(this.options);
    this.listenAnchors();
  }

  static get popupOpened() {
    return $popup.open;
  }

  static showPopup() {
    this.lockScroll(true);
    $popup.showModal();
    const activeItem = $popup.querySelector('li.is-active-li');
    activeItem.scrollIntoView({ block: 'center' });
  }

  static hidePopup() {
    $popup.toggleAttribute(CLOSING);

    $popup.addEventListener(
      'animationend',
      () => {
        $popup.toggleAttribute(CLOSING);
        $popup.close();
      },
      { once: true }
    );

    this.lockScroll(false);
  }

  static lockScroll(enable) {
    document.documentElement.classList.toggle(SCROLL_LOCK, enable);
    document.body.classList.toggle(SCROLL_LOCK, enable);
  }

  static clickBackdrop(event) {
    if ($popup.hasAttribute(CLOSING)) {
      return;
    }

    const rect = event.target.getBoundingClientRect();
    if (
      event.clientX < rect.left ||
      event.clientX > rect.right ||
      event.clientY < rect.top ||
      event.clientY > rect.bottom
    ) {
      this.hidePopup();
    }
  }

  static initComponents() {
    this.initBar();

    [...$triggers].forEach((trigger) => {
      trigger.onclick = () => this.showPopup();
    });

    $popup.onclick = (e) => this.clickBackdrop(e);
    $btnClose.onclick = () => this.hidePopup();
    $popup.oncancel = (e) => {
      e.preventDefault();
      this.hidePopup();
    };
  }

  static init() {
    tocbot.init(this.options);
    this.listenAnchors();
    this.initComponents();
  }
}


================================================
FILE: _javascript/modules/components/toc.js
================================================
import { TocMobile as mobile } from './toc/toc-mobile';
import { TocDesktop as desktop } from './toc/toc-desktop';

const desktopMode = matchMedia('(min-width: 1200px)');

function refresh(e) {
  if (e.matches) {
    if (mobile.popupOpened) {
      mobile.hidePopup();
    }

    desktop.refresh();
  } else {
    mobile.refresh();
  }
}

function init() {
  if (document.querySelector('main>article[data-toc="true"]') === null) {
    return;
  }

  // Avoid create multiple instances of Tocbot. Ref: <https://github.com/tscanlin/tocbot/issues/203>
  if (desktopMode.matches) {
    desktop.init();
  } else {
    mobile.init();
  }

  const $tocWrapper = document.getElementById('toc-wrapper');
  $tocWrapper.classList.remove('invisible');

  desktopMode.onchange = refresh;
}

export { init as initToc };


================================================
FILE: _javascript/modules/components/tooltip-loader.js
================================================
import Tooltip from 'bootstrap/js/src/tooltip';

export function loadTooltip() {
  const tooltipTriggerList = document.querySelectorAll(
    '[data-bs-toggle="tooltip"]'
  );

  [...tooltipTriggerList].map(
    (tooltipTriggerEl) => new Tooltip(tooltipTriggerEl)
  );
}


================================================
FILE: _javascript/modules/components.js
================================================
export { categoryCollapse } from './components/category-collapse';
export { initClipboard } from './components/clipboard';
export { loadImg } from './components/img-loading';
export { imgPopup } from './components/img-popup';
export { initLocaleDatetime } from './components/locale-datetime';
export { initToc } from './components/toc';
export { loadMermaid } from './components/mermaid';
export { modeWatcher } from './components/mode-toggle';
export { back2top } from './components/back-to-top';
export { loadTooltip } from './components/tooltip-loader';


================================================
FILE: _javascript/modules/layouts/basic.js
================================================
import { back2top, loadTooltip, modeWatcher } from '../components';

export function basic() {
  modeWatcher();
  back2top();
  loadTooltip();
}


================================================
FILE: _javascript/modules/layouts/sidebar.js
================================================
const ATTR_DISPLAY = 'sidebar-display';
const $sidebar = document.getElementById('sidebar');
const $trigger = document.getElementById('sidebar-trigger');
const $mask = document.getElementById('mask');

class SidebarUtil {
  static #isExpanded = false;

  static toggle() {
    this.#isExpanded = !this.#isExpanded;
    document.body.toggleAttribute(ATTR_DISPLAY, this.#isExpanded);
    $sidebar.classList.toggle('z-2', this.#isExpanded);
    $mask.classList.toggle('d-none', !this.#isExpanded);
  }
}

export function initSidebar() {
  $trigger.onclick = $mask.onclick = () => SidebarUtil.toggle();
}


================================================
FILE: _javascript/modules/layouts/topbar.js
================================================
import { displaySearch } from '../components/search-display';

export function initTopbar() {
  displaySearch();
}


================================================
FILE: _javascript/modules/layouts.js
================================================
export { basic } from './layouts/basic';
export { initSidebar } from './layouts/sidebar';
export { initTopbar } from './layouts/topbar';


================================================
FILE: _javascript/page.js
================================================
import { basic, initSidebar, initTopbar } from './modules/layouts';
import {
  loadImg,
  imgPopup,
  initClipboard,
  loadMermaid
} from './modules/components';

loadImg();
imgPopup();
initSidebar();
initTopbar();
initClipboard();
loadMermaid();
basic();


================================================
FILE: _javascript/post.js
================================================
import { basic, initTopbar, initSidebar } from './modules/layouts';

import {
  loadImg,
  imgPopup,
  initLocaleDatetime,
  initClipboard,
  initToc,
  loadMermaid
} from './modules/components';

loadImg();
initToc();
imgPopup();
initSidebar();
initLocaleDatetime();
initClipboard();
initTopbar();
loadMermaid();
basic();


================================================
FILE: _javascript/pwa/app.js
================================================
import Toast from 'bootstrap/js/src/toast';

if ('serviceWorker' in navigator
Download .txt
gitextract_gso752j0/

├── .devcontainer/
│   ├── devcontainer.json
│   └── post-create.sh
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── DISCUSSION_TEMPLATE/
│   │   ├── general.yml
│   │   ├── ideas.yml
│   │   └── q-a.yml
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── codeql/
│   │   └── codeql-config.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── cd.yml
│       ├── ci.yml
│       ├── codeql.yml
│       ├── commitlint.yml
│       ├── lint-js.yml
│       ├── lint-scss.yml
│       ├── pr-filter.yml
│       ├── publish.yml
│       ├── scripts/
│       │   └── pr-filter.js
│       ├── stale.yml
│       └── starter/
│           └── pages-deploy.yml
├── .gitignore
├── .gitmodules
├── .husky/
│   └── commit-msg
├── .markdownlint.json
├── .nojekyll
├── .stylelintrc.json
├── .vscode/
│   ├── extensions.json
│   ├── settings.json
│   └── tasks.json
├── Gemfile
├── LICENSE
├── README.md
├── _config.yml
├── _data/
│   ├── authors.yml
│   ├── contact.yml
│   ├── locales/
│   │   ├── ar.yml
│   │   ├── bg-BG.yml
│   │   ├── ca-ES.yml
│   │   ├── cs-CZ.yml
│   │   ├── da-DK.yml
│   │   ├── de-DE.yml
│   │   ├── dv‑MV.yml
│   │   ├── el-GR.yml
│   │   ├── en.yml
│   │   ├── es-ES.yml
│   │   ├── fa-IR.yml
│   │   ├── fi-FI.yml
│   │   ├── fr-FR.yml
│   │   ├── hu-HU.yml
│   │   ├── id-ID.yml
│   │   ├── it-IT.yml
│   │   ├── ja-JP.yml
│   │   ├── ko-KR.yml
│   │   ├── ku-IQ.yml
│   │   ├── my-MM.yml
│   │   ├── nl-NL.yml
│   │   ├── ps‑AF.yml
│   │   ├── pt-BR.yml
│   │   ├── ru-RU.yml
│   │   ├── sl-SI.yml
│   │   ├── sv-SE.yml
│   │   ├── th.yml
│   │   ├── tr-TR.yml
│   │   ├── uk-UA.yml
│   │   ├── ur-PK.yml
│   │   ├── vi-VN.yml
│   │   ├── zh-CN.yml
│   │   └── zh-TW.yml
│   ├── media.yml
│   ├── origin/
│   │   ├── basic.yml
│   │   └── cors.yml
│   └── share.yml
├── _includes/
│   ├── analytics/
│   │   ├── cloudflare.html
│   │   ├── fathom.html
│   │   ├── goatcounter.html
│   │   ├── google.html
│   │   ├── matomo.html
│   │   └── umami.html
│   ├── comment.html
│   ├── comments/
│   │   ├── disqus.html
│   │   ├── giscus.html
│   │   └── utterances.html
│   ├── datetime.html
│   ├── embed/
│   │   ├── audio.html
│   │   ├── bilibili.html
│   │   ├── spotify.html
│   │   ├── twitch.html
│   │   ├── video.html
│   │   └── youtube.html
│   ├── favicons.html
│   ├── footer.html
│   ├── head.html
│   ├── js-selector.html
│   ├── jsdelivr-combine.html
│   ├── lang.html
│   ├── language-alias.html
│   ├── media-url.html
│   ├── metadata-hook.html
│   ├── notification.html
│   ├── origin-type.html
│   ├── pageviews/
│   │   └── goatcounter.html
│   ├── post-nav.html
│   ├── post-paginator.html
│   ├── post-sharing.html
│   ├── post-summary.html
│   ├── read-time.html
│   ├── refactor-content.html
│   ├── related-posts.html
│   ├── search-loader.html
│   ├── search-results.html
│   ├── sidebar.html
│   ├── toc-status.html
│   ├── toc.html
│   ├── topbar.html
│   ├── trending-tags.html
│   └── update-list.html
├── _javascript/
│   ├── categories.js
│   ├── commons.js
│   ├── home.js
│   ├── misc.js
│   ├── modules/
│   │   ├── components/
│   │   │   ├── back-to-top.js
│   │   │   ├── category-collapse.js
│   │   │   ├── clipboard.js
│   │   │   ├── img-loading.js
│   │   │   ├── img-popup.js
│   │   │   ├── locale-datetime.js
│   │   │   ├── mermaid.js
│   │   │   ├── mode-toggle.js
│   │   │   ├── search-display.js
│   │   │   ├── toc/
│   │   │   │   ├── toc-desktop.js
│   │   │   │   └── toc-mobile.js
│   │   │   ├── toc.js
│   │   │   └── tooltip-loader.js
│   │   ├── components.js
│   │   ├── layouts/
│   │   │   ├── basic.js
│   │   │   ├── sidebar.js
│   │   │   └── topbar.js
│   │   └── layouts.js
│   ├── page.js
│   ├── post.js
│   ├── pwa/
│   │   ├── app.js
│   │   └── sw.js
│   └── theme.js
├── _layouts/
│   ├── archives.html
│   ├── categories.html
│   ├── category.html
│   ├── compress.html
│   ├── default.html
│   ├── home.html
│   ├── page.html
│   ├── post.html
│   ├── tag.html
│   └── tags.html
├── _plugins/
│   └── posts-lastmod-hook.rb
├── _posts/
│   ├── 2019-08-08-text-and-typography.md
│   ├── 2019-08-08-write-a-new-post.md
│   ├── 2019-08-09-getting-started.md
│   └── 2019-08-11-customize-the-favicon.md
├── _sass/
│   ├── abstracts/
│   │   ├── _breakpoints.scss
│   │   ├── _index.scss
│   │   ├── _mixins.scss
│   │   ├── _placeholders.scss
│   │   └── _variables.scss
│   ├── base/
│   │   ├── _base.scss
│   │   ├── _index.scss
│   │   ├── _reset.scss
│   │   ├── _syntax.scss
│   │   └── _typography.scss
│   ├── components/
│   │   ├── _buttons.scss
│   │   ├── _index.scss
│   │   └── _popups.scss
│   ├── layout/
│   │   ├── _footer.scss
│   │   ├── _index.scss
│   │   ├── _panel.scss
│   │   ├── _sidebar.scss
│   │   └── _topbar.scss
│   ├── main.bundle.scss
│   ├── main.scss
│   ├── pages/
│   │   ├── _archives.scss
│   │   ├── _categories.scss
│   │   ├── _category-tag.scss
│   │   ├── _home.scss
│   │   ├── _index.scss
│   │   ├── _post.scss
│   │   ├── _search.scss
│   │   └── _tags.scss
│   └── themes/
│       ├── _dark.scss
│       └── _light.scss
├── _tabs/
│   ├── about.md
│   ├── archives.md
│   ├── categories.md
│   └── tags.md
├── assets/
│   ├── 404.html
│   ├── css/
│   │   └── jekyll-theme-chirpy.scss
│   ├── feed.xml
│   ├── img/
│   │   └── favicons/
│   │       └── site.webmanifest
│   ├── js/
│   │   └── data/
│   │       ├── mathjax.js
│   │       ├── search.json
│   │       └── swconf.js
│   └── robots.txt
├── docs/
│   ├── CHANGELOG.md
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   └── SECURITY.md
├── eslint.config.js
├── index.html
├── jekyll-theme-chirpy.gemspec
├── package.json
├── purgecss.js
├── rollup.config.js
└── tools/
    ├── init.sh
    ├── release.sh
    ├── run.sh
    └── test.sh
Download .txt
SYMBOL INDEX (102 symbols across 21 files)

FILE: .github/workflows/scripts/pr-filter.js
  function hasTypes (line 1) | function hasTypes(markdown) {
  function hasDescription (line 5) | function hasDescription(markdown) {

FILE: _javascript/modules/components/back-to-top.js
  function back2top (line 5) | function back2top() {

FILE: _javascript/modules/components/category-collapse.js
  function categoryCollapse (line 11) | function categoryCollapse() {

FILE: _javascript/modules/components/clipboard.js
  constant ICON_DEFAULT (line 12) | const ICON_DEFAULT = 'far fa-clipboard';
  constant ICON_SUCCESS (line 13) | const ICON_SUCCESS = 'fas fa-check';
  constant ATTR_TIMEOUT (line 15) | const ATTR_TIMEOUT = 'timeout';
  constant ATTR_TITLE_SUCCEED (line 16) | const ATTR_TITLE_SUCCEED = 'data-title-succeed';
  constant ATTR_TITLE_ORIGIN (line 17) | const ATTR_TITLE_ORIGIN = 'data-bs-original-title';
  constant TIMEOUT (line 18) | const TIMEOUT = 2000;
  function isLocked (line 20) | function isLocked(node) {
  function lock (line 31) | function lock(node) {
  function unlock (line 35) | function unlock(node) {
  function showTooltip (line 39) | function showTooltip(btn) {
  function hideTooltip (line 45) | function hideTooltip(btn) {
  function setSuccessIcon (line 50) | function setSuccessIcon(btn) {
  function resumeIcon (line 55) | function resumeIcon(btn) {
  function setCodeClipboard (line 60) | function setCodeClipboard() {
  function setLinkClipboard (line 103) | function setLinkClipboard() {
  function initClipboard (line 140) | function initClipboard() {

FILE: _javascript/modules/components/img-loading.js
  constant ATTR_DATA_SRC (line 5) | const ATTR_DATA_SRC = 'data-src';
  constant ATTR_DATA_LQIP (line 6) | const ATTR_DATA_LQIP = 'data-lqip';
  function removeCover (line 13) | function removeCover(clzss) {
  function handleImage (line 17) | function handleImage() {
  function switchLQIP (line 32) | function switchLQIP() {
  function loadImg (line 38) | function loadImg() {

FILE: _javascript/modules/components/img-popup.js
  function swapImages (line 11) | function swapImages(current, reverse) {
  function imgPopup (line 25) | function imgPopup() {

FILE: _javascript/modules/components/locale-datetime.js
  class LocaleHelper (line 8) | class LocaleHelper {
    method attrTimestamp (line 9) | static get attrTimestamp() {
    method attrDateFormat (line 13) | static get attrDateFormat() {
    method locale (line 17) | static get locale() {
    method getTimestamp (line 21) | static getTimestamp(elem) {
    method getDateFormat (line 25) | static getDateFormat(elem) {
  function initLocaleDatetime (line 30) | function initLocaleDatetime() {

FILE: _javascript/modules/components/mermaid.js
  constant MERMAID (line 5) | const MERMAID = 'mermaid';
  function refreshTheme (line 8) | function refreshTheme(event) {
  function setNode (line 26) | function setNode(elem) {
  function loadMermaid (line 38) | function loadMermaid() {

FILE: _javascript/modules/components/mode-toggle.js
  function modeWatcher (line 7) | function modeWatcher() {

FILE: _javascript/modules/components/search-display.js
  constant LOADED (line 17) | const LOADED = 'd-block';
  constant UNLOADED (line 18) | const UNLOADED = 'd-none';
  constant FOCUS (line 19) | const FOCUS = 'input-focus';
  constant FLEX (line 20) | const FLEX = 'd-flex';
  class MobileSearchBar (line 23) | class MobileSearchBar {
    method on (line 24) | static on() {
    method off (line 32) | static off() {
  class ResultSwitch (line 41) | class ResultSwitch {
    method on (line 44) | static on() {
    method off (line 54) | static off() {
  function isMobileView (line 72) | function isMobileView() {
  function displaySearch (line 76) | function displaySearch() {

FILE: _javascript/modules/components/toc.js
  function refresh (line 6) | function refresh(e) {
  function init (line 18) | function init() {

FILE: _javascript/modules/components/toc/toc-desktop.js
  class TocDesktop (line 1) | class TocDesktop {
    method refresh (line 13) | static refresh() {
    method init (line 17) | static init() {

FILE: _javascript/modules/components/toc/toc-mobile.js
  constant SCROLL_LOCK (line 11) | const SCROLL_LOCK = 'overflow-hidden';
  constant CLOSING (line 12) | const CLOSING = 'closing';
  class TocMobile (line 14) | class TocMobile {
    method initBar (line 29) | static initBar() {
    method listenAnchors (line 43) | static listenAnchors() {
    method refresh (line 50) | static refresh() {
    method popupOpened (line 58) | static get popupOpened() {
    method showPopup (line 62) | static showPopup() {
    method hidePopup (line 69) | static hidePopup() {
    method lockScroll (line 84) | static lockScroll(enable) {
    method clickBackdrop (line 89) | static clickBackdrop(event) {
    method initComponents (line 105) | static initComponents() {
    method init (line 120) | static init() {

FILE: _javascript/modules/components/tooltip-loader.js
  function loadTooltip (line 3) | function loadTooltip() {

FILE: _javascript/modules/layouts/basic.js
  function basic (line 3) | function basic() {

FILE: _javascript/modules/layouts/sidebar.js
  constant ATTR_DISPLAY (line 1) | const ATTR_DISPLAY = 'sidebar-display';
  class SidebarUtil (line 6) | class SidebarUtil {
    method toggle (line 9) | static toggle() {
  function initSidebar (line 17) | function initSidebar() {

FILE: _javascript/modules/layouts/topbar.js
  function initTopbar (line 3) | function initTopbar() {

FILE: _javascript/pwa/sw.js
  function verifyUrl (line 6) | function verifyUrl(url) {

FILE: _javascript/theme.js
  class Theme (line 6) | class Theme {
    method DARK (line 12) | static get DARK() {
    method LIGHT (line 16) | static get LIGHT() {
    method ID (line 23) | static get ID() {
    method visualState (line 33) | static get visualState() {
    method #mode (line 41) | static get #mode() {
    method #isDarkMode (line 48) | static get #isDarkMode() {
    method #hasMode (line 52) | static get #hasMode() {
    method #sysDark (line 56) | static get #sysDark() {
    method getThemeMapper (line 66) | static getThemeMapper(light, dark) {
    method init (line 76) | static init() {
    method flip (line 104) | static flip() {
    method #setDark (line 113) | static #setDark() {
    method #setLight (line 118) | static #setLight() {
    method #clearMode (line 123) | static #clearMode() {
    method #notify (line 131) | static #notify() {

FILE: purgecss.js
  constant DIST_PATH (line 4) | const DIST_PATH = '_sass/vendors';
  function main (line 19) | function main() {

FILE: rollup.config.js
  constant SRC_DEFAULT (line 7) | const SRC_DEFAULT = '_javascript';
  constant SRC_PWA (line 8) | const SRC_PWA = `${SRC_DEFAULT}/pwa`;
  constant DIST (line 9) | const DIST = 'assets/js/dist';
  function cleanup (line 19) | function cleanup() {
  function insertFrontmatter (line 24) | function insertFrontmatter() {
  function build (line 37) | function build(
Condensed preview — 219 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (434K chars).
[
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 867,
    "preview": "{\n  \"name\": \"Jekyll\",\n  \"image\": \"mcr.microsoft.com/devcontainers/jekyll:2-bullseye\",\n  \"onCreateCommand\": \"git config -"
  },
  {
    "path": ".devcontainer/post-create.sh",
    "chars": 631,
    "preview": "#!/usr/bin/env bash\n\nif [ -f package.json ]; then\n  bash -i -c \"nvm install --lts && nvm install-latest-npm\"\n  npm i\n  n"
  },
  {
    "path": ".editorconfig",
    "chars": 318,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\n# Unix-style newli"
  },
  {
    "path": ".gitattributes",
    "chars": 568,
    "preview": "# Set default behavior to automatically normalize line endings.\n* text=auto\n\n# Force bash scripts to always use LF line "
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/general.yml",
    "chars": 544,
    "preview": "body:\n  - type: checkboxes\n    attributes:\n      label: Checklist\n      description: Following the guidelines can make y"
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/ideas.yml",
    "chars": 173,
    "preview": "body:\n  - type: textarea\n    attributes:\n      label: Description\n      description: Please describe in detail what you "
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/q-a.yml",
    "chars": 1141,
    "preview": "body:\n  - type: checkboxes\n    attributes:\n      label: Checklist\n      description: Following the guidelines can make y"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 18,
    "preview": "ko_fi: coteschung\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1788,
    "preview": "name: Bug Report\ndescription: Create a report to help us improve\nbody:\n  - type: checkboxes\n    attributes:\n      label:"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 199,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask the community for help\n    url: https://github.com/cotes2020/je"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1247,
    "preview": "name: Feature Request\ndescription: Suggest an idea for this project\nlabels:\n  - enhancement\nbody:\n  - type: checkboxes\n "
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 704,
    "preview": "## Type of change\n<!-- Please select the desired item checkbox and change it from `[ ]` to `[x]` and then delete the irr"
  },
  {
    "path": ".github/codeql/codeql-config.yml",
    "chars": 30,
    "preview": "paths-ignore:\n  - \"assets/js\"\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 645,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"bundler\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  - packa"
  },
  {
    "path": ".github/workflows/cd.yml",
    "chars": 861,
    "preview": "name: CD\n\non:\n  push:\n    branches: [production]\n    tags-ignore: [\"**\"]\n\njobs:\n  release:\n    if: ${{ ! startsWith(gith"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 982,
    "preview": "name: CI\n\non:\n  push:\n    branches:\n      - master\n      - \"hotfix/*\"\n    paths-ignore:\n      - \".github/**\"\n      - \"!."
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1201,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [\"master\"]\n    paths: [\"_javascript/**/*.js\"]\n  pull_request:\n    paths: [\"_ja"
  },
  {
    "path": ".github/workflows/commitlint.yml",
    "chars": 246,
    "preview": "name: Lint Commit Messages\n\non:\n  push:\n    branches:\n      - master\n      - \"hotfix/*\"\n  pull_request:\n\njobs:\n  commitl"
  },
  {
    "path": ".github/workflows/lint-js.yml",
    "chars": 546,
    "preview": "name: Lint JS\n\non:\n  push:\n    paths:\n      - \"_javascript/**/*.js\"\n      - \".github/workflows/scripts/**/*.js\"\n      - "
  },
  {
    "path": ".github/workflows/lint-scss.yml",
    "chars": 431,
    "preview": "name: Lint SCSS\n\non:\n  push:\n    paths:\n      - \"_sass/**/*.scss\"\n  pull_request:\n    paths:\n      - \"_sass/**/*.scss\"\n\n"
  },
  {
    "path": ".github/workflows/pr-filter.yml",
    "chars": 699,
    "preview": "name: PR Filter\n\non:\n  pull_request_target:\n    types: [opened, reopened]\n\njobs:\n  check-template:\n    if: github.event."
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 552,
    "preview": "name: Publish\n\non:\n  push:\n    branches:\n      - docs\n  workflow_call:\n    secrets:\n      GH_PAT:\n        required: true"
  },
  {
    "path": ".github/workflows/scripts/pr-filter.js",
    "chars": 1022,
    "preview": "function hasTypes(markdown) {\n  return /## Type of change/.test(markdown) && /-\\s\\[x\\]/i.test(markdown);\n}\n\nfunction has"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 959,
    "preview": "name: \"Close stale issues and PRs\"\n\non:\n  schedule:\n    - cron: \"0 0 * * *\" # every day at 00:00 UTC\n\npermissions:\n  iss"
  },
  {
    "path": ".github/workflows/starter/pages-deploy.yml",
    "chars": 1737,
    "preview": "name: \"Build and Deploy\"\non:\n  push:\n    branches:\n      - main\n      - master\n    paths-ignore:\n      - .gitignore\n    "
  },
  {
    "path": ".gitignore",
    "chars": 309,
    "preview": "# Bundler cache\n.bundle\nvendor\nGemfile.lock\n\n# Jekyll cache\n.jekyll-cache\n.jekyll-metadata\n_site\n\n# RubyGems\n*.gem\n\n# NP"
  },
  {
    "path": ".gitmodules",
    "chars": 105,
    "preview": "[submodule \"assets/lib\"]\n\tpath = assets/lib\n\turl = https://github.com/cotes2020/chirpy-static-assets.git\n"
  },
  {
    "path": ".husky/commit-msg",
    "chars": 33,
    "preview": "npx --no -- commitlint --edit $1\n"
  },
  {
    "path": ".markdownlint.json",
    "chars": 159,
    "preview": "{\n  \"commands-show-output\": false,\n  \"blanks-around-fences\": false,\n  \"line-length\": false,\n  \"no-inline-html\": {\n    \"a"
  },
  {
    "path": ".nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".stylelintrc.json",
    "chars": 795,
    "preview": "{\n  \"ignoreFiles\": [\"_sass/vendors/**\"],\n  \"extends\": \"stylelint-config-standard-scss\",\n  \"rules\": {\n    \"no-descending-"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 64,
    "preview": "{\n  \"recommendations\": [\"ms-vscode-remote.remote-containers\"]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 786,
    "preview": "{\n  // Prettier\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"editor.formatOnSave\": true,\n  // Shopify Liqui"
  },
  {
    "path": ".vscode/tasks.json",
    "chars": 1511,
    "preview": "{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Run Jekyll Server\",\n      \"type\": \"shell\",\n      \"command\": \""
  },
  {
    "path": "Gemfile",
    "chars": 248,
    "preview": "# frozen_string_literal: true\n\nsource \"https://rubygems.org\"\n\ngemspec\n\ngem \"html-proofer\", \"~> 5.0\", group: :test\n\nplatf"
  },
  {
    "path": "LICENSE",
    "chars": 1078,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2019 Cotes Chung\n\nPermission is hereby granted, free of charge, to any person obtai"
  },
  {
    "path": "README.md",
    "chars": 3604,
    "preview": "<!-- markdownlint-disable-next-line -->\n<div align=\"center\">\n\n  <!-- markdownlint-disable-next-line -->\n  # Chirpy Jekyl"
  },
  {
    "path": "_config.yml",
    "chars": 6741,
    "preview": "# The Site Configuration\n\n# Import the theme\ntheme: jekyll-theme-chirpy\n\n# The language of the webpage › http://www.ling"
  },
  {
    "path": "_data/authors.yml",
    "chars": 498,
    "preview": "## Template › https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/advanced-usage.md#setting-author-url\n# ---------"
  },
  {
    "path": "_data/contact.yml",
    "chars": 1180,
    "preview": "#  The contact options.\n\n- type: github\n  icon: \"fab fa-github\"\n\n- type: twitter\n  icon: \"fa-brands fa-x-twitter\"\n\n- typ"
  },
  {
    "path": "_data/locales/ar.yml",
    "chars": 1836,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: منشور\n  category: فئة\n  tag: وسم\n\n# The tabs of "
  },
  {
    "path": "_data/locales/bg-BG.yml",
    "chars": 1746,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Публикация\n  category: Категория\n  tag: Таг\n\n# T"
  },
  {
    "path": "_data/locales/ca-ES.yml",
    "chars": 1924,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Entrada\n  category: Categoria\n  tag: Etiqueta\n\n#"
  },
  {
    "path": "_data/locales/cs-CZ.yml",
    "chars": 1921,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Příspěvek\n  category: Kategorie\n  tag: Štítek\n\n#"
  },
  {
    "path": "_data/locales/da-DK.yml",
    "chars": 1857,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Opslag\n  category: Kategori\n  tag: Tag\n\n# The ta"
  },
  {
    "path": "_data/locales/de-DE.yml",
    "chars": 1916,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Eintrag\n  category: Kategorie\n  tag: Tag\n\n# The "
  },
  {
    "path": "_data/locales/dv‑MV.yml",
    "chars": 1948,
    "preview": "# The layout text of site in Dhivehi (Maldives)\n\n# ----- Commons label -----\n\nlayout:\n  post: ޕޯސްޓް\n  category: ނަތީޖާ\n"
  },
  {
    "path": "_data/locales/el-GR.yml",
    "chars": 2092,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Δημοσίευση\n  category: Κατηγορία\n  tag: Ετικέτα\n"
  },
  {
    "path": "_data/locales/en.yml",
    "chars": 1922,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Post\n  category: Category\n  tag: Tag\n\n# The tabs"
  },
  {
    "path": "_data/locales/es-ES.yml",
    "chars": 1760,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Entrada\n  category: Categoría\n  tag: Etiqueta\n\n#"
  },
  {
    "path": "_data/locales/fa-IR.yml",
    "chars": 1969,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: پست\n  category: دسته‌بندی\n  tag: برچسب\n\n# The ta"
  },
  {
    "path": "_data/locales/fi-FI.yml",
    "chars": 1954,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Julkaisu\n  category: Kateogoria\n  tag: Tagi\n\n# T"
  },
  {
    "path": "_data/locales/fr-FR.yml",
    "chars": 1721,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Post\n  category: Catégorie\n  tag: Tag\n\n# The tab"
  },
  {
    "path": "_data/locales/hu-HU.yml",
    "chars": 2000,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Bejegyzés\n  category: Kategória\n  tag: Címke\n\n# "
  },
  {
    "path": "_data/locales/id-ID.yml",
    "chars": 1706,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Postingan\n  category: Kategori\n  tag: Tagar\n\n# T"
  },
  {
    "path": "_data/locales/it-IT.yml",
    "chars": 2068,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Post\n  category: Categoria\n  tag: Tag\n\n# The tab"
  },
  {
    "path": "_data/locales/ja-JP.yml",
    "chars": 1599,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: 投稿\n  category: カテゴリー\n  tag: タグ\n\n# The tabs of si"
  },
  {
    "path": "_data/locales/ko-KR.yml",
    "chars": 1538,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: 포스트\n  category: 카테고리\n  tag: 태그\n\n# The tabs of si"
  },
  {
    "path": "_data/locales/ku-IQ.yml",
    "chars": 2042,
    "preview": "# The layout text of site in Kurdish (Sorani)\n\n# ----- Commons label -----\n\nlayout:\n  post: بابەت\n  category: هاوپۆل\n  t"
  },
  {
    "path": "_data/locales/my-MM.yml",
    "chars": 1837,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: ပို့စ်\n  category: ကဏ္ဍ\n  tag: နာမ(တက်ဂ်)\n\n# The"
  },
  {
    "path": "_data/locales/nl-NL.yml",
    "chars": 1920,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Post\n  category: Categorie\n  tag: Tag\n\n# The tab"
  },
  {
    "path": "_data/locales/ps‑AF.yml",
    "chars": 1862,
    "preview": "# The layout text of site in Pashto (Afghanistan)\n\n# ----- Commons label -----\n\nlayout:\n  post: لیکنه\n  category: وېشنيز"
  },
  {
    "path": "_data/locales/pt-BR.yml",
    "chars": 1707,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Post\n  category: Categoria\n  tag: Tag\n\n# The tab"
  },
  {
    "path": "_data/locales/ru-RU.yml",
    "chars": 1891,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Пост\n  category: Категория\n  tag: Тег\n\n# The tab"
  },
  {
    "path": "_data/locales/sl-SI.yml",
    "chars": 2511,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Objava #Post\n  category: Kategorija #Category\n  "
  },
  {
    "path": "_data/locales/sv-SE.yml",
    "chars": 2044,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Inlägg #Post\n  category: Kategori #Category\n  ta"
  },
  {
    "path": "_data/locales/th.yml",
    "chars": 1856,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: โพสต์\n  category: หมวดหมู่\n  tag: แท็ก\n\n# The ta"
  },
  {
    "path": "_data/locales/tr-TR.yml",
    "chars": 1719,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Gönderi\n  category: Kategori\n  tag: Etiket\n\n# Th"
  },
  {
    "path": "_data/locales/uk-UA.yml",
    "chars": 1697,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Публікація\n  category: Категорія\n  tag: Тег\n\n# T"
  },
  {
    "path": "_data/locales/ur-PK.yml",
    "chars": 1878,
    "preview": "# The layout text of site in Urdu (Pakistan)\n\n# ----- Commons label -----\n\nlayout:\n  post: تحریر\n  category: زمرہ\n  tag:"
  },
  {
    "path": "_data/locales/vi-VN.yml",
    "chars": 1753,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: Bài viết\n  category: Danh mục\n  tag: Thẻ\n\n# The "
  },
  {
    "path": "_data/locales/zh-CN.yml",
    "chars": 1412,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: 文章\n  category: 分类\n  tag: 标签\n\n# The tabs of sideb"
  },
  {
    "path": "_data/locales/zh-TW.yml",
    "chars": 1413,
    "preview": "# The layout text of site\n\n# ----- Commons label -----\n\nlayout:\n  post: 文章\n  category: 分類\n  tag: 標籤\n\n# The tabs of sideb"
  },
  {
    "path": "_data/media.yml",
    "chars": 332,
    "preview": "- extension: mp3\n  mime_type: mpeg\n- extension: mov\n  mime_type: quicktime\n- extension: avi\n  mime_type: x-msvideo\n- ext"
  },
  {
    "path": "_data/origin/basic.yml",
    "chars": 952,
    "preview": "# fonts\n\nwebfonts: /assets/lib/fonts/main.css\n\n# Libraries\n\ntoc:\n  css: /assets/lib/tocbot/tocbot.min.css\n  js: /assets/"
  },
  {
    "path": "_data/origin/cors.yml",
    "chars": 1829,
    "preview": "# Resource Hints\nresource_hints:\n  - url: https://fonts.googleapis.com\n    links:\n      - rel: preconnect\n      - rel: d"
  },
  {
    "path": "_data/share.yml",
    "chars": 1577,
    "preview": "#  Sharing options at the bottom of the post.\n#  Icons from <https://fontawesome.com/>\n\nplatforms:\n  - type: Twitter\n   "
  },
  {
    "path": "_includes/analytics/cloudflare.html",
    "chars": 188,
    "preview": "<!-- Cloudflare Web Analytics -->\n<script\n  defer\n  src=\"https://static.cloudflareinsights.com/beacon.min.js\"\n  data-cf-"
  },
  {
    "path": "_includes/analytics/fathom.html",
    "chars": 132,
    "preview": "<!-- Fathom -->\n<script\n  src=\"https://cdn.usefathom.com/script.js\"\n  data-site=\"{{ site.analytics.fathom.id }}\"\n  defer"
  },
  {
    "path": "_includes/analytics/goatcounter.html",
    "chars": 170,
    "preview": "<!-- GoatCounter -->\n<script\n  async\n  src=\"https://gc.zgo.at/count.js\"\n  data-goatcounter=\"https://{{ site.analytics.go"
  },
  {
    "path": "_includes/analytics/google.html",
    "chars": 431,
    "preview": "<!-- Global site tag (gtag.js) - Google Analytics -->\n<script defer src=\"https://www.googletagmanager.com/gtag/js?id={{ "
  },
  {
    "path": "_includes/analytics/matomo.html",
    "chars": 568,
    "preview": "<!-- Matomo -->\n<script>\n  document.addEventListener('DOMContentLoaded', () => {\n    var _paq = (window._paq = window._p"
  },
  {
    "path": "_includes/analytics/umami.html",
    "chars": 144,
    "preview": "<!-- Umami -->\n<script\n  defer\n  src=\"{{ site.analytics.umami.domain }}/script.js\"\n  data-website-id=\"{{ site.analytics."
  },
  {
    "path": "_includes/comment.html",
    "chars": 199,
    "preview": "<!-- The comments switcher -->\n{% if page.comments and site.comments.provider %}\n  {% capture path %}comments/{{ site.co"
  },
  {
    "path": "_includes/comments/disqus.html",
    "chars": 1726,
    "preview": "<script>\n  var disqus_config = function () {\n    this.page.url = '{{ page.url | absolute_url }}';\n    this.page.identifi"
  },
  {
    "path": "_includes/comments/giscus.html",
    "chars": 2036,
    "preview": "<!-- https://giscus.app/ -->\n<script>\n  (function () {\n    const themeMapper = Theme.getThemeMapper('light', 'dark_dimme"
  },
  {
    "path": "_includes/comments/utterances.html",
    "chars": 1311,
    "preview": "<!-- https://utteranc.es/ -->\n<script>\n  (function () {\n    const origin = 'https://utteranc.es';\n    const themeMapper "
  },
  {
    "path": "_includes/datetime.html",
    "chars": 577,
    "preview": "<!--\n  Date format snippet\n  See: ${JS_ROOT}/modules/components/locale-datetime.js\n-->\n\n{% assign df_strftime = site.dat"
  },
  {
    "path": "_includes/embed/audio.html",
    "chars": 1160,
    "preview": "{% assign src = include.src | strip %}\n{% assign title = include.title | strip %}\n{% assign types = include.types | defa"
  },
  {
    "path": "_includes/embed/bilibili.html",
    "chars": 207,
    "preview": "<iframe\n  class=\"embed-video\"\n  loading=\"lazy\"\n  src=\"https://player.bilibili.com/player.html?bvid={{ include.id }}\"\n  s"
  },
  {
    "path": "_includes/embed/spotify.html",
    "chars": 500,
    "preview": "{% assign size = 352 %}\n{% assign theme = '' %}\n\n{% if include.compact %}\n  {% assign size = 152 %}\n{% endif %}\n\n{% if i"
  },
  {
    "path": "_includes/embed/twitch.html",
    "chars": 240,
    "preview": "<iframe\n  class=\"embed-video twitch\"\n  loading=\"lazy\"\n  src=\"https://player.twitch.tv/?video={{ include.id }}&parent={{ "
  },
  {
    "path": "_includes/embed/video.html",
    "chars": 1910,
    "preview": "{% assign video_url = include.src %}\n{% assign title = include.title %}\n{% assign poster_url = include.poster %}\n{% assi"
  },
  {
    "path": "_includes/embed/youtube.html",
    "chars": 279,
    "preview": "<iframe\n  class=\"embed-video\"\n  loading=\"lazy\"\n  src=\"https://www.youtube.com/embed/{{ include.id }}\"\n  title=\"YouTube v"
  },
  {
    "path": "_includes/favicons.html",
    "chars": 655,
    "preview": "<!--\n  The Favicons for Web, Android, Microsoft, and iOS (iPhone and iPad) Apps\n  Generated by: https://realfavicongener"
  },
  {
    "path": "_includes/footer.html",
    "chars": 1332,
    "preview": "<!-- The Footer -->\n\n<footer\n  aria-label=\"Site Info\"\n  class=\"\n    d-flex flex-column justify-content-center text-muted"
  },
  {
    "path": "_includes/head.html",
    "chars": 4749,
    "preview": "<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"theme-color\" media=\"(prefers-"
  },
  {
    "path": "_includes/js-selector.html",
    "chars": 2643,
    "preview": "<!-- JS selector for site. -->\n\n<!-- commons -->\n\n{% assign urls = site.data.origin[type].search.js %}\n\n<!-- layout spec"
  },
  {
    "path": "_includes/jsdelivr-combine.html",
    "chars": 745,
    "preview": "{% assign urls = include.urls | split: ',' %}\n\n{% assign combined_urls = null %}\n\n{% assign domain = 'https://cdn.jsdeli"
  },
  {
    "path": "_includes/lang.html",
    "chars": 291,
    "preview": "{% comment %}\n  Detect appearance language and return it through variable \"lang\"\n{% endcomment %}\n{% if site.data.locale"
  },
  {
    "path": "_includes/language-alias.html",
    "chars": 1818,
    "preview": "{% comment %}\n  Convert the alias of the syntax language to the official name\n\n  See: <https://github.com/rouge-ruby/rou"
  },
  {
    "path": "_includes/media-url.html",
    "chars": 1112,
    "preview": "{%- comment -%}\n  Generate media resource final URL based on `site.cdn`, `page.media_subpath`\n\n  Arguments:\n    src - re"
  },
  {
    "path": "_includes/metadata-hook.html",
    "chars": 57,
    "preview": "<!-- A placeholder to allow defining custom metadata -->\n"
  },
  {
    "path": "_includes/notification.html",
    "chars": 635,
    "preview": "<aside\n  id=\"notification\"\n  class=\"toast\"\n  role=\"alert\"\n  aria-live=\"assertive\"\n  aria-atomic=\"true\"\n  data-bs-animati"
  },
  {
    "path": "_includes/origin-type.html",
    "chars": 349,
    "preview": "{% comment %} Site static assets origin type {% endcomment %}\n\n{% assign type = 'cors' %}\n\n{% if site.assets.self_host.e"
  },
  {
    "path": "_includes/pageviews/goatcounter.html",
    "chars": 669,
    "preview": "<!-- Display GoatCounter pageviews -->\n<script>\n  document.addEventListener('DOMContentLoaded', () => {\n    const pv = d"
  },
  {
    "path": "_includes/post-nav.html",
    "chars": 981,
    "preview": "<!-- Navigation buttons at the bottom of the post. -->\n\n<nav class=\"post-navigation d-flex justify-content-between\" aria"
  },
  {
    "path": "_includes/post-paginator.html",
    "chars": 3002,
    "preview": "<!-- The paginator for post list on HomePage. -->\n\n<nav aria-label=\"Page Navigation\">\n  <ul class=\"pagination align-item"
  },
  {
    "path": "_includes/post-sharing.html",
    "chars": 1894,
    "preview": "<!-- Post sharing snippet -->\n\n<div class=\"share-wrapper d-flex align-items-center\">\n  <span class=\"share-label text-mut"
  },
  {
    "path": "_includes/post-summary.html",
    "chars": 1219,
    "preview": "{%- comment -%}\n  Get the post's description or body content.\n\n  Arguments:\n    full_text: If true, return the full cont"
  },
  {
    "path": "_includes/read-time.html",
    "chars": 978,
    "preview": "<!-- Calculate the post's reading time, and display the word count in tooltip -->\n\n{% assign words = include.content | s"
  },
  {
    "path": "_includes/refactor-content.html",
    "chars": 9539,
    "preview": "<!-- Refactor the HTML structure -->\n\n{% assign _content = include.content %}\n\n<!--\n  In order to allow a wide table to "
  },
  {
    "path": "_includes/related-posts.html",
    "chars": 2820,
    "preview": "<!-- Recommend the other 3 posts according to the tags and categories of the current post. -->\n\n<!-- The total size of r"
  },
  {
    "path": "_includes/search-loader.html",
    "chars": 1561,
    "preview": "<!--\n  Jekyll Simple Search loader\n  See: <https://github.com/christian-fei/Simple-Jekyll-Search>\n-->\n\n{% capture result"
  },
  {
    "path": "_includes/search-results.html",
    "chars": 357,
    "preview": "<!-- The Search results -->\n\n<div id=\"search-result-wrapper\" class=\"d-flex justify-content-center d-none\">\n  <div class="
  },
  {
    "path": "_includes/sidebar.html",
    "chars": 3629,
    "preview": "<!-- The Side Bar -->\n\n<aside aria-label=\"Sidebar\" id=\"sidebar\" class=\"d-flex flex-column align-items-end\">\n  <header cl"
  },
  {
    "path": "_includes/toc-status.html",
    "chars": 292,
    "preview": "{% comment %}\n  Determine TOC state and return it through variable \"enable_toc\"\n{% endcomment %}\n\n{% assign enable_toc ="
  },
  {
    "path": "_includes/toc.html",
    "chars": 322,
    "preview": "{% include toc-status.html %}\n\n{% if enable_toc %}\n  <div class=\"toc-border-cover z-3\"></div>\n  <section id=\"toc-wrapper"
  },
  {
    "path": "_includes/topbar.html",
    "chars": 2749,
    "preview": "<!-- The Top Bar -->\n\n<header id=\"topbar-wrapper\" class=\"flex-shrink-0\" aria-label=\"Top Bar\">\n  <div\n    id=\"topbar\"\n   "
  },
  {
    "path": "_includes/trending-tags.html",
    "chars": 1456,
    "preview": "<!-- The trending tags list -->\n\n{% assign MAX = 10 %}\n\n{% assign size_list = '' | split: '' %}\n{% assign tag_list = '' "
  },
  {
    "path": "_includes/update-list.html",
    "chars": 1181,
    "preview": "<!-- Get 5 last posted/updated posts -->\n\n{% assign MAX_SIZE = 5 %}\n\n{% assign all_list = '' | split: '' %}\n\n{% for post"
  },
  {
    "path": "_javascript/categories.js",
    "chars": 184,
    "preview": "import { basic, initSidebar, initTopbar } from './modules/layouts';\nimport { categoryCollapse } from './modules/componen"
  },
  {
    "path": "_javascript/commons.js",
    "chars": 107,
    "preview": "import { basic, initSidebar, initTopbar } from './modules/layouts';\n\ninitSidebar();\ninitTopbar();\nbasic();\n"
  },
  {
    "path": "_javascript/home.js",
    "chars": 208,
    "preview": "import { basic, initSidebar, initTopbar } from './modules/layouts';\nimport { initLocaleDatetime, loadImg } from './modul"
  },
  {
    "path": "_javascript/misc.js",
    "chars": 188,
    "preview": "import { basic, initSidebar, initTopbar } from './modules/layouts';\nimport { initLocaleDatetime } from './modules/compon"
  },
  {
    "path": "_javascript/modules/components/back-to-top.js",
    "chars": 415,
    "preview": "/**\n * Reference: https://bootsnipp.com/snippets/featured/link-to-top-page\n */\n\nexport function back2top() {\n  const btn"
  },
  {
    "path": "_javascript/modules/components/category-collapse.js",
    "chars": 1102,
    "preview": "/**\n * Tab 'Categories' expand/close effect.\n */\n\nimport 'bootstrap/js/src/collapse.js';\n\nconst childPrefix = 'l_';\ncons"
  },
  {
    "path": "_javascript/modules/components/clipboard.js",
    "chars": 3170,
    "preview": "/**\n * Clipboard functions\n *\n * Dependencies:\n *    clipboard.js (https://github.com/zenorocha/clipboard.js)\n */\n\nimpor"
  },
  {
    "path": "_javascript/modules/components/img-loading.js",
    "chars": 1473,
    "preview": "/**\n * Setting up image lazy loading and LQIP switching\n */\n\nconst ATTR_DATA_SRC = 'data-src';\nconst ATTR_DATA_LQIP = 'd"
  },
  {
    "path": "_javascript/modules/components/img-popup.js",
    "chars": 1116,
    "preview": "/**\n * Set up image popup\n *\n * Dependencies: https://github.com/biati-digital/glightbox\n */\n\nconst lightImages = '.popu"
  },
  {
    "path": "_javascript/modules/components/locale-datetime.js",
    "chars": 1431,
    "preview": "/**\n * Update month/day to locale datetime\n *\n * Requirement: <https://github.com/iamkun/dayjs>\n */\n\n/* A tool for local"
  },
  {
    "path": "_javascript/modules/components/mermaid.js",
    "chars": 1567,
    "preview": "/**\n * Mermaid-js loader\n */\n\nconst MERMAID = 'mermaid';\nconst themeMapper = Theme.getThemeMapper('default', 'dark');\n\nf"
  },
  {
    "path": "_javascript/modules/components/mode-toggle.js",
    "chars": 241,
    "preview": "/**\n * Add listener for theme mode toggle\n */\n\nconst $toggle = document.getElementById('mode-toggle');\n\nexport function "
  },
  {
    "path": "_javascript/modules/components/search-display.js",
    "chars": 2853,
    "preview": "/**\n * This script makes #search-result-wrapper switch to unload or shown automatically.\n */\n\nconst btnSbTrigger = docum"
  },
  {
    "path": "_javascript/modules/components/toc/toc-desktop.js",
    "chars": 453,
    "preview": "export class TocDesktop {\n  /* Tocbot options Ref: https://github.com/tscanlin/tocbot#usage */\n  static options = {\n    "
  },
  {
    "path": "_javascript/modules/components/toc/toc-mobile.js",
    "chars": 2956,
    "preview": "/**\n * TOC button, topbar and popup for mobile devices\n */\n\nconst $tocBar = document.getElementById('toc-bar');\nconst $s"
  },
  {
    "path": "_javascript/modules/components/toc.js",
    "chars": 806,
    "preview": "import { TocMobile as mobile } from './toc/toc-mobile';\nimport { TocDesktop as desktop } from './toc/toc-desktop';\n\ncons"
  },
  {
    "path": "_javascript/modules/components/tooltip-loader.js",
    "chars": 270,
    "preview": "import Tooltip from 'bootstrap/js/src/tooltip';\n\nexport function loadTooltip() {\n  const tooltipTriggerList = document.q"
  },
  {
    "path": "_javascript/modules/components.js",
    "chars": 557,
    "preview": "export { categoryCollapse } from './components/category-collapse';\nexport { initClipboard } from './components/clipboard"
  },
  {
    "path": "_javascript/modules/layouts/basic.js",
    "chars": 145,
    "preview": "import { back2top, loadTooltip, modeWatcher } from '../components';\n\nexport function basic() {\n  modeWatcher();\n  back2t"
  },
  {
    "path": "_javascript/modules/layouts/sidebar.js",
    "chars": 601,
    "preview": "const ATTR_DISPLAY = 'sidebar-display';\nconst $sidebar = document.getElementById('sidebar');\nconst $trigger = document.g"
  },
  {
    "path": "_javascript/modules/layouts/topbar.js",
    "chars": 115,
    "preview": "import { displaySearch } from '../components/search-display';\n\nexport function initTopbar() {\n  displaySearch();\n}\n"
  },
  {
    "path": "_javascript/modules/layouts.js",
    "chars": 137,
    "preview": "export { basic } from './layouts/basic';\nexport { initSidebar } from './layouts/sidebar';\nexport { initTopbar } from './"
  },
  {
    "path": "_javascript/page.js",
    "chars": 256,
    "preview": "import { basic, initSidebar, initTopbar } from './modules/layouts';\nimport {\n  loadImg,\n  imgPopup,\n  initClipboard,\n  l"
  },
  {
    "path": "_javascript/post.js",
    "chars": 323,
    "preview": "import { basic, initTopbar, initSidebar } from './modules/layouts';\n\nimport {\n  loadImg,\n  imgPopup,\n  initLocaleDatetim"
  },
  {
    "path": "_javascript/pwa/app.js",
    "chars": 1735,
    "preview": "import Toast from 'bootstrap/js/src/toast';\n\nif ('serviceWorker' in navigator) {\n  // Get Jekyll config from URL paramet"
  },
  {
    "path": "_javascript/pwa/sw.js",
    "chars": 2046,
    "preview": "importScripts('./assets/js/data/swconf.js');\n\nconst purge = swconf.purge;\nconst interceptor = swconf.interceptor;\n\nfunct"
  },
  {
    "path": "_javascript/theme.js",
    "chars": 2918,
    "preview": "/**\n * Theme management class\n *\n * To reduce flickering during page load, this script should be loaded synchronously.\n "
  },
  {
    "path": "_layouts/archives.html",
    "chars": 1073,
    "preview": "---\nlayout: page\n# The Archives of posts.\n---\n\n{% include lang.html %}\n\n{% assign df_strftime_m = site.data.locales[lang"
  },
  {
    "path": "_layouts/categories.html",
    "chars": 4941,
    "preview": "---\nlayout: page\n# All the Categories of posts\n---\n\n{% include lang.html %}\n\n{% assign HEAD_PREFIX = 'h_' %}\n{% assign L"
  },
  {
    "path": "_layouts/category.html",
    "chars": 650,
    "preview": "---\nlayout: page\n# The Category layout\n---\n\n{% include lang.html %}\n\n<div id=\"page-category\">\n  <h1 class=\"ps-lg-2\">\n   "
  },
  {
    "path": "_layouts/compress.html",
    "chars": 4565,
    "preview": "---\n# Jekyll layout that compresses HTML\n# v3.2.0\n# http://jch.penibelst.de/\n# © 2014–2015 Anatol Broder\n# MIT License\n-"
  },
  {
    "path": "_layouts/default.html",
    "chars": 2667,
    "preview": "---\nlayout: compress\n---\n\n<!doctype html>\n\n{% include origin-type.html %}\n\n{% include lang.html %}\n\n{% if site.theme_mod"
  },
  {
    "path": "_layouts/home.html",
    "chars": 4413,
    "preview": "---\nlayout: default\n---\n\n{% include lang.html %}\n\n{% assign all_pinned = site.posts | where: 'pin', 'true' %}\n{% assign "
  },
  {
    "path": "_layouts/page.html",
    "chars": 441,
    "preview": "---\nlayout: default\n---\n\n{% include lang.html %}\n\n<article class=\"px-1\">\n  {% if page.layout == 'page' or page.collectio"
  },
  {
    "path": "_layouts/post.html",
    "chars": 5823,
    "preview": "---\nlayout: default\npanel_includes:\n  - toc\ntail_includes:\n  - related-posts\n  - post-nav\nscript_includes:\n  - comment\n-"
  },
  {
    "path": "_layouts/tag.html",
    "chars": 639,
    "preview": "---\nlayout: page\n# The layout for Tag page\n---\n\n{% include lang.html %}\n\n<div id=\"page-tag\">\n  <h1 class=\"ps-lg-2\">\n    "
  },
  {
    "path": "_layouts/tags.html",
    "chars": 541,
    "preview": "---\nlayout: page\n# All the Tags of posts.\n---\n\n<div id=\"tags\" class=\"d-flex flex-wrap mx-xl-2\">\n  {% assign tags = '' | "
  },
  {
    "path": "_plugins/posts-lastmod-hook.rb",
    "chars": 323,
    "preview": "#!/usr/bin/env ruby\n#\n# Check for changed posts\n\nJekyll::Hooks.register :posts, :post_init do |post|\n\n  commit_num = `gi"
  },
  {
    "path": "_posts/2019-08-08-text-and-typography.md",
    "chars": 6127,
    "preview": "---\ntitle: Text and Typography\ndescription: Examples of text, typography, math equations, diagrams, flowcharts, pictures"
  },
  {
    "path": "_posts/2019-08-08-write-a-new-post.md",
    "chars": 16150,
    "preview": "---\ntitle: Writing a New Post\nauthor: cotes\ndate: 2019-08-08 14:10:00 +0800\ncategories: [Blogging, Tutorial]\ntags: [writ"
  },
  {
    "path": "_posts/2019-08-09-getting-started.md",
    "chars": 7311,
    "preview": "---\ntitle: Getting Started\ndescription: >-\n  Get started with Chirpy basics in this comprehensive overview.\n  You will l"
  },
  {
    "path": "_posts/2019-08-11-customize-the-favicon.md",
    "chars": 1846,
    "preview": "---\ntitle: Customize the Favicon\nauthor: cotes\ndate: 2019-08-11 00:34:00 +0800\ncategories: [Blogging, Tutorial]\ntags: [f"
  },
  {
    "path": "_sass/abstracts/_breakpoints.scss",
    "chars": 1049,
    "preview": "@use 'sass:map';\n\n$-breakpoints: (\n  // 1 column\n  sm: 576px,\n  md: 768px,\n  // 2 columns\n  lg: 850px,\n  // 3 columns\n  "
  },
  {
    "path": "_sass/abstracts/_index.scss",
    "chars": 90,
    "preview": "@forward 'variables';\n@forward 'mixins';\n@forward 'placeholders';\n@forward 'breakpoints';\n"
  },
  {
    "path": "_sass/abstracts/_mixins.scss",
    "chars": 1425,
    "preview": "@mixin text-ellipsis {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n@mixin mt-mb($value) {\n "
  },
  {
    "path": "_sass/abstracts/_placeholders.scss",
    "chars": 2558,
    "preview": "@use 'variables' as v;\n@use 'mixins' as mx;\n\n%heading {\n  color: var(--heading-color);\n  font-weight: 400;\n  font-family"
  },
  {
    "path": "_sass/abstracts/_variables.scss",
    "chars": 880,
    "preview": "/* sidebar */\n\n$sidebar-width: 260px !default; /* the basic width */\n$sidebar-width-large: 300px !default; /* screen wid"
  },
  {
    "path": "_sass/base/_base.scss",
    "chars": 7539,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/mixins' as mx;\n@use '../ab"
  },
  {
    "path": "_sass/base/_index.scss",
    "chars": 77,
    "preview": "@forward 'reset';\n@forward 'base';\n@forward 'typography';\n@forward 'syntax';\n"
  },
  {
    "path": "_sass/base/_reset.scss",
    "chars": 599,
    "preview": "@use '../abstracts/mixins' as *;\n\n::-webkit-input-placeholder {\n  @include placeholder;\n}\n\n::-moz-placeholder {\n  @inclu"
  },
  {
    "path": "_sass/base/_syntax.scss",
    "chars": 4801,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/mixins' as mx;\n@use '../ab"
  },
  {
    "path": "_sass/base/_typography.scss",
    "chars": 4343,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/mixins' as mx;\n@use '../ab"
  },
  {
    "path": "_sass/components/_buttons.scss",
    "chars": 1104,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n\n#back-to-top {\n  visibility: hidden;\n  opaci"
  },
  {
    "path": "_sass/components/_index.scss",
    "chars": 39,
    "preview": "@forward 'buttons';\n@forward 'popups';\n"
  },
  {
    "path": "_sass/components/_popups.scss",
    "chars": 3073,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/placeholders';\n\n/* PWA upd"
  },
  {
    "path": "_sass/layout/_footer.scss",
    "chars": 595,
    "preview": "@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/variables' as v;\n@use '../abstracts/mixins' as mx;\n@use '../ab"
  },
  {
    "path": "_sass/layout/_index.scss",
    "chars": 76,
    "preview": "@forward 'sidebar';\n@forward 'topbar';\n@forward 'panel';\n@forward 'footer';\n"
  },
  {
    "path": "_sass/layout/_panel.scss",
    "chars": 1028,
    "preview": "@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/mixins' as mx;\n@use '../abstracts/placeholders';\n\n.access {\n  "
  },
  {
    "path": "_sass/layout/_sidebar.scss",
    "chars": 5114,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/mixins' as mx;\n@use '../abstracts/breakpoints' as bp;\n@use '../ab"
  },
  {
    "path": "_sass/layout/_topbar.scss",
    "chars": 1435,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/mixins' as mx;\n@use '../abstracts/breakpoints' as bp;\n@use '../ab"
  },
  {
    "path": "_sass/main.bundle.scss",
    "chars": 39,
    "preview": "@use 'vendors/bootstrap';\n@use 'main';\n"
  },
  {
    "path": "_sass/main.scss",
    "chars": 77,
    "preview": "@forward 'base';\n@forward 'components';\n@forward 'layout';\n@forward 'pages';\n"
  },
  {
    "path": "_sass/pages/_archives.scss",
    "chars": 2461,
    "preview": "@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/placeholders';\n\n#archives {\n  letter-spacing: 0.03rem;\n\n  @inc"
  },
  {
    "path": "_sass/pages/_categories.scss",
    "chars": 1338,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/placeholders';\n\n%-category-icon-color {\n  color: gray;\n}\n\n.catego"
  },
  {
    "path": "_sass/pages/_category-tag.scss",
    "chars": 1025,
    "preview": "@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/mixins' as mx;\n@use '../abstracts/placeholders';\n\n.dash {\n  ma"
  },
  {
    "path": "_sass/pages/_home.scss",
    "chars": 2796,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/placeholders';\n\n#post-list"
  },
  {
    "path": "_sass/pages/_index.scss",
    "chars": 139,
    "preview": "@forward 'search';\n@forward 'home';\n@forward 'post';\n@forward 'categories';\n@forward 'tags';\n@forward 'archives';\n@forwa"
  },
  {
    "path": "_sass/pages/_post.scss",
    "chars": 7859,
    "preview": "@use '../abstracts/variables' as v;\n@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/mixins' as mx;\n@use '../ab"
  },
  {
    "path": "_sass/pages/_search.scss",
    "chars": 2850,
    "preview": "@use '../abstracts/breakpoints' as bp;\n@use '../abstracts/variables' as v;\n@use '../abstracts/placeholders';\n\nsearch {\n "
  },
  {
    "path": "_sass/pages/_tags.scss",
    "chars": 439,
    "preview": "@use '../abstracts/breakpoints' as bp;\n\n.tag {\n  border-radius: 0.7em;\n  padding: 6px 8px 7px;\n  margin-right: 0.8rem;\n "
  },
  {
    "path": "_sass/themes/_dark.scss",
    "chars": 6279,
    "preview": "@mixin styles {\n  color-scheme: dark;\n\n  /* Framework color */\n  --main-bg: rgb(27 27 30);\n  --mask-bg: rgb(68 69 70);\n "
  },
  {
    "path": "_sass/themes/_light.scss",
    "chars": 5901,
    "preview": "@mixin styles {\n  /* Framework color */\n  --main-bg: white;\n  --mask-bg: #c1c3c5;\n  --main-border-color: #f3f3f3;\n\n  /* "
  },
  {
    "path": "_tabs/about.md",
    "chars": 194,
    "preview": "---\n# the default layout is 'page'\nicon: fas fa-info-circle\norder: 4\n---\n\n> Add Markdown syntax content to file `_tabs/a"
  },
  {
    "path": "_tabs/archives.md",
    "chars": 55,
    "preview": "---\nlayout: archives\nicon: fas fa-archive\norder: 3\n---\n"
  },
  {
    "path": "_tabs/categories.md",
    "chars": 56,
    "preview": "---\nlayout: categories\nicon: fas fa-stream\norder: 1\n---\n"
  },
  {
    "path": "_tabs/tags.md",
    "chars": 48,
    "preview": "---\nlayout: tags\nicon: fas fa-tags\norder: 2\n---\n"
  },
  {
    "path": "assets/404.html",
    "chars": 166,
    "preview": "---\nlayout: page\ntitle: \"404: Page not found\"\npermalink: /404.html\n---\n\n{% include lang.html %}\n\n<p class=\"lead\">{{ site"
  },
  {
    "path": "assets/css/jekyll-theme-chirpy.scss",
    "chars": 153,
    "preview": "---\n---\n\n/* prettier-ignore */\n@use 'main\n{%- if jekyll.environment == 'production' -%}\n  .bundle\n{%- endif -%}\n';\n\n/* a"
  },
  {
    "path": "assets/feed.xml",
    "chars": 1973,
    "preview": "---\nlayout: compress\npermalink: /feed.xml\n# Atom Feed, reference: https://validator.w3.org/feed/docs/atom.html\n---\n\n{% c"
  }
]

// ... and 19 more files (download for full content)

About this extraction

This page contains the full source code of the cotes2020/jekyll-theme-chirpy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 219 files (395.1 KB), approximately 124.1k tokens, and a symbol index with 102 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!