Full Code of docsifyjs/docsify for AI

develop 851db13891fe cached
174 files
722.0 KB
222.8k tokens
208 symbols
1 requests
Download .txt
Showing preview only (767K chars total). Download the full file or copy to clipboard to get everything.
Repository: docsifyjs/docsify
Branch: develop
Commit: 851db13891fe
Files: 174
Total size: 722.0 KB

Directory structure:
gitextract_4_14r9ru/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── crowdin/
│   │   └── crowdin-push.yml
│   ├── dependabot.yml
│   ├── semantic.yml
│   └── workflows/
│       ├── crowdin.yml
│       ├── emoji.yml
│       └── test.yml
├── .gitignore
├── .gitpod.yml
├── .husky/
│   └── pre-commit
├── .npmignore
├── .prettierignore
├── .prettierrc.json
├── .vscode/
│   ├── launch.json
│   └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── HISTORY.md
├── LICENSE
├── README.md
├── SECURITY.md
├── babel.config.json
├── build/
│   ├── cover.js
│   ├── emoji.js
│   ├── release.sh
│   └── util.js
├── docs/
│   ├── .nojekyll
│   ├── CNAME
│   ├── README.md
│   ├── _coverpage.md
│   ├── _media/
│   │   ├── example-with-yaml.md
│   │   ├── example.html
│   │   ├── example.js
│   │   └── example.md
│   ├── _navbar.md
│   ├── _sidebar.md
│   ├── adding-pages.md
│   ├── cdn.md
│   ├── configuration.md
│   ├── cover.md
│   ├── custom-navbar.md
│   ├── deploy.md
│   ├── embed-files.md
│   ├── emoji.md
│   ├── helpers.md
│   ├── index.html
│   ├── language-highlight.md
│   ├── markdown.md
│   ├── plugins.md
│   ├── pwa.md
│   ├── quickstart.md
│   ├── themes.md
│   ├── ui-kit.md
│   ├── v5-upgrade.md
│   ├── vue.md
│   └── write-a-plugin.md
├── eslint.config.js
├── jest.config.js
├── middleware.js
├── package.json
├── playwright.config.js
├── postcss.config.cjs
├── rollup.config.js
├── server.configs.js
├── server.js
├── src/
│   ├── core/
│   │   ├── Docsify.js
│   │   ├── config.js
│   │   ├── event/
│   │   │   └── index.js
│   │   ├── fetch/
│   │   │   └── index.js
│   │   ├── global-api.js
│   │   ├── globals.ts
│   │   ├── index.js
│   │   ├── init/
│   │   │   └── lifecycle.js
│   │   ├── module.js
│   │   ├── modules.ts
│   │   ├── render/
│   │   │   ├── compiler/
│   │   │   │   ├── blockquote.js
│   │   │   │   ├── code.js
│   │   │   │   ├── heading.js
│   │   │   │   ├── image.js
│   │   │   │   ├── link.js
│   │   │   │   ├── media.js
│   │   │   │   ├── paragraph.js
│   │   │   │   ├── tableCell.js
│   │   │   │   ├── taskList.js
│   │   │   │   └── taskListItem.js
│   │   │   ├── compiler.js
│   │   │   ├── embed.js
│   │   │   ├── emoji-data.js
│   │   │   ├── emojify.js
│   │   │   ├── gen-tree.js
│   │   │   ├── index.js
│   │   │   ├── progressbar.js
│   │   │   ├── slugify.js
│   │   │   ├── tpl.js
│   │   │   └── utils.js
│   │   ├── router/
│   │   │   ├── history/
│   │   │   │   ├── base.js
│   │   │   │   ├── hash.js
│   │   │   │   └── html5.js
│   │   │   ├── index.js
│   │   │   └── util.js
│   │   ├── util/
│   │   │   ├── ajax.js
│   │   │   ├── core.js
│   │   │   ├── dom.js
│   │   │   ├── env.js
│   │   │   ├── index.js
│   │   │   └── prism.js
│   │   └── virtual-routes/
│   │       ├── exact-match.js
│   │       ├── index.js
│   │       └── next.js
│   └── plugins/
│       ├── disqus.js
│       ├── emoji.js
│       ├── external-script.js
│       ├── front-matter/
│       │   ├── index.js
│       │   ├── parser.js
│       │   └── yaml.js
│       ├── ga.js
│       ├── gitalk.js
│       ├── gtag.js
│       ├── matomo.js
│       ├── search/
│       │   ├── component.js
│       │   ├── index.js
│       │   ├── markdown-to-txt.js
│       │   ├── search.js
│       │   └── style.css
│       └── zoom-image.js
├── test/
│   ├── README.md
│   ├── config/
│   │   ├── jest.setup-tests.js
│   │   ├── jest.setup.js
│   │   ├── jest.teardown.js
│   │   ├── playwright.setup.js
│   │   ├── playwright.teardown.js
│   │   └── server.js
│   ├── consume-types/
│   │   ├── README.md
│   │   ├── example.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── prism.js
│   │   ├── register-sw.js
│   │   ├── sw.js
│   │   └── tsconfig.json
│   ├── e2e/
│   │   ├── configuration.test.js
│   │   ├── example.test.js
│   │   ├── fixtures/
│   │   │   └── docsify-init-fixture.js
│   │   ├── gtag.test.js
│   │   ├── index-file.test.js
│   │   ├── plugins.test.js
│   │   ├── search.test.js
│   │   ├── security.test.js
│   │   ├── sidebar.test.js
│   │   ├── virtual-routes.test.js
│   │   └── vue.test.js
│   ├── helpers/
│   │   ├── docsify-init.js
│   │   └── wait-for.js
│   ├── integration/
│   │   ├── __snapshots__/
│   │   │   ├── docs.test.js.snap
│   │   │   └── emoji.test.js.snap
│   │   ├── docs.test.js
│   │   ├── docsify.test.js
│   │   ├── emoji.test.js
│   │   ├── example.test.js
│   │   ├── global-apis.test.js
│   │   ├── render.test.js
│   │   └── sidebar.test.js
│   └── unit/
│       ├── core-util.test.js
│       ├── render-util.test.js
│       ├── router-history-base.test.js
│       └── router-util.test.js
├── tsconfig.json
└── vercel.json

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

================================================
FILE: .editorconfig
================================================
# http://EditorConfig.org

root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true


================================================
FILE: .gitattributes
================================================
* text=auto eol=lf


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Submit a bug report.
labels: ['bug', 'Triage']

body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report! **Please write in English**.
        Before creating an issue please make sure you are using the latest version of Docsify.

  - type: textarea
    attributes:
      label: Description
      description: A clear and concise description of what the bug is, and why you consider it to be a bug.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Expected behavior
      description: A description of what you expected to happen.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Actual behavior
      description: A description of what is actually happening.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to reproduce
      description: |
        A description with steps to reproduce the issue.
        Provide a link to a public repository or create a reproducible [sandbox](https://codesandbox.io/s/307qqv236):
      placeholder: |
        1. Step 1
        2. Step 2
    validations:
      required: true

  - type: textarea
    attributes:
      label: Environment
      description: |
        Please provide the following information if relevant to the issue:
        ```markdown
        - Your OS:
        - Node.js version:
        - npm/yarn version:
        - Browser version:
        - Docsify version:
        - Docsify plugins (if the bug happens when plugins enabled, please try to isolate the issue):
        ```

  - type: checkboxes
    attributes:
      label: Additional Information
      options:
        - label: Bug still occurs when all/other plugins are disabled?


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Discord - the community chat
    url: https://discord.gg/docsify
    about: Join the Discord community and chat about Docsify


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Propose a new feature or improvement for this project.
labels: ['feature request', 'Triage']

body:
  - type: markdown
    attributes:
      value: |
        Thank you for suggesting a feature! Please provide as much detail as possible to help us understand your idea. **Write in English.**

  - type: textarea
    attributes:
      label: Problem or Desire
      description: What problem or need will this feature address? Why is it important?
    validations:
      required: true

  - type: textarea
    attributes:
      label: Proposal
      description: What is your proposed solution? How should this feature work?
    validations:
      required: true

  - type: textarea
    attributes:
      label: Implementation Details
      description: If you have any ideas about how this feature could be implemented, please share them here.

  - type: textarea
    attributes:
      label: Additional Context
      description: Add any other context, screenshots, or references that might help us understand your request.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Summary

<!-- Describe what the change does and why it should be merged. Provide **before/after** screenshots for any UI changes. -->

## Related issue, if any:

<!-- Paste issue's link or number hashtag here. -->

## What kind of change does this PR introduce?

<!-- (Change "[ ]" to "[x]" to check a box.) -->

- [ ] Bugfix
- [ ] Feature
- [ ] Code style update (formatting, renaming)
- [ ] Refactoring (no functional changes, no api changes)
- [ ] Build related changes
- [ ] Documentation content changes
- [ ] Other (please describe):

## For any code change,

- [ ] Related documentation has been updated, if needed
- [ ] Related tests have been added or updated, if needed

## Does this PR introduce a breaking change?

<!-- If yes, describe the impact and migration path for existing applications. -->

- [ ] Yes
- [ ] No

## Tested in the following browsers:

- [ ] Chrome
- [ ] Firefox
- [ ] Safari
- [ ] Edge


================================================
FILE: .github/crowdin/crowdin-push.yml
================================================
files:
  - source: /*.md
    translation: /%two_letters_code%/%original_file_name%
    ignore:
      - '/_coverpage.md'
      - '/_navbar.md'

project_id_env: CROWDIN_PROJECT_ID
api_token_env: CROWDIN_PERSONAL_TOKEN


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: npm # See documentation for possible values
    directory: '/' # Location of package manifests
    open-pull-requests-limit: 10
    schedule:
      interval: monthly
    ignore:
      # For all dependencies, trigger pull requests only for semver-major updates (ignore minor and patch).
      - dependency-name: '*'
        update-types:
          ['version-update:semver-patch', 'version-update:semver-minor']
  - package-ecosystem: 'github-actions'
    directory: '/'
    open-pull-requests-limit: 10
    schedule:
      interval: monthly
    ignore:
      # For all dependencies, trigger pull requests only for semver-major and semver-minor updates (ignore patch).
      - dependency-name: '*'
        update-types:
          ['version-update:semver-patch', 'version-update:semver-minor']


================================================
FILE: .github/semantic.yml
================================================
titleAndCommits: true
allowMergeCommits: true
allowRevertCommits: true
anyCommit: true


================================================
FILE: .github/workflows/crowdin.yml
================================================
name: Crowdin Action

on:
  workflow_dispatch:
  push:
    paths:
      - 'docs/**.md'
    branches: [develop, main]

jobs:
  crowdin:
    if: github.repository == 'docsifyjs/docsify'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Crowdin push
        uses: crowdin/github-action@v2
        with:
          upload_sources: true
          upload_translations: false
          download_translations: false
          push_translations: false
          config: '.github/crowdin/crowdin-push.yml'
          crowdin_branch_name: ${{ github.ref_name }}
          base_path: ${{ github.workspace }}/docs
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
          CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}


================================================
FILE: .github/workflows/emoji.yml
================================================
name: Sync Emoji

on:
  schedule:
    - cron: '0 2 * * *'
  workflow_dispatch:

jobs:
  sync-emoji:
    if: github.repository == 'docsifyjs/docsify'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: latest
          cache: 'npm'

      - name: Install dependencies
        run: npm ci --ignore-scripts

      - name: Run script to sync emoji data
        run: npm run build:emoji

      - name: Commit
        id: auto-commit-action
        uses: stefanzweifel/git-auto-commit-action@v7
        with:
          commit_message: 'chore: Sync emoji data with GitHub emoji API'
          branch: sync-emoji
          create_branch: true
          file_pattern: 'src/core/render/emoji-data.js docs/emoji.md'
          push_options: '--force'

      - name: Create Pull Request
        if: ${{ steps.auto-commit-action.outputs.changes_detected == 'true' }}
        run: |
          gh pr create --title 'chore: Sync emoji data with GitHub emoji API' --body 'Found updated github emojis need to sync.' --base develop --reviewer docsifyjs/reviewers
        continue-on-error: true
        env:
          GH_TOKEN: ${{ secrets.READ_TEAM_TOKEN }}


================================================
FILE: .github/workflows/test.yml
================================================
name: Build & Test

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]
  workflow_dispatch:

jobs:
  lint:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: ['lts/*']
    steps:
      - uses: actions/checkout@v6
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v6
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      - name: Install dependencies
        run: npm ci --ignore-scripts
      - name: Build
        run: npm run build
      - name: Lint
        run: npm run lint

  test-jest:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        node-version: ['lts/*']
        os: ['macos-latest', 'ubuntu-latest', 'windows-latest']
    steps:
      - uses: actions/checkout@v6
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v6
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      - name: Install dependencies
        run: npm ci --ignore-scripts
      - name: Build
        run: npm run build
      - name: Unit Tests
        run: npm run test:unit -- --ci --runInBand
      - name: Integration Tests
        run: npm run test:integration -- --ci --runInBand
      - name: Consumption Tests
        run: npm run test:consume-types

  test-playwright:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: ['lts/*']
    steps:
      - uses: actions/checkout@v6
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v6
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      - name: Install dependencies
        run: npm ci --ignore-scripts
      - name: Build
        run: npm run build
      - name: Install Playwright
        run: npx playwright install --with-deps
      - name: E2E Tests (Playwright)
        run: npm run test:e2e

      # In the interest of not having to modify GitHub settings to update required
      # builds for passing, I stuck this test here.
      - name: Test v4 build
        run: |
          git fetch --tags
          npm run build:v4
          # ensure v4 build files exist:
          test -f lib/docsify.js
          test -f themes/pure.css
          # ensure no git changes after building v4:
          git diff --exit-code
          npm run clean:v4
          # ensure v4 build files are removed:
          test ! -f lib/docsify.js
          test ! -f themes/pure.css
          # ensure no git changes after cleaning v4:
          git diff --exit-code

      - name: Store artifacts
        uses: actions/upload-artifact@v7
        if: failure()
        with:
          name: ${{ matrix.os }}-${{ matrix.node-version }}-artifacts
          path: |
            _playwright-results/
            _playwright-report/


================================================
FILE: .gitignore
================================================
# Directories
.husky/_
.idea
.vercel
_playwright-report
_playwright-results
node_modules

# Files
.DS_Store
*.log

# Exceptions
!.gitkeep

# Output folder for the global build only
dist/

# Output folders for the legacy v4 build
lib/
themes/

# TypeScript declaration files for standard ESM consumption
src/**/*.d.ts
src/**/*.d.ts.map


================================================
FILE: .gitpod.yml
================================================
tasks:
  - command: gp await-port 3000 && sleep 3 && gp preview $(gp url 3000)
  - init: npm install
    command: npm run dev
ports:
  - port: 3000
    onOpen: ignore
vscode:
  extensions:
    - sysoev.language-stylus@1.11.0:xX39oruAJ5UQzTNVRdbBaQ==


================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run prettier
npx lint-staged


================================================
FILE: .npmignore
================================================
.eslintignore
.github
.gitignore


================================================
FILE: .prettierignore
================================================
# Directories
_playwright-*
dist
lib

# Files
_vars.css
_vars-advanced.css
CHANGELOG.md
emoji-data.*
HISTORY.md


================================================
FILE: .prettierrc.json
================================================
{
  "arrowParens": "avoid",
  "singleQuote": true
}


================================================
FILE: .vscode/launch.json
================================================
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Run unit tests",
      "runtimeExecutable": "npm",
      "runtimeArgs": ["run", "test:jest"],
      "console": "integratedTerminal"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Run current test file",
      "runtimeExecutable": "npm",
      "runtimeArgs": ["run", "test:jest", "--"],
      "args": ["-i", "${relativeFile}", "--testPathIgnorePatterns"],
      "console": "integratedTerminal"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Run selected test name",
      "runtimeExecutable": "npm",
      "runtimeArgs": ["run", "test:jest", "--"],
      "args": [
        "-i",
        "${relativeFile}",
        "-t",
        "${selectedText}",
        "--testPathIgnorePatterns"
      ],
      "console": "integratedTerminal"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Update current test file snapshot(s)",
      "runtimeExecutable": "npm",
      "runtimeArgs": ["run", "test:jest", "--"],
      "args": [
        "-i",
        "${relativeFile}",
        "--updateSnapshot",
        "--testPathIgnorePatterns"
      ],
      "console": "integratedTerminal"
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Update selected test name snapshot(s)",
      "runtimeExecutable": "npm",
      "runtimeArgs": ["run", "test:jest", "--"],
      "args": [
        "-i",
        "${relativeFile}",
        "-t",
        "${selectedText}",
        "--updateSnapshot",
        "--testPathIgnorePatterns"
      ],
      "console": "integratedTerminal"
    }
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "cSpell.words": ["coverpage"],
  "typescript.tsdk": "node_modules/typescript/lib"
}


================================================
FILE: CHANGELOG.md
================================================
# [5.0.0-rc.4](https://github.com/docsifyjs/docsify/compare/v5.0.0-rc.3...v5.0.0-rc.4) (2026-03-11)


### Bug Fixes

* adjust intersection observer threshold for sticky class toggle ([#2637](https://github.com/docsifyjs/docsify/issues/2637)) ([4e8be38](https://github.com/docsifyjs/docsify/commit/4e8be38304ad5fcf64c585f42afef46c72adabb7))
* enhance accessibility for sidebar toggle button ([#2604](https://github.com/docsifyjs/docsify/issues/2604)) ([3014945](https://github.com/docsifyjs/docsify/commit/3014945e4d677d24124a3a01fe88ec82951ebfa7))
* improve word breaking for code blocks in markdown ([#2636](https://github.com/docsifyjs/docsify/issues/2636)) ([73d41e9](https://github.com/docsifyjs/docsify/commit/73d41e9e48ab7effae4c5dffd4aec4bd4e1b9168))
* include h6 headings in heading element selection ([#2649](https://github.com/docsifyjs/docsify/issues/2649)) ([44326ca](https://github.com/docsifyjs/docsify/commit/44326ca423b25ddbb12b172ab7180edd553c61f4))
* strip HTML tags from config.name when setting page title ([#2690](https://github.com/docsifyjs/docsify/issues/2690)) ([0cfee34](https://github.com/docsifyjs/docsify/commit/0cfee34dbc0d511a272070e4124eb2f3102d988e)), closes [#2610](https://github.com/docsifyjs/docsify/issues/2610)
* typo ([#2632](https://github.com/docsifyjs/docsify/issues/2632)) ([2d45376](https://github.com/docsifyjs/docsify/commit/2d45376bb8dc3f7a07c633a7be4d38af3a56501b))


### Features

* add fallback default language support ([#2607](https://github.com/docsifyjs/docsify/issues/2607)) ([1abe3a9](https://github.com/docsifyjs/docsify/commit/1abe3a9ea48cd3a96ee65cd958090bf2936de3c9))
* enhance embed handling for table cells ([#2606](https://github.com/docsifyjs/docsify/issues/2606)) ([422a745](https://github.com/docsifyjs/docsify/commit/422a745acc4783c325d55413c5349ca70c42c67c))
* Fragment identifier full line ignore ([#2626](https://github.com/docsifyjs/docsify/issues/2626)) ([e811756](https://github.com/docsifyjs/docsify/commit/e8117563eae4aa9468c36b76fe83c5ce3f7423ea))
* output type definitions, and allow `new Docsify(opts)` to accept options for ESM usage ([#2392](https://github.com/docsifyjs/docsify/issues/2392)) ([b960519](https://github.com/docsifyjs/docsify/commit/b960519608747015d1ab974c9ed809c21f3b1bda))



# [5.0.0-rc.3](https://github.com/docsifyjs/docsify/compare/v5.0.0-rc.1...v5.0.0-rc.3) (2025-09-05)


### Bug Fixes

* enhance focus handling ([#2595](https://github.com/docsifyjs/docsify/issues/2595)) ([22ac7e8](https://github.com/docsifyjs/docsify/commit/22ac7e855de24b13280e9904930e58af58dbd6a7))
* enhance focus handling by adding smooth scroll to content area ([#2569](https://github.com/docsifyjs/docsify/issues/2569)) ([20d095b](https://github.com/docsifyjs/docsify/commit/20d095b53c827c4d0590dee5fd377ba21560d7fb))
* escape HTML in search keywords ([#2586](https://github.com/docsifyjs/docsify/issues/2586)) ([743e9cb](https://github.com/docsifyjs/docsify/commit/743e9cb484cc70859a582fb74d78ea1f52ef2c2a))
* exclude app-name-link from sidebar text overflow styling ([#2564](https://github.com/docsifyjs/docsify/issues/2564)) ([375c058](https://github.com/docsifyjs/docsify/commit/375c058e3e1b12f3507d97a41b3fd8d6c4e904b0))
* handle hash navigation to prevent duplicate callbacks ([#2575](https://github.com/docsifyjs/docsify/issues/2575)) ([72569de](https://github.com/docsifyjs/docsify/commit/72569dee8db92a01e8de5448e05c32afbd090fb2))
* heading link overflow style ([#2568](https://github.com/docsifyjs/docsify/issues/2568)) ([be21637](https://github.com/docsifyjs/docsify/commit/be2163725ae314de3aa9a56c1216ce8c774cfcc6))
* improve slug generation ([#2581](https://github.com/docsifyjs/docsify/issues/2581)) ([9bc58c9](https://github.com/docsifyjs/docsify/commit/9bc58c9ca24db513a90a06752181954aab0628ca))
* normalize slugs to NFC and remove emoji variation selector ([#2597](https://github.com/docsifyjs/docsify/issues/2597)) ([5999f09](https://github.com/docsifyjs/docsify/commit/5999f09a4bac23169766af68fbdc71215161c1c6))
* remove block display from anchor links to prevent layout issues ([#2576](https://github.com/docsifyjs/docsify/issues/2576)) ([6e45024](https://github.com/docsifyjs/docsify/commit/6e4502416886b9494cd7b510968c351c7e6fc3cd))
* **sidebar:** remove ignored headings and children ([#2580](https://github.com/docsifyjs/docsify/issues/2580)) ([2a49bd0](https://github.com/docsifyjs/docsify/commit/2a49bd0aa4bb17eeb3d9f363c6f2b01e61e778ac))
* update relative link handling ([#2579](https://github.com/docsifyjs/docsify/issues/2579)) ([eeacfcc](https://github.com/docsifyjs/docsify/commit/eeacfcce2a3df4e4146b5b54275553452b317352))


### Features

* GitHub style callouts ([#2487](https://github.com/docsifyjs/docsify/issues/2487)) ([2e59b0f](https://github.com/docsifyjs/docsify/commit/2e59b0f50cf8123b98e4c97c3053aa6985ae13a2))
* support config helper multi keys if supported ([#2571](https://github.com/docsifyjs/docsify/issues/2571)) ([a2f734f](https://github.com/docsifyjs/docsify/commit/a2f734f223cae475aefe7d41995a2030a1f9c0a2))
* support extract content between fragment markers from Markdown ([#2582](https://github.com/docsifyjs/docsify/issues/2582)) ([32aa74e](https://github.com/docsifyjs/docsify/commit/32aa74e0d2fcd89705e5c30fc8b8e2562e7b774e))



# [5.0.0-rc.2](https://github.com/docsifyjs/docsify/compare/v5.0.0-rc.1...v5.0.0-rc.2) (2025-09-05)


### Bug Fixes

* enhance focus handling ([#2595](https://github.com/docsifyjs/docsify/issues/2595)) ([22ac7e8](https://github.com/docsifyjs/docsify/commit/22ac7e855de24b13280e9904930e58af58dbd6a7))
* enhance focus handling by adding smooth scroll to content area ([#2569](https://github.com/docsifyjs/docsify/issues/2569)) ([20d095b](https://github.com/docsifyjs/docsify/commit/20d095b53c827c4d0590dee5fd377ba21560d7fb))
* escape HTML in search keywords ([#2586](https://github.com/docsifyjs/docsify/issues/2586)) ([743e9cb](https://github.com/docsifyjs/docsify/commit/743e9cb484cc70859a582fb74d78ea1f52ef2c2a))
* exclude app-name-link from sidebar text overflow styling ([#2564](https://github.com/docsifyjs/docsify/issues/2564)) ([375c058](https://github.com/docsifyjs/docsify/commit/375c058e3e1b12f3507d97a41b3fd8d6c4e904b0))
* handle hash navigation to prevent duplicate callbacks ([#2575](https://github.com/docsifyjs/docsify/issues/2575)) ([72569de](https://github.com/docsifyjs/docsify/commit/72569dee8db92a01e8de5448e05c32afbd090fb2))
* heading link overflow style ([#2568](https://github.com/docsifyjs/docsify/issues/2568)) ([be21637](https://github.com/docsifyjs/docsify/commit/be2163725ae314de3aa9a56c1216ce8c774cfcc6))
* improve slug generation ([#2581](https://github.com/docsifyjs/docsify/issues/2581)) ([9bc58c9](https://github.com/docsifyjs/docsify/commit/9bc58c9ca24db513a90a06752181954aab0628ca))
* remove block display from anchor links to prevent layout issues ([#2576](https://github.com/docsifyjs/docsify/issues/2576)) ([6e45024](https://github.com/docsifyjs/docsify/commit/6e4502416886b9494cd7b510968c351c7e6fc3cd))
* **sidebar:** remove ignored headings and children ([#2580](https://github.com/docsifyjs/docsify/issues/2580)) ([2a49bd0](https://github.com/docsifyjs/docsify/commit/2a49bd0aa4bb17eeb3d9f363c6f2b01e61e778ac))
* update relative link handling ([#2579](https://github.com/docsifyjs/docsify/issues/2579)) ([eeacfcc](https://github.com/docsifyjs/docsify/commit/eeacfcce2a3df4e4146b5b54275553452b317352))


### Features

* GitHub style callouts ([#2487](https://github.com/docsifyjs/docsify/issues/2487)) ([2e59b0f](https://github.com/docsifyjs/docsify/commit/2e59b0f50cf8123b98e4c97c3053aa6985ae13a2))
* support config helper multi keys if supported ([#2571](https://github.com/docsifyjs/docsify/issues/2571)) ([a2f734f](https://github.com/docsifyjs/docsify/commit/a2f734f223cae475aefe7d41995a2030a1f9c0a2))
* support extract content between fragment markers from Markdown ([#2582](https://github.com/docsifyjs/docsify/issues/2582)) ([32aa74e](https://github.com/docsifyjs/docsify/commit/32aa74e0d2fcd89705e5c30fc8b8e2562e7b774e))



# Changelog

## [5.0.0-rc.1](https://github.com/docsifyjs/docsify/compare/v4.13.1...v5.0.0-rc.1) (2025-05-27)


### Bug Fixes

* auto header config heading generate func ([#2474](https://github.com/docsifyjs/docsify/issues/2474)) ([4bc5062](https://github.com/docsifyjs/docsify/commit/4bc5062fc13a3a43c7ed432f1b585fdab41f1447))
* carbon broken ([#2387](https://github.com/docsifyjs/docsify/issues/2387)) ([87fd55d](https://github.com/docsifyjs/docsify/commit/87fd55d7125539b929f3260fca92e666e988b6da))
* **ci:** run test action for pull requests ([#2445](https://github.com/docsifyjs/docsify/issues/2445)) ([15ed3b7](https://github.com/docsifyjs/docsify/commit/15ed3b76b00eac06cc4230b1f592993adf2a893b))
* correct loadSidebar=false render structure issue ([#2470](https://github.com/docsifyjs/docsify/issues/2470)) ([7cbd532](https://github.com/docsifyjs/docsify/commit/7cbd5322d056bb87b4340bdb19909a9c32d19abb))
* dev mode hot reload and add sourcemaps ([#2402](https://github.com/docsifyjs/docsify/issues/2402)) ([947d8de](https://github.com/docsifyjs/docsify/commit/947d8decb8c5c62f3ce50d0c6ac0e27bb6c7a6b5))
* enhancement of isExternal ([#2093](https://github.com/docsifyjs/docsify/issues/2093)) ([7f13ba0](https://github.com/docsifyjs/docsify/commit/7f13ba0f9841776008d0707f027bd80c4e3cbf0c))
* fix cross-origin links in history router mode ([#1967](https://github.com/docsifyjs/docsify/issues/1967)) ([ef6905b](https://github.com/docsifyjs/docsify/commit/ef6905b53a5c1587c3ebf870f0d11ff111a2350d))
* fix dependabot.yml ([a321e83](https://github.com/docsifyjs/docsify/commit/a321e8373b3c6afc9d0b08714e34bd8bd68716d9))
* fix docsify-server-renderer dependency. ([#1915](https://github.com/docsifyjs/docsify/issues/1915)) ([c73f858](https://github.com/docsifyjs/docsify/commit/c73f8587b2f67e28c228e521518110ff504cefeb))
* fix id with pure number. ([#2021](https://github.com/docsifyjs/docsify/issues/2021)) ([f4f21a3](https://github.com/docsifyjs/docsify/commit/f4f21a3f74d265f16b1e658feda417bf851458da))
* genIndex error for search ([#1933](https://github.com/docsifyjs/docsify/issues/1933)) ([a8f9fc1](https://github.com/docsifyjs/docsify/commit/a8f9fc1d5f5c7808efe65e5ca9359f38014b1bcd))
* husky can not auto install issue after upgrade. ([#2325](https://github.com/docsifyjs/docsify/issues/2325)) ([cec43d7](https://github.com/docsifyjs/docsify/commit/cec43d71774556d38fa9746f4df4319a6ad768c2))
* parse heading error ([#2526](https://github.com/docsifyjs/docsify/issues/2526)) ([561c777](https://github.com/docsifyjs/docsify/commit/561c777df898a71f8b44b25e5946b56eb1d2c106))
* Prevent initial unnecessary IntersectionObserver callback execution ([#2523](https://github.com/docsifyjs/docsify/issues/2523)) ([a73e07e](https://github.com/docsifyjs/docsify/commit/a73e07eac06a70f63896e2bb7f0c205534dc21c8))
* prevent unnecessary themeColor deprecation notice ([#2403](https://github.com/docsifyjs/docsify/issues/2403)) ([a3ab2be](https://github.com/docsifyjs/docsify/commit/a3ab2be0b070a1bacc4fec3c2d2f0ffe279bada0))
* **search:** clean markdown elements in search contents ([#2457](https://github.com/docsifyjs/docsify/issues/2457)) ([95901eb](https://github.com/docsifyjs/docsify/commit/95901eb8a829865c883a4374c53a0b8909b53c41))
* skip-to-content scroll behavior ([#2401](https://github.com/docsifyjs/docsify/issues/2401)) ([2d986fe](https://github.com/docsifyjs/docsify/commit/2d986feb34fcdb2a2731cff7b29b0a4d0563787e))
* sync the page title regarding the title config ([#2478](https://github.com/docsifyjs/docsify/issues/2478)) ([2eec7c4](https://github.com/docsifyjs/docsify/commit/2eec7c4884146add6e0c8142e463cfad34fb7637))
* upgrade debug from 4.3.3 to 4.3.4 ([#1919](https://github.com/docsifyjs/docsify/issues/1919)) ([0c9221e](https://github.com/docsifyjs/docsify/commit/0c9221e5a425984470ebc89ffb682e988b08b06e))
* upgrade medium-zoom from 1.0.6 to 1.0.7 ([#1934](https://github.com/docsifyjs/docsify/issues/1934)) ([2601392](https://github.com/docsifyjs/docsify/commit/26013929ccf1927cc6a46c5455fb70f71d90492f))
* upgrade medium-zoom from 1.0.7 to 1.0.8 ([#1939](https://github.com/docsifyjs/docsify/issues/1939)) ([81fc1b7](https://github.com/docsifyjs/docsify/commit/81fc1b7dce15d74bb025d3f95bfa5dae55540a10))
* upgrade node-fetch from 2.6.8 to 2.6.9 ([#1996](https://github.com/docsifyjs/docsify/issues/1996)) ([bb88d63](https://github.com/docsifyjs/docsify/commit/bb88d6302b22b2484cca6436c7b4279d5e7fc5ea))
* When alias contains parameters, append ext error ([#1855](https://github.com/docsifyjs/docsify/issues/1855)) ([1a32fb7](https://github.com/docsifyjs/docsify/commit/1a32fb73347308696f6e82c0757ba081a4e7b8de))


### Features

* Add "Skip to main content" link and update nav behavior ([#2253](https://github.com/docsifyjs/docsify/issues/2253)) ([50b84f7](https://github.com/docsifyjs/docsify/commit/50b84f74b25c27f1a3a102055e7f099db31155f8))
* add google analytics gtag.js plugin ([#1702](https://github.com/docsifyjs/docsify/issues/1702)) ([29f3c82](https://github.com/docsifyjs/docsify/commit/29f3c82faaffb817d2149d23a0e3a884cd1cc843))
* Allow top nav to receive keyboard focus ([#2269](https://github.com/docsifyjs/docsify/issues/2269)) ([4d5bf5a](https://github.com/docsifyjs/docsify/commit/4d5bf5ac48499c57cfdffd98bfaa29bf20d85260))
* Keyboard bindings ([#2279](https://github.com/docsifyjs/docsify/issues/2279)) ([cf61192](https://github.com/docsifyjs/docsify/commit/cf61192f9a467c96372bce9e4e371a3f0c6a1780))
* **search:** use dexie.js instead of localStorage ([#2464](https://github.com/docsifyjs/docsify/issues/2464)) ([42f2548](https://github.com/docsifyjs/docsify/commit/42f25482fa1ea6ec666800145f6da33e9119aa8c))
* Support dark mode for zoom-image plugin ([#2524](https://github.com/docsifyjs/docsify/issues/2524)) ([5826863](https://github.com/docsifyjs/docsify/commit/58268632c8ebc2855c38305a05b8326727e388c1))
* support prism langs dependencies import validation ([#2489](https://github.com/docsifyjs/docsify/issues/2489)) ([87e43f1](https://github.com/docsifyjs/docsify/commit/87e43f157f749dda01b54e33117ef851b12bda7c))
* support relative path with target config. ([#1751](https://github.com/docsifyjs/docsify/issues/1751)) ([e15ad0c](https://github.com/docsifyjs/docsify/commit/e15ad0c7d530287692e98ca587f8f07d90624919))
* v5 style overhaul ([#2469](https://github.com/docsifyjs/docsify/issues/2469)) ([77d93fa](https://github.com/docsifyjs/docsify/commit/77d93fae7886346e739285630ea865ac8197149e))



## [4.13.1](https://github.com/docsifyjs/docsify/compare/v4.13.0...v4.13.1) (2023-06-24)


### Bug Fixes

* enhancement of isExternal ([#2093](https://github.com/docsifyjs/docsify/issues/2093)) ([6a7d15b](https://github.com/docsifyjs/docsify/commit/6a7d15b1d5b93e19d3cf9a328cdbf5f1a166b5bd))
* fix cross-origin links in history router mode ([#1967](https://github.com/docsifyjs/docsify/issues/1967)) ([2312fee](https://github.com/docsifyjs/docsify/commit/2312feef459211a8bcdcbf9164a9ffe051609b70))
* genIndex error for search ([#1933](https://github.com/docsifyjs/docsify/issues/1933)) ([68d8735](https://github.com/docsifyjs/docsify/commit/68d873587c29d694ece466177984aa5fd739dd4b))



# [4.13.0](https://github.com/docsifyjs/docsify/compare/v4.12.4...v4.13.0) (2022-10-26)


### Bug Fixes

* cornerExternalLinkTarget config. ([#1814](https://github.com/docsifyjs/docsify/issues/1814)) ([54cc5f9](https://github.com/docsifyjs/docsify/commit/54cc5f939b9499ae56604f589eef4e3f1c13cdc5))
* correctly fix missing +1, -1 ([#1722](https://github.com/docsifyjs/docsify/issues/1722)) ([719dcbe](https://github.com/docsifyjs/docsify/commit/719dcbea5cb0c8b0835f8e9fc473b094feecb7ec))
* Coverpage when content > viewport height ([#1744](https://github.com/docsifyjs/docsify/issues/1744)) ([301b516](https://github.com/docsifyjs/docsify/commit/301b5169613e95765eda335a4b21d0f9f9cbbbfd)), closes [#381](https://github.com/docsifyjs/docsify/issues/381)
* filter null node first. ([#1909](https://github.com/docsifyjs/docsify/issues/1909)) ([d27af3d](https://github.com/docsifyjs/docsify/commit/d27af3dd09a882fce4f1e2774065de57a3501858))
* fix docsify-ignore in search title. ([#1872](https://github.com/docsifyjs/docsify/issues/1872)) ([9832805](https://github.com/docsifyjs/docsify/commit/9832805681cc6099e9c78deecf6dc0c6fb61fd9b))
* fix search with no content. ([#1878](https://github.com/docsifyjs/docsify/issues/1878)) ([9b74744](https://github.com/docsifyjs/docsify/commit/9b74744299ece0108573a142e5a2e949dc569254))
* Ignore emoji shorthand codes in URIs ([#1847](https://github.com/docsifyjs/docsify/issues/1847)) ([3c9b3d9](https://github.com/docsifyjs/docsify/commit/3c9b3d9702bb05a5ff45a4ce4233e144cf1ebecb)), closes [#1823](https://github.com/docsifyjs/docsify/issues/1823)
* Legacy bugs (styles, site plugin error, and dev server error) ([#1743](https://github.com/docsifyjs/docsify/issues/1743)) ([fa6df6d](https://github.com/docsifyjs/docsify/commit/fa6df6d58487ec294e22be04ac159dfb5745bd66))
* package.json & package-lock.json to reduce vulnerabilities ([#1756](https://github.com/docsifyjs/docsify/issues/1756)) ([2dc5b12](https://github.com/docsifyjs/docsify/commit/2dc5b12b715e3ad1922a6401e3fd9837a99ef9c0))
* packages/docsify-server-renderer/package.json & packages/docsify-server-renderer/package-lock.json to reduce vulnerabilities ([#1715](https://github.com/docsifyjs/docsify/issues/1715)) ([c1227b2](https://github.com/docsifyjs/docsify/commit/c1227b22cb8a3fb6c362ca8ac109082ab2251cc3))


### Features

* Emoji build ([#1766](https://github.com/docsifyjs/docsify/issues/1766)) ([ba5ee26](https://github.com/docsifyjs/docsify/commit/ba5ee26f00e957b58173f96b1901f6ffd3d8e5f5))
* Native emoji w/ image-based fallbacks and improved parsing ([#1746](https://github.com/docsifyjs/docsify/issues/1746)) ([35002c9](https://github.com/docsifyjs/docsify/commit/35002c92b762f0d12e51582d7de7914fa380596a)), closes [#779](https://github.com/docsifyjs/docsify/issues/779)
* Plugin error handling ([#1742](https://github.com/docsifyjs/docsify/issues/1742)) ([63b2535](https://github.com/docsifyjs/docsify/commit/63b2535a45a98945ec897277f4fbddec2ddba887))



## [4.12.2](https://github.com/docsifyjs/docsify/compare/v4.12.1...v4.12.2) (2022-01-06)


### Bug Fixes

* Add escapeHtml for search ([#1551](https://github.com/docsifyjs/docsify/issues/1551)) ([c24f7f6](https://github.com/docsifyjs/docsify/commit/c24f7f6f0b87a87f6dd3755f69eb0969ebb029c9))
* allow also " inside of an embed ([ec16e4a](https://github.com/docsifyjs/docsify/commit/ec16e4a9d5718ac4f4c25bb3dcaea3b7551372e0))
* buble theme missing generic fallback font ([#1568](https://github.com/docsifyjs/docsify/issues/1568)) ([37d9f0e](https://github.com/docsifyjs/docsify/commit/37d9f0e1214276e93b2a11ed87390aafa1bdbcec))
* Cannot read property 'classList' of null ([#1527](https://github.com/docsifyjs/docsify/issues/1527)) ([d6df2b8](https://github.com/docsifyjs/docsify/commit/d6df2b85a99371bb9a87402a10dd515bb734182e))
* Cannot read property 'tagName' of null ([#1655](https://github.com/docsifyjs/docsify/issues/1655)) ([c3cdadc](https://github.com/docsifyjs/docsify/commit/c3cdadc37137edcd9e219359973902d2fc8b66ff))
* upgrade debug from 4.3.2 to 4.3.3 ([#1692](https://github.com/docsifyjs/docsify/issues/1692)) ([40e7749](https://github.com/docsifyjs/docsify/commit/40e77490c68b4143c75dfaebcd0b7f640581306b))
* Upgrade docsify from 4.12.0 to 4.12.1 ([#1544](https://github.com/docsifyjs/docsify/issues/1544)) ([d607f6d](https://github.com/docsifyjs/docsify/commit/d607f6d71c35b50f586806a832f65061f5e3427e))
* upgrade dompurify from 2.2.6 to 2.2.7 ([#1552](https://github.com/docsifyjs/docsify/issues/1552)) ([407e4d4](https://github.com/docsifyjs/docsify/commit/407e4d4f3de78bebd639a3fdae751f8045728e57))
* Upgrade dompurify from 2.2.6 to 2.2.7 ([#1553](https://github.com/docsifyjs/docsify/issues/1553)) ([93c48f3](https://github.com/docsifyjs/docsify/commit/93c48f3d615d95dba550a0e95df6b545d68c3593))
* upgrade dompurify from 2.2.7 to 2.2.8 ([#1577](https://github.com/docsifyjs/docsify/issues/1577)) ([0dd44cc](https://github.com/docsifyjs/docsify/commit/0dd44cc828cc54f7c3b776d45b32925b66cae499))
* upgrade dompurify from 2.2.7 to 2.3.0 ([#1619](https://github.com/docsifyjs/docsify/issues/1619)) ([66303fe](https://github.com/docsifyjs/docsify/commit/66303fec4c7115621e556ad742cfac9d19f26bd9))
* upgrade dompurify from 2.2.8 to 2.2.9 ([#1600](https://github.com/docsifyjs/docsify/issues/1600)) ([baf5a8a](https://github.com/docsifyjs/docsify/commit/baf5a8a4962656d8be8f714283064d2ea10c7e14))
* upgrade dompurify from 2.2.9 to 2.3.0 ([#1616](https://github.com/docsifyjs/docsify/issues/1616)) ([b07fa3c](https://github.com/docsifyjs/docsify/commit/b07fa3cc8323e63dd7b105c7e29b2e1914f5c117))
* upgrade dompurify from 2.3.0 to 2.3.1 ([#1635](https://github.com/docsifyjs/docsify/issues/1635)) ([5ac8237](https://github.com/docsifyjs/docsify/commit/5ac8237cc76e19ca2b373a1a1da6eb4a4da6d8b2))
* upgrade dompurify from 2.3.1 to 2.3.2 ([#1647](https://github.com/docsifyjs/docsify/issues/1647)) ([ff6acfa](https://github.com/docsifyjs/docsify/commit/ff6acfa7623a7db8b00d62c51a9c3037215c4888))
* upgrade node-fetch from 2.6.1 to 2.6.2 ([#1641](https://github.com/docsifyjs/docsify/issues/1641)) ([6ee1c14](https://github.com/docsifyjs/docsify/commit/6ee1c142769a6442aa8c1523ab215106707fa7fc))
* upgrade node-fetch from 2.6.2 to 2.6.4 ([#1649](https://github.com/docsifyjs/docsify/issues/1649)) ([6f81034](https://github.com/docsifyjs/docsify/commit/6f81034ba6a7a6b64ccf1acd2d1fc73761f70a63))
* upgrade node-fetch from 2.6.4 to 2.6.5 ([#1654](https://github.com/docsifyjs/docsify/issues/1654)) ([d16e657](https://github.com/docsifyjs/docsify/commit/d16e657f708777e8377d8e158b50b4010623282d))
* upgrade node-fetch from 2.6.5 to 2.6.6 ([#1668](https://github.com/docsifyjs/docsify/issues/1668)) ([cefe3f8](https://github.com/docsifyjs/docsify/commit/cefe3f87e697a6c54a74d601df2eeb331fcd8933))



## [4.12.1](https://github.com/docsifyjs/docsify/compare/v4.12.0...v4.12.1) (2021-03-07)


### Bug Fixes

* isExternal check with malformed URL + tests ([#1510](https://github.com/docsifyjs/docsify/issues/1510)) ([ff2a66f](https://github.com/docsifyjs/docsify/commit/ff2a66f12752471277fe81a64ad6c4b2c08111fe)), closes [#1477](https://github.com/docsifyjs/docsify/issues/1477) [#1126](https://github.com/docsifyjs/docsify/issues/1126) [#1489](https://github.com/docsifyjs/docsify/issues/1489)
* Replace ES6 usage for IE11 compatibility ([#1500](https://github.com/docsifyjs/docsify/issues/1500)) ([a0f61b2](https://github.com/docsifyjs/docsify/commit/a0f61b2af72cb888ea5b635021a5c9da6beb7ac5))
* theme switcher in IE11 ([#1502](https://github.com/docsifyjs/docsify/issues/1502)) ([8cda078](https://github.com/docsifyjs/docsify/commit/8cda07891afeb1ea6e198d2a600f205357ab4b89))
* Upgrade docsify from 4.11.6 to 4.12.0 ([#1518](https://github.com/docsifyjs/docsify/issues/1518)) ([47cd86c](https://github.com/docsifyjs/docsify/commit/47cd86c8f196a241fc23720e3addfe95d4c973cd))


### Features

* Support search when there is no title ([#1519](https://github.com/docsifyjs/docsify/issues/1519)) ([bc37268](https://github.com/docsifyjs/docsify/commit/bc3726853fb2d1f9241927ea0317970ab0c8a2f2))


### Chore

- Fix missing carbon ([#1501](https://github.com/docsifyjs/docsify/issues/1501))
- Change Gitter to Discord throughout project ([#1507](https://github.com/docsifyjs/docsify/issues/1507))
- Add test cases on isExternal ([#1515](https://github.com/docsifyjs/docsify/issues/1515))


# [4.12.0](https://github.com/docsifyjs/docsify/compare/v4.11.6...v4.12.0) (2021-02-08)


### Bug Fixes

* add missing argument for highlighting code ([#1365](https://github.com/docsifyjs/docsify/issues/1365)) ([f35bf99](https://github.com/docsifyjs/docsify/commit/f35bf99d9c762774e328b30347707e62eb8e6f63))
* Can't search homepage content ([#1391](https://github.com/docsifyjs/docsify/issues/1391)) ([25bc9b7](https://github.com/docsifyjs/docsify/commit/25bc9b7eb7e878a6a50ed5f91d33d6a75f9811b0))
* Cannot read property 'startsWith' of undefined ([#1358](https://github.com/docsifyjs/docsify/issues/1358)) ([9351729](https://github.com/docsifyjs/docsify/commit/9351729634b52db0e7e241bed7784fbcd5c39fe0))
* Cannot read property level of undefined ([#1357](https://github.com/docsifyjs/docsify/issues/1357)) ([4807e58](https://github.com/docsifyjs/docsify/commit/4807e58cb994de83f063cb82d2b4a695f29378c8))
* cannot search list content ([#1361](https://github.com/docsifyjs/docsify/issues/1361)) ([8d17dcb](https://github.com/docsifyjs/docsify/commit/8d17dcbe68048d654e62adb01a3925e39a8e0c44))
* duplicate search content when `/README` or `/` exists in the sidebar ([#1403](https://github.com/docsifyjs/docsify/issues/1403)) ([7c3bf98](https://github.com/docsifyjs/docsify/commit/7c3bf98df869188d5956ed1a331f7048b6eba441))
* package.json & package-lock.json to reduce vulnerabilities ([#1419](https://github.com/docsifyjs/docsify/issues/1419)) ([69b6907](https://github.com/docsifyjs/docsify/commit/69b6907c864dbcdf1fe5c75f51a80e6ae6ec279d))
* packages/docsify-server-renderer/package.json & packages/docsify-server-renderer/package-lock.json to reduce vulnerabilities ([#1389](https://github.com/docsifyjs/docsify/issues/1389)) ([62cd35e](https://github.com/docsifyjs/docsify/commit/62cd35ee8345270aab7a48bc761db007d54a0f48))
* packages/docsify-server-renderer/package.json & packages/docsify-server-renderer/package-lock.json to reduce vulnerabilities ([#1418](https://github.com/docsifyjs/docsify/issues/1418)) ([58fbca0](https://github.com/docsifyjs/docsify/commit/58fbca00ebd12f636c213d386761df9ebfb2bd4c))
* Prevent loading remote content via URL hash ([#1489](https://github.com/docsifyjs/docsify/issues/1489)) ([14ce7f3](https://github.com/docsifyjs/docsify/commit/14ce7f3d862ac79fc7d9d316cb2e057d50e1b506)), closes [#1477](https://github.com/docsifyjs/docsify/issues/1477) [#1126](https://github.com/docsifyjs/docsify/issues/1126)
* search on homepage test ([#1398](https://github.com/docsifyjs/docsify/issues/1398)) ([ee550d0](https://github.com/docsifyjs/docsify/commit/ee550d0c51f222851854c7cd7e9e6f76e26eb6f4))
* search titles containing ignored characters ([#1395](https://github.com/docsifyjs/docsify/issues/1395)) ([a2ebb21](https://github.com/docsifyjs/docsify/commit/a2ebb2192ac73211a8924111d736df9574abf61b))
* sidebar active class and expand don't work as expect when use "space" in markdown filename ([#1454](https://github.com/docsifyjs/docsify/issues/1454)) ([dcf5a64](https://github.com/docsifyjs/docsify/commit/dcf5a644eb6a2eef65fb940f3407c12828a679bc)), closes [#1032](https://github.com/docsifyjs/docsify/issues/1032)
* sidebar horizontal scroll bar ([#1362](https://github.com/docsifyjs/docsify/issues/1362)) ([b480822](https://github.com/docsifyjs/docsify/commit/b480822286c66b478e5a7a9b2c82a10b99c69121))
* sidebar title error ([#1360](https://github.com/docsifyjs/docsify/issues/1360)) ([2100fc3](https://github.com/docsifyjs/docsify/commit/2100fc318b009c6e448e48ffff6a693f1988916c))
* slugs are still broken when headings contain html ([#1443](https://github.com/docsifyjs/docsify/issues/1443)) ([76c5e68](https://github.com/docsifyjs/docsify/commit/76c5e685d75ee6df9acc0a7cf92d5daa138c3240))
* the sidebar links to another site. ([#1336](https://github.com/docsifyjs/docsify/issues/1336)) ([c9d4f7a](https://github.com/docsifyjs/docsify/commit/c9d4f7abc94a2cbc4bb558013775df380c1c8376))
* title error when sidebar link exists with html tag ([#1404](https://github.com/docsifyjs/docsify/issues/1404)) ([8ccc202](https://github.com/docsifyjs/docsify/commit/8ccc20225104376af2e5df6757c4dbd58c0e758e)), closes [#1408](https://github.com/docsifyjs/docsify/issues/1408)
* Unable to navigate on server without default index support ([#1372](https://github.com/docsifyjs/docsify/issues/1372)) ([759ffac](https://github.com/docsifyjs/docsify/commit/759ffac992b19dbb05b92114ec5620d3bb180d0d))
* upgrade debug from 4.1.1 to 4.3.0 ([#1390](https://github.com/docsifyjs/docsify/issues/1390)) ([ae45b32](https://github.com/docsifyjs/docsify/commit/ae45b3201ba03303a2feb5a347b18fda818a569a))
* upgrade debug from 4.3.0 to 4.3.1 ([#1446](https://github.com/docsifyjs/docsify/issues/1446)) ([bc3350f](https://github.com/docsifyjs/docsify/commit/bc3350f6e6bfe670c95569b4e9c51321f5c7dbb9))
* upgrade debug from 4.3.1 to 4.3.2 ([#1463](https://github.com/docsifyjs/docsify/issues/1463)) ([df21153](https://github.com/docsifyjs/docsify/commit/df21153ab5e841ad89707e07c68a04873a2f3fe8))
* upgrade docsify from 4.11.4 to 4.11.6 ([#1373](https://github.com/docsifyjs/docsify/issues/1373)) ([c2d12ed](https://github.com/docsifyjs/docsify/commit/c2d12ed27fe86b0c5cd690b4d8a22bf06d2a90b9))
* upgrade dompurify from 2.0.17 to 2.1.0 ([#1397](https://github.com/docsifyjs/docsify/issues/1397)) ([1863d8e](https://github.com/docsifyjs/docsify/commit/1863d8edb70da234bf7f211986ba71706351682f))
* upgrade dompurify from 2.1.0 to 2.1.1 ([#1402](https://github.com/docsifyjs/docsify/issues/1402)) ([8cf9fd8](https://github.com/docsifyjs/docsify/commit/8cf9fd8150bd67709c68d8dfe4dc881624583ac8))
* upgrade dompurify from 2.2.2 to 2.2.3 ([#1457](https://github.com/docsifyjs/docsify/issues/1457)) ([720d909](https://github.com/docsifyjs/docsify/commit/720d9091c8e571d6c891426983f54d9c94739182))
* upgrade dompurify from 2.2.2 to 2.2.6 ([#1483](https://github.com/docsifyjs/docsify/issues/1483)) ([eee9507](https://github.com/docsifyjs/docsify/commit/eee9507d435459ae8e68e1112bb58a63b2f58530))
* upgrade dompurify from 2.2.3 to 2.2.6 ([#1482](https://github.com/docsifyjs/docsify/issues/1482)) ([7adad57](https://github.com/docsifyjs/docsify/commit/7adad57df1b7efa469b0cde37f788c36dc27cf8b))
* upgrade marked from 1.2.4 to 1.2.9 ([#1486](https://github.com/docsifyjs/docsify/issues/1486)) ([716a7fa](https://github.com/docsifyjs/docsify/commit/716a7fa777a1eee66964977e1d4405cff3275c53))
* upgrade prismjs from 1.21.0 to 1.22.0 ([#1415](https://github.com/docsifyjs/docsify/issues/1415)) ([0806f48](https://github.com/docsifyjs/docsify/commit/0806f48531b6cb5e6a395c12ab88f0b59281bbf8))
* upgrade prismjs from 1.22.0 to 1.23.0 ([#1481](https://github.com/docsifyjs/docsify/issues/1481)) ([5f29cde](https://github.com/docsifyjs/docsify/commit/5f29cde84c7b74d70c34e3f1f43c479f1bba670d))
* Use legacy-compatible methods for IE11 ([#1495](https://github.com/docsifyjs/docsify/issues/1495)) ([06cbebf](https://github.com/docsifyjs/docsify/commit/06cbebfc0d34726f4a7102a7dc9020520f3a7f86))


### Features

* search ignore diacritical marks ([#1434](https://github.com/docsifyjs/docsify/issues/1434)) ([8968a74](https://github.com/docsifyjs/docsify/commit/8968a744cea5910057ba59ef690316722a35b341))
* Add Jest + Playwright Testing ([#1276](https://github.com/docsifyjs/docsify/issues/1276))
* Add Vue components, mount options, global options, and v3 support ([#1409](https://github.com/docsifyjs/docsify/issues/1409))



## [4.11.6](https://github.com/docsifyjs/docsify/compare/v4.11.5...v4.11.6) (2020-08-22)


### Bug Fixes

* Add patch for {docsify-ignore} and {docsify-ignore-all} ([ce31607](https://github.com/docsifyjs/docsify/commit/ce316075e033afdbeb43ce01e284a29fe1870e38))



## [4.11.5](https://github.com/docsifyjs/docsify/compare/v4.11.4...v4.11.5) (2020-08-21)


### Bug Fixes

*  Russian language link error ([#1270](https://github.com/docsifyjs/docsify/issues/1270)) ([2a52460](https://github.com/docsifyjs/docsify/commit/2a52460a59448abaf681046fbc5dca642285ae1f))
* {docsify-updated} in the sample code is parsed into time ([#1321](https://github.com/docsifyjs/docsify/issues/1321)) ([2048610](https://github.com/docsifyjs/docsify/commit/2048610aacd4e3c6a592f4247834a726c7ca33fb))
* Add error handling for missing dependencies (fixes [#1210](https://github.com/docsifyjs/docsify/issues/1210)) ([#1232](https://github.com/docsifyjs/docsify/issues/1232)) ([3673001](https://github.com/docsifyjs/docsify/commit/3673001a24cb24c57454f9bc7619de49d2c3a044))
* after setting the background image, the button is obscured ([#1234](https://github.com/docsifyjs/docsify/issues/1234)) ([34d918f](https://github.com/docsifyjs/docsify/commit/34d918f9973bdb8e893248853e3ef7e803d4c253))
* convert {docsify-ignore} and {docsify-ignore-all} to HTML comments ([#1318](https://github.com/docsifyjs/docsify/issues/1318)) ([90d283d](https://github.com/docsifyjs/docsify/commit/90d283d340502456a5d8495df596bb4a02ceb39b))
* fallback page should use path not file location ([#1301](https://github.com/docsifyjs/docsify/issues/1301)) ([2bceabc](https://github.com/docsifyjs/docsify/commit/2bceabcb8e623570540493e2f1d956adf45c99e7))
* Fix search error when exist translations documents ([#1300](https://github.com/docsifyjs/docsify/issues/1300)) ([b869019](https://github.com/docsifyjs/docsify/commit/b8690199006366e86084e9e018def7b9b8f46512))
* gitignore was ignoring folders in src, so VS Code search results or file fuzzy finder were not working, etc ([d4c9247](https://github.com/docsifyjs/docsify/commit/d4c9247b87c0a2701683ed1a17383cfb451cf609))
* packages/docsify-server-renderer/package.json & packages/docsify-server-renderer/package-lock.json to reduce vulnerabilities ([#1250](https://github.com/docsifyjs/docsify/issues/1250)) ([d439bac](https://github.com/docsifyjs/docsify/commit/d439bac93f479d0480799880538fc3104e54c907))
* search can not search the table header ([#1256](https://github.com/docsifyjs/docsify/issues/1256)) ([3f03e78](https://github.com/docsifyjs/docsify/commit/3f03e78418993d8e9a4f5062e10dc79c3753389e))
* Search plugin: matched text is replaced with search text ([#1298](https://github.com/docsifyjs/docsify/issues/1298)) ([78775b6](https://github.com/docsifyjs/docsify/commit/78775b6ee73102cc5ac71c0ee2b392c5f4f6f4f8))
* the uncaught typeerror when el is null ([#1308](https://github.com/docsifyjs/docsify/issues/1308)) ([952f4c9](https://github.com/docsifyjs/docsify/commit/952f4c921b7a6a558c500ca6b105582d39ad36a2))
* Updated docs with instructions for installing specific version (fixes [#780](https://github.com/docsifyjs/docsify/issues/780)) ([#1225](https://github.com/docsifyjs/docsify/issues/1225)) ([b90c948](https://github.com/docsifyjs/docsify/commit/b90c948090e89fa778279c95060dbd7668285658))
* upgrade medium-zoom from 1.0.5 to 1.0.6 ([3beaa66](https://github.com/docsifyjs/docsify/commit/3beaa6666b78518f1ffaa37f6942f3cb08fef896))
* upgrade tinydate from 1.2.0 to 1.3.0 ([#1341](https://github.com/docsifyjs/docsify/issues/1341)) ([59d090f](https://github.com/docsifyjs/docsify/commit/59d090fe9096bc03e259c166634bb75bb2623f85))


### Features

* **search:** add pathNamespaces option ([d179dde](https://github.com/docsifyjs/docsify/commit/d179dde1c71acdcbe66cb762377b123926c55bf2))
* Add title to sidebar links ([#1286](https://github.com/docsifyjs/docsify/issues/1286)) ([667496b](https://github.com/docsifyjs/docsify/commit/667496b85d99b168255f58e60a6bfe902cc6ee03))



## [4.11.4](https://github.com/docsifyjs/docsify/compare/v4.11.3...v4.11.4) (2020-06-18)


### Bug Fixes

* consistent location of search result ([e9dd2de](https://github.com/docsifyjs/docsify/commit/e9dd2de384b81619aae2bcbf92f52721cb76a177))
* cover overlapping sidebar by removing z-index ([0bf03f5](https://github.com/docsifyjs/docsify/commit/0bf03f58103037d100b1635cf3989c8d3672b4ba))
* cross-origin url cannot be redirected when  "externalLinkTarget" is set to "_self" and "routerMode" is set to "history". ([#1062](https://github.com/docsifyjs/docsify/issues/1062)) ([fd2cec6](https://github.com/docsifyjs/docsify/commit/fd2cec6bd66c46d6957811fefae4c615c3052a4f)), closes [#1046](https://github.com/docsifyjs/docsify/issues/1046) [#1046](https://github.com/docsifyjs/docsify/issues/1046) [#1046](https://github.com/docsifyjs/docsify/issues/1046)
* default html img resize if no height included ([#1065](https://github.com/docsifyjs/docsify/issues/1065)) ([9ff4d06](https://github.com/docsifyjs/docsify/commit/9ff4d0677304bc190e7bd9e89bbbdc64895197fa))
* fixed target and rel issue (fixes [#1183](https://github.com/docsifyjs/docsify/issues/1183)) ([3d662a5](https://github.com/docsifyjs/docsify/commit/3d662a5bf71bbfef077cfbc478df241d794f55a0))
* Inconsistent search and body rendering ([dcb0aae](https://github.com/docsifyjs/docsify/commit/dcb0aaea99efbd68175f1d1aeb5076b6dde9801e))
* rendering cover width bug ([717991c](https://github.com/docsifyjs/docsify/commit/717991c90cf709f4da91fe32610129de6529266b))
* search does not find the contents of the table ([#1198](https://github.com/docsifyjs/docsify/issues/1198)) ([31010e4](https://github.com/docsifyjs/docsify/commit/31010e4979b3d3ab4bd247a09c4ac5fd1405eaa8))
* The search error after setting the ID in the title ([#1159](https://github.com/docsifyjs/docsify/issues/1159)) ([6e554f8](https://github.com/docsifyjs/docsify/commit/6e554f8ebd3d4a2c5c7e4f66cff3dfe2b6aa1e31))
* upgrade docsify from 4.10.2 to 4.11.2 ([60b7f89](https://github.com/docsifyjs/docsify/commit/60b7f89b373b0d48ec8406a51eddeaed8126696d))


### Features

* added html sanitizer for remote rendering ([#1128](https://github.com/docsifyjs/docsify/issues/1128)) ([714ef29](https://github.com/docsifyjs/docsify/commit/714ef29afe779a6db5c4761ebaacdfc70ee2d8dd))
* update src/core/index.js to export all global APIs, deprecate old globals in favor of a single global DOCSIFY, and add tests for this ([7e002bf](https://github.com/docsifyjs/docsify/commit/7e002bf939d7837843908417b5445b4f8d36c1cd))


### Reverts

* Revert "Updated docs site dark and light mode with switch and redesigned search bar using docsify-darklight-theme" (#1207) ([26cb940](https://github.com/docsifyjs/docsify/commit/26cb940b51d34ee584b8425012a336f38a4abd76)), closes [#1207](https://github.com/docsifyjs/docsify/issues/1207) [#1182](https://github.com/docsifyjs/docsify/issues/1182)



## [4.11.3](https://github.com/docsifyjs/docsify/compare/v4.11.2...v4.11.3) (2020-03-24)


### Bug Fixes

* fix: digit issue with sidebar (complete REVERT to old method) ([154abf5](https://github.com/docsifyjs/docsify/commit/154abf59a6153e84b018fcdffa86892776d6da7d))



## [4.11.2](https://github.com/docsifyjs/docsify/compare/v4.11.1...v4.11.2) (2020-03-09)


### Bug Fixes

* fixed rendering of color in coverpage issue ([406670c](https://github.com/docsifyjs/docsify/commit/406670c3d619a627142900fd45019fb8ce00f60a))



## [4.11.1](https://github.com/docsifyjs/docsify/compare/v4.11.0...v4.11.1) (2020-03-09)



# [4.11.0](https://github.com/docsifyjs/docsify/compare/v4.10.2...v4.11.0) (2020-03-09)


### Bug Fixes

* emojis in titles not working correctly and update ([#1016](https://github.com/docsifyjs/docsify/issues/1016)) ([b3d9b96](https://github.com/docsifyjs/docsify/commit/b3d9b966dfbb6f456c2c457da1d2a366e85d9190))
* searching table content ([6184e50](https://github.com/docsifyjs/docsify/commit/6184e502629932ca71fdd0a1b10150d118f5a7c8))
* stage modified files as part of pre-commit hook ([#985](https://github.com/docsifyjs/docsify/issues/985)) ([5b77b0f](https://github.com/docsifyjs/docsify/commit/5b77b0f628f056b7ebb6d0b617561d19964516a2))
* config initialization and coercion ([#861](https://github.com/docsifyjs/docsify/pull/861))
* strip indent when embedding code fragment ([#996](https://github.com/docsifyjs/docsify/pull/996))
* Ensure autoHeader dom result is similar to parsed H1 ([#811](https://github.com/docsifyjs/docsify/pull/811))
* upgrade docsify from 4.9.4 to 4.10.2 ([#1054](https://github.com/docsifyjs/docsify/issues/1054)) ([78290b2](https://github.com/docsifyjs/docsify/commit/78290b21038a3ae09c4c7438bd89b14ca4c02805))
* upgrade medium-zoom from 1.0.4 to 1.0.5 ([39ebd73](https://github.com/docsifyjs/docsify/commit/39ebd73021290439180878cae32e663b9e60e214))
* upgrade prismjs from 1.17.1 to 1.19.0 ([9981c43](https://github.com/docsifyjs/docsify/commit/9981c4361ad690d0ed32cf1fb5b48cc5b9f770bb))


### Features

* configure pre-commit hook ([#983](https://github.com/docsifyjs/docsify/issues/983)) ([eea41a1](https://github.com/docsifyjs/docsify/commit/eea41a1207c46533ea9c6c59d82e2c94aa4dd70e))
* Add a prepare script. ([efbea24](https://github.com/docsifyjs/docsify/commit/efbea24de71f2287993b52ed1cef1a2dd6a53f81))
* added capability to add css class and id to images + links + refactoring ([#820](https://github.com/docsifyjs/docsify/issues/820)) ([724ac02](https://github.com/docsifyjs/docsify/commit/724ac024ddfc28e93d8b5dd909e722747286fa00))
* added dark mode to docs closes [#1031](https://github.com/docsifyjs/docsify/issues/1031) ([dc43d3c](https://github.com/docsifyjs/docsify/commit/dc43d3c512c2f04750e76176c25ece626ae7fe2a))
* new option `hideSidebar` ([#1026](https://github.com/docsifyjs/docsify/issues/1026)) ([b7547f1](https://github.com/docsifyjs/docsify/commit/b7547f151e928b3a0eb6a94b2af36023da4fa877))
* new option `topMargin` ([#1045](https://github.com/docsifyjs/docsify/pull/1045)) ([8faee03](https://github.com/docsifyjs/docsify/pull/1024/commits/b53ea1e304d3a2782b125c1d8711295d88faee03))


### Docs

* update docs for the `name` config option ([#992](https://github.com/docsifyjs/docsify/pull/992))
* about cache ([#854](https://github.com/docsifyjs/docsify/pull/854))
* removed FOSSA badge
* documented `__colon__` tip ([#1025](https://github.com/docsifyjs/docsify/pull/1025))

### Chore

* Migrate relative links to absolute in embedded markdown ([#867](https://github.com/docsifyjs/docsify/pull/867))
* smarter scroll behavior ([#744](https://github.com/docsifyjs/docsify/pull/744))
* improve basic layout style ([#884](https://github.com/docsifyjs/docsify/pull/884))
* There are currently {three=>four} themes available. ([#892](https://github.com/docsifyjs/docsify/pull/892))
* Added a redirect for images to show up in Amplify ([#918](https://github.com/docsifyjs/docsify/pull/918))
* removed the escaping of the name of sidebar ([#991](https://github.com/docsifyjs/docsify/pull/991))
* Eslint fixes for v4x ([#989](https://github.com/docsifyjs/docsify/pull/989))
* added github Actions for CI ([#1000](https://github.com/docsifyjs/docsify/pull/1000))
* Add a prepare script. ([#1010](https://github.com/docsifyjs/docsify/pull/1010))
* chore(GH-action): using ubuntu 16 and removed node 8 from CI
* chore: add config ([#1014](https://github.com/docsifyjs/docsify/pull/1014))
* chore(stale): added enhancement label to exemptlabels
* chore(stale): added bug label to exemptlabels
* .markdown-section max-width 800px to 80% ([#1017](https://github.com/docsifyjs/docsify/pull/1017))
* changed the CDN from unpkg to jsDelivr #1020 ([#1022](https://github.com/docsifyjs/docsify/pull/1022))
* migrate CI to github, refactore CI and npm scripts, linting fixes ([#1023](https://github.com/docsifyjs/docsify/pull/1023))
* chore(readme): added CI badges and fixed the logo issue
* added new linter config ([#1028](https://github.com/docsifyjs/docsify/pull/1028))


## [4.10.2](https://github.com/docsifyjs/docsify/compare/v4.10.0...v4.10.2) (2019-12-16)



# [4.10.0](https://github.com/docsifyjs/docsify/compare/v4.9.4...v4.10.0) (2019-12-16)


### Bug Fixes

* fixed security alert for chokidar(update dep) ([a62b037](https://github.com/docsifyjs/docsify/commit/a62b037becb36941c11c8eab6e4d83df8db85af3))
* npm audit issues ([#934](https://github.com/docsifyjs/docsify/issues/934)) ([615205c](https://github.com/docsifyjs/docsify/commit/615205cfdb7aea8f37a1ec5dd928105eeef56357))
* package security alerts ([f5f1561](https://github.com/docsifyjs/docsify/commit/f5f15619f1a239d6ce12a2f83ad8817352a3352b))
* security alerts of cssnano ([d7d5c8f](https://github.com/docsifyjs/docsify/commit/d7d5c8f302d7c18dbb32e982202a07b73badf6f6))



<a name="4.9.4"></a>
## [4.9.4](https://github.com/docsifyjs/docsify/compare/v4.9.2...v4.9.4) (2019-05-05)



<a name="4.9.2"></a>
## [4.9.2](https://github.com/docsifyjs/docsify/compare/v4.9.1...v4.9.2) (2019-04-21)


### Bug Fixes

* re-render gitalk when router changed ([11ea1f8](https://github.com/docsifyjs/docsify/commit/11ea1f8))


### Features

* allows relative path, fixed [#590](https://github.com/docsifyjs/docsify/issues/590) ([31654f1](https://github.com/docsifyjs/docsify/commit/31654f1))



<a name="4.9.1"></a>
## [4.9.1](https://github.com/docsifyjs/docsify/compare/v4.9.0...v4.9.1) (2019-02-21)


### Bug Fixes

* github assets url ([#774](https://github.com/docsifyjs/docsify/issues/774)) ([140bf10](https://github.com/docsifyjs/docsify/commit/140bf10))



<a name="4.9.0"></a>
# [4.9.0](https://github.com/docsifyjs/docsify/compare/v4.8.6...v4.9.0) (2019-02-19)


### Bug Fixes

* task list rendering (Fix [#749](https://github.com/docsifyjs/docsify/issues/749)) ([#757](https://github.com/docsifyjs/docsify/issues/757)) ([69ef489](https://github.com/docsifyjs/docsify/commit/69ef489))
* upgrade npm-run-all ([049726e](https://github.com/docsifyjs/docsify/commit/049726e))


### Features

* **search-plugin:** add namespace option ([#706](https://github.com/docsifyjs/docsify/issues/706)) ([28beff8](https://github.com/docsifyjs/docsify/commit/28beff8))
* Add new theme "dolphin" ([#735](https://github.com/docsifyjs/docsify/issues/735)) ([c3345ba](https://github.com/docsifyjs/docsify/commit/c3345ba))
* Provide code fragments feature ([#748](https://github.com/docsifyjs/docsify/issues/748)) ([1447c8a](https://github.com/docsifyjs/docsify/commit/1447c8a))



<a name="4.8.6"></a>
## [4.8.6](https://github.com/docsifyjs/docsify/compare/v4.8.5...v4.8.6) (2018-11-12)


### Bug Fixes

* IE10 compatibility ([#691](https://github.com/docsifyjs/docsify/issues/691)) ([4db8cd6](https://github.com/docsifyjs/docsify/commit/4db8cd6))



<a name="4.8.5"></a>
## [4.8.5](https://github.com/docsifyjs/docsify/compare/v4.8.4...v4.8.5) (2018-11-02)


### Bug Fixes

* expose version info for Docsify, fixed [#641](https://github.com/docsifyjs/docsify/issues/641) ([aa719e3](https://github.com/docsifyjs/docsify/commit/aa719e3))



<a name="4.8.4"></a>
## [4.8.4](https://github.com/docsifyjs/docsify/compare/v4.8.3...v4.8.4) (2018-11-01)


### Bug Fixes

* **cover:** Compatible with legacy styles, fixed [#677](https://github.com/docsifyjs/docsify/issues/677) ([#678](https://github.com/docsifyjs/docsify/issues/678)) ([1a945d4](https://github.com/docsifyjs/docsify/commit/1a945d4))



<a name="4.8.3"></a>

## [4.8.3](https://github.com/docsifyjs/docsify/compare/v4.8.2...v4.8.3) (2018-11-01)

Fix the last release files has the old version marked...

<a name="4.8.2"></a>

## [4.8.2](https://github.com/docsifyjs/docsify/compare/v4.8.1...v4.8.2) (2018-11-01)

### Bug Fixes

- cover button style, fixed [#670](https://github.com/docsifyjs/docsify/issues/670), fixed [#665](https://github.com/docsifyjs/docsify/issues/665) ([#675](https://github.com/docsifyjs/docsify/issues/675)) ([fcd1087](https://github.com/docsifyjs/docsify/commit/fcd1087))
- update match regex ([#669](https://github.com/docsifyjs/docsify/issues/669)) ([2edf47e](https://github.com/docsifyjs/docsify/commit/2edf47e))
- use copy of cached value ([#668](https://github.com/docsifyjs/docsify/issues/668)) ([5fcf210](https://github.com/docsifyjs/docsify/commit/5fcf210))
- **compiler:** import prism-markup-templating, fixed [#672](https://github.com/docsifyjs/docsify/issues/672) ([#676](https://github.com/docsifyjs/docsify/issues/676)) ([fdd8826](https://github.com/docsifyjs/docsify/commit/fdd8826))

### Features

- add heading config id ([#671](https://github.com/docsifyjs/docsify/issues/671)) ([ab19b13](https://github.com/docsifyjs/docsify/commit/ab19b13))

<a name="4.8.1"></a>

## [4.8.1](https://github.com/docsifyjs/docsify/compare/v4.8.0...v4.8.1) (2018-10-31)

### Bug Fixes

- ssr package dep, fixed [#605](https://github.com/docsifyjs/docsify/issues/605) ([2bc880d](https://github.com/docsifyjs/docsify/commit/2bc880d))
- **compiler:** extra quotes for codeblock ([4f588e0](https://github.com/docsifyjs/docsify/commit/4f588e0))
- **compiler:** prevent render of html code in paragraph, fixed [#663](https://github.com/docsifyjs/docsify/issues/663) ([d35059d](https://github.com/docsifyjs/docsify/commit/d35059d))

### Features

- upgrade PrismJS, fixed [#534](https://github.com/docsifyjs/docsify/issues/534) ([4805cb5](https://github.com/docsifyjs/docsify/commit/4805cb5))

<a name="4.8.0"></a>

# [4.8.0](https://github.com/docsifyjs/docsify/compare/v4.7.1...v4.8.0) (2018-10-31)

### Bug Fixes

- Cache TOC for later usage in the case of cached file html ([#649](https://github.com/docsifyjs/docsify/issues/649)) ([9e86017](https://github.com/docsifyjs/docsify/commit/9e86017))
- improve external script plugin ([#632](https://github.com/docsifyjs/docsify/issues/632)) ([50c2434](https://github.com/docsifyjs/docsify/commit/50c2434))
- missing variable declaration ([#660](https://github.com/docsifyjs/docsify/issues/660)) ([1ce37bd](https://github.com/docsifyjs/docsify/commit/1ce37bd))
- Remove target for mailto links ([#652](https://github.com/docsifyjs/docsify/issues/652)) ([18f0f03](https://github.com/docsifyjs/docsify/commit/18f0f03))
- Update getAllPath query selector ([#653](https://github.com/docsifyjs/docsify/issues/653)) ([f6f4e32](https://github.com/docsifyjs/docsify/commit/f6f4e32))
- Update vue.styl ([#634](https://github.com/docsifyjs/docsify/issues/634)) ([bf060be](https://github.com/docsifyjs/docsify/commit/bf060be))

### Features

- Add docsify version to $window.docsify object ([#641](https://github.com/docsifyjs/docsify/issues/641)) ([94bc415](https://github.com/docsifyjs/docsify/commit/94bc415)), closes [#521](https://github.com/docsifyjs/docsify/issues/521)
- **compiler:** support embedded mermaid ([#629](https://github.com/docsifyjs/docsify/issues/629)) ([42ea8af](https://github.com/docsifyjs/docsify/commit/42ea8af))
- Add hideOtherSidebarContent option ([#661](https://github.com/docsifyjs/docsify/issues/661)) ([4a23c4a](https://github.com/docsifyjs/docsify/commit/4a23c4a))
- Allow base64, external, and relative logo values ([#642](https://github.com/docsifyjs/docsify/issues/642)) ([0a0802a](https://github.com/docsifyjs/docsify/commit/0a0802a)), closes [#577](https://github.com/docsifyjs/docsify/issues/577)
- upgrade marked to 0.5.x, fixed [#645](https://github.com/docsifyjs/docsify/issues/645), close [#644](https://github.com/docsifyjs/docsify/issues/644) ([#662](https://github.com/docsifyjs/docsify/issues/662)) ([a39b214](https://github.com/docsifyjs/docsify/commit/a39b214))

<a name="4.7.1"></a>

## [4.7.1](https://github.com/docsifyjs/docsify/compare/v4.7.0...v4.7.1) (2018-08-30)

<a name="4.7.0"></a>

# [4.7.0](https://github.com/QingWei-Li/docsify/compare/v4.6.9...v4.7.0) (2018-06-29)

### Bug Fixes

- alldow addition content in sidebar, fix [#518](https://github.com/QingWei-Li/docsify/issues/518), fix 539 ([#543](https://github.com/QingWei-Li/docsify/issues/543)) ([04b36b0](https://github.com/QingWei-Li/docsify/commit/04b36b0))
- async install config, fixed [#425](https://github.com/QingWei-Li/docsify/issues/425) ([e4e011c](https://github.com/QingWei-Li/docsify/commit/e4e011c))
- loading embed files synchronously, fixed [#525](https://github.com/QingWei-Li/docsify/issues/525), fixed [#527](https://github.com/QingWei-Li/docsify/issues/527) ([#544](https://github.com/QingWei-Li/docsify/issues/544)) ([feea7f9](https://github.com/QingWei-Li/docsify/commit/feea7f9))
- path include chinese character cause hilight bug ([#556](https://github.com/QingWei-Li/docsify/issues/556)) ([a5f333a](https://github.com/QingWei-Li/docsify/commit/a5f333a))

### Features

- add logo option, [#264](https://github.com/QingWei-Li/docsify/issues/264) ([#541](https://github.com/QingWei-Li/docsify/issues/541)) ([ee72dd0](https://github.com/QingWei-Li/docsify/commit/ee72dd0))
- add unpkg field, close [#531](https://github.com/QingWei-Li/docsify/issues/531) ([#558](https://github.com/QingWei-Li/docsify/issues/558)) ([5c0de0a](https://github.com/QingWei-Li/docsify/commit/5c0de0a))
- support image resizing, resolve [#508](https://github.com/QingWei-Li/docsify/issues/508) ([#545](https://github.com/QingWei-Li/docsify/issues/545)) ([3a7ad62](https://github.com/QingWei-Li/docsify/commit/3a7ad62))

<a name="4.6.10"></a>

## [4.6.10](https://github.com/QingWei-Li/docsify/compare/v4.6.9...v4.6.10) (2018-03-25)

### Bug Fixes

- async install config, fixed [#425](https://github.com/QingWei-Li/docsify/issues/425) ([e4e011c](https://github.com/QingWei-Li/docsify/commit/e4e011c))

<a name="4.6.9"></a>

## [4.6.9](https://github.com/QingWei-Li/docsify/compare/v4.6.8...v4.6.9) (2018-03-10)

### Bug Fixes

- upgrade medium-zoom, fixed [#417](https://github.com/QingWei-Li/docsify/issues/417) ([6a3d69a](https://github.com/QingWei-Li/docsify/commit/6a3d69a))

<a name="4.6.8"></a>

## [4.6.8](https://github.com/QingWei-Li/docsify/compare/v4.6.7...v4.6.8) (2018-03-06)

### Bug Fixes

- resolve path of image and embed files, fixed [#412](https://github.com/QingWei-Li/docsify/issues/412) ([bfd0d18](https://github.com/QingWei-Li/docsify/commit/bfd0d18))

<a name="4.6.7"></a>

## [4.6.7](https://github.com/QingWei-Li/docsify/compare/v4.6.6...v4.6.7) (2018-03-03)

### Bug Fixes

- layout css, fixed [#409](https://github.com/QingWei-Li/docsify/issues/409) ([aeb692e](https://github.com/QingWei-Li/docsify/commit/aeb692e))

<a name="4.6.6"></a>

## [4.6.6](https://github.com/QingWei-Li/docsify/compare/v4.6.5...v4.6.6) (2018-03-03)

<a name="4.6.5"></a>

## [4.6.5](https://github.com/QingWei-Li/docsify/compare/v4.6.4...v4.6.5) (2018-03-03)

### Bug Fixes

- **navbar:** Now Navbar isn't append to DOM when loadNavbar is falsy ([#407](https://github.com/QingWei-Li/docsify/issues/407)) ([0933445](https://github.com/QingWei-Li/docsify/commit/0933445))

### Features

- **config:** Add 404 page options. ([#406](https://github.com/QingWei-Li/docsify/issues/406)) ([9b3b445](https://github.com/QingWei-Li/docsify/commit/9b3b445))

<a name="4.6.4"></a>

## [4.6.4](https://github.com/QingWei-Li/docsify/compare/v4.6.3...v4.6.4) (2018-03-01)

### Bug Fixes

- **render:** Disable markdown parsing when the file is an HTML ([#403](https://github.com/QingWei-Li/docsify/issues/403)) ([278a75e](https://github.com/QingWei-Li/docsify/commit/278a75e))

### Features

- **fetch:** Add fallback languages configuration. ([#402](https://github.com/QingWei-Li/docsify/issues/402)) ([ecc0e04](https://github.com/QingWei-Li/docsify/commit/ecc0e04))

<a name="4.6.3"></a>

## [4.6.3](https://github.com/QingWei-Li/docsify/compare/v4.6.2...v4.6.3) (2018-02-15)

### Bug Fixes

- **hook:** beforeEach don\'t work, fixed [#393](https://github.com/QingWei-Li/docsify/issues/393) ([6a09059](https://github.com/QingWei-Li/docsify/commit/6a09059))

<a name="4.6.2"></a>

## [4.6.2](https://github.com/QingWei-Li/docsify/compare/v4.6.1...v4.6.2) (2018-02-14)

### Bug Fixes

- **embed:** broken in IE, fixed [#389](https://github.com/QingWei-Li/docsify/issues/389), fixed [#391](https://github.com/QingWei-Li/docsify/issues/391) ([45a7464](https://github.com/QingWei-Li/docsify/commit/45a7464))
- **embed:** init value ([890a7bf](https://github.com/QingWei-Li/docsify/commit/890a7bf))

<a name="4.6.1"></a>

## [4.6.1](https://github.com/QingWei-Li/docsify/compare/v4.6.0...v4.6.1) (2018-02-12)

### Bug Fixes

- **embed** compatible ssr ([dc0c3ce](https://github.com/QingWei-Li/docsify/commit/dc0c3ce))
- **embed** async fetch embed files, fixed [#387](https://github.com/QingWei-Li/docsify/issues/387)

<a name="4.6.0"></a>

# [4.6.0](https://github.com/QingWei-Li/docsify/compare/v4.5.9...v4.6.0) (2018-02-11)

### Bug Fixes

- **search:** custom clear button, fixed [#271](https://github.com/QingWei-Li/docsify/issues/271) ([864aa18](https://github.com/QingWei-Li/docsify/commit/864aa18))
- **search:** escape special characters for search, fixed [#369](https://github.com/QingWei-Li/docsify/issues/369) ([9755439](https://github.com/QingWei-Li/docsify/commit/9755439))
- build config ([342438f](https://github.com/QingWei-Li/docsify/commit/342438f))
- button style for coverpage, fixed [#362](https://github.com/QingWei-Li/docsify/issues/362) ([85428ef](https://github.com/QingWei-Li/docsify/commit/85428ef))
- dropdown scroll style, fixed [#346](https://github.com/QingWei-Li/docsify/issues/346) ([c4d83f2](https://github.com/QingWei-Li/docsify/commit/c4d83f2))
- highlight homepage link, fixed [#304](https://github.com/QingWei-Li/docsify/issues/304) ([f960c19](https://github.com/QingWei-Li/docsify/commit/f960c19))
- homepage link ([e097f88](https://github.com/QingWei-Li/docsify/commit/e097f88))
- onlyCover ([033be4f](https://github.com/QingWei-Li/docsify/commit/033be4f))
- ssr compatible embedd ([ebc10c4](https://github.com/QingWei-Li/docsify/commit/ebc10c4))
- ssr coverpage, fixed [#273](https://github.com/QingWei-Li/docsify/issues/273) ([9e824a4](https://github.com/QingWei-Li/docsify/commit/9e824a4))

### Features

- click sidebar menu add collapse and expand, close [#294](https://github.com/QingWei-Li/docsify/issues/294) ([5e161a1](https://github.com/QingWei-Li/docsify/commit/5e161a1))
- **compiler:** support embedded file as code block, close [#134](https://github.com/QingWei-Li/docsify/issues/134) ([761ccc2](https://github.com/QingWei-Li/docsify/commit/761ccc2))
- **compiler:** support embedded markdown, html, video, etc files, close [#383](https://github.com/QingWei-Li/docsify/issues/383), close [#333](https://github.com/QingWei-Li/docsify/issues/333) ([524f52f](https://github.com/QingWei-Li/docsify/commit/524f52f))
- **cover:** add onlyCover option, close [#382](https://github.com/QingWei-Li/docsify/issues/382) ([b265fdd](https://github.com/QingWei-Li/docsify/commit/b265fdd))
- **fetch:** add requestHeaders option, fixed [#336](https://github.com/QingWei-Li/docsify/issues/336) ([54ab4c9](https://github.com/QingWei-Li/docsify/commit/54ab4c9))
- **render:** add ext option for custom file extension, close [#340](https://github.com/QingWei-Li/docsify/issues/340) ([248aa72](https://github.com/QingWei-Li/docsify/commit/248aa72))
- **render:** mutilple coverpage, close [#315](https://github.com/QingWei-Li/docsify/issues/315) ([f68ddf5](https://github.com/QingWei-Li/docsify/commit/f68ddf5))

<a name="4.5.9"></a>

## [4.5.9](https://github.com/QingWei-Li/docsify/compare/v4.5.8...v4.5.9) (2018-02-07)

### Bug Fixes

- upgrade marked ([4157173](https://github.com/QingWei-Li/docsify/commit/4157173))

<a name="4.5.8"></a>

## [4.5.8](https://github.com/QingWei-Li/docsify/compare/v4.5.6...v4.5.8) (2018-02-07)

### Bug Fixes

- cover style, fixed [#381](https://github.com/QingWei-Li/docsify/issues/381) ([368754e](https://github.com/QingWei-Li/docsify/commit/368754e))
- updated deps ([#337](https://github.com/QingWei-Li/docsify/issues/337)) ([a12d393](https://github.com/QingWei-Li/docsify/commit/a12d393))

<a name="4.5.7"></a>

## [4.5.7](https://github.com/QingWei-Li/docsify/compare/v4.5.6...v4.5.7) (2017-12-29)

### Features

- add navigation plugin, closed [#180](https://github.com/QingWei-Li/docsify/issues/180) ([f78be4c](https://github.com/QingWei-Li/docsify/commit/f78be4c))

<a name="4.5.6"></a>

## [4.5.6](https://github.com/QingWei-Li/docsify/compare/v4.5.3...v4.5.6) (2017-12-14)

### Bug Fixes

- **style:** increase the tap targets of menu button, fixed [#325](https://github.com/QingWei-Li/docsify/issues/325) ([888f217](https://github.com/QingWei-Li/docsify/commit/888f217))

<a name="4.5.5"></a>

## [4.5.5](https://github.com/QingWei-Li/docsify/compare/v4.5.4...v4.5.5) (2017-11-30)

### Bug Fixes

- disqus plugin issue ([#318](https://github.com/QingWei-Li/docsify/issues/318)) ([041b33e](https://github.com/QingWei-Li/docsify/commit/041b33e)), closes [#317](https://github.com/QingWei-Li/docsify/issues/317)

<a name="4.5.4"></a>

## [4.5.4](https://github.com/QingWei-Li/docsify/compare/v4.5.2...v4.5.4) (2017-11-29)

### Bug Fixes

- **compiler:** task lists style, fixed [#215](https://github.com/QingWei-Li/docsify/issues/215) ([e43ded4](https://github.com/QingWei-Li/docsify/commit/e43ded4))

### Features

- add gitalk plugin ([#306](https://github.com/QingWei-Li/docsify/issues/306)) ([9208e64](https://github.com/QingWei-Li/docsify/commit/9208e64))

<a name="4.5.3"></a>

## [4.5.3](https://github.com/QingWei-Li/docsify/compare/v4.5.2...v4.5.3) (2017-11-11)

### Features

- add gitalk plugin ([#306](https://github.com/QingWei-Li/docsify/issues/306)) ([9208e64](https://github.com/QingWei-Li/docsify/commit/9208e64))

<a name="4.5.2"></a>

## [4.5.2](https://github.com/QingWei-Li/docsify/compare/v4.5.1...v4.5.2) (2017-11-09)

### Features

- github task lists, close [#215](https://github.com/QingWei-Li/docsify/issues/215) ([#305](https://github.com/QingWei-Li/docsify/issues/305)) ([d486eef](https://github.com/QingWei-Li/docsify/commit/d486eef))

<a name="4.5.1"></a>

## [4.5.1](https://github.com/QingWei-Li/docsify/compare/v4.5.0...v4.5.1) (2017-11-07)

### Features

- fetch files with the query params, fixed [#303](https://github.com/QingWei-Li/docsify/issues/303) ([2a2ed96](https://github.com/QingWei-Li/docsify/commit/2a2ed96))

<a name="4.5.0"></a>

# [4.5.0](https://github.com/QingWei-Li/docsify/compare/v4.4.1...v4.5.0) (2017-11-04)

### Features

- add disqus plugin, closed [#123](https://github.com/QingWei-Li/docsify/issues/123) ([fd7d4e0](https://github.com/QingWei-Li/docsify/commit/fd7d4e0))

<a name="4.4.1"></a>

## [4.4.1](https://github.com/QingWei-Li/docsify/compare/v4.4.0...v4.4.1) (2017-10-31)

### Bug Fixes

- {docsify-ignore-all} and {docsify-ignore} bug ([#299](https://github.com/QingWei-Li/docsify/issues/299)) ([cc98f56](https://github.com/QingWei-Li/docsify/commit/cc98f56))
- zoom image plugin issue, fixed [#187](https://github.com/QingWei-Li/docsify/issues/187) ([#300](https://github.com/QingWei-Li/docsify/issues/300)) ([fa772cf](https://github.com/QingWei-Li/docsify/commit/fa772cf))

<a name="4.4.0"></a>

# [4.4.0](https://github.com/QingWei-Li/docsify/compare/v4.3.15...v4.4.0) (2017-10-30)

### Bug Fixes

- sidebar style issue on firefox, fixed [#184](https://github.com/QingWei-Li/docsify/issues/184) ([#297](https://github.com/QingWei-Li/docsify/issues/297)) ([36bfc9d](https://github.com/QingWei-Li/docsify/commit/36bfc9d))

### Features

- add helper for disabled link, fixed [#295](https://github.com/QingWei-Li/docsify/issues/295) ([#296](https://github.com/QingWei-Li/docsify/issues/296)) ([4ad96f3](https://github.com/QingWei-Li/docsify/commit/4ad96f3))

<a name="4.3.15"></a>

## [4.3.15](https://github.com/QingWei-Li/docsify/compare/v4.3.14...v4.3.15) (2017-10-20)

### Bug Fixes

- scroll active sidebar ([a2b8eae](https://github.com/QingWei-Li/docsify/commit/a2b8eae))

<a name="4.3.14"></a>

## [4.3.14](https://github.com/QingWei-Li/docsify/compare/v4.3.13...v4.3.14) (2017-10-20)

### Bug Fixes

- codesponsor style ([ab68268](https://github.com/QingWei-Li/docsify/commit/ab68268))

<a name="4.3.13"></a>

## [4.3.13](https://github.com/QingWei-Li/docsify/compare/v4.3.12...v4.3.13) (2017-10-17)

### Bug Fixes

- duplicate results in search fixed [#257](https://github.com/QingWei-Li/docsify/issues/257) ([#284](https://github.com/QingWei-Li/docsify/issues/284)) ([3476f6f](https://github.com/QingWei-Li/docsify/commit/3476f6f))

### Features

- make whole search result clickable ([#285](https://github.com/QingWei-Li/docsify/issues/285)) ([1b91227](https://github.com/QingWei-Li/docsify/commit/1b91227))

<a name="4.3.12"></a>

## [4.3.12](https://github.com/QingWei-Li/docsify/compare/v4.3.11...v4.3.12) (2017-10-15)

### Bug Fixes

- incorrect active link ([#281](https://github.com/QingWei-Li/docsify/issues/281)) ([a3ab379](https://github.com/QingWei-Li/docsify/commit/a3ab379))

<a name="4.3.11"></a>

## [4.3.11](https://github.com/QingWei-Li/docsify/compare/v4.3.10...v4.3.11) (2017-10-15)

### Bug Fixes

- broken links to same page heading, fix [#278](https://github.com/QingWei-Li/docsify/issues/278), fix [#279](https://github.com/QingWei-Li/docsify/issues/279) ([91d6337](https://github.com/QingWei-Li/docsify/commit/91d6337))

<a name="4.3.10"></a>

## [4.3.10](https://github.com/QingWei-Li/docsify/compare/v4.3.9...v4.3.10) (2017-10-12)

### Bug Fixes

- link render issue after page refreshing ([#276](https://github.com/QingWei-Li/docsify/issues/276)) ([abd885e](https://github.com/QingWei-Li/docsify/commit/abd885e))

<a name="4.3.9"></a>

## [4.3.9](https://github.com/QingWei-Li/docsify/compare/v4.3.8...v4.3.9) (2017-10-11)

### Bug Fixes

- scroll issue in IE ([#275](https://github.com/QingWei-Li/docsify/issues/275)) ([3e94cb6](https://github.com/QingWei-Li/docsify/commit/3e94cb6))

<a name="4.3.8"></a>

## [4.3.8](https://github.com/QingWei-Li/docsify/compare/v4.3.7...v4.3.8) (2017-10-07)

### Bug Fixes

- **slugify:** GitHub compatible heading links, fixed [#272](https://github.com/QingWei-Li/docsify/issues/272) ([9b4e666](https://github.com/QingWei-Li/docsify/commit/9b4e666))

<a name="4.3.7"></a>

## [4.3.7](https://github.com/QingWei-Li/docsify/compare/v4.3.6...v4.3.7) (2017-10-02)

### Bug Fixes

- **slugify:** GitHub compatible heading links, fixed [#267](https://github.com/QingWei-Li/docsify/issues/267) ([c195d2d](https://github.com/QingWei-Li/docsify/commit/c195d2d))

<a name="4.3.6"></a>

## [4.3.6](https://github.com/QingWei-Li/docsify/compare/v4.3.5...v4.3.6) (2017-09-21)

### Bug Fixes

- style for codesponsor plugin ([08afec7](https://github.com/QingWei-Li/docsify/commit/08afec7))

<a name="4.3.5"></a>

## [4.3.5](https://github.com/QingWei-Li/docsify/compare/v4.3.4...v4.3.5) (2017-09-20)

### Bug Fixes

- missed symbol ([#254](https://github.com/QingWei-Li/docsify/issues/254)) ([6c702d3](https://github.com/QingWei-Li/docsify/commit/6c702d3))

### Features

- **plugin:** add codesponsor plugin ([46ac4c3](https://github.com/QingWei-Li/docsify/commit/46ac4c3))

<a name="4.3.4"></a>

## [4.3.4](https://github.com/QingWei-Li/docsify/compare/v4.3.3...v4.3.4) (2017-09-07)

### Bug Fixes

- scroll position issue, fixed [#234](https://github.com/QingWei-Li/docsify/issues/234) ([388ed3d](https://github.com/QingWei-Li/docsify/commit/388ed3d))

<a name="4.3.3"></a>

## [4.3.3](https://github.com/QingWei-Li/docsify/compare/v4.3.2...v4.3.3) (2017-09-06)

### Bug Fixes

- **buble.css:** tweaks code block style, fixed [#249](https://github.com/QingWei-Li/docsify/issues/249) ([9d43051](https://github.com/QingWei-Li/docsify/commit/9d43051))

### Features

- add doc for react and vue demo box plugin ([#247](https://github.com/QingWei-Li/docsify/issues/247)) ([f0aca19](https://github.com/QingWei-Li/docsify/commit/f0aca19))

<a name="4.3.2"></a>

## [4.3.2](https://github.com/QingWei-Li/docsify/compare/v4.3.1...v4.3.2) (2017-09-01)

### Bug Fixes

- sidebar highlight ([f82f419](https://github.com/QingWei-Li/docsify/commit/f82f419))

### Features

- add Edit on github plugin (thanks [@njleonzhang](https://github.com/njleonzhang)) ([a0e1ea8](https://github.com/QingWei-Li/docsify/commit/a0e1ea8))

<a name="4.3.1"></a>

## [4.3.1](https://github.com/QingWei-Li/docsify/compare/v4.2.9...v4.3.1) (2017-08-30)

### Features

- **markdown:** supports mermaid [#137](https://github.com/QingWei-Li/docsify/issues/137) ([f4800e0](https://github.com/QingWei-Li/docsify/commit/f4800e0))

<a name="4.3.0"></a>

# [4.3.0](https://github.com/QingWei-Li/docsify/compare/v4.2.9...v4.3.0) (2017-08-17)

### Features

- **markdown:** supports mermaid [#137](https://github.com/QingWei-Li/docsify/issues/137) ([f4800e0](https://github.com/QingWei-Li/docsify/commit/f4800e0))

<a name="4.2.9"></a>

## [4.2.9](https://github.com/QingWei-Li/docsify/compare/v4.2.8...v4.2.9) (2017-08-15)

### Bug Fixes

- ensure document ready before init Docsify [#233](https://github.com/QingWei-Li/docsify/issues/233)

<a name="4.2.8"></a>

## [4.2.8](https://github.com/QingWei-Li/docsify/compare/v4.2.7...v4.2.8) (2017-08-10)

### Features

- **compiler:** support for setting target attribute for link, fixed [#230](https://github.com/QingWei-Li/docsify/issues/230) ([7f270f9](https://github.com/QingWei-Li/docsify/commit/7f270f9))

<a name="4.2.7"></a>

## [4.2.7](https://github.com/QingWei-Li/docsify/compare/v4.2.4...v4.2.7) (2017-08-05)

### Bug Fixes

- **release:** release shell ([628e211](https://github.com/QingWei-Li/docsify/commit/628e211))
- **style:** nowrap => pre-wrap, fixed [#228](https://github.com/QingWei-Li/docsify/issues/228) ([a88252c](https://github.com/QingWei-Li/docsify/commit/a88252c))

<a name="4.2.6"></a>

## [4.2.6](https://github.com/QingWei-Li/docsify/compare/v4.2.4...v4.2.6) (2017-07-27)

### Bug Fixes

- **css:** hide the nav when the content has not yet been loaded ([1fa1619](https://github.com/QingWei-Li/docsify/commit/1fa1619))
- **release:** release shell ([628e211](https://github.com/QingWei-Li/docsify/commit/628e211))

<a name="4.2.4"></a>

## [4.2.4](https://github.com/QingWei-Li/docsify/compare/v4.2.2...v4.2.4) (2017-07-26)

### Bug Fixes

- **render:** Remove getRootNode to be compatible with the lower version of Chrome, fixed [#225](https://github.com/QingWei-Li/docsify/issues/225) ([b8dd346](https://github.com/QingWei-Li/docsify/commit/b8dd346))

<a name="4.2.3"></a>

## [4.2.3](https://github.com/QingWei-Li/docsify/compare/v4.2.2...v4.2.3) (2017-07-26)

### Features

- **search:** Supports the max depth of the search headline, fixed [#223](https://github.com/QingWei-Li/docsify/issues/223), resolve [#129](https://github.com/QingWei-Li/docsify/issues/129) ([b7b589b](https://github.com/QingWei-Li/docsify/commit/b7b589b))

<a name="4.2.2"></a>

## [4.2.2](https://github.com/QingWei-Li/docsify/compare/v4.2.1...v4.2.2) (2017-07-24)

### Bug Fixes

- style rerender due to setting themeColor ([17ff3d1](https://github.com/QingWei-Li/docsify/commit/17ff3d1))

<a name="4.2.1"></a>

## [4.2.1](https://github.com/QingWei-Li/docsify/compare/v4.2.0...v4.2.1) (2017-07-19)

- give the navbar some line-height (#216)
- Remove unnecessary moduleName option from rollup config for plugins (#209)

<a name="4.2.0"></a>

# [4.2.0](https://github.com/QingWei-Li/docsify/compare/v4.1.14...v4.2.0) (2017-07-10)

### Bug Fixes

- not found page ([9af8559](https://github.com/QingWei-Li/docsify/commit/9af8559))

### Features

- alias option supports regexp, resolve [#183](https://github.com/QingWei-Li/docsify/issues/183) ([c4aa22c](https://github.com/QingWei-Li/docsify/commit/c4aa22c))
- ignore to compiled link, fixed [#203](https://github.com/QingWei-Li/docsify/issues/203) ([#204](https://github.com/QingWei-Li/docsify/issues/204)) ([2e00f4c](https://github.com/QingWei-Li/docsify/commit/2e00f4c))

<a name="4.1.14"></a>

## [4.1.14](https://github.com/QingWei-Li/docsify/compare/v4.1.13...v4.1.14) (2017-06-24)

### Bug Fixes

- get file path ([e8117e5](https://github.com/QingWei-Li/docsify/commit/e8117e5))

### Features

- add context attribute, fixed [#191](https://github.com/QingWei-Li/docsify/issues/191) ([ce0e9ac](https://github.com/QingWei-Li/docsify/commit/ce0e9ac))

<a name="4.1.13"></a>

## [4.1.13](https://github.com/QingWei-Li/docsify/compare/v4.1.12...v4.1.13) (2017-06-11)

<a name="4.1.12"></a>

## [4.1.12](https://github.com/QingWei-Li/docsify/compare/v4.1.11...v4.1.12) (2017-06-03)

### Bug Fixes

- **render:** subtitle in side bar shows undefined, fixed [#182](https://github.com/QingWei-Li/docsify/issues/182) ([d087d57](https://github.com/QingWei-Li/docsify/commit/d087d57))

<a name="4.1.11"></a>

## [4.1.11](https://github.com/QingWei-Li/docsify/compare/v4.1.10...v4.1.11) (2017-06-02)

### Bug Fixes

- **compiler:** force reset toc when rendering sidebar fixed [#181](https://github.com/QingWei-Li/docsify/issues/181) ([ccf4c7c](https://github.com/QingWei-Li/docsify/commit/ccf4c7c))
- **render:** autoHeader does not work ([1304d2e](https://github.com/QingWei-Li/docsify/commit/1304d2e))

<a name="4.1.10"></a>

## [4.1.10](https://github.com/QingWei-Li/docsify/compare/v4.1.9...v4.1.10) (2017-06-02)

### Bug Fixes

- **hash:** hash routing crashes when url has querystring ([6d48ce1](https://github.com/QingWei-Li/docsify/commit/6d48ce1))

<a name="4.1.9"></a>

## [4.1.9](https://github.com/QingWei-Li/docsify/compare/v4.1.8...v4.1.9) (2017-05-31)

### Bug Fixes

- can't render toc on first load ([d9b487e](https://github.com/QingWei-Li/docsify/commit/d9b487e))
- **lifecycle:** continue to handle data ([955d3d5](https://github.com/QingWei-Li/docsify/commit/955d3d5))
- **render:** broken name link, fixed [#167](https://github.com/QingWei-Li/docsify/issues/167) ([91b66a5](https://github.com/QingWei-Li/docsify/commit/91b66a5))

<a name="4.1.8"></a>

## [4.1.8](https://github.com/QingWei-Li/docsify/compare/v4.1.7...v4.1.8) (2017-05-31)

### Bug Fixes

- auto replace version ([22b50f0](https://github.com/QingWei-Li/docsify/commit/22b50f0))
- update edit button demo ([ec887c1](https://github.com/QingWei-Li/docsify/commit/ec887c1))

### Features

- add edit button demo ([a64cee1](https://github.com/QingWei-Li/docsify/commit/a64cee1))
- add edit button demo, close [#162](https://github.com/QingWei-Li/docsify/issues/162) ([036fdac](https://github.com/QingWei-Li/docsify/commit/036fdac))

<a name="4.1.7"></a>

## [4.1.7](https://github.com/QingWei-Li/docsify/compare/v4.1.6...v4.1.7) (2017-05-30)

### Bug Fixes

- **ssr:** clean files ([0014895](https://github.com/QingWei-Li/docsify/commit/0014895))

<a name="4.1.6"></a>

## [4.1.6](https://github.com/QingWei-Li/docsify/compare/v4.1.5...v4.1.6) (2017-05-30)

### Bug Fixes

- **ssr:** add debug ([6b9e092](https://github.com/QingWei-Li/docsify/commit/6b9e092))

<a name="4.1.5"></a>

## [4.1.5](https://github.com/QingWei-Li/docsify/compare/v4.1.4...v4.1.5) (2017-05-30)

### Bug Fixes

- **ssr:** missing package ([6db8c9e](https://github.com/QingWei-Li/docsify/commit/6db8c9e))

<a name="4.1.4"></a>

## [4.1.4](https://github.com/QingWei-Li/docsify/compare/v4.1.3...v4.1.4) (2017-05-30)

### Bug Fixes

- **ssr:** file path ([79a83bc](https://github.com/QingWei-Li/docsify/commit/79a83bc))

<a name="4.1.3"></a>

## [4.1.3](https://github.com/QingWei-Li/docsify/compare/v4.1.2...v4.1.3) (2017-05-30)

### Bug Fixes

- update babel config ([9825db4](https://github.com/QingWei-Li/docsify/commit/9825db4))

<a name="4.1.2"></a>

## [4.1.2](https://github.com/QingWei-Li/docsify/compare/v4.1.1...v4.1.2) (2017-05-30)

### Bug Fixes

- update babel config ([80dba19](https://github.com/QingWei-Li/docsify/commit/80dba19))

<a name="4.1.1"></a>

## [4.1.1](https://github.com/QingWei-Li/docsify/compare/v4.1.0...v4.1.1) (2017-05-30)

### Bug Fixes

- build for ssr package ([4cb20a5](https://github.com/QingWei-Li/docsify/commit/4cb20a5))
- remove history mode ([0e74e6c](https://github.com/QingWei-Li/docsify/commit/0e74e6c))

<a name="4.1.0"></a>

# [4.1.0](https://github.com/QingWei-Li/docsify/compare/v4.0.2...v4.1.0) (2017-05-30)

<a name="4.0.2"></a>

## [4.0.2](https://github.com/QingWei-Li/docsify/compare/v4.0.1...v4.0.2) (2017-05-30)

### Bug Fixes

- basePath for history mode ([fc1cd3f](https://github.com/QingWei-Li/docsify/commit/fc1cd3f))

<a name="4.0.1"></a>

## [4.0.1](https://github.com/QingWei-Li/docsify/compare/v4.0.0...v4.0.1) (2017-05-29)

### Bug Fixes

- **ssr:** remove context ([4626157](https://github.com/QingWei-Li/docsify/commit/4626157))
- lint ([b764b6e](https://github.com/QingWei-Li/docsify/commit/b764b6e))

<a name="4.0.0"></a>

# [4.0.0](https://github.com/QingWei-Li/docsify/compare/v3.7.3...v4.0.0) (2017-05-29)

### Bug Fixes

- **render:** init event in ssr ([eba1c98](https://github.com/QingWei-Li/docsify/commit/eba1c98))
- lint ([1f4514d](https://github.com/QingWei-Li/docsify/commit/1f4514d))

### Features

- finish ssr ([3444884](https://github.com/QingWei-Li/docsify/commit/3444884))
- init docsify-server-renderer ([6dea685](https://github.com/QingWei-Li/docsify/commit/6dea685))
- support history mode ([f095eb8](https://github.com/QingWei-Li/docsify/commit/f095eb8))


================================================
FILE: CONTRIBUTING.md
================================================
# Contribute

## Introduction

First, thank you for considering contributing to docsify! It's people like you that make the open source community such a great community! 😊

We welcome any type of contribution, not only code. You can help with

- **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open)
- **Marketing**: writing blog posts, howto's, printing stickers, ...
- **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ...
- **Code**: take a look at the [open issues](https://github.com/docsifyjs/docsify/issues). Even if you can't write code, commenting on them, showing that you care about a given issue matters. It helps us triage them.
- **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/docsify).

## Your First Contribution

Working on your first Pull Request ever? You can learn how from this _free_ series, [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github).

## Online one-click setup for Contributing

You can use Gitpod (a free online VS Code-like IDE) for contributing. With a single click it'll launch a workspace and automatically:

- clone the docsify repo.
- install the dependencies.
- start `npm run dev`.

```bash
npm install && npm run dev
```

So that you can start straight away.

[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/docsifyjs/docsify)

- Fork it!
- Create your feature branch: `git checkout -b my-new-feature`
- Commit your changes: `git add . && git commit -m 'Add some feature'`
- Push to the branch: `git push origin my-new-feature`
- Submit a pull request

## Submitting code

Any code change should be submitted as a pull request. The description should explain what the code does and give steps to execute it. The pull request should also contain tests.

## Testing

Ensure that things work by running:

```sh
npm test
```

## Test Snapshots

If a snapshot fails, or to add new snapshots, run:

```sh
npx jest --updateSnapshot
```

## Code review process

The bigger the pull request, the longer it will take to review and merge. Try to break down large pull requests in smaller chunks that are easier to review and merge.
It is also always helpful to have some context for your pull request. What was the purpose? Why does it matter to you?

## Financial contributions

We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/docsify).
Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.

## Questions

If you have any questions, create an [issue](https://github.com/docsifyjs/docsify/issues) (protip: do a quick search first to see if someone else didn't ask the same question before!).
You can also reach us at hello@docsify.opencollective.com.

## Credits

### Contributors

Thank you to all the people who have already contributed to docsify!
<a href="graphs/contributors"><img src="https://opencollective.com/docsify/contributors.svg?width=890" /></a>

### Backers

Thank you to all our backers! [[Become a backer](https://opencollective.com/docsify#backer)]

<a href="https://opencollective.com/docsify#backers" target="_blank"><img src="https://opencollective.com/docsify/backers.svg?width=890"></a>

### Sponsors

Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/docsify#sponsor))

<a href="https://opencollective.com/docsify/sponsor/0/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/1/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/2/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/3/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/4/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/5/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/6/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/7/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/8/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/docsify/sponsor/9/website" target="_blank"><img src="https://opencollective.com/docsify/sponsor/9/avatar.svg"></a>

<!-- This `CONTRIBUTING.md` is based on @nayafia's template https://github.com/nayafia/contributing-template -->


================================================
FILE: Dockerfile
================================================
FROM mcr.microsoft.com/playwright:focal
WORKDIR /app
COPY . .
RUN rm package-lock.json
RUN npm install
RUN npx playwright install  
RUN npm run build
ENTRYPOINT ["npm", "run"]
CMD ["test"]

================================================
FILE: HISTORY.md
================================================
<!-- Historical history file (do not edit). -->

<a name="3.7.3"></a>
## [3.7.3](https://github.com/QingWei-Li/docsify/compare/v3.7.2...v3.7.3) (2017-05-22)


### Bug Fixes

* **render:** find => filter ([eca3368](https://github.com/QingWei-Li/docsify/commit/eca3368))



<a name="3.7.2"></a>
## [3.7.2](https://github.com/QingWei-Li/docsify/compare/v3.7.1...v3.7.2) (2017-05-19)



<a name="3.7.1"></a>
## [3.7.1](https://github.com/QingWei-Li/docsify/compare/v3.7.0...v3.7.1) (2017-05-19)


### Bug Fixes

* docsify-updated is undefined ([b2b4742](https://github.com/QingWei-Li/docsify/commit/b2b4742))



<a name="3.7.0"></a>
# [3.7.0](https://github.com/QingWei-Li/docsify/compare/v3.6.6...v3.7.0) (2017-05-16)


### Features

* add docsify-updated, close [#158](https://github.com/QingWei-Li/docsify/issues/158) ([d2be5ae](https://github.com/QingWei-Li/docsify/commit/d2be5ae))
* add externalLinkTarget, close [#149](https://github.com/QingWei-Li/docsify/issues/149) ([2d73285](https://github.com/QingWei-Li/docsify/commit/2d73285))



<a name="3.6.6"></a>
## [3.6.6](https://github.com/QingWei-Li/docsify/compare/v3.6.5...v3.6.6) (2017-05-06)


### Features

* support query string for the search, fixed [#156](https://github.com/QingWei-Li/docsify/issues/156) ([da75d70](https://github.com/QingWei-Li/docsify/commit/da75d70))



<a name="3.6.5"></a>
## [3.6.5](https://github.com/QingWei-Li/docsify/compare/v3.6.4...v3.6.5) (2017-04-28)


### Bug Fixes

* **util:** fix crash, fixed [#154](https://github.com/QingWei-Li/docsify/issues/154) ([51832d3](https://github.com/QingWei-Li/docsify/commit/51832d3))



<a name="3.6.4"></a>
## [3.6.4](https://github.com/QingWei-Li/docsify/compare/v3.6.3...v3.6.4) (2017-04-28)


### Bug Fixes

* **util:** correctly clean up duplicate slashes, fixed [#153](https://github.com/QingWei-Li/docsify/issues/153) ([76c041a](https://github.com/QingWei-Li/docsify/commit/76c041a))



<a name="3.6.3"></a>
## [3.6.3](https://github.com/QingWei-Li/docsify/compare/v3.6.2...v3.6.3) (2017-04-25)


### Bug Fixes

* **external-script:** script attrs ([2653849](https://github.com/QingWei-Li/docsify/commit/2653849))



<a name="3.6.2"></a>
## [3.6.2](https://github.com/QingWei-Li/docsify/compare/v3.6.0...v3.6.2) (2017-04-12)


### Features

* **event:** Collapse the sidebar when click outside element in the small screen ([9b7e5f5](https://github.com/QingWei-Li/docsify/commit/9b7e5f5))
* **external-script:** detect more than one script dom, fixed [#146](https://github.com/QingWei-Li/docsify/issues/146) ([94d6603](https://github.com/QingWei-Li/docsify/commit/94d6603))



<a name="3.6.0"></a>
# [3.6.0](https://github.com/QingWei-Li/docsify/compare/v3.5.2...v3.6.0) (2017-04-09)


### Features

* **render:** add mergeNavbar option, close [#125](https://github.com/QingWei-Li/docsify/issues/125), [#124](https://github.com/QingWei-Li/docsify/issues/124) ([#145](https://github.com/QingWei-Li/docsify/issues/145)) ([9220523](https://github.com/QingWei-Li/docsify/commit/9220523))



<a name="3.5.2"></a>
## [3.5.2](https://github.com/QingWei-Li/docsify/compare/v3.5.1...v3.5.2) (2017-04-05)



<a name="3.5.1"></a>
## [3.5.1](https://github.com/QingWei-Li/docsify/compare/v3.5.0...v3.5.1) (2017-03-25)


### Bug Fixes

* .md file extension regex ([594299f](https://github.com/QingWei-Li/docsify/commit/594299f))



<a name="3.5.0"></a>
# [3.5.0](https://github.com/QingWei-Li/docsify/compare/v3.4.4...v3.5.0) (2017-03-25)


### Bug Fixes

* adjust display on small screens ([bf35471](https://github.com/QingWei-Li/docsify/commit/bf35471))
* navbar labels for German ([b022aaf](https://github.com/QingWei-Li/docsify/commit/b022aaf))


### Features

* **route:** auto remove .md extension ([8f11653](https://github.com/QingWei-Li/docsify/commit/8f11653))



<a name="3.4.4"></a>
## [3.4.4](https://github.com/QingWei-Li/docsify/compare/v3.4.3...v3.4.4) (2017-03-17)


### Bug Fixes

* **search:** fix input style ([2d6a51b](https://github.com/QingWei-Li/docsify/commit/2d6a51b))



<a name="3.4.3"></a>
## [3.4.3](https://github.com/QingWei-Li/docsify/compare/v3.4.2...v3.4.3) (2017-03-16)



<a name="3.4.2"></a>
## [3.4.2](https://github.com/QingWei-Li/docsify/compare/v3.4.1...v3.4.2) (2017-03-11)


### Features

* **emojify:** add no-emoji option ([3aef37a](https://github.com/QingWei-Li/docsify/commit/3aef37a))



<a name="3.4.1"></a>
## [3.4.1](https://github.com/QingWei-Li/docsify/compare/v3.4.0...v3.4.1) (2017-03-10)


### Bug Fixes

* **dom:** Disable the dom cache when vue is present, fixed [#119](https://github.com/QingWei-Li/docsify/issues/119) ([b9a7275](https://github.com/QingWei-Li/docsify/commit/b9a7275))



<a name="3.4.0"></a>
# [3.4.0](https://github.com/QingWei-Li/docsify/compare/v3.3.0...v3.4.0) (2017-03-09)


### Features

* **zoom-image:** add plugin ([50fa6fc](https://github.com/QingWei-Li/docsify/commit/50fa6fc))



<a name="3.3.0"></a>
# [3.3.0](https://github.com/QingWei-Li/docsify/compare/v3.2.0...v3.3.0) (2017-03-07)



<a name="3.2.0"></a>
# [3.2.0](https://github.com/QingWei-Li/docsify/compare/v3.1.2...v3.2.0) (2017-02-28)


### Bug Fixes

* **fetch:** load sidebar and navbar for parent path, fixed [#100](https://github.com/QingWei-Li/docsify/issues/100) ([f3fc596](https://github.com/QingWei-Li/docsify/commit/f3fc596))
* **render:** Toc rendering error, fixed [#106](https://github.com/QingWei-Li/docsify/issues/106) ([0d59ee9](https://github.com/QingWei-Li/docsify/commit/0d59ee9))


### Features

* **search:** Localization for no data tip, close [#103](https://github.com/QingWei-Li/docsify/issues/103) ([d3c9fbd](https://github.com/QingWei-Li/docsify/commit/d3c9fbd))



<a name="3.1.2"></a>
## [3.1.2](https://github.com/QingWei-Li/docsify/compare/v3.1.1...v3.1.2) (2017-02-27)



<a name="3.1.1"></a>
## [3.1.1](https://github.com/QingWei-Li/docsify/compare/v3.1.0...v3.1.1) (2017-02-24)


### Bug Fixes

* **render:** custom cover background image ([8f9bf29](https://github.com/QingWei-Li/docsify/commit/8f9bf29))
* **search:** don't search nameLink, fixed [#102](https://github.com/QingWei-Li/docsify/issues/102) ([507d9e8](https://github.com/QingWei-Li/docsify/commit/507d9e8))
* **tpl:** extra character, fixed [#101](https://github.com/QingWei-Li/docsify/issues/101) ([d67d25f](https://github.com/QingWei-Li/docsify/commit/d67d25f))



<a name="3.1.0"></a>
# [3.1.0](https://github.com/QingWei-Li/docsify/compare/v3.0.5...v3.1.0) (2017-02-22)


### Bug Fixes

* **search:** incorrect anchor link, fixed [#90](https://github.com/QingWei-Li/docsify/issues/90) ([b8a3d8f](https://github.com/QingWei-Li/docsify/commit/b8a3d8f))
* **sw:** update white list ([f2975a5](https://github.com/QingWei-Li/docsify/commit/f2975a5))


### Features

* **emoji:** add emoji plugin ([855c450](https://github.com/QingWei-Li/docsify/commit/855c450))



<a name="3.0.5"></a>
## [3.0.5](https://github.com/QingWei-Li/docsify/compare/v3.0.4...v3.0.5) (2017-02-21)


### Bug Fixes

* **event:** highlight sidebar when clicked, fixed [#86](https://github.com/QingWei-Li/docsify/issues/86) ([2a1157a](https://github.com/QingWei-Li/docsify/commit/2a1157a))
* **gen-tree:** cache toc list, fixed [#88](https://github.com/QingWei-Li/docsify/issues/88) ([3394ebb](https://github.com/QingWei-Li/docsify/commit/3394ebb))
* **layout.css:** loading style ([42b2dba](https://github.com/QingWei-Li/docsify/commit/42b2dba))


### Features

* **pwa:** add sw.js ([f7111b5](https://github.com/QingWei-Li/docsify/commit/f7111b5))



<a name="3.0.4"></a>
## [3.0.4](https://github.com/QingWei-Li/docsify/compare/v3.0.3...v3.0.4) (2017-02-20)


### Bug Fixes

* **render:** disable rendering sub list when loadSidebar is false ([35dd2e1](https://github.com/QingWei-Li/docsify/commit/35dd2e1))
* **render:** execute script ([780c1e5](https://github.com/QingWei-Li/docsify/commit/780c1e5))



<a name="3.0.3"></a>
## [3.0.3](https://github.com/QingWei-Li/docsify/compare/v3.0.2...v3.0.3) (2017-02-19)



<a name="3.0.2"></a>
## [3.0.2](https://github.com/QingWei-Li/docsify/compare/v3.0.1...v3.0.2) (2017-02-19)


### Bug Fixes

* **compiler:** link ([3b127a1](https://github.com/QingWei-Li/docsify/commit/3b127a1))
* **search:** add lazy input ([bf593a7](https://github.com/QingWei-Li/docsify/commit/bf593a7))



<a name="3.0.1"></a>
## [3.0.1](https://github.com/QingWei-Li/docsify/compare/v3.0.0...v3.0.1) (2017-02-19)


### Bug Fixes

* **route:** empty alias ([cd99b52](https://github.com/QingWei-Li/docsify/commit/cd99b52))



<a name="3.0.0"></a>
# [3.0.0](https://github.com/QingWei-Li/docsify/compare/v2.4.3...v3.0.0) (2017-02-19)


### Bug Fixes

* **compiler:** link ([c7e09c3](https://github.com/QingWei-Li/docsify/commit/c7e09c3))
* **render:** support html file ([7b6a2ac](https://github.com/QingWei-Li/docsify/commit/7b6a2ac))
* **search:** escape html ([fcb66e8](https://github.com/QingWei-Li/docsify/commit/fcb66e8))
* **search:** fix default config ([2efd859](https://github.com/QingWei-Li/docsify/commit/2efd859))


### Features

* **front-matter:** add front matter[WIP] ([dbb9278](https://github.com/QingWei-Li/docsify/commit/dbb9278))
* **render:** add auto header ([b7768b1](https://github.com/QingWei-Li/docsify/commit/b7768b1))
* **search:** Localization for search placeholder, close [#80](https://github.com/QingWei-Li/docsify/issues/80) ([2351c3e](https://github.com/QingWei-Li/docsify/commit/2351c3e))
* **themes:** add loading info ([86594a3](https://github.com/QingWei-Li/docsify/commit/86594a3))



<a name="2.4.3"></a>
## [2.4.3](https://github.com/QingWei-Li/docsify/compare/v2.4.2...v2.4.3) (2017-02-15)



<a name="2.4.2"></a>
## [2.4.2](https://github.com/QingWei-Li/docsify/compare/v2.4.1...v2.4.2) (2017-02-14)


### Bug Fixes

* **index:** load file path error ([dc536a3](https://github.com/QingWei-Li/docsify/commit/dc536a3))



<a name="2.4.1"></a>
## [2.4.1](https://github.com/QingWei-Li/docsify/compare/v2.4.0...v2.4.1) (2017-02-13)


### Bug Fixes

* **index:** cover page ([dd0c84b](https://github.com/QingWei-Li/docsify/commit/dd0c84b))



<a name="2.4.0"></a>
# [2.4.0](https://github.com/QingWei-Li/docsify/compare/v2.3.0...v2.4.0) (2017-02-13)


### Features

* **hook:** add doneEach ([c6f7602](https://github.com/QingWei-Li/docsify/commit/c6f7602))



<a name="2.3.0"></a>
# [2.3.0](https://github.com/QingWei-Li/docsify/compare/v2.2.1...v2.3.0) (2017-02-13)


### Bug Fixes

* **event:**  has no effect on a FF mobile browser, fixed [#67](https://github.com/QingWei-Li/docsify/issues/67) ([0ff36c2](https://github.com/QingWei-Li/docsify/commit/0ff36c2))
* **render:** custom marked renderer ([bf559b4](https://github.com/QingWei-Li/docsify/commit/bf559b4))
* **render:** fix render link ([a866744](https://github.com/QingWei-Li/docsify/commit/a866744))
* **render:** image url ([6f87529](https://github.com/QingWei-Li/docsify/commit/6f87529))
* **render:** render link ([38ea660](https://github.com/QingWei-Li/docsify/commit/38ea660))
* **src:** fix route ([324301a](https://github.com/QingWei-Li/docsify/commit/324301a))
* **src:** get alias ([784173e](https://github.com/QingWei-Li/docsify/commit/784173e))
* **src:** get alias ([ce99a04](https://github.com/QingWei-Li/docsify/commit/ce99a04))
* **themes:** fix navbar style ([fa54b52](https://github.com/QingWei-Li/docsify/commit/fa54b52))
* **themes:** update navbar style ([4864d1b](https://github.com/QingWei-Li/docsify/commit/4864d1b))


### Features

* **hook:** support custom plugin ([9e81a59](https://github.com/QingWei-Li/docsify/commit/9e81a59))
* **src:** add alias feature ([24412cd](https://github.com/QingWei-Li/docsify/commit/24412cd))
* **src:** dynamic title and fix sidebar style ([6b30eb6](https://github.com/QingWei-Li/docsify/commit/6b30eb6))



<a name="2.2.1"></a>
## [2.2.1](https://github.com/QingWei-Li/docsify/compare/v2.2.0...v2.2.1) (2017-02-11)


### Bug Fixes

* **event:** scroll active sidebar ([50f5fc2](https://github.com/QingWei-Li/docsify/commit/50f5fc2))
* **search:** crash when not content, fixed [#68](https://github.com/QingWei-Li/docsify/issues/68) ([9d3cc89](https://github.com/QingWei-Li/docsify/commit/9d3cc89))
* **search:** not work in mobile ([3941304](https://github.com/QingWei-Li/docsify/commit/3941304))



<a name="2.2.0"></a>
# [2.2.0](https://github.com/QingWei-Li/docsify/compare/v2.1.0...v2.2.0) (2017-02-09)


### Features

* **plugins:** add Google Analytics plugin ([#66](https://github.com/QingWei-Li/docsify/issues/66)) ([ac61bb0](https://github.com/QingWei-Li/docsify/commit/ac61bb0))



<a name="2.1.0"></a>
# [2.1.0](https://github.com/QingWei-Li/docsify/compare/v2.0.3...v2.1.0) (2017-02-09)


### Bug Fixes

* render name ([12e2479](https://github.com/QingWei-Li/docsify/commit/12e2479))
* **vue.css:** update sidebar style ([fc140ef](https://github.com/QingWei-Li/docsify/commit/fc140ef))


### Features

* add search, close [#43](https://github.com/QingWei-Li/docsify/issues/43) ([eb5ff3e](https://github.com/QingWei-Li/docsify/commit/eb5ff3e))



<a name="2.0.3"></a>
## [2.0.3](https://github.com/QingWei-Li/docsify/compare/v2.0.2...v2.0.3) (2017-02-07)


### Bug Fixes

* css var polyfill ([8cd386a](https://github.com/QingWei-Li/docsify/commit/8cd386a))
* css var polyfill ([cbaee21](https://github.com/QingWei-Li/docsify/commit/cbaee21))
* rendering emojis ([8c7e4d7](https://github.com/QingWei-Li/docsify/commit/8c7e4d7))



<a name="2.0.2"></a>
## [2.0.2](https://github.com/QingWei-Li/docsify/compare/v2.0.1...v2.0.2) (2017-02-05)


### Bug Fixes

* button style in cover page ([4470855](https://github.com/QingWei-Li/docsify/commit/4470855))



<a name="2.0.1"></a>
## [2.0.1](https://github.com/QingWei-Li/docsify/compare/v2.0.0...v2.0.1) (2017-02-05)



<a name="2.0.0"></a>
# [2.0.0](https://github.com/QingWei-Li/docsify/compare/v1.10.5...v2.0.0) (2017-02-05)


### Features

* customize the theme color ([5cc9f05](https://github.com/QingWei-Li/docsify/commit/5cc9f05))



<a name="1.10.5"></a>
## [1.10.5](https://github.com/QingWei-Li/docsify/compare/v1.10.4...v1.10.5) (2017-01-28)



<a name="1.10.4"></a>
## [1.10.4](https://github.com/QingWei-Li/docsify/compare/v1.10.3...v1.10.4) (2017-01-27)



<a name="1.10.3"></a>
## [1.10.3](https://github.com/QingWei-Li/docsify/compare/v1.10.2...v1.10.3) (2017-01-27)



<a name="1.10.2"></a>
## [1.10.2](https://github.com/QingWei-Li/docsify/compare/v1.10.1...v1.10.2) (2017-01-25)



<a name="1.10.1"></a>
## [1.10.1](https://github.com/QingWei-Li/docsify/compare/v1.10.0...v1.10.1) (2017-01-25)



<a name="1.10.0"></a>
# [1.10.0](https://github.com/QingWei-Li/docsify/compare/v1.9.0...v1.10.0) (2017-01-25)



<a name="1.9.0"></a>
# [1.9.0](https://github.com/QingWei-Li/docsify/compare/v1.8.0...v1.9.0) (2017-01-24)



<a name="1.8.0"></a>
# [1.8.0](https://github.com/QingWei-Li/docsify/compare/v1.7.4...v1.8.0) (2017-01-24)



<a name="1.7.4"></a>
## [1.7.4](https://github.com/QingWei-Li/docsify/compare/v1.7.3...v1.7.4) (2017-01-13)



<a name="1.7.3"></a>
## [1.7.3](https://github.com/QingWei-Li/docsify/compare/v1.7.2...v1.7.3) (2017-01-13)



<a name="1.7.2"></a>
## [1.7.2](https://github.com/QingWei-Li/docsify/compare/v1.7.1...v1.7.2) (2017-01-12)



<a name="1.7.1"></a>
## [1.7.1](https://github.com/QingWei-Li/docsify/compare/v1.7.0...v1.7.1) (2017-01-12)



<a name="1.7.0"></a>
# [1.7.0](https://github.com/QingWei-Li/docsify/compare/v1.6.1...v1.7.0) (2017-01-12)



<a name="1.6.1"></a>
## [1.6.1](https://github.com/QingWei-Li/docsify/compare/v1.6.0...v1.6.1) (2017-01-10)



<a name="1.6.0"></a>
# [1.6.0](https://github.com/QingWei-Li/docsify/compare/v1.5.2...v1.6.0) (2017-01-10)



<a name="1.5.2"></a>
## [1.5.2](https://github.com/QingWei-Li/docsify/compare/v1.5.1...v1.5.2) (2017-01-10)



<a name="1.5.1"></a>
## [1.5.1](https://github.com/QingWei-Li/docsify/compare/v1.5.0...v1.5.1) (2017-01-09)



<a name="1.5.0"></a>
# [1.5.0](https://github.com/QingWei-Li/docsify/compare/v1.4.3...v1.5.0) (2017-01-04)


### Features

* Markdown parser is configurable, [#42](https://github.com/QingWei-Li/docsify/issues/42) ([8b1000a](https://github.com/QingWei-Li/docsify/commit/8b1000a))



<a name="1.4.3"></a>
## [1.4.3](https://github.com/QingWei-Li/docsify/compare/v1.4.2...v1.4.3) (2017-01-01)



<a name="1.4.2"></a>
## [1.4.2](https://github.com/QingWei-Li/docsify/compare/v1.4.1...v1.4.2) (2016-12-31)



<a name="1.4.1"></a>
## [1.4.1](https://github.com/QingWei-Li/docsify/compare/v1.4.0...v1.4.1) (2016-12-31)



<a name="1.4.0"></a>
# [1.4.0](https://github.com/QingWei-Li/docsify/compare/v1.3.5...v1.4.0) (2016-12-31)



<a name="1.3.5"></a>
## [1.3.5](https://github.com/QingWei-Li/docsify/compare/v1.3.4...v1.3.5) (2016-12-25)



<a name="1.3.4"></a>
## [1.3.4](https://github.com/QingWei-Li/docsify/compare/v1.3.3...v1.3.4) (2016-12-25)



<a name="1.3.3"></a>
## [1.3.3](https://github.com/QingWei-Li/docsify/compare/v1.3.2...v1.3.3) (2016-12-23)



<a name="1.3.2"></a>
## [1.3.2](https://github.com/QingWei-Li/docsify/compare/v1.3.1...v1.3.2) (2016-12-22)



<a name="1.3.1"></a>
## [1.3.1](https://github.com/QingWei-Li/docsify/compare/v1.3.0...v1.3.1) (2016-12-22)



<a name="1.3.0"></a>
# [1.3.0](https://github.com/QingWei-Li/docsify/compare/v1.2.0...v1.3.0) (2016-12-21)



<a name="1.2.0"></a>
# [1.2.0](https://github.com/QingWei-Li/docsify/compare/v1.1.7...v1.2.0) (2016-12-20)



<a name="1.1.7"></a>
## [1.1.7](https://github.com/QingWei-Li/docsify/compare/v1.1.6...v1.1.7) (2016-12-19)



<a name="1.1.6"></a>
## [1.1.6](https://github.com/QingWei-Li/docsify/compare/v1.1.5...v1.1.6) (2016-12-18)



<a name="1.1.5"></a>
## [1.1.5](https://github.com/QingWei-Li/docsify/compare/v1.1.4...v1.1.5) (2016-12-18)



<a name="1.1.4"></a>
## [1.1.4](https://github.com/QingWei-Li/docsify/compare/v1.1.3...v1.1.4) (2016-12-17)



<a name="1.1.3"></a>
## [1.1.3](https://github.com/QingWei-Li/docsify/compare/v1.1.2...v1.1.3) (2016-12-17)



<a name="1.1.2"></a>
## [1.1.2](https://github.com/QingWei-Li/docsify/compare/v1.1.1...v1.1.2) (2016-12-17)



<a name="1.1.1"></a>
## [1.1.1](https://github.com/QingWei-Li/docsify/compare/v1.1.0...v1.1.1) (2016-12-17)



<a name="1.1.0"></a>
# [1.1.0](https://github.com/QingWei-Li/docsify/compare/v1.0.3...v1.1.0) (2016-12-16)



<a name="1.0.3"></a>
## [1.0.3](https://github.com/QingWei-Li/docsify/compare/v1.0.2...v1.0.3) (2016-12-13)



<a name="1.0.2"></a>
## [1.0.2](https://github.com/QingWei-Li/docsify/compare/v1.0.1...v1.0.2) (2016-12-13)



<a name="1.0.1"></a>
## [1.0.1](https://github.com/QingWei-Li/docsify/compare/v1.0.0...v1.0.1) (2016-12-08)



<a name="1.0.0"></a>
# [1.0.0](https://github.com/QingWei-Li/docsify/compare/v0.7.0...v1.0.0) (2016-12-08)



<a name="0.7.0"></a>
# [0.7.0](https://github.com/QingWei-Li/docsify/compare/v0.6.1...v0.7.0) (2016-11-30)



<a name="0.6.1"></a>
## [0.6.1](https://github.com/QingWei-Li/docsify/compare/v0.6.0...v0.6.1) (2016-11-29)



<a name="0.6.0"></a>
# [0.6.0](https://github.com/QingWei-Li/docsify/compare/v0.5.0...v0.6.0) (2016-11-29)



<a name="0.5.0"></a>
# [0.5.0](https://github.com/QingWei-Li/docsify/compare/v0.4.2...v0.5.0) (2016-11-28)



<a name="0.4.2"></a>
## [0.4.2](https://github.com/QingWei-Li/docsify/compare/v0.4.1...v0.4.2) (2016-11-28)



<a name="0.4.1"></a>
## [0.4.1](https://github.com/QingWei-Li/docsify/compare/v0.4.0...v0.4.1) (2016-11-28)



<a name="0.4.0"></a>
# [0.4.0](https://github.com/QingWei-Li/docsify/compare/v0.3.1...v0.4.0) (2016-11-27)


### Features

* custom sidebar, [#4](https://github.com/QingWei-Li/docsify/issues/4) ([#5](https://github.com/QingWei-Li/docsify/issues/5)) ([37e7984](https://github.com/QingWei-Li/docsify/commit/37e7984))



<a name="0.3.1"></a>
## [0.3.1](https://github.com/QingWei-Li/docsify/compare/v0.3.0...v0.3.1) (2016-11-27)



<a name="0.3.0"></a>
# [0.3.0](https://github.com/QingWei-Li/docsify/compare/v0.2.1...v0.3.0) (2016-11-27)



<a name="0.2.1"></a>
## [0.2.1](https://github.com/QingWei-Li/docsify/compare/v0.2.0...v0.2.1) (2016-11-26)



<a name="0.2.0"></a>
# [0.2.0](https://github.com/QingWei-Li/docsify/compare/v0.1.0...v0.2.0) (2016-11-26)



<a name="0.1.0"></a>
# [0.1.0](https://github.com/QingWei-Li/docsify/compare/v0.0.5...v0.1.0) (2016-11-26)



<a name="0.0.5"></a>
## [0.0.5](https://github.com/QingWei-Li/docsify/compare/v0.0.4...v0.0.5) (2016-11-24)



<a name="0.0.4"></a>
## [0.0.4](https://github.com/QingWei-Li/docsify/compare/v0.0.3...v0.0.4) (2016-11-22)



<a name="0.0.3"></a>
## [0.0.3](https://github.com/QingWei-Li/docsify/compare/v0.0.2...v0.0.3) (2016-11-20)



<a name="0.0.2"></a>
## [0.0.2](https://github.com/QingWei-Li/docsify/compare/v0.0.1...v0.0.2) (2016-11-20)



<a name="0.0.1"></a>
## 0.0.1 (2016-11-20)


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2016 - present Docsify Contributors (https://github.com/docsifyjs/docsify/graphs/contributors)

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
================================================
<p align="center">
  <a href="https://docsify.js.org">
    <img alt="docsify" src="./docs/_media/icon.svg">
  </a>
</p>

<p align="center">
  A magical documentation site generator.
</p>

<p align="center">
  <a href="#backers"><img alt="Backers on Open Collective" src="https://opencollective.com/docsify/backers/badge.svg?style=flat-square"></a>
  <a href="#sponsors">
    <img alt="Sponsors on Open Collective" src="https://opencollective.com/docsify/sponsors/badge.svg?style=flat-square"></a>
  <a href="https://github.com/docsifyjs/docsify/actions/workflows/test.yml"><img src="https://github.com/docsifyjs/docsify/actions/workflows/test.yml/badge.svg" alt="Build & Test"></a>
  <a href="https://www.npmjs.com/package/docsify"><img alt="npm" src="https://img.shields.io/npm/v/docsify.svg?style=flat-square"></a>
  <a href="https://discord.gg/3NwKFyR"><img alt="Join Discord community and chat about Docsify" src="https://img.shields.io/discord/713647066802421792.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2&cacheSeconds=60"></a>
  <a href="https://gitpod.io/#https://github.com/docsifyjs/docsify"><img src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod" alt="Gitpod Ready-to-Code"></a>
</p>

<p align="center">Gold Sponsor via <a href="https://opencollective.com/docsify">Open Collective</a></p>

<p align="center">
  <a href="https://opencollective.com/docsify/order/3254">
    <img src="https://opencollective.com/docsify/tiers/gold-sponsor.svg?avatarHeight=48">
  </a>
</p>

Docsify turns one or more Markdown files into a Website, with no build process required.

## Features

- No statically built HTML files
- Simple and lightweight
- Smart full-text search plugin
- Multiple themes
- Useful plugin API
- Emoji support

## Quick Start

Get going fast by using a static web server or GitHub Pages with this ready-to-use [Docsify Template](https://github.com/docsifyjs/docsify-template), review the [quick start tutorial](https://docsify.js.org/#/quickstart) or jump right into a CodeSandbox example site with the button below.

[![Edit 307qqv236](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/307qqv236)

## Showcase

A large collection of showcase projects are included in [awesome-docsify](https://github.com/docsifyjs/awesome-docsify#showcase).

## Links

- [Documentation](https://docsify.js.org)
- [Docsify CLI (Command Line Interface)](https://github.com/docsifyjs/docsify-cli)
- CDN: [UNPKG](https://unpkg.com/docsify/) | [jsDelivr](https://cdn.jsdelivr.net/npm/docsify/) | [cdnjs](https://cdnjs.com/libraries/docsify)
- [`develop` branch preview](https://docsify-preview.vercel.app/)
- [Awesome docsify](https://github.com/docsifyjs/awesome-docsify)
- [Community chat](https://discord.gg/3NwKFyR)

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md).

## Backers

Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/docsify/contribute)]

<a href="https://opencollective.com/docsify#backers" target="_blank"><img src="https://opencollective.com/docsify/backers.svg?width=890"></a>

## Sponsors

Thank you for supporting this project! ❤️ [[Become a sponsor](https://opencollective.com/docsify/contribute)]

<img src="https://opencollective.com/docsify/sponsors.svg?width=890" />

## Contributors

This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].

<a href="https://github.com/docsifyjs/docsify/graphs/contributors"><img src="https://opencollective.com/docsify/contributors.svg?width=890" /></a>

## License

[MIT](LICENSE)


================================================
FILE: SECURITY.md
================================================
# Security Policy

If you believe you have found a security vulnerability in docsify, please report it to us asap.

## Reporting a Vulnerability

**Please do not report security vulnerabilities through our public GitHub issues.**

Send email to us via :email: maintainers@docsifyjs.org.

Please include as much of the following information as possible to help us better understand the possible issue:

- Type of issue (e.g. cross-site scripting)
- Full paths of source file(s) related to the manifestation of the issue
- The location of the affected source code (tag/branch/commit or direct URL)
- Any special configuration required to reproduce the issue
- Step-by-step instructions to reproduce the issue
- Proof-of-concept or exploit code
- Impact of the issue, including how an attacker might exploit the issue

This information will help us triage your report more quickly.

Thank you in advance.


================================================
FILE: babel.config.json
================================================
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": "defaults"
      }
    ]
  ]
}


================================================
FILE: build/cover.js
================================================
import fs from 'fs';
import { relative } from './util.js';

const read = fs.readFileSync;
const write = fs.writeFileSync;
const pkgPath = relative(import.meta, '..', 'package.json');
const pkg = JSON.parse(read(pkgPath).toString());
const version = process.env.VERSION || pkg.version;

const file = relative(import.meta, '..', 'docs', '_coverpage.md');
let cover = read(file, 'utf8').toString();

console.log('Replace version number in cover page...');
cover = cover.replace(
  /<small>(\S+)?<\/small>/g,
  /* html */ `<small>${version}</small>`,
);
write(file, cover);


================================================
FILE: build/emoji.js
================================================
import fs from 'fs';
import path from 'path';
import axios from 'axios';

const filePaths = {
  emojiMarkdown: path.resolve(process.cwd(), 'docs', 'emoji.md'),
  emojiJS: path.resolve(
    process.cwd(),
    'src',
    'core',
    'render',
    'emoji-data.js',
  ),
};

async function getEmojiData() {
  const emojiDataURL = 'https://api.github.com/emojis';

  console.info(`- Fetching emoji data from ${emojiDataURL}`);

  const response = await axios.get(emojiDataURL);
  const baseURL = Object.values(response.data)
    .find(url => /unicode\//)
    .split('unicode/')[0];
  const data = { ...response.data };

  // Remove base URL from emoji URLs
  Object.entries(data).forEach(
    ([key, value]) => (data[key] = value.replace(baseURL, '')),
  );

  console.info(`- Retrieved ${Object.keys(data).length} emoji entries`);

  return {
    baseURL,
    data,
  };
}

function writeEmojiPage(emojiData) {
  const isExistingPage = fs.existsSync(filePaths.emojiMarkdown);
  const emojiPage =
    (isExistingPage && fs.readFileSync(filePaths.emojiMarkdown, 'utf8')) ||
    '<!-- START -->\n\n<!-- END -->';
  const emojiRegEx = /(<!--\s*START.*-->\n)([\s\S]*)(\n<!--\s*END.*-->)/;
  const emojiMatch = emojiPage.match(emojiRegEx);
  const emojiMarkdownStart = emojiMatch[1].trim();
  const emojiMarkdown = emojiMatch[2].trim();
  const emojiMarkdownEnd = emojiMatch[3].trim();
  const newEmojiMarkdown = Object.keys(emojiData.data)
    .reduce(
      (preVal, curVal) =>
        (preVal += `:${curVal}: ` + '`' + `:${curVal}:` + '`' + '\n\n'),
      '',
    )
    .trim();

  if (emojiMarkdown !== newEmojiMarkdown) {
    const newEmojiPage = emojiPage.replace(
      emojiMatch[0],
      `${emojiMarkdownStart}\n\n${newEmojiMarkdown}\n\n${emojiMarkdownEnd}`,
    );

    fs.writeFileSync(filePaths.emojiMarkdown, newEmojiPage);

    console.info(
      `- ${!isExistingPage ? 'Created' : 'Updated'}: ${filePaths.emojiMarkdown}`,
    );
  } else {
    console.info(`- No changes: ${filePaths.emojiMarkdown}`);
  }
}

function writeEmojiJS(emojiData) {
  const isExistingPage = fs.existsSync(filePaths.emojiJS);
  const emojiJS = isExistingPage && fs.readFileSync(filePaths.emojiJS, 'utf8');
  const newEmojiJS = [
    '// =============================================================================',
    '// DO NOT EDIT: This file is auto-generated by an /build/emoji.js',
    '// =============================================================================\n',
    `export default ${JSON.stringify(emojiData, {}, 2)}`,
  ].join('\n');

  if (!emojiJS || emojiJS !== newEmojiJS) {
    fs.writeFileSync(filePaths.emojiJS, newEmojiJS);

    console.info(
      `- ${!isExistingPage ? 'Created' : 'Updated'}: ${filePaths.emojiJS}`,
    );
  } else {
    console.info(`- No changes: ${filePaths.emojiJS}`);
  }
}

console.info('Build emoji');

const emojiData = await getEmojiData();

writeEmojiPage(emojiData);
writeEmojiJS(emojiData);

console.info('Finish update');


================================================
FILE: build/release.sh
================================================
set -e

if [[ -z $1 ]]; then
  echo "Enter new version: "
  read VERSION
else
  VERSION=$1
fi

RELEASE_TAG=${RELEASE_TAG:-""}

if [[ -n "$RELEASE_TAG" && "$VERSION" != *"$RELEASE_TAG"* ]]; then
  RELEASE_MSG="$VERSION ($RELEASE_TAG)"
else
  RELEASE_MSG="$VERSION"
fi

read -p "Releasing $VERSION $RELEASE_TAG - are you sure? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
  echo "Releasing $VERSION ..."

  # Update version (don't commit or tag yet)
  npm --no-git-tag-version version "$VERSION"

  # Build and test
  npm run build
  npm run test:update:snapshot
  npm run test
  git stash
  npm run build:v4 # builds legacy v4 lib/ and themes/ folders for backwards compat while people transition to v5.
  git stash pop

  # Changelog
  npx conventional-changelog -p angular -i CHANGELOG.md -s

  # Commit all changes
  git add -A
  git commit -m "[release] $RELEASE_MSG"

  # Tag and push
  git tag "v$VERSION"
  git push origin "v$VERSION"
  git push

  # Publish to npm
  if [[ -z $RELEASE_TAG ]]; then
    npm publish
  else
    npm publish --tag "$RELEASE_TAG"
  fi

  npm run clean:v4 # clean up legacy v4 build files
fi


================================================
FILE: build/util.js
================================================
import url from 'url';
import path from 'path';

/** Get a new path relative to the current module (pass import.meta). */
export const relative = (meta, ...to) =>
  path.resolve(path.dirname(url.fileURLToPath(meta.url)), ...to);


================================================
FILE: docs/.nojekyll
================================================


================================================
FILE: docs/CNAME
================================================
docsify.js.org

================================================
FILE: docs/README.md
================================================
# docsify

> A magical documentation site generator.

## What it is

Docsify turns your Markdown files into a documentation website instantly. Unlike most other documentation site generator tools, it doesn't need to build HTML files. Instead, it dynamically loads and parses your Markdown files and displays them as a website. To get started, create an `index.html` file and [deploy it on GitHub Pages](deploy.md) (for more details see the [Quick start](quickstart.md) guide).

## Features

- No statically built HTML files
- Simple and lightweight
- Smart full-text search plugin
- Multiple themes
- Useful plugin API
- Emoji support

## Examples

Check out the [Showcase](https://github.com/docsifyjs/awesome-docsify#showcase) to see docsify in use.

## Donate

Please consider donating if you think docsify is helpful to you or that my work is valuable. I am happy if you can help me [buy a cup of coffee](https://github.com/QingWei-Li/donate). :heart:

## Community

Users and the development team are usually in the [Discord server](https://discord.gg/3NwKFyR).


================================================
FILE: docs/_coverpage.md
================================================
<!-- markdownlint-disable first-line-h1 -->

![logo](_media/icon.svg)

# docsify <small>5.0.0-rc.4</small> :id=docsify

> A magical documentation site generator

- Simple and lightweight
- No statically built HTML files
- Multiple themes

[Get Started](#docsify)
[GitHub](https://github.com/docsifyjs/docsify/)

<!-- ![color](#f0f0f0) -->
<!-- ![](/_media/icon.svg) -->


================================================
FILE: docs/_media/example-with-yaml.md
================================================
---
author: John Smith
date: 2020-1-1
---

> This is from the `example-with-yaml.md`


================================================
FILE: docs/_media/example.html
================================================
<style>
  html,
  body {
    margin: 0;
    padding: 0;
    min-height: 100%;
  }

  body {
    background-color: #4158d0;
    background-image: linear-gradient(
      43deg,
      #4158d0 0%,
      #c850c0 46%,
      #ffcc70 100%
    );
    color: #fff;
    font-family: sans-serif;
  }

  main {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
  }
</style>

<main>
  <p>Example HTML Page</p>
</main>


================================================
FILE: docs/_media/example.js
================================================
import fetch from 'fetch';

const URL = 'https://example.com';
const PORT = 8080;

/// [demo]
const result = fetch(`${URL}:${PORT}`)
  .then(response => {
    return response.json();
  })
  .then(myJson => {
    console.log(JSON.stringify(myJson));
  });
/// [demo]

result.then(console.log).catch(console.error);


================================================
FILE: docs/_media/example.md
================================================
> This is from the `example.md`


================================================
FILE: docs/_navbar.md
================================================
<!-- markdownlint-disable first-line-h1 -->

- Translations

  - [English](/)
  - [简体中文](/zh-cn/)


================================================
FILE: docs/_sidebar.md
================================================
<!-- markdownlint-disable first-line-h1 -->

- Getting started

  - [Quick start](quickstart.md)
  - [Adding pages](adding-pages.md)
  - [Cover page](cover.md)
  - [Custom navbar](custom-navbar.md)

- Customization

  - [Configuration](configuration.md)
  - [Themes](themes.md)
  - [List of Plugins](plugins.md)
  - [Write a Plugin](write-a-plugin.md)
  - [Markdown configuration](markdown.md)
  - [Language highlighting](language-highlight.md)
  - [Emoji](emoji.md)

- Guide

  - [Deploy](deploy.md)
  - [Helpers](helpers.md)
  - [Vue compatibility](vue.md)
  - [CDN](cdn.md)
  - [Offline Mode (PWA)](pwa.md)
  - [Embed Files](embed-files.md)
  - [UI Kit](ui-kit.md)

- Upgrading

  - [v4 to v5](v5-upgrade.md)

* [Awesome docsify](awesome.md)
* [Changelog](changelog.md)


================================================
FILE: docs/adding-pages.md
================================================
# Adding pages

If you need more pages, you can simply create more markdown files in your docsify directory. If you create a file named `guide.md`, then it is accessible via `/#/guide`.

For example, the directory structure is as follows:

```text
.
└── docs
    ├── README.md
    ├── guide.md
    └── zh-cn
        ├── README.md
        └── guide.md
```

Matching routes

```text
docs/README.md        => http://domain.com
docs/guide.md         => http://domain.com/#/guide
docs/zh-cn/README.md  => http://domain.com/#/zh-cn/
docs/zh-cn/guide.md   => http://domain.com/#/zh-cn/guide
```

## Sidebar

In order to have a sidebar, you can create your own `_sidebar.md` (see [this documentation's sidebar](https://github.com/docsifyjs/docsify/blob/main/docs/_sidebar.md) for an example):

First, you need to set `loadSidebar` to **true**. Details are available in the [configuration paragraph](configuration#loadsidebar).

```html
<!-- index.html -->

<script>
  window.$docsify = {
    loadSidebar: true,
  };
</script>
<script src="//cdn.jsdelivr.net/npm/docsify@5/dist/docsify.min.js"></script>
```

Create the `_sidebar.md`:

```markdown
<!-- docs/_sidebar.md -->

- [Home](/)
- [Page 1](page-1.md)
```

To create section headers:

```markdown
<!-- docs/_sidebar.md -->

- Section Header 1

  - [Home](/)
  - [Page 1](page-1.md)

- Section Header 2

  - [Page 2](page-2.md)
  - [Page 3](page-3.md)
```

You need to create a `.nojekyll` in `./docs` to prevent GitHub Pages from ignoring files that begin with an underscore.

> [!IMPORTANT] Docsify only looks for `_sidebar.md` in the current folder, and uses that, otherwise it falls back to the one configured using `window.$docsify.loadSidebar` config.

Example file structure:

```text
└── docs/
    ├── _sidebar.md
    ├── index.md
    ├── getting-started.md
    └── running-services.md
```

## Nested Sidebars

You may want the sidebar to update after navigation to reflect the current directory. This can be done by adding a `_sidebar.md` file to each folder.

`_sidebar.md` is loaded from each level directory. If the current directory doesn't have `_sidebar.md`, it will fall back to the parent directory. If, for example, the current path is `/guide/quick-start`, the `_sidebar.md` will be loaded from `/guide/_sidebar.md`.

You can specify `alias` to avoid unnecessary fallback.

```html
<script>
  window.$docsify = {
    loadSidebar: true,
    alias: {
      '/.*/_sidebar.md': '/_sidebar.md',
    },
  };
</script>
```

> [!IMPORTANT] You can create a `README.md` file in a subdirectory to use it as the landing page for the route.

## Set Page Titles from Sidebar Selection

A page's `title` tag is generated from the _selected_ sidebar item name. For better SEO, you can customize the title by specifying a string after the filename.

```markdown
<!-- docs/_sidebar.md -->

- [Home](/)
- [Guide](guide.md 'The greatest guide in the world')
```

## Table of Contents

Once you've created `_sidebar.md`, the sidebar content is automatically generated based on the headers in the markdown files.

A custom sidebar can also automatically generate a table of contents by setting a `subMaxLevel`, compare [subMaxLevel configuration](configuration#submaxlevel).

```html
<!-- index.html -->

<script>
  window.$docsify = {
    loadSidebar: true,
    subMaxLevel: 2,
  };
</script>
<script src="//cdn.jsdelivr.net/npm/docsify@5/dist/docsify.min.js"></script>
```

## Ignoring Subheaders

When `subMaxLevel` is set, each header is automatically added to the table of contents by default. If you want to ignore a specific header, add `<!-- {docsify-ignore} -->` to it.

```markdown
# Getting Started

## Header <!-- {docsify-ignore} -->

This header won't appear in the sidebar table of contents.
```

To ignore all headers on a specific page, you can use `<!-- {docsify-ignore-all} -->` on the first header of the page.

```markdown
# Getting Started <!-- {docsify-ignore-all} -->

## Header

This header won't appear in the sidebar table of contents.
```

Both `<!-- {docsify-ignore} -->` and `<!-- {docsify-ignore-all} -->` will not be rendered on the page when used.

And the `{docsify-ignore}` and `{docsify-ignore-all}` can do the samething as well.


================================================
FILE: docs/cdn.md
================================================
# CDN

The docsify [npm package](https://www.npmjs.com/package/docsify) is auto-published to CDNs with each release. The contents can be viewed on each CDN.

Docsify recommends [jsDelivr](//cdn.jsdelivr.net) as its preferred CDN:

- https://cdn.jsdelivr.net/npm/docsify/

Other CDNs are available and may be required in locations where jsDelivr is not available:

- https://cdnjs.com/libraries/docsify
- https://unpkg.com/browse/docsify/
- https://www.bootcdn.cn/docsify/

## Specifying versions

Note the `@` version lock in the CDN URLs below. This allows specifying the latest major, minor, patch, or specific [semver](https://semver.org) version number.

- MAJOR versions include breaking changes<br>
  `1.0.0` → `2.0.0`
- MINOR versions include non-breaking new functionality<br>
  `1.0.0` → `1.1.0`
- PATCH versions include non-breaking bug fixes<br>
  `1.0.0` → `1.0.1`

Uncompressed resources are available by omitting the `.min` from the filename.

## Latest "major" version

Specifying the latest major version allows your site to receive all non-breaking enhancements ("minor" updates) and bug fixes ("patch" updates) as they are released. This is good option for those who prefer a zero-maintenance way of keeping their site up to date with minimal risk as new versions are published.

> [!TIP] When a new major version is released, you will need to manually update the major version number after the `@` symbol in your CDN URLs.

<!-- prettier-ignore -->
```html
<!-- Theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@5/dist/themes/addons/vue.min.css" />

<!-- Docsify -->
<script src="//cdn.jsdelivr.net/npm/docsify@5/dist/docsify.min.js"></script>
```

## Specific version

Specifying an exact version prevents any future updates from affecting your site. This is good option for those who prefer to manually update their resources as new versions are published.

> [!TIP] When a new version is released, you will need to manually update the version number after the `@` symbol in your CDN URLs.

<!-- prettier-ignore -->
```html
<!-- Theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@5.0.0/dist/themes/addons/vue.min.css" />

<!-- Docsify -->
<script src="//cdn.jsdelivr.net/npm/docsify@5.0.0/dist/docsify.min.js"></script>
```


================================================
FILE: docs/configuration.md
================================================
# Configuration

You can configure Docsify by defining `window.$docsify` as an object:

```html
<script>
  window.$docsify = {
    repo: 'docsifyjs/docsify',
    maxLevel: 3,
    coverpage: true,
  };
</script>
```

The config can also be defined as a function, in which case the first argument is the Docsify `vm` instance. The function should return a config object. This can be useful for referencing `vm` in places like the markdown configuration:

```html
<script>
  window.$docsify = function (vm) {
    return {
      markdown: {
        renderer: {
          code(code, lang) {
            // ... use `vm` ...
          },
        },
      },
    };
  };
</script>
```

## alias

- Type: `Object`

Set the route alias. You can freely manage routing rules. Supports RegExp.
Do note that order matters! If a route can be matched by multiple aliases, the one you declared first takes precedence.

```js
window.$docsify = {
  alias: {
    '/foo/(.*)': '/bar/$1', // supports regexp
    '/zh-cn/changelog': '/changelog',
    '/changelog':
      'https://raw.githubusercontent.com/docsifyjs/docsify/main/CHANGELOG',

    // You may need this if you use routerMode:'history'.
    '/.*/_sidebar.md': '/_sidebar.md', // See #301
  },
};
```

> **Note** If you change [`routerMode`](#routermode) to `'history'`, you may
> want to configure an alias for your `_sidebar.md` and `_navbar.md` files.

## auto2top

- Type: `Boolean`
- Default: `false`

Scrolls to the top of the screen when the route is changed.

```js
window.$docsify = {
  auto2top: true,
};
```

## autoHeader

- Type: `Boolean`
- Default: `false`

If `loadSidebar` and `autoHeader` are both enabled, for each link in `_sidebar.md`, prepend a header to the page before converting it to HTML — but only if the page does not already contain an H1 heading.

For more details, see [#78](https://github.com/docsifyjs/docsify/issues/78).

```js
window.$docsify = {
  loadSidebar: true,
  autoHeader: true,
};
```

## basePath

- Type: `String`

Base path of the website. You can set it to another directory or another domain name.

```js
window.$docsify = {
  basePath: '/path/',

  // Load the files from another site
  basePath: 'https://docsify.js.org/',

  // Even can load files from other repo
  basePath:
    'https://raw.githubusercontent.com/ryanmcdermott/clean-code-javascript/master/',
};
```

## catchPluginErrors

- Type: `Boolean`
- Default: `true`

Determines if Docsify should handle uncaught _synchronous_ plugin errors automatically. This can prevent plugin errors from affecting docsify's ability to properly render live site content.

## cornerExternalLinkTarget

- Type: `String`
- Default: `'_blank'`

Target to open external link at the top right corner. Default `'_blank'` (new window/tab)

```js
window.$docsify = {
  cornerExternalLinkTarget: '_self', // default: '_blank'
};
```

## coverpage

- Type: `Boolean|String|String[]|Object`
- Default: `false`

Activate the [cover feature](cover.md). If true, it will load from `_coverpage.md`.

```js
window.$docsify = {
  coverpage: true,

  // Custom file name
  coverpage: 'cover.md',

  // multiple covers
  coverpage: ['/', '/zh-cn/'],

  // multiple covers and custom file name
  coverpage: {
    '/': 'cover.md',
    '/zh-cn/': 'cover.md',
  },
};
```

## el

- Type: `String`
- Default: `'#app'`

The DOM element to be mounted on initialization. It can be a CSS selector string or an actual [HTMLElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement).

```js
window.$docsify = {
  el: '#app',
};
```

## executeScript

- Type: `Boolean`
- Default: `null`

Execute the script on the page. Only parses the first script tag ([demo](themes)). If Vue is detected, this is `true` by default.

```js
window.$docsify = {
  executeScript: true,
};
```

```markdown
## This is test

<script>
  console.log(2333)
</script>
```

Note that if you are running an external script, e.g. an embedded jsfiddle demo, make sure to include the [external-script](plugins.md?id=external-script) plugin.

## ext

- Type: `String`
- Default: `'.md'`

Request file extension.

```js
window.$docsify = {
  ext: '.md',
};
```

## externalLinkRel

- Type: `String`
- Default: `'noopener'`

Default `'noopener'` (no opener) prevents the newly opened external page (when [externalLinkTarget](#externallinktarget) is `'_blank'`) from having the ability to control our page. No `rel` is set when it's not `'_blank'`. See [this post](https://mathiasbynens.github.io/rel-noopener/) for more information about why you may want to use this option.

```js
window.$docsify = {
  externalLinkRel: '', // default: 'noopener'
};
```

## externalLinkTarget

- Type: `String`
- Default: `'_blank'`

Target to open external links inside the markdown. Default `'_blank'` (new window/tab)

```js
window.$docsify = {
  externalLinkTarget: '_self', // default: '_blank'
};
```

## fallbackLanguages

- Type: `Array<string>`

List of languages that will fallback to the default language when a page is requested and it doesn't exist for the given locale.

Example:

- try to fetch the page of `/de/overview`. If this page exists, it'll be displayed.
- then try to fetch the default page `/overview` (depending on the default language). If this page exists, it'll be displayed.
- then display the 404 page.

```js
window.$docsify = {
  fallbackLanguages: ['fr', 'de'],
};
```

## fallbackDefaultLanguage

- Type: `String`
- Default: `''`

When a page is requested and it doesn't exist for the given locale, Docsify will fallback to the language specified by this option.

For example, in the scenario described above, if `/de/overview` does not exist and `fallbackDefaultLanguage` is configured as `zh-cn`, Docsify will fetch `/zh-cn/overview` instead of `/overview`.

```js
window.$docsify = {
  fallbackLanguages: ['fr', 'de'],
  fallbackDefaultLanguage: 'zh-cn', // default: ''
};
```

## formatUpdated

- Type: `String|Function`

We can display the file update date through **{docsify-updated<span>}</span>** variable. And format it by `formatUpdated`.
See https://github.com/lukeed/tinydate#patterns

```js
window.$docsify = {
  formatUpdated: '{MM}/{DD} {HH}:{mm}',

  formatUpdated(time) {
    // ...

    return time;
  },
};
```

## hideSidebar

- Type : `Boolean`
- Default: `false`

This option will completely hide your sidebar and won't render any content on the side.

```js
window.$docsify = {
  hideSidebar: true,
};
```

## homepage

- Type: `String`
- Default: `'README.md'`

`README.md` in your docs folder will be treated as the homepage for your website, but sometimes you may need to serve another file as your homepage.

```js
window.$docsify = {
  // Change to /home.md
  homepage: 'home.md',

  // Or use the readme in your repo
  homepage:
    'https://raw.githubusercontent.com/docsifyjs/docsify/main/README.md',
};
```

## keyBindings

- Type: `Boolean|Object`
- Default: `Object`
  - <kbd>\\</kbd> Toggle the sidebar menu
  - <kbd>/</kbd> Focus on [search](plugins#full-text-search) field. Also supports <kbd>alt</kbd>&nbsp;/&nbsp;<kbd>ctrl</kbd>&nbsp;+&nbsp;<kbd>k</kbd>.

Binds key combination(s) to a custom callback function.

Key `bindings` are defined as case insensitive string values separated by `+`. Modifier key values include `alt`, `ctrl`, `meta`, and `shift`. Non-modifier key values should match the keyboard event's [key](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) or [code](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code) value.

The `callback` function receive a [keydown event](https://developer.mozilla.org/en-US/docs/Web/API/Element/keydown_event) as an argument.

> [!IMPORTANT] Let site visitors know your custom key bindings are available! If a binding is associated with a DOM element, consider inserting a `<kbd>` element as a visual cue (e.g., <kbd>alt</kbd> + <kbd>a</kbd>) or adding [title](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title) and [aria-keyshortcuts](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-keyshortcuts) attributes for hover/focus hints.

```js
window.$docsify = {
  keyBindings: {
    // Custom key binding
    myCustomBinding: {
      bindings: ['alt+a', 'shift+a'],
      callback(event) {
        alert('Hello, World!');
      },
    },
  },
};
```

Key bindings can be disabled entirely or individually by setting the binding configuration to `false`.

```js
window.$docsify = {
  // Disable all key bindings
  keyBindings: false,
};
```

```js
window.$docsify = {
  keyBindings: {
    // Disable individual key bindings
    focusSearch: false,
    toggleSidebar: false,
  },
};
```

## loadNavbar

- Type: `Boolean|String`
- Default: `false`

Loads navbar from the Markdown file `_navbar.md` if **true**, else loads it from the path specified.

```js
window.$docsify = {
  // load from _navbar.md
  loadNavbar: true,

  // load from nav.md
  loadNavbar: 'nav.md',
};
```

## loadSidebar

- Type: `Boolean|String`
- Default: `false`

Loads sidebar from the Markdown file `_sidebar.md` if **true**, else loads it from the path specified.

```js
window.$docsify = {
  // load from _sidebar.md
  loadSidebar: true,

  // load from summary.md
  loadSidebar: 'summary.md',
};
```

## logo

- Type: `String`

Website logo as it appears in the sidebar. You can resize it using CSS.

> [!IMPORTANT] Logo will only be visible if `name` prop is also set. See [name](#name) configuration.

```js
window.$docsify = {
  logo: '/_media/icon.svg',
};
```

## markdown

- Type: `Function`

See [Markdown configuration](markdown.md).

```js
window.$docsify = {
  // object
  markdown: {
    smartypants: true,
    renderer: {
      link() {
        // ...
      },
    },
  },

  // function
  markdown(marked, renderer) {
    // ...
    return marked;
  },
};
```

## maxLevel

- Type: `Number`
- Default: `6`

Maximum Table of content level.

```js
window.$docsify = {
  maxLevel: 4,
};
```

## mergeNavbar

- Type: `Boolean`
- Default: `false`

Navbar will be merged with the sidebar on smaller screens.

```js
window.$docsify = {
  mergeNavbar: true,
};
```

## name

- Type: `Boolean | String`

Website name as it appears in the sidebar.

```js
window.$docsify = {
  name: 'docsify',
};
```

The name field can also contain custom HTML for easier customization:

```js
window.$docsify = {
  name: '<span>docsify</span>',
};
```

If `true`, the website name will be inferred from the document's `<title>` tag.

```js
window.$docsify = {
  name: true,
};
```

If `false` or empty, no name will be displayed.

```js
window.$docsify = {
  name: false,
};
```

## nameLink

- Type: `String`
- Default: `'window.location.pathname'`

The URL that the website `name` links to.

```js
window.$docsify = {
  nameLink: '/',

  // For each route
  nameLink: {
    '/zh-cn/': '#/zh-cn/',
    '/': '#/',
  },
};
```

## nativeEmoji

- Type: `Boolean`
- Default: `false`

Render emoji shorthand codes using GitHub-style emoji images or native emoji characters.

```js
window.$docsify = {
  nativeEmoji: true,
};
```

```markdown
:smile:
:partying_face:
:joy:
:+1:
:-1:
```

GitHub-style images when `false`:

<output data-lang="output">
  <img class="emoji" src="https://github.githubassets.com/images/icons/emoji/unicode/1f604.png" alt="smile">
  <img class="emoji" src="https://github.githubassets.com/images/icons/emoji/unicode/1f973.png" alt="partying_face">
  <img class="emoji" src="https://github.githubassets.com/images/icons/emoji/unicode/1f602.png" alt="joy">
  <img class="emoji" src="https://github.githubassets.com/images/icons/emoji/unicode/1f44d.png" alt="+1">
  <img class="emoji" src="https://github.githubassets.com/images/icons/emoji/unicode/1f44e.png" alt="-1">
</output>

Native characters when `true`:

<output data-lang="output">
  <span class="emoji">😄︎</span>
  <span class="emoji">🥳︎</span>
  <span class="emoji">😂︎</span>
  <span class="emoji">👍︎</span>
  <span class="emoji">👎︎</span>
</output>

To render shorthand codes as text, replace `:` characters with the `&colon;` HTML entity.

```markdown
&colon;100&colon;
```

<output data-lang="output">

&colon;100&colon;

</output>

## noCompileLinks

- Type: `Array<string>`

Sometimes we do not want docsify to handle our links. See [#203](https://github.com/docsifyjs/docsify/issues/203). We can skip compiling of certain links by specifying an array of strings. Each string is converted into to a regular expression (`RegExp`) and the _whole_ href of a link is matched against it.

```js
window.$docsify = {
  noCompileLinks: ['/foo', '/bar/.*'],
};
```

## noEmoji

- Type: `Boolean`
- Default: `false`

Disabled emoji parsing and render all emoji shorthand as text.

```js
window.$docsify = {
  noEmoji: true,
};
```

```markdown
:100:
```

<output data-lang="output">

&colon;100&colon;

</output>

To disable emoji parsing of individual shorthand codes, replace `:` characters with the `&colon;` HTML entity.

```markdown
:100:

&colon;100&colon;
```

<output data-lang="output">

:100:

&colon;100&colon;

</output>

## notFoundPage

- Type: `Boolean|String|Object`
- Default: `false`

Display default "404 - Not Found" message:

```js
window.$docsify = {
  notFoundPage: false,
};
```

Load the `_404.md` file:

```js
window.$docsify = {
  notFoundPage: true,
};
```

Load the customized path of the 404 page:

```js
window.$docsify = {
  notFoundPage: 'my404.md',
};
```

Load the right 404 page according to the localization:

```js
window.$docsify = {
  notFoundPage: {
    '/': '_404.md',
    '/de': 'de/_404.md',
  },
};
```

> Note: The options for fallbackLanguages don't work with the `notFoundPage` options.

## onlyCover

- Type: `Boolean`
- Default: `false`

Only coverpage is loaded when visiting the home page.

```js
window.$docsify = {
  onlyCover: false,
};
```

## plugins

See [Plugins](./plugins.md).

## relativePath

- Type: `Boolean`
- Default: `false`

If **true**, links are relative to the current context.

For example, the directory structure is as follows:

```text
.
└── docs
    ├── README.md
    ├── guide.md
    └── zh-cn
        ├── README.md
        ├── guide.md
        └── config
            └── example.md
```

With relative path **enabled** and current URL `http://domain.com/zh-cn/README`, given links will resolve to:

```text
guide.md              => http://domain.com/zh-cn/guide
config/example.md     => http://domain.com/zh-cn/config/example
../README.md          => http://domain.com/README
/README.md            => http://domain.com/README
```

```js
window.$docsify = {
  // Relative path enabled
  relativePath: true,

  // Relative path disabled (default value)
  relativePath: false,
};
```

## repo

- Type: `String`

Configure the repository url, or a string of `username/repo`, to add the [GitHub Corner](http://tholman.com/github-corners/) widget in the top right corner of the site.

```js
window.$docsify = {
  repo: 'docsifyjs/docsify',
  // or
  repo: 'https://github.com/docsifyjs/docsify/',
};
```

If undefined or empty, no GitHub corner will be displayed.

## requestHeaders

- Type: `Object`

Set the request resource headers.

```js
window.$docsify = {
  requestHeaders: {
    'x-token': 'xxx',
  },
};
```

Such as setting the cache

```js
window.$docsify = {
  requestHeaders: {
    'cache-control': 'max-age=600',
  },
};
```

## routerMode

Configure the URL format that the paths of your site will use.

- Type: `String`
- Default: `'hash'`

```js
window.$docsify = {
  routerMode: 'history', // default: 'hash'
};
```

For statically-deployed sites (f.e. on GitHub Pages) hash-based routing is
simpler to set up. For websites that can re-write URLs, the history-based format
is better (especially for search-engine optimization, hash-based routing is not
so search-engine friendly)

Hash-based routing means all URL paths will be prefixed with `/#/` in the
address bar. This is a trick that allows the site to load `/index.html`, then it
uses the path that follows the `#` to determine what markdown files to load. For
example, a complete hash-based URL may look like this:
`https://example.com/#/path/to/page`. The browser will actually load
`https://example.com` (assuming your static server serves
`index.html` by default, as most do), and then the Docsify JavaScript code will
look at the `/#/...` and determine the markdown file to load and render.
Additionally, when clicking on a link, the Docsify router will change the
content after the hash dynamically. The value of `location.pathname` will still be
`/` no matter what. The parts of a hash path are _not_ sent to the server when
visiting such a URL in a browser.

On the other hand, history-based routing means the Docsify JavaScript will use
the [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API)
to dynamically change the URL without using a `#`. This means that all URLs will
be considered "real" by search engines, and the full path will be sent to the
server when visiting the URL in your browser. For example, a URL may look like
`https://example.com/path/to/page`. The browser will try to load that full URL
directly from the server, not just `https://example.com`. The upside of this is
that these types of URLs are much more friendly for search engines, and can be
indexed (yay!). The downside, however, is that your server, or the place where
you host your site files, has to be able to handle these URLs. Various static
website hosting services allow "rewrite rules" to be configured, such that a
server can be configured to always send back `/index.html` no matter what path
is visited. The value of `location.pathname` will show `/path/to/page`, because
it was actually sent to the server.

TLDR: start with `hash` routing (the default). If you feel adventurous, learn
how to configure a server, then switch to `history` mode for better experience
without the `#` in the URL and SEO optimization.

> **Note** If you use `routerMode: 'history'`, you may want to add an
> [`alias`](#alias) to make your `_sidebar.md` and `_navbar.md` files always be
> loaded no matter which path is being visited.
>
> ```js
> window.$docsify = {
>   routerMode: 'history',
>   alias: {
>     '/.*/_sidebar.md': '/_sidebar.md',
>     '/.*/_navbar.md': '/_navbar.md',
>   },
> };
> ```

## routes

- Type: `Object`

Define "virtual" routes that can provide content dynamically. A route is a map between the expected path, to either a string or a function. If the mapped value is a string, it is treated as markdown and parsed accordingly. If it is a function, it is expected to return markdown content.

A route function receives up to three parameters:

1. `route` - the path of the route that was requested (e.g. `/bar/baz`)
2. `matched` - the [`RegExpMatchArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match) that was matched by the route (e.g. for `/bar/(.+)`, you get `['/bar/baz', 'baz']`)
3. `next` - this is a callback that you may call when your route function is async

Do note that order matters! Routes are matched the same order you declare them in, which means that in cases where you have overlapping routes, you might want to list the more specific ones first.

```js
window.$docsify = {
  routes: {
    // Basic match w/ return string
    '/foo': '# Custom Markdown',

    // RegEx match w/ synchronous function
    '/bar/(.*)'(route, matched) {
      return '# Custom Markdown';
    },

    // RegEx match w/ asynchronous function
    '/baz/(.*)'(route, matched, next) {
      fetch('/api/users?id=12345')
        .then(response => {
          next('# Custom Markdown');
        })
        .catch(err => {
          // Handle error...
        });
    },
  },
};
```

Other than strings, route functions can return a falsy value (`null` \ `undefined`) to indicate that they ignore the current request:

```js
window.$docsify = {
  routes: {
    // accepts everything other than dogs (synchronous)
    '/pets/(.+)'(route, matched) {
      if (matched[0] === 'dogs') {
        return null;
      } else {
        return 'I like all pets but dogs';
      }
    }

    // accepts everything other than cats (asynchronous)
    '/pets/(.*)'(route, matched, next) {
      if (matched[0] === 'cats') {
        next();
      } else {
        // Async task(s)...
        next('I like all pets but cats');
      }
    }
  }
}
```

Finally, if you have a specific path that has a real markdown file (and therefore should not be matched by your route), you can opt it out by returning an explicit `false` value:

```js
window.$docsify = {
  routes: {
    // if you look up /pets/cats, docsify will skip all routes and look for "pets/cats.md"
    '/pets/cats'(route, matched) {
      return false;
    }

    // but any other pet should generate dynamic content right here
    '/pets/(.+)'(route, matched) {
      const pet = matched[0];
      return `your pet is ${pet} (but not a cat)`;
    }
  }
}
```

## skipLink

- Type: `Boolean|String|Object`
- Default: `'Skip to main content'`

Determines if/how the site's [skip navigation link](https://webaim.org/techniques/skipnav/) will be rendered.

```js
// Render skip link for all routes
window.$docsify = {
  skipLink: 'Skip to content',
};
```

```js
// Render localized skip links based on route paths
window.$docsify = {
  skipLink: {
    '/es/': 'Saltar al contenido principal',
    '/de-de/': 'Ga naar de hoofdinhoud',
    '/ru-ru/': 'Перейти к основному содержанию',
    '/zh-cn/': '跳到主要内容',
  },
};
```

```js
// Do not render skip link
window.$docsify = {
  skipLink: false,
};
```

```js
// Use default
window.$docsify = {
  skipLink: true, // "Skip to main content"
};
```

## subMaxLevel

- Type: `Number`
- Default: `0`

Add table of contents (TOC) in custom sidebar.

```js
window.$docsify = {
  subMaxLevel: 2,
};
```

If you have a link to the homepage in the sidebar and want it to be shown as active when accessing the root url, make sure to update your sidebar accordingly:

```markdown
- Sidebar
  - [Home](/)
  - [Another page](another.md)
```

For more details, see [#1131](https://github.com/docsifyjs/docsify/issues/1131).

## themeColor ⚠️ :id=themecolor

> [!IMPORTANT] Deprecated as of v5. Use the `--theme-color` [theme property](themes#theme-properties) to [customize](themes#customization) your theme color.

- Type: `String`

Customize the theme color.

```js
window.$docsify = {
  themeColor: '#3F51B5',
};
```

## topMargin ⚠️ :id=topmargin

> [!IMPORTANT] Deprecated as of v5. Use the `--scroll-padding-top` [theme property](themes#theme-properties) to specify a scroll margin when using a sticky navbar.

- Type: `Number|String`
- Default: `0`

Adds scroll padding to the top of the viewport. This is useful when you have added a sticky or "fixed" element and would like auto scrolling to align with the bottom of your element.

```js
window.$docsify = {
  topMargin: 90, // 90, '90px', '2rem', etc.
};
```

## vueComponents

- Type: `Object`

Creates and registers global [Vue](https://vuejs.org/guide/essentials/component-basics.html). Components are specified using the component name as the key with an object containing Vue options as the value. Component `data` is unique for each instance and will not persist as users navigate the site.

```js
window.$docsify = {
  vueComponents: {
    'button-counter': {
      template: `
        <button @click="count += 1">
          You clicked me {{ count }} times
        </button>
      `,
      data() {
        return {
          count: 0,
        };
      },
    },
  },
};
```

```markdown
<button-counter></button-counter>
```

<output data-lang="output">
  <button-counter></button-counter>
</output>

## vueGlobalOptions

- Type: `Object`

Specifies global Vue options for use with Vue content not explicitly mounted with [vueMounts](#mounting-dom-elements), [vueComponents](#components), or a [markdown script](#markdown-script). Changes to global `data` will persist and be reflected anywhere global references are used.

```js
window.$docsify = {
  vueGlobalOptions: {
    data() {
      return {
        count: 0,
      };
    },
  },
};
```

```markdown
<p>
  <button @click="count -= 1">-</button>
  {{ count }}
  <button @click="count += 1">+</button>
</p>
```

<output data-lang="output">
  <p>
    <button @click="count -= 1">-</button>
    {{ count }}
    <button @click="count += 1">+</button>
  </p>
</output>

## vueMounts

- Type: `Object`

Specifies DOM elements to mount as Vue instances and their associated options. Mount elements are specified using a [CSS selector](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) as the key with an object containing Vue options as their value. Docsify will mount the first matching element in the main content area each time a new page is loaded. Mount element `data` is unique for each instance and will not persist as users navigate the site.

```js
window.$docsify = {
  vueMounts: {
    '#counter': {
      data() {
        return {
          count: 0,
        };
      },
    },
  },
};
```

```markdown
<div id="counter">
  <button @click="count -= 1">-</button>
  {{ count }}
  <button @click="count += 1">+</button>
</div>
```

<output id="counter">
  <button @click="count -= 1">-</button>
  {{ count }}
  <button @click="count += 1">+</button>
</output>


================================================
FILE: docs/cover.md
================================================
# Cover

Activate the cover feature by setting `coverpage` to **true**. See [coverpage configuration](configuration#coverpage).

## Basic usage

Set `coverpage` to **true**, and create a `_coverpage.md`:

```js
window.$docsify = {
  coverpage: true,
};
```

```markdown
<!-- _coverpage.md -->

![logo](_media/icon.svg)

# docsify

> A magical documentation site generator

- Simple and lightweight
- No statically built HTML files
- Multiple themes

[GitHub](https://github.com/docsifyjs/docsify/)
[Get Started](#docsify)
```

## Customization

The cover page can be customized using [theme properties](themes#theme-properties):

<!-- prettier-ignore -->
```css
:root {
  --cover-bg         : url('path/to/image.png');
  --cover-bg-overlay : rgba(0, 0, 0, 0.5);
  --cover-color      : #fff;
  --cover-title-color: var(--theme-color);
  --cover-title-font : 600 var(--font-size-xxxl) var(--font-family);
}
```

Alternatively, a background color or image can be specified in the cover page markdown.

```markdown
<!-- background color -->

![color](#f0f0f0)
```

```markdown
<!-- background image -->

![](_media/bg.png)
```

## Coverpage as homepage

Normally, the coverpage and the homepage appear at the same time. Of course, you can also separate the coverpage by [`onlyCover`](configuration#onlycover) option.

## Multiple covers

If your docs site is in more than one language, it may be useful to set multiple covers.

For example, your docs structure is like this

```text
.
└── docs
    ├── README.md
    ├── guide.md
    ├── _coverpage.md
    └── zh-cn
        ├── README.md
        └── guide.md
        └── _coverpage.md
```

Now, you can set

```js
window.$docsify = {
  coverpage: ['/', '/zh-cn/'],
};
```

Or a special file name

```js
window.$docsify = {
  coverpage: {
    '/': 'cover.md',
    '/zh-cn/': 'cover.md',
  },
};
```


================================================
FILE: docs/custom-navbar.md
================================================
# Custom navbar

## HTML

If you need custom navigation, you can create a HTML-based navigation bar.

> [!IMPORTANT] Note that documentation links begin with `#/`.

```html
<!-- index.html -->

<body>
  <nav>
    <a href="#/">EN</a>
    <a href="#/zh-cn/">简体中文</a>
  </nav>
  <div id="app"></div>
</body>
```

## Markdown

Alternatively, you can create a custom markdown-based navigation file by setting `loadNavbar` to **true** and creating `_navbar.md`, compare [loadNavbar configuration](configuration#loadnavbar).

```html
<!-- index.html -->

<script>
  window.$docsify = {
    loadNavbar: true,
  };
</script>
<script src="//cdn.jsdelivr.net/npm/docsify@5/dist/docsify.min.js"></script>
```

```markdown
<!-- _navbar.md -->

- [En](/)
- [chinese](/zh-cn/)
```

To create drop-down menus:

```markdown
<!-- _navbar.md -->

- Translations

  - [En](/)
  - [chinese](/zh-cn/)
```

> [!IMPORTANT] You need to create a `.nojekyll` in `./docs` to prevent GitHub Pages from ignoring files that begin with an underscore.

`_navbar.md` is loaded from each level directory. If the current directory doesn't have `_navbar.md`, it will fall back to the parent directory. If, for example, the current path is `/guide/quick-start`, the `_navbar.md` will be loaded from `/guide/_navbar.md`.

## Nesting

You can create sub-lists by indenting items that are under a certain parent.

```markdown
<!-- _navbar.md -->

- Getting started

  - [Quick start](quickstart.md)
  - [Writing more pages](more-pages.md)
  - [Custom navbar](custom-navbar.md)
  - [Cover page](cover.md)

- Configuration

  - [Configuration](configuration.md)
  - [Themes](themes.md)
  - [Using plugins](plugins.md)
  - [Markdown configuration](markdown.md)
  - [Language highlight](language-highlight.md)
```

renders as

![Nesting navbar](_images/nested-navbar.png 'Nesting navbar')

## Combining custom navbars with the emoji plugin

If you use the [emoji plugin](plugins#emoji):

```html
<!-- index.html -->

<script>
  window.$docsify = {
    // ...
  };
</script>
<script src="//cdn.jsdelivr.net/npm/docsify@5/dist/docsify.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify@5/dist/plugins/emoji.min.js"></script>
```

you could, for example, use flag emojis in your custom navbar Markdown file:

```markdown
<!-- _navbar.md -->

- [:us:, :uk:](/)
- [:cn:](/zh-cn/)
```


================================================
FILE: docs/deploy.md
================================================
# Deploy

Similar to [GitBook](https://www.gitbook.com), you can deploy files to GitHub Pages, GitLab Pages or VPS.

## GitHub Pages

There are three places to populate your docs for your GitHub repository:

- `docs/` folder
- main branch
- gh-pages branch

It is recommended that you save your files to the `./docs` subfolder of the `main` branch of your repository. Then select `main branch /docs folder` as your GitHub Pages source in your repository's settings page.

![GitHub Pages](_images/deploy-github-pages.png)

> [!IMPORTANT] You can also save files in the root directory and select `main branch`.
> You'll need to place a `.nojekyll` file in the deploy location (such as `/docs` or the gh-pages branch)

## GitLab Pages

If you are deploying your master branch, create a `.gitlab-ci.yml` with the following script:

> [!TIP] The `.public` workaround is so `cp` doesn't also copy `public/` to itself in an infinite loop.

```YAML
pages:
  stage: deploy
  script:
  - mkdir .public
  - cp -r * .public
  - mv .public public
  artifacts:
    paths:
    - public
  only:
  - master
```

> [!IMPORTANT] You can replace script with `- cp -r docs/. public`, if `./docs` is your Docsify subfolder.

## Firebase Hosting

> [!IMPORTANT] You'll need to install the Firebase CLI using `npm i -g firebase-tools` after signing into the [Firebase Console](https://console.firebase.google.com) using a Google Account.

Using a terminal, determine and navigate to the directory for your Firebase Project. This could be `~/Projects/Docs`, etc. From there, run `firebase init` and choose `Hosting` from the menu (use **space** to select, **arrow keys** to change options and **enter** to confirm). Follow the setup instructions.

Your `firebase.json` file should look similar to this (I changed the deployment directory from `public` to `site`):

```json
{
  "hosting": {
    "public": "site",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
  }
}
```

Once finished, build the starting template by running `docsify init ./site` (replacing site with the deployment directory you determined when running `firebase init` - public by default). Add/edit the documentation, then run `firebase deploy` from the root project directory.

## VPS

Use the following nginx config.

```nginx
server {
  listen 80;
  server_name  your.domain.com;

  location / {
    alias /path/to/dir/of/docs/;
    index index.html;
  }
}
```

## Netlify

1.  Login to your [Netlify](https://www.netlify.com/) account.
2.  In the [dashboard](https://app.netlify.com/) page, click **Add New Site**.
3.  Select GitHub.
4.  Choose the repository where you store your docs, in the **Base Directory** add the subfolder where the files are stored. For example, it should be `docs`.
5.  In the **Build Command** area leave it blank.
6.  In the **Publish directory** area, if you have added the `docs` in the **Base Directory** you will see the publish directory populated with `docs/`
7.  Netlify is smart enough to look for the the `index.html` file inside the `docs/` folder.

### HTML5 router

When using the HTML5 router, you need to set up redirect rules that redirect all requests to your `index.html`. It's pretty simple when you're using Netlify. Just create a file named `_redirects` in the docs directory, add this snippet to the file, and you're all set:

```sh
/*    /index.html   200
```

## Vercel

1. Install [Vercel CLI](https://vercel.com/download), `npm i -g vercel`
2. Change directory to your docsify website, for example `cd docs`
3. Deploy with a single command, `vercel`

## AWS Amplify

1. Set the routerMode in the Docsify project `index.html` to _history_ mode.

```html
<script>
  window.$docsify = {
    loadSidebar: true,
    routerMode: 'history',
  };
</script>
```

2. Login to your [AWS Console](https://aws.amazon.com).
3. Go to the [AWS Amplify Dashboard](https://aws.amazon.com/amplify).
4. Choose the **Deploy** route to setup your project.
5. When prompted, keep the build settings empty if you're serving your docs within the root directory. If you're serving your docs from a different directory, customise your amplify.yml

```yml
version: 0.1
frontend:
  phases:
    build:
      commands:
        - echo "Nothing to build"
  artifacts:
    baseDirectory: /docs
    files:
      - '**/*'
  cache:
    paths: []
```

6. Add the following Redirect rules in their displayed order. Note that the second record is a PNG image where you can change it with any image format you are using.

| Source address | Target address | Type          |
| -------------- | -------------- | ------------- |
| /<\*>.md       | /<\*>.md       | 200 (Rewrite) |
| /<\*>.png      | /<\*>.png      | 200 (Rewrite) |
| /<\*>          | /index.html    | 200 (Rewrite) |

## Stormkit

1.  Login to your [Stormkit](https://www.stormkit.io) account.
2.  Using the user interface, import your docsify project from one of the three supported Git providers (GitHub, GitLab, or Bitbucket).
3.  Navigate to the project’s production environment in Stormkit or create a new environment if needed.
4.  Verify the build command in your Stormkit configuration. By default, Stormkit CI will run `npm run build` but you can specify a custom build command on this page.
5.  Set output folder to `docs`
6.  Click the “Deploy Now” button to deploy your site.

Read more in the [Stormkit Documentation](https://stormkit.io/docs).

## Docker

- Create docsify files

  You need prepare the initial files instead of making them inside the container.
  See the [Quickstart](https://docsify.js.org/#/quickstart) section for instructions on how to create these files manually or using [docsify-cli](https://github.com/docsifyjs/docsify-cli).

  ```sh
  index.html
  README.md
  ```

- Create Dockerfile

  ```Dockerfile
    FROM node:latest
    LABEL description="A demo Dockerfile for build Docsify."
    WORKDIR /docs
    RUN npm install -g docsify-cli@latest
    EXPOSE 3000/tcp
    ENTRYPOINT docsify serve .

  ```

  The current directory structure should be this:

  ```sh
   index.html
   README.md
   Dockerfile
  ```

- Build docker image

  ```sh
  docker build -f Dockerfile -t docsify/demo .
  ```

- Run docker image

  ```sh
  docker run -itp 3000:3000 --name=docsify -v $(pwd):/docs docsify/demo
  ```

## Kinsta Static Site Hosting

You can deploy **Docsify** as a Static Site on [Kinsta](https://kinsta.com/static-site-hosting/).

1. Login or create an account to view your [MyKinsta](https://my.kinsta.com/) dashboard.

2. Authorize Kinsta with your Git provider.

3. Select **Static Sites** from the left sidebar and press **Add sites**.

4. Select the repository and branch you want to deploy.

5. During the build settings, Kinsta will automatically try to fill out the **Build command**, **Node version**, and **Publish directory**. If it won't, fill out the following:

   - Build command: leave empty
   - Node version: leave on default selection or a specific version (e.g. `18.16.0`)
   - Publish directory: `docs`

6. Click the **Create site**.

## DeployHQ

[DeployHQ](https://www.deployhq.com/) is a deployment automation platform that deploys your code to SSH/SFTP servers, FTP servers, cloud storage (Amazon S3, Cloudflare R2), and modern hosting platforms (Netlify, Heroku).

> [!IMPORTANT] DeployHQ does not host your site. It automates deploying your Docsify files to your chosen hosting provider or server.

To deploy your Docsify site using DeployHQ:

1. Sign up for a [DeployHQ account](https://www.deployhq.com/) and verify your email.

2. Create your first project by clicking on **Projects** and **New Project**. Connect your Git repository (GitHub, GitLab, Bitbucket, or any private repository). Authorize DeployHQ to access your repository.

3. Add a server and enter your server details:

   - Give your server a name
   - Select your protocol (SSH/SFTP, FTP, or cloud platform)
   - Enter your server hostname, username, and password/SSH key
   - Set **Deployment Path** to your web root (e.g., `public_html/`)

4. Since Docsify doesn't require a build step, you can deploy your files directly. If your Docsify files are in a `docs/` folder, configure the **Source Path** in your server settings to `docs/`.

5. Click **Deploy Project**, then select your server and click **Deploy** to start your first deployment.

Your Docsify site will be deployed to your server. You can enable automatic deployments to deploy on every Git push, or schedule deployments for specific times.

For more information on advanced deployment features, see [DeployHQ's documentation](https://www.deployhq.com/support).


================================================
FILE: docs/embed-files.md
================================================
# Embed files

With docsify 4.6 it is now possible to embed any type of file.

You can embed these files as video, audio, iframes, or code blocks, and even Markdown files can even be embedded directly into the document.

For example, here is an embedded Markdown file. You only need to do this:

```markdown
[filename](_media/example.md ':include')
```

Then the content of `example.md` will be displayed directly here:

[filename](_media/example.md ':include')

You can check the original content for [example.md](_media/example.md ':ignore').

Normally, this will be compiled into a link, but in docsify, if you add `:include` it will be embedded. You can use single or double quotation marks around as you like.

External links can be used too - just replace the target. If you want to use a gist URL, see [Embed a gist](#embed-a-gist) section.

## Embedded file type

Currently, file extensions are automatically recognized and embedded in different ways.

These types are supported:

- **iframe** `.html`, `.htm`
- **markdown** `.markdown`, `.md`
- **audio** `.mp3`
- **video** `.mp4`, `.ogg`
- **code** other file extension

Of course, you can force the specified type. For example, a Markdown file can be embedded as a code block by setting `:type=code`.

```markdown
[filename](_media/example.md ':include :type=code')
```

You will get:

[filename](_media/example.md ':include :type=code')

## Markdown with YAML Front Matter

Front Matter, commonly utilized in blogging systems like Jekyll, serves to define metadata for a document. The [front-matter.js](https://www.npmjs.com/package/front-matter) package facilitates the extraction of metadata (front matter) from documents.

When using Markdown, YAML front matter will be stripped from the rendered content. The attributes cannot be used in this case.

```markdown
[filename](_media/example-with-yaml.md ':include')
```

You will get just the content

[filename](_media/example-with-yaml.md ':include')

## Embedded code fragments

Sometimes you don't want to embed a whole file. Maybe because you need just a few lines but you want to compile and test the file in CI.

```markdown
[filename](_media/example.js ':include :type=code :fragment=demo')
```

In your code file you need to surround the fragment between `/// [demo]` lines (before and after the fragment).
Alternatively you can use `### [demo]`. By default, only identifiers are omitted. To omit the entire line containing the identifier in the fragment output, add the `:omitFragmentLine` option. This is useful if your code fragment is e.g. HTML and you want to hide the Docsify fragment identifier from showing in your HTML source. `<!-- /// [demo] -->` in your source file and `:omitFragmentLine` will make the `-->` not show up in your Docsify code fragment section.

Example: In the source file \_media/example.js, `/// [demo]` identifiers have been included:

```markdown
[filename](_media/example.js ':include :type=code')
```

[filename](_media/example.js ':include :type=code')

Adding the `:fragment=demo` results in the following:

```markdown
[filename](_media/example.js ':include :type=code :fragment=demo')
```

[filename](_media/example.js ':include :type=code :fragment=demo')

## Tag attribute

If you embed the file as `iframe`, `audio` and `video`, then you may need to set the attributes of these tags.

> [!TIP] Note, for the `audio` and `video` types, docsify adds the `controls` attribute by default. When you want add more attributes, the `controls` attribute need to be added manually if need be.

```md
[filename](_media/example.mp4 ':include :type=video controls width=100%')
```

```markdown
[cinwell website](https://cinwell.com ':include :type=iframe width=100% height=400px')
```

[cinwell website](https://cinwell.com ':include :type=iframe width=100% height=400px')

Did you see it? You only need to write directly. You can check [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) for these attributes.

## The code block highlight

Embedding any type of source code file, you can specify the highlighted language or automatically identify.

```markdown
[](_media/example.html ':include :type=code text')
```

⬇️

[](_media/example.html ':include :type=code text')

> [!TIP] How to set highlight? You can see [here](language-highlight.md).

## Embed a gist

You can embed a gist as markdown content or as a code block - this is based on the approach at the start of [Embed Files](#embed-files) section, but uses a raw gist URL as the target.

> [!TIP] **No** plugin or app config change is needed here to make this work. In fact, the "Embed" `script` tag that is copied from a gist will _not_ load even if you make plugin or config changes to allow an external script.

### Identify the gist's metadata

Start by viewing a gist on `gist.github.com`. For the purposes of this guide, we use this gist:

- https://gist.github.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15

Identify the following items from the gist:

| Field        | Example                            | Description                                                                                        |
| ------------ | ---------------------------------- | -------------------------------------------------------------------------------------------------- |
| **Username** | `anikethsaha`                      | The gist's owner.                                                                                  |
| **Gist ID**  | `c2bece08f27c4277001f123898d16a7c` | Identifier for the gist. This is fixed for the gist's lifetime.                                    |
| **Filename** | `content.md`                       | Select a name of a file in the gist. This needed even on a single-file gist for embedding to work. |

You will need those to build the _raw gist URL_ for the target file. This has the following format:

- `https://gist.githubusercontent.com/USERNAME/GIST_ID/raw/FILENAME`

Here are two examples based on the sample gist:

- https://gist.githubusercontent.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15/raw/content.md
- https://gist.githubusercontent.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15/raw/script.js

> [!TIP] Alternatively, you can get a raw URL directly clicking the _Raw_ button on a gist file. But, if you use that approach, just be sure to **remove** the revision number between `raw/` and the filename so that the URL matches the pattern above instead. Otherwise your embedded gist will **not** show the latest content when the gist is updated.

Continue with one of the sections below to embed the gist on a Docsify page.

### Render markdown content from a gist

This is a great way to embed content **seamlessly** in your docs, without sending someone to an external link. This approach is well-suited to reusing a gist of say installation instructions across doc sites of multiple repos. This approach works equally well with a gist owned by your account or by another user.

Here is the format:

```markdown
[LABEL](https://gist.githubusercontent.com/USERNAME/GIST_ID/raw/FILENAME ':include')
```

For example:

```markdown
[gist: content.md](https://gist.githubusercontent.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15/raw/content.md ':include')
```

Which renders as:

[gist: content.md](https://gist.githubusercontent.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15/raw/content.md ':include')

The `LABEL` can be any text you want. It acts as a _fallback_ message if the link is broken - so it is useful to repeat the filename here in case you need to fix a broken link. It also makes an embedded element easy to read at a glance.

### Render a codeblock from a gist

The format is the same as the previous section, but with `:type=code` added to the alt text. As with the [Embedded file type](#embedded-file-type) section, the syntax highlighting will be **inferred** from the extension (e.g. `.js` or `.py`), so you can leave the `type` set as `code`.

Here is the format:

```markdown
[LABEL](https://gist.githubusercontent.com/USERNAME/GIST_ID/raw/FILENAME ':include :type=code')
```

For example:

```markdown
[gist: script.js](https://gist.githubusercontent.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15/raw/script.js ':include :type=code')
```

Which renders as:

[gist: script.js](https://gist.githubusercontent.com/anikethsaha/f88893bb563bb7229d6e575db53a8c15/raw/script.js ':include :type=code')


================================================
FILE: docs/emoji.md
================================================
# Emoji

Below is a complete list of emoji shorthand codes. Docsify can be configured to render emoji using GitHub-style emoji images or native emoji characters using the [`nativeEmoji`](configuration#nativeemoji) configuration option.

<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(15em, 1fr));">

<!-- START: Auto-generated content (/build/emoji.js) -->

:100: `:100:`

:1234: `:1234:`

:+1: `:+1:`

:-1: `:-1:`

:1st_place_medal: `:1st_place_medal:`

:2nd_place_medal: `:2nd_place_medal:`

:3rd_place_medal: `:3rd_place_medal:`

:8ball: `:8ball:`

:a: `:a:`

:ab: `:ab:`

:abacus: `:abacus:`

:abc: `:abc:`

:abcd: `:abcd:`

:accept: `:accept:`

:accessibility: `:accessibility:`

:accordion: `:accordion:`

:adhesive_bandage: `:adhesive_bandage:`

:adult: `:adult:`

:aerial_tramway: `:aerial_tramway:`

:afghanistan: `:afghanistan:`

:airplane: `:airplane:`

:aland_islands: `:aland_islands:`

:alarm_clock: `:alarm_clock:`

:albania: `:albania:`

:alembic: `:alembic:`

:algeria: `:algeria:`

:alien: `:alien:`

:ambulance: `:ambulance:`

:american_samoa: `:american_samoa:`

:amphora: `:amphora:`

:anatomical_heart: `:anatomical_heart:`

:anchor: `:anchor:`

:andorra: `:andorra:`

:angel: `:angel:`

:anger: `:anger:`

:angola: `:angola:`

:angry: `:angry:`

:anguilla: `:anguilla:`

:anguished: `:anguished:`

:ant: `:ant:`

:antarctica: `:antarctica:`

:antigua_barbuda: `:antigua_barbuda:`

:apple: `:apple:`

:aquarius: `:aquarius:`

:argentina: `:argentina:`

:aries: `:aries:`

:armenia: `:armenia:`

:arrow_backward: `:arrow_backward:`

:arrow_double_down: `:arrow_double_down:`

:arrow_double_up: `:arrow_double_up:`

:arrow_down: `:arrow_down:`

:arrow_down_small: `:arrow_down_small:`

:arrow_forward: `:arrow_forward:`

:arrow_heading_down: `:arrow_heading_down:`

:arrow_heading_up: `:arrow_heading_up:`

:arrow_left: `:arrow_left:`

:arrow_lower_left: `:arrow_lower_left:`

:arrow_lower_right: `:arrow_lower_right:`

:arrow_right: `:arrow_right:`

:arrow_right_hook: `:arrow_right_hook:`

:arrow_up: `:arrow_up:`

:arrow_up_down: `:arrow_up_down:`

:arrow_up_small: `:arrow_up_small:`

:arrow_upper_left: `:arrow_upper_left:`

:arrow_upper_right: `:arrow_upper_right:`

:arrows_clockwise: `:arrows_clockwise:`

:arrows_counterclockwise: `:arrows_counterclockwise:`

:art: `:art:`

:articulated_lorry: `:articulated_lorry:`

:artificial_satellite: `:artificial_satellite:`

:artist: `:artist:`

:aruba: `:aruba:`

:ascension_island: `:ascension_island:`

:asterisk: `:asterisk:`

:astonished: `:astonished:`

:astronaut: `:astronaut:`

:athletic_shoe: `:athletic_shoe:`

:atm: `:atm:`

:atom: `:atom:`

:atom_symbol: `:atom_symbol:`

:australia: `:australia:`

:austria: `:austria:`

:auto_rickshaw: `:auto_rickshaw:`

:avocado: `:avocado:`

:axe: `:axe:`

:azerbaijan: `:azerbaijan:`

:b: `:b:`

:baby: `:baby:`

:baby_bottle: `:baby_bottle:`

:baby_chick: `:baby_chick:`

:baby_symbol: `:baby_symbol:`

:back: `:back:`

:bacon: `:bacon:`

:badger: `:badger:`

:badminton: `:badminton:`

:bagel: `:bagel:`

:baggage_claim: `:baggage_claim:`

:baguette_bread: `:baguette_bread:`

:bahamas: `:bahamas:`

:bahrain: `:bahrain:`

:balance_scale: `:balance_scale:`

:bald_man: `:bald_man:`

:bald_woman: `:bald_woman:`

:ballet_shoes: `:ballet_shoes:`

:balloon: `:balloon:`

:ballot_box: `:ballot_box:`

:ballot_box_with_check: `:ballot_box_with_check:`

:bamboo: `:bamboo:`

:banana: `:banana:`

:bangbang: `:bangbang:`

:bangladesh: `:bangladesh:`

:banjo: `:banjo:`

:bank: `:bank:`

:bar_chart: `:bar_chart:`

:barbados: `:barbados:`

:barber: `:barber:`

:baseball: `:baseball:`

:basecamp: `:basecamp:`

:basecampy: `:basecampy:`

:basket: `:basket:`

:basketball: `:basketball:`

:basketball_man: `:basketball_man:`

:basketball_woman: `:basketball_woman:`

:bat: `:bat:`

:bath: `:bath:`

:bathtub: `:bathtub:`

:battery: `:battery:`

:beach_umbrella: `:beach_umbrella:`

:beans: `:beans:`

:bear: `:bear:`

:bearded_person: `:bearded_person:`

:beaver: `:beaver:`

:bed: `:bed:`

:bee: `:bee:`

:beer: `:beer:`

:beers: `:beers:`

:beetle: `:beetle:`

:beginner: `:beginner:`

:belarus: `:belarus:`

:belgium: `:belgium:`

:belize: `:belize:`

:bell: `:bell:`

:bell_pepper: `:bell_pepper:`

:bellhop_bell: `:bellhop_bell:`

:benin: `:benin:`

:bento: `:bento:`

:bermuda: `:bermuda:`

:beverage_box: `:beverage_box:`

:bhutan: `:bhutan:`

:bicyclist: `:bicyclist:`

:bike: `:bike:`

:biking_man: `:biking_man:`

:biking_woman: `:biking_woman:`

:bikini: `:bikini:`

:billed_cap: `:billed_cap:`

:biohazard: `:biohazard:`

:bird: `:bird:`

:birthday: `:birthday:`

:bison: `:bison:`

:biting_lip: `:biting_lip:`

:black_bird: `:black_bird:`

:black_cat: `:black_cat:`

:black_circle: `:black_circle:`

:black_flag: `:black_flag:`

:black_heart: `:black_heart:`

:black_joker: `:black_joker:`

:black_large_square: `:black_large_square:`

:black_medium_small_square: `:black_medium_small_square:`

:black_medium_square: `:black_medium_square:`

:black_nib: `:black_nib:`

:black_small_square: `:black_small_square:`

:black_square_button: `:black_square_button:`

:blond_haired_man: `:blond_haired_man:`

:blond_haired_person: `:blond_haired_person:`

:blond_haired_woman: `:blond_haired_woman:`

:blonde_woman: `:blonde_woman:`

:blossom: `:blossom:`

:blowfish: `:blowfish:`

:blue_book: `:blue_book:`

:blue_car: `:blue_car:`

:blue_heart: `:blue_heart:`

:blue_square: `:blue_square:`

:blueberries: `:blueberries:`

:blush: `:blush:`

:boar: `:boar:`

:boat: `:boat:`

:bolivia: `:bolivia:`

:bomb: `:bomb:`

:bone: `:bone:`

:book: `:book:`

:bookmark: `:bookmark:`

:bookmark_tabs: `:bookmark_tabs:`

:books: `:books:`

:boom: `:boom:`

:boomerang: `:boomerang:`

:boot: `:boot:`

:bosnia_herzegovina: `:bosnia_herzegovina:`

:botswana: `:botswana:`

:bouncing_ball_man: `:bouncing_ball_man:`

:bouncing_ball_person: `:bouncing_ball_person:`

:bouncing_ball_woman: `:bouncing_ball_woman:`

:bouquet: `:bouquet:`

:bouvet_island: `:bouvet_island:`

:bow: `:bow:`

:bow_and_arrow: `:bow_and_arrow:`

:bowing_man: `:bowing_man:`

:bowing_woman: `:bowing_woman:`

:bowl_with_spoon: `:bowl_with_spoon:`

:bowling: `:bowling:`

:bowtie: `:bowtie:`

:boxing_glove: `:boxing_glove:`

:boy: `:boy:`

:brain: `:brain:`

:brazil: `:brazil:`

:bread: `:bread:`

:breast_feeding: `:breast_feeding:`

:bricks: `:bricks:`

:bride_with_veil: `:bride_with_veil:`

:bridge_at_night: `:bridge_at_night:`

:briefcase: `:briefcase:`

:british_indian_ocean_territory: `:british_indian_ocean_territory:`

:british_virgin_islands: `:british_virgin_islands:`

:broccoli: `:broccoli:`

:broken_heart: `:broken_heart:`

:broom: `:broom:`

:brown_circle: `:brown_circle:`

:brown_heart: `:brown_heart:`

:brown_square: `:brown_square:`

:brunei: `:brunei:`

:bubble_tea: `:bubble_tea:`

:bubbles: `:bubbles:`

:bucket: `:bucket:`

:bug: `:bug:`

:building_construction: `:building_construction:`

:bulb: `:bulb:`

:bulgaria: `:bulgaria:`

:bullettrain_front: `:bullettrain_front:`

:bullettrain_side: `:bullettrain_side:`

:burkina_faso: `:burkina_faso:`

:burrito: `:burrito:`

:burundi: `:burundi:`

:bus: `:bus:`

:business_suit_levitating: `:business_suit_levitating:`

:busstop: `:busstop:`

:bust_in_silhouette: `:bust_in_silhouette:`

:busts_in_silhouette: `:busts_in_silhouette:`

:butter: `:butter:`

:butterfly: `:butterfly:`

:cactus: `:cactus:`

:cake: `:cake:`

:calendar: `:calendar:`

:call_me_hand: `:call_me_hand:`

:calling: `:calling:`

:cambodia: `:cambodia:`

:camel: `:camel:`

:camera: `:camera:`

:camera_flash: `:camera_flash:`

:cameroon: `:cameroon:`

:camping: `:camping:`

:canada: `:canada:`

:canary_islands: `:canary_islands:`

:cancer: `:cancer:`

:candle: `:candle:`

:candy: `:candy:`

:canned_food: `:canned_food:`

:canoe: `:canoe:`

:cape_verde: `:cape_verde:`

:capital_abcd: `:capital_abcd:`

:capricorn: `:capricorn:`

:car: `:car:`

:card_file_box: `:card_file_box:`

:card_index: `:card_index:`

:card_index_dividers: `:card_index_dividers:`

:caribbean_netherlands: `:caribbean_netherlands:`

:carousel_horse: `:carousel_horse:`

:carpentry_saw: `:carpentry_saw:`

:carrot: `:carrot:`

:cartwheeling: `:cartwheeling:`

:cat: `:cat:`

:cat2: `:cat2:`

:cayman_islands: `:cayman_islands:`

:cd: `:cd:`

:central_african_republic: `:central_african_republic:`

:ceuta_melilla: `:ceuta_melilla:`

:chad: `:chad:`

:chains: `:chains:`

:chair: `:chair:`

:champagne: `:champagne:`

:chart: `:chart:`

:chart_with_downwards_trend: `:chart_with_downwards_trend:`

:chart_with_upwards_trend: `:chart_with_upwards_trend:`

:checkered_flag: `:checkered_flag:`

:cheese: `:cheese:`

:cherries: `:cherries:`

:cherry_blossom: `:cherry_blossom:`

:chess_pawn: `:chess_pawn:`

:chestnut: `:chestnut:`

:chicken: `:chicken:`

:child: `:child:`

:children_crossing: `:children_crossing:`

:chile: `:chile:`

:chipmunk: `:chipmunk:`

:chocolate_bar: `:chocolate_bar:`

:chopsticks: `:chopsticks:`

:christmas_island: `:christmas_island:`

:christmas_tree: `:christmas_tree:`

:church: `:church:`

:cinema: `:cinema:`

:circus_tent: `:circus_tent:`

:city_sunrise: `:city_sunrise:`

:city_sunset: `:city_sunset:`

:cityscape: `:cityscape:`

:cl: `:cl:`

:clamp: `:clamp:`

:clap: `:clap:`

:clapper: `:clapper:`

:classical_building: `:classical_building:`

:climbing: `:climbing:`

:climbing_man: `:climbing_man:`

:climbing_woman: `:climbing_woman:`

:clinking_glasses: `:clinking_glasses:`

:clipboard: `:clipboard:`

:clipperton_island: `:clipperton_island:`

:clock1: `:clock1:`

:clock10: `:clock10:`

:clock1030: `:clock1030:`

:clock11: `:clock11:`

:clock1130: `:clock1130:`

:clock12: `:clock12:`

:clock1230: `:clock1230:`

:clock130: `:clock130:`

:clock2: `:clock2:`

:clock230: `:clock230:`

:clock3: `:clock3:`

:clock330: `:clock330:`

:clock4: `:clock4:`

:clock430: `:clock430:`

:clock5: `:clock5:`

:clock530: `:clock530:`

:clock6: `:clock6:`

:clock630: `:clock630:`

:clock7: `:clock7:`

:clock730: `:clock730:`

:clock8: `:clock8:`

:clock830: `:clock830:`

:clock9: `:clock9:`

:clock930: `:clock930:`

:closed_book: `:closed_book:`

:closed_lock_with_key: `:closed_lock_with_key:`

:closed_umbrella: `:closed_umbrella:`

:cloud: `:cloud:`

:cloud_with_lightning: `:cloud_with_lightning:`

:cloud_with_lightning_and_rain: `:cloud_with_lightning_and_rain:`

:cloud_with_rain: `:cloud_with_rain:`

:cloud_with_snow: `:cloud_with_snow:`

:clown_face: `:clown_face:`

:clubs: `:clubs:`

:cn: `:cn:`

:coat: `:coat:`

:cockroach: `:cockroach:`

:cocktail: `:cocktail:`

:coconut: `:coconut:`

:cocos_islands: `:cocos_islands:`

:coffee: `:coffee:`

:coffin: `:coffin:`

:coin: `:coin:`

:cold_face: `:cold_face:`

:cold_sweat: `:cold_sweat:`

:collision: `:collision:`

:colombia: `:colombia:`

:comet: `:comet:`

:comoros: `:comoros:`

:compass: `:compass:`

:computer: `:computer:`

:computer_mouse: `:computer_mouse:`

:confetti_ball: `:confetti_ball:`

:confounded: `:confounded:`

:confused: `:confused:`

:congo_brazzaville: `:congo_brazzaville:`

:congo_kinshasa: `:congo_kinshasa:`

:congratulations: `:congratulations:`

:construction: `:construction:`

:construction_worker: `:construction_worker:`

:construction_worker_man: `:construction_worker_man:`

:construction_w
Download .txt
gitextract_4_14r9ru/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── crowdin/
│   │   └── crowdin-push.yml
│   ├── dependabot.yml
│   ├── semantic.yml
│   └── workflows/
│       ├── crowdin.yml
│       ├── emoji.yml
│       └── test.yml
├── .gitignore
├── .gitpod.yml
├── .husky/
│   └── pre-commit
├── .npmignore
├── .prettierignore
├── .prettierrc.json
├── .vscode/
│   ├── launch.json
│   └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── HISTORY.md
├── LICENSE
├── README.md
├── SECURITY.md
├── babel.config.json
├── build/
│   ├── cover.js
│   ├── emoji.js
│   ├── release.sh
│   └── util.js
├── docs/
│   ├── .nojekyll
│   ├── CNAME
│   ├── README.md
│   ├── _coverpage.md
│   ├── _media/
│   │   ├── example-with-yaml.md
│   │   ├── example.html
│   │   ├── example.js
│   │   └── example.md
│   ├── _navbar.md
│   ├── _sidebar.md
│   ├── adding-pages.md
│   ├── cdn.md
│   ├── configuration.md
│   ├── cover.md
│   ├── custom-navbar.md
│   ├── deploy.md
│   ├── embed-files.md
│   ├── emoji.md
│   ├── helpers.md
│   ├── index.html
│   ├── language-highlight.md
│   ├── markdown.md
│   ├── plugins.md
│   ├── pwa.md
│   ├── quickstart.md
│   ├── themes.md
│   ├── ui-kit.md
│   ├── v5-upgrade.md
│   ├── vue.md
│   └── write-a-plugin.md
├── eslint.config.js
├── jest.config.js
├── middleware.js
├── package.json
├── playwright.config.js
├── postcss.config.cjs
├── rollup.config.js
├── server.configs.js
├── server.js
├── src/
│   ├── core/
│   │   ├── Docsify.js
│   │   ├── config.js
│   │   ├── event/
│   │   │   └── index.js
│   │   ├── fetch/
│   │   │   └── index.js
│   │   ├── global-api.js
│   │   ├── globals.ts
│   │   ├── index.js
│   │   ├── init/
│   │   │   └── lifecycle.js
│   │   ├── module.js
│   │   ├── modules.ts
│   │   ├── render/
│   │   │   ├── compiler/
│   │   │   │   ├── blockquote.js
│   │   │   │   ├── code.js
│   │   │   │   ├── heading.js
│   │   │   │   ├── image.js
│   │   │   │   ├── link.js
│   │   │   │   ├── media.js
│   │   │   │   ├── paragraph.js
│   │   │   │   ├── tableCell.js
│   │   │   │   ├── taskList.js
│   │   │   │   └── taskListItem.js
│   │   │   ├── compiler.js
│   │   │   ├── embed.js
│   │   │   ├── emoji-data.js
│   │   │   ├── emojify.js
│   │   │   ├── gen-tree.js
│   │   │   ├── index.js
│   │   │   ├── progressbar.js
│   │   │   ├── slugify.js
│   │   │   ├── tpl.js
│   │   │   └── utils.js
│   │   ├── router/
│   │   │   ├── history/
│   │   │   │   ├── base.js
│   │   │   │   ├── hash.js
│   │   │   │   └── html5.js
│   │   │   ├── index.js
│   │   │   └── util.js
│   │   ├── util/
│   │   │   ├── ajax.js
│   │   │   ├── core.js
│   │   │   ├── dom.js
│   │   │   ├── env.js
│   │   │   ├── index.js
│   │   │   └── prism.js
│   │   └── virtual-routes/
│   │       ├── exact-match.js
│   │       ├── index.js
│   │       └── next.js
│   └── plugins/
│       ├── disqus.js
│       ├── emoji.js
│       ├── external-script.js
│       ├── front-matter/
│       │   ├── index.js
│       │   ├── parser.js
│       │   └── yaml.js
│       ├── ga.js
│       ├── gitalk.js
│       ├── gtag.js
│       ├── matomo.js
│       ├── search/
│       │   ├── component.js
│       │   ├── index.js
│       │   ├── markdown-to-txt.js
│       │   ├── search.js
│       │   └── style.css
│       └── zoom-image.js
├── test/
│   ├── README.md
│   ├── config/
│   │   ├── jest.setup-tests.js
│   │   ├── jest.setup.js
│   │   ├── jest.teardown.js
│   │   ├── playwright.setup.js
│   │   ├── playwright.teardown.js
│   │   └── server.js
│   ├── consume-types/
│   │   ├── README.md
│   │   ├── example.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── prism.js
│   │   ├── register-sw.js
│   │   ├── sw.js
│   │   └── tsconfig.json
│   ├── e2e/
│   │   ├── configuration.test.js
│   │   ├── example.test.js
│   │   ├── fixtures/
│   │   │   └── docsify-init-fixture.js
│   │   ├── gtag.test.js
│   │   ├── index-file.test.js
│   │   ├── plugins.test.js
│   │   ├── search.test.js
│   │   ├── security.test.js
│   │   ├── sidebar.test.js
│   │   ├── virtual-routes.test.js
│   │   └── vue.test.js
│   ├── helpers/
│   │   ├── docsify-init.js
│   │   └── wait-for.js
│   ├── integration/
│   │   ├── __snapshots__/
│   │   │   ├── docs.test.js.snap
│   │   │   └── emoji.test.js.snap
│   │   ├── docs.test.js
│   │   ├── docsify.test.js
│   │   ├── emoji.test.js
│   │   ├── example.test.js
│   │   ├── global-apis.test.js
│   │   ├── render.test.js
│   │   └── sidebar.test.js
│   └── unit/
│       ├── core-util.test.js
│       ├── render-util.test.js
│       ├── router-history-base.test.js
│       └── router-util.test.js
├── tsconfig.json
└── vercel.json
Download .txt
SYMBOL INDEX (208 symbols across 60 files)

FILE: build/emoji.js
  function getEmojiData (line 16) | async function getEmojiData() {
  function writeEmojiPage (line 40) | function writeEmojiPage(emojiData) {
  function writeEmojiJS (line 74) | function writeEmojiJS(emojiData) {

FILE: docs/_media/example.js
  constant URL (line 3) | const URL = 'https://example.com';
  constant PORT (line 4) | const PORT = 8080;

FILE: jest.config.js
  constant TEST_HOST (line 4) | const TEST_HOST = `http://${hostname}:${port}`;

FILE: middleware.js
  function middleware (line 37) | async function middleware(request) {

FILE: playwright.config.js
  constant TEST_HOST (line 5) | const TEST_HOST = `http://${hostname}:${port}`;

FILE: server.configs.js
  method handle (line 51) | handle(req, res, next) {

FILE: src/core/Docsify.js
  class Docsify (line 23) | class Docsify extends Fetch(
    method constructor (line 30) | constructor(conf = {}) {
    method initPlugin (line 45) | initPlugin() {

FILE: src/core/config.js
  method themeColor (line 68) | get themeColor() {
  method themeColor (line 71) | set themeColor(value) {
  method topMargin (line 91) | get topMargin() {
  method topMargin (line 94) | set topMargin(value) {
  method callback (line 142) | callback(/** @type {KeyboardEvent} */ e) {

FILE: src/core/event/index.js
  function Events (line 11) | function Events(Base) {

FILE: src/core/fetch/index.js
  function Fetch (line 11) | function Fetch(Base) {

FILE: src/core/global-api.js
  function initGlobalAPI (line 9) | function initGlobalAPI() {

FILE: src/core/globals.ts
  type DocsifyConfigOrFn (line 11) | type DocsifyConfigOrFn =
  type Window (line 16) | interface Window {

FILE: src/core/init/lifecycle.js
  function Lifecycle (line 9) | function Lifecycle(Base) {

FILE: src/core/render/compiler.js
  class Compiler (line 22) | class Compiler {
    method constructor (line 23) | constructor(config, router) {
    method compileEmbed (line 101) | compileEmbed(href, title) {
    method _matchNotCompileLink (line 144) | _matchNotCompileLink(link) {
    method _initRenderer (line 156) | _initRenderer() {
    method sidebar (line 195) | sidebar(text, level) {
    method resetToc (line 228) | resetToc() {
    method subSidebar (line 237) | subSidebar(level) {
    method header (line 262) | header(text, level) {
    method cover (line 279) | cover(text) {

FILE: src/core/render/compiler/media.js
  method markdown (line 2) | markdown(url) {
  method mermaid (line 7) | mermaid(url) {
  method iframe (line 12) | iframe(url, title) {
  method video (line 19) | video(url, title) {
  method audio (line 24) | audio(url, title) {
  method code (line 29) | code(url, title) {

FILE: src/core/render/embed.js
  function extractFragmentContent (line 18) | function extractFragmentContent(text, fragment, fullLine) {
  function walkFetchEmbed (line 35) | function walkFetchEmbed({ embedTokens, compile, fetch }, cb) {
  function prerenderEmbed (line 135) | function prerenderEmbed({ compiler, raw = '', fetch }, done) {

FILE: src/core/render/emojify.js
  function replaceEmojiShorthand (line 3) | function replaceEmojiShorthand(m, $1, useNativeEmoji) {
  function emojify (line 28) | function emojify(text, useNativeEmoji) {

FILE: src/core/render/gen-tree.js
  function genTree (line 8) | function genTree(toc, maxLevel) {

FILE: src/core/render/index.js
  function Render (line 23) | function Render(Base) {

FILE: src/core/render/progressbar.js
  function init (line 9) | function init() {

FILE: src/core/render/slugify.js
  function lower (line 4) | function lower(string) {
  function slugify (line 8) | function slugify(str) {

FILE: src/core/render/tpl.js
  function corner (line 9) | function corner(data, cornerExternalLinkTarget) {
  function main (line 38) | function main(config) {
  function cover (line 78) | function cover() {
  function tree (line 93) | function tree(
  function helper (line 118) | function helper(className, content) {
  function theme (line 125) | function theme(color) {

FILE: src/core/render/utils.js
  function getAndRemoveConfig (line 21) | function getAndRemoveConfig(str = '') {
  function removeAtag (line 59) | function removeAtag(str = '') {
  function getAndRemoveDocsifyIgnoreConfig (line 69) | function getAndRemoveDocsifyIgnoreConfig(content = '') {

FILE: src/core/router/history/base.js
  class History (line 11) | class History {
    method constructor (line 14) | constructor(config) {
    method #getAlias (line 18) | #getAlias(path, alias, last) {
    method #getFileName (line 34) | #getFileName(path, ext) {
    method getBasePath (line 50) | getBasePath() {
    method getFile (line 58) | getFile(path = this.getCurrentPath(), isRelative = false) {
    method onchange (line 75) | onchange(cb = noop) {
    method getCurrentPath (line 82) | getCurrentPath() {
    method normalize (line 86) | normalize() {
    method parse (line 94) | parse(path) {
    method toURL (line 98) | toURL(path, params, currentRoute) {

FILE: src/core/router/history/hash.js
  function replaceHash (line 6) | function replaceHash(path) {
  class HashHistory (line 11) | class HashHistory extends History {
    method getBasePath (line 14) | getBasePath() {
    method getCurrentPath (line 29) | getCurrentPath() {
    method onchange (line 38) | onchange(cb = noop) {
    method normalize (line 69) | normalize() {
    method parse (line 86) | parse(path = location.href) {
    method toURL (line 108) | toURL(path, params, currentRoute) {

FILE: src/core/router/history/html5.js
  class HTML5History (line 6) | class HTML5History extends History {
    method getCurrentPath (line 9) | getCurrentPath() {
    method onchange (line 21) | onchange(cb = noop) {
    method parse (line 43) | parse(path = location.href) {

FILE: src/core/router/index.js
  function Router (line 24) | function Router(Base) {

FILE: src/core/router/util.js
  function parseQuery (line 10) | function parseQuery(query) {
  function stringifyQuery (line 30) | function stringifyQuery(obj, ignores = []) {
  function stripUrlExceptId (line 48) | function stripUrlExceptId(str) {
  function normaliseFragment (line 122) | function normaliseFragment(path) {
  function getPath (line 129) | function getPath(...args) {

FILE: src/core/util/ajax.js
  function get (line 28) | function get(url, hasBar = false, headers = {}) {

FILE: src/core/util/core.js
  function cached (line 9) | function cached(fn) {
  function isPrimitive (line 30) | function isPrimitive(value) {
  function noop (line 38) | function noop() {}
  function isFn (line 45) | function isFn(obj) {
  function isExternal (line 54) | function isExternal(url) {

FILE: src/core/util/dom.js
  function getNode (line 12) | function getNode(el, noCache = false) {
  function setHTML (line 35) | function setHTML(el, content, replace) {
  function find (line 59) | function find(el, query = ':is()') {
  function findAll (line 76) | function findAll(el, query = ':is()') {
  function create (line 89) | function create(node, tpl) {
  function appendTo (line 102) | function appendTo(target, el) {
  function before (line 110) | function before(target, el) {
  function on (line 119) | function on(el, type, handler) {
  function off (line 130) | function off(el, type, handler) {
  function style (line 139) | function style(content) {
  function documentReady (line 149) | function documentReady(callback, doc = document) {

FILE: src/core/util/env.js
  function isMobile (line 7) | function isMobile() {

FILE: src/core/util/prism.js
  function checkLangDependenciesAllLoaded (line 228) | function checkLangDependenciesAllLoaded(lang) {

FILE: src/core/virtual-routes/exact-match.js
  function makeExactMatcher (line 6) | function makeExactMatcher(matcher) {

FILE: src/core/virtual-routes/index.js
  function VirtualRoutes (line 31) | function VirtualRoutes(Base) {

FILE: src/core/virtual-routes/next.js
  function createNextFunction (line 10) | function createNextFunction() {

FILE: src/plugins/disqus.js
  function install (line 8) | function install(hook, vm) {

FILE: src/plugins/external-script.js
  function handleExternalScript (line 3) | function handleExternalScript() {

FILE: src/plugins/front-matter/parser.js
  function extractor (line 21) | function extractor(string) {
  function parse (line 32) | function parse(string) {

FILE: src/plugins/front-matter/yaml.js
  function Block (line 59) | function Block(lvl) {
  function parser (line 80) | function parser(str) {
  function processValue (line 144) | function processValue(val) {
  function processFoldedBlock (line 251) | function processFoldedBlock(block) {
  function processLiteralBlock (line 262) | function processLiteralBlock(block) {
  function processBlock (line 272) | function processBlock(blocks) {
  function semanticAnalysis (line 395) | function semanticAnalysis(blocks) {
  function preProcess (line 400) | function preProcess(src) {
  function load (line 425) | function load(str) {

FILE: src/plugins/ga.js
  function appendScript (line 2) | function appendScript() {
  function init (line 11) | function init(id) {
  function collect (line 23) | function collect() {

FILE: src/plugins/gitalk.js
  function install (line 3) | function install(hook) {

FILE: src/plugins/gtag.js
  function appendScript (line 3) | function appendScript(id) {
  function initGlobalSiteTag (line 13) | function initGlobalSiteTag(id) {
  function initAdditionalTag (line 29) | function initAdditionalTag(id) {
  function init (line 33) | function init(ids) {
  function collect (line 49) | function collect() {

FILE: src/plugins/matomo.js
  function appendScript (line 1) | function appendScript(options) {
  function init (line 10) | function init(options) {
  function collect (line 21) | function collect() {

FILE: src/plugins/search/component.js
  constant NO_DATA_TEXT (line 4) | let NO_DATA_TEXT = '';
  function tpl (line 6) | function tpl(vm, defaultValue = '') {
  function doSearch (line 38) | function doSearch(value) {
  function bindEvents (line 72) | function bindEvents() {
  function updatePlaceholder (line 108) | function updatePlaceholder(text, path) {
  function updateNoData (line 125) | function updateNoData(text, path) {
  function init (line 134) | function init(opts, vm) {
  function update (line 149) | function update(opts, vm) {

FILE: src/plugins/search/index.js
  constant CONFIG (line 20) | const CONFIG = {
  method callback (line 59) | callback(e) {

FILE: src/plugins/search/markdown-to-txt.js
  function unescape (line 17) | function unescape(string) {
  function escape (line 33) | function escape(string) {
  function helpersCleanup (line 39) | function helpersCleanup(string) {
  method space (line 44) | space() {
  method code (line 48) | code({ text }) {
  method blockquote (line 53) | blockquote({ tokens }) {
  method html (line 57) | html() {
  method heading (line 61) | heading({ tokens }) {
  method hr (line 65) | hr() {
  method list (line 69) | list(token) {
  method listitem (line 79) | listitem(item) {
  method checkbox (line 117) | checkbox(options) {
  method paragraph (line 121) | paragraph({ tokens }) {
  method table (line 125) | table(token) {
  method tablerow (line 149) | tablerow({ text }) {
  method tablecell (line 153) | tablecell(token) {
  method strong (line 157) | strong({ text }) {
  method em (line 161) | em({ tokens }) {
  method codespan (line 165) | codespan({ text }) {
  method br (line 169) | br() {
  method del (line 173) | del({ tokens }) {
  method link (line 177) | link({ tokens, href, title }) {
  method image (line 184) | image({ title, text, href }) {
  method text (line 188) | text(token) {
  function markdownToTxt (line 199) | function markdownToTxt(markdown) {

FILE: src/plugins/search/search.js
  constant INDEXES (line 9) | let INDEXES = [];
  function saveData (line 17) | async function saveData(maxAge, expireKey) {
  function getData (line 28) | async function getData(key, isExpireKey = false) {
  constant LOCAL_STORAGE (line 40) | const LOCAL_STORAGE = {
  function resolveExpireKey (line 45) | function resolveExpireKey(namespace) {
  function resolveIndexKey (line 51) | function resolveIndexKey(namespace) {
  function escapeHtml (line 57) | function escapeHtml(string) {
  function getAllPaths (line 69) | function getAllPaths(router) {
  function getTableData (line 93) | function getTableData(token) {
  function getListData (line 103) | function getListData(token) {
  function genIndex (line 110) | function genIndex(path, content = '', router, depth, indexKey) {
  function ignoreDiacriticalMarks (line 180) | function ignoreDiacriticalMarks(keyword) {
  function search (line 191) | function search(query) {
  function init (line 273) | async function init(config, vm) {

FILE: src/plugins/zoom-image.js
  function install (line 3) | function install(hook) {

FILE: test/config/jest.setup-tests.js
  class IntersectionObserver (line 24) | class IntersectionObserver {
    method constructor (line 25) | constructor() {}
    method disconnect (line 31) | disconnect() {
    method observe (line 35) | observe() {
    method takeRecords (line 39) | takeRecords() {
    method unobserve (line 43) | unobserve() {
  function addEventListenerSpy (line 56) | function addEventListenerSpy(type, listener, options) {

FILE: test/config/server.js
  function startServer (line 7) | async function startServer() {
  function stopServer (line 30) | function stopServer() {

FILE: test/consume-types/register-sw.js
  function queueReload (line 8) | function queueReload() {

FILE: test/consume-types/sw.js
  function tryJs (line 67) | async function tryJs() {
  function tryIndexJs (line 74) | async function tryIndexJs() {

FILE: test/e2e/configuration.test.js
  method callback (line 181) | callback(e) {
  method callback (line 213) | callback(e) {

FILE: test/e2e/gtag.test.js
  function pageRequestListened (line 13) | function pageRequestListened(page) {

FILE: test/e2e/virtual-routes.test.js
  function navigateToRoute (line 9) | async function navigateToRoute(page, route) {
  method '/pets/(.*)' (line 121) | '/pets/(.*)'(_, matched) {

FILE: test/e2e/vue.test.js
  function getSharedConfig (line 8) | function getSharedConfig() {

FILE: test/helpers/docsify-init.js
  function docsifyInit (line 36) | async function docsifyInit(options = {}) {

FILE: test/helpers/wait-for.js
  function waitForFunction (line 17) | function waitForFunction(fn, arg, options = {}) {
  function waitForSelector (line 62) | function waitForSelector(cssSelector, options = {}) {
  function waitForText (line 99) | function waitForText(cssSelector, text, options = {}) {

FILE: test/unit/router-history-base.test.js
  class MockHistory (line 3) | class MockHistory extends History {
    method parse (line 4) | parse(path) {
Condensed preview — 174 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (785K chars).
[
  {
    "path": ".editorconfig",
    "chars": 174,
    "preview": "# http://EditorConfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert"
  },
  {
    "path": ".gitattributes",
    "chars": 19,
    "preview": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1802,
    "preview": "name: Bug Report\ndescription: Submit a bug report.\nlabels: ['bug', 'Triage']\n\nbody:\n  - type: markdown\n    attributes:\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 179,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Discord - the community chat\n    url: https://discord.gg/docsify\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1059,
    "preview": "name: Feature Request\ndescription: Propose a new feature or improvement for this project.\nlabels: ['feature request', 'T"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 923,
    "preview": "## Summary\n\n<!-- Describe what the change does and why it should be merged. Provide **before/after** screenshots for any"
  },
  {
    "path": ".github/crowdin/crowdin-push.yml",
    "chars": 216,
    "preview": "files:\n  - source: /*.md\n    translation: /%two_letters_code%/%original_file_name%\n    ignore:\n      - '/_coverpage.md'\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1157,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/semantic.yml",
    "chars": 87,
    "preview": "titleAndCommits: true\nallowMergeCommits: true\nallowRevertCommits: true\nanyCommit: true\n"
  },
  {
    "path": ".github/workflows/crowdin.yml",
    "chars": 860,
    "preview": "name: Crowdin Action\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'docs/**.md'\n    branches: [develop, main]\n\njo"
  },
  {
    "path": ".github/workflows/emoji.yml",
    "chars": 1234,
    "preview": "name: Sync Emoji\n\non:\n  schedule:\n    - cron: '0 2 * * *'\n  workflow_dispatch:\n\njobs:\n  sync-emoji:\n    if: github.repos"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 2904,
    "preview": "name: Build & Test\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main, develop]\n  workflow_d"
  },
  {
    "path": ".gitignore",
    "chars": 335,
    "preview": "# Directories\n.husky/_\n.idea\n.vercel\n_playwright-report\n_playwright-results\nnode_modules\n\n# Files\n.DS_Store\n*.log\n\n# Exc"
  },
  {
    "path": ".gitpod.yml",
    "chars": 250,
    "preview": "tasks:\n  - command: gp await-port 3000 && sleep 3 && gp preview $(gp url 3000)\n  - init: npm install\n    command: npm ru"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 86,
    "preview": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpm run prettier\nnpx lint-staged\n"
  },
  {
    "path": ".npmignore",
    "chars": 33,
    "preview": ".eslintignore\n.github\n.gitignore\n"
  },
  {
    "path": ".prettierignore",
    "chars": 112,
    "preview": "# Directories\n_playwright-*\ndist\nlib\n\n# Files\n_vars.css\n_vars-advanced.css\nCHANGELOG.md\nemoji-data.*\nHISTORY.md\n"
  },
  {
    "path": ".prettierrc.json",
    "chars": 52,
    "preview": "{\n  \"arrowParens\": \"avoid\",\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1885,
    "preview": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  //"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 143,
    "preview": "{\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"cSpell.words\": [\"coverpage\"],\n  \"typescript.tsdk\": \"node_mod"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 75800,
    "preview": "# [5.0.0-rc.4](https://github.com/docsifyjs/docsify/compare/v5.0.0-rc.3...v5.0.0-rc.4) (2026-03-11)\n\n\n### Bug Fixes\n\n* a"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5420,
    "preview": "# Contribute\n\n## Introduction\n\nFirst, thank you for considering contributing to docsify! It's people like you that make "
  },
  {
    "path": "Dockerfile",
    "chars": 188,
    "preview": "FROM mcr.microsoft.com/playwright:focal\nWORKDIR /app\nCOPY . .\nRUN rm package-lock.json\nRUN npm install\nRUN npx playwrigh"
  },
  {
    "path": "HISTORY.md",
    "chars": 20673,
    "preview": "<!-- Historical history file (do not edit). -->\n\n<a name=\"3.7.3\"></a>\n## [3.7.3](https://github.com/QingWei-Li/docsify/c"
  },
  {
    "path": "LICENSE",
    "chars": 1146,
    "preview": "MIT License\n\nCopyright (c) 2016 - present Docsify Contributors (https://github.com/docsifyjs/docsify/graphs/contributors"
  },
  {
    "path": "README.md",
    "chars": 3600,
    "preview": "<p align=\"center\">\n  <a href=\"https://docsify.js.org\">\n    <img alt=\"docsify\" src=\"./docs/_media/icon.svg\">\n  </a>\n</p>\n"
  },
  {
    "path": "SECURITY.md",
    "chars": 902,
    "preview": "# Security Policy\n\nIf you believe you have found a security vulnerability in docsify, please report it to us asap.\n\n## R"
  },
  {
    "path": "babel.config.json",
    "chars": 108,
    "preview": "{\n  \"presets\": [\n    [\n      \"@babel/preset-env\",\n      {\n        \"targets\": \"defaults\"\n      }\n    ]\n  ]\n}\n"
  },
  {
    "path": "build/cover.js",
    "chars": 570,
    "preview": "import fs from 'fs';\nimport { relative } from './util.js';\n\nconst read = fs.readFileSync;\nconst write = fs.writeFileSync"
  },
  {
    "path": "build/emoji.js",
    "chars": 2967,
    "preview": "import fs from 'fs';\nimport path from 'path';\nimport axios from 'axios';\n\nconst filePaths = {\n  emojiMarkdown: path.reso"
  },
  {
    "path": "build/release.sh",
    "chars": 1134,
    "preview": "set -e\n\nif [[ -z $1 ]]; then\n  echo \"Enter new version: \"\n  read VERSION\nelse\n  VERSION=$1\nfi\n\nRELEASE_TAG=${RELEASE_TAG"
  },
  {
    "path": "build/util.js",
    "chars": 229,
    "preview": "import url from 'url';\nimport path from 'path';\n\n/** Get a new path relative to the current module (pass import.meta). *"
  },
  {
    "path": "docs/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/CNAME",
    "chars": 14,
    "preview": "docsify.js.org"
  },
  {
    "path": "docs/README.md",
    "chars": 1067,
    "preview": "# docsify\n\n> A magical documentation site generator.\n\n## What it is\n\nDocsify turns your Markdown files into a documentat"
  },
  {
    "path": "docs/_coverpage.md",
    "chars": 370,
    "preview": "<!-- markdownlint-disable first-line-h1 -->\n\n![logo](_media/icon.svg)\n\n# docsify <small>5.0.0-rc.4</small> :id=docsify\n\n"
  },
  {
    "path": "docs/_media/example-with-yaml.md",
    "chars": 85,
    "preview": "---\nauthor: John Smith\ndate: 2020-1-1\n---\n\n> This is from the `example-with-yaml.md`\n"
  },
  {
    "path": "docs/_media/example.html",
    "chars": 446,
    "preview": "<style>\n  html,\n  body {\n    margin: 0;\n    padding: 0;\n    min-height: 100%;\n  }\n\n  body {\n    background-color: #4158d"
  },
  {
    "path": "docs/_media/example.js",
    "chars": 314,
    "preview": "import fetch from 'fetch';\n\nconst URL = 'https://example.com';\nconst PORT = 8080;\n\n/// [demo]\nconst result = fetch(`${UR"
  },
  {
    "path": "docs/_media/example.md",
    "chars": 32,
    "preview": "> This is from the `example.md`\n"
  },
  {
    "path": "docs/_navbar.md",
    "chars": 98,
    "preview": "<!-- markdownlint-disable first-line-h1 -->\n\n- Translations\n\n  - [English](/)\n  - [简体中文](/zh-cn/)\n"
  },
  {
    "path": "docs/_sidebar.md",
    "chars": 773,
    "preview": "<!-- markdownlint-disable first-line-h1 -->\n\n- Getting started\n\n  - [Quick start](quickstart.md)\n  - [Adding pages](addi"
  },
  {
    "path": "docs/adding-pages.md",
    "chars": 4211,
    "preview": "# Adding pages\n\nIf you need more pages, you can simply create more markdown files in your docsify directory. If you crea"
  },
  {
    "path": "docs/cdn.md",
    "chars": 2284,
    "preview": "# CDN\n\nThe docsify [npm package](https://www.npmjs.com/package/docsify) is auto-published to CDNs with each release. The"
  },
  {
    "path": "docs/configuration.md",
    "chars": 25331,
    "preview": "# Configuration\n\nYou can configure Docsify by defining `window.$docsify` as an object:\n\n```html\n<script>\n  window.$docsi"
  },
  {
    "path": "docs/cover.md",
    "chars": 1843,
    "preview": "# Cover\n\nActivate the cover feature by setting `coverpage` to **true**. See [coverpage configuration](configuration#cove"
  },
  {
    "path": "docs/custom-navbar.md",
    "chars": 2345,
    "preview": "# Custom navbar\n\n## HTML\n\nIf you need custom navigation, you can create a HTML-based navigation bar.\n\n> [!IMPORTANT] Not"
  },
  {
    "path": "docs/deploy.md",
    "chars": 8607,
    "preview": "# Deploy\n\nSimilar to [GitBook](https://www.gitbook.com), you can deploy files to GitHub Pages, GitLab Pages or VPS.\n\n## "
  },
  {
    "path": "docs/embed-files.md",
    "chars": 8413,
    "preview": "# Embed files\n\nWith docsify 4.6 it is now possible to embed any type of file.\n\nYou can embed these files as video, audio"
  },
  {
    "path": "docs/emoji.md",
    "chars": 57279,
    "preview": "# Emoji\n\nBelow is a complete list of emoji shorthand codes. Docsify can be configured to render emoji using GitHub-style"
  },
  {
    "path": "docs/helpers.md",
    "chars": 4312,
    "preview": "# Doc helper\n\ndocsify extends Markdown syntax to make your documents more readable.\n\n> Note: For the special code syntax"
  },
  {
    "path": "docs/index.html",
    "chars": 7894,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>docsify</title>\n    <link rel=\"icon\" h"
  },
  {
    "path": "docs/language-highlight.md",
    "chars": 3852,
    "preview": "# Language highlighting\n\n## Prism\n\nDocsify uses [Prism](https://prismjs.com) for syntax highlighting within code blocks."
  },
  {
    "path": "docs/markdown.md",
    "chars": 1366,
    "preview": "# Markdown configuration\n\n**docsify** uses [marked](https://github.com/markedjs/marked) as its Markdown parser. You can "
  },
  {
    "path": "docs/plugins.md",
    "chars": 7474,
    "preview": "# List of Plugins\n\nThese are built-in and external plugins for Docsify.\n\nSee also how to [Write a Plugin](./write-a-plug"
  },
  {
    "path": "docs/pwa.md",
    "chars": 3858,
    "preview": "# Offline Mode\n\n[Progressive Web Apps](https://developers.google.com/web/progressive-web-apps/) (PWA) are experiences th"
  },
  {
    "path": "docs/quickstart.md",
    "chars": 4296,
    "preview": "# Quick start\n\nIt is recommended to install `docsify-cli` globally, which helps initializing and previewing the website "
  },
  {
    "path": "docs/themes.md",
    "chars": 11650,
    "preview": "# Themes\n\n## Core theme\n\nThe Docsify \"core\" theme contains all of the styles and [theme properties](#theme-properties) n"
  },
  {
    "path": "docs/ui-kit.md",
    "chars": 17339,
    "preview": "<!-- markdownlint-disable single-title no-duplicate-heading -->\n\n# UI Kit\n\n<details>\n  <summary>View the markdown source"
  },
  {
    "path": "docs/v5-upgrade.md",
    "chars": 4063,
    "preview": "# Upgrading v4 to v5\n\nThe main changes when upgrading a Docsify v4 site to v5 involve updating CDN URLs and theme files."
  },
  {
    "path": "docs/vue.md",
    "chars": 8686,
    "preview": "# Vue compatibility\n\nDocsify allows [Vue.js](https://vuejs.org) content to be added directly to your markdown pages. Thi"
  },
  {
    "path": "docs/write-a-plugin.md",
    "chars": 5492,
    "preview": "# Write a plugin\n\nA docsify plugin is a function with the ability to execute custom JavaScript code at various stages of"
  },
  {
    "path": "eslint.config.js",
    "chars": 1874,
    "preview": "import eslintConfigPrettier from 'eslint-config-prettier';\nimport playwrightPlugin from 'eslint-plugin-playwright';\nimpo"
  },
  {
    "path": "jest.config.js",
    "chars": 1001,
    "preview": "import { testConfig } from './server.configs.js';\n\nconst { hostname, port } = testConfig;\nconst TEST_HOST = `http://${ho"
  },
  {
    "path": "middleware.js",
    "chars": 1703,
    "preview": "// Exports\n// =============================================================================\nexport const config = {\n  ma"
  },
  {
    "path": "package.json",
    "chars": 5355,
    "preview": "{\n  \"name\": \"docsify\",\n  \"version\": \"5.0.0-rc.4\",\n  \"description\": \"A magical documentation generator.\",\n  \"homepage\": \""
  },
  {
    "path": "playwright.config.js",
    "chars": 1679,
    "preview": "import { devices } from '@playwright/test';\nimport { testConfig } from './server.configs.js';\n\nconst { hostname, port } "
  },
  {
    "path": "postcss.config.cjs",
    "chars": 228,
    "preview": "module.exports = ctx => ({\n  map: ctx.options.map,\n  plugins: {\n    'postcss-import': {},\n    'postcss-nesting': {\n     "
  },
  {
    "path": "rollup.config.js",
    "chars": 3050,
    "preview": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { babel } from '@rollup/plugin-babel';\nimport co"
  },
  {
    "path": "server.configs.js",
    "chars": 1445,
    "preview": "import * as path from 'node:path';\nimport * as url from 'node:url';\nimport { rewriteRules } from './middleware.js';\n\ncon"
  },
  {
    "path": "server.js",
    "chars": 552,
    "preview": "import { create } from 'browser-sync';\nimport { devConfig, prodConfig } from './server.configs.js';\n\nconst bsServer = cr"
  },
  {
    "path": "src/core/Docsify.js",
    "chars": 1774,
    "preview": "import prism from 'prismjs';\nimport { Router } from './router/index.js';\nimport { Render } from './render/index.js';\nimp"
  },
  {
    "path": "src/core/config.js",
    "chars": 6349,
    "preview": "import { stripIndent } from 'common-tags';\nimport { hyphenate, isPrimitive } from './util/core.js';\n/** @import { Docsif"
  },
  {
    "path": "src/core/event/index.js",
    "chars": 18552,
    "preview": "import { isMobile, mobileBreakpoint } from '../util/env.js';\nimport * as dom from '../util/dom.js';\nimport { stripUrlExc"
  },
  {
    "path": "src/core/fetch/index.js",
    "chars": 8641,
    "preview": "import { getParentPath, stringifyQuery } from '../router/util.js';\nimport { noop, isExternal } from '../util/core.js';\ni"
  },
  {
    "path": "src/core/global-api.js",
    "chars": 507,
    "preview": "import * as prism from 'prismjs';\nimport { marked } from 'marked';\nimport * as util from './util/index.js';\nimport * as "
  },
  {
    "path": "src/core/globals.ts",
    "chars": 1188,
    "preview": "import prism from 'prismjs';\nimport { marked as _marked } from 'marked';\nimport * as util from './util/index.js';\nimport"
  },
  {
    "path": "src/core/index.js",
    "chars": 232,
    "preview": "import { documentReady } from './util/dom.js';\nimport { Docsify } from './Docsify.js';\nimport initGlobalAPI from './glob"
  },
  {
    "path": "src/core/init/lifecycle.js",
    "chars": 2866,
    "preview": "import { noop } from '../util/core.js';\n\n/** @typedef {import('../Docsify.js').Constructor} Constructor */\n\n/**\n * @temp"
  },
  {
    "path": "src/core/module.js",
    "chars": 30,
    "preview": "export * from './Docsify.js';\n"
  },
  {
    "path": "src/core/modules.ts",
    "chars": 78,
    "preview": "declare module '*.css' {\n  const cssText: string;\n  export default cssText;\n}\n"
  },
  {
    "path": "src/core/render/compiler/blockquote.js",
    "chars": 1568,
    "preview": "export const blockquoteCompiler = ({ renderer }) =>\n  (renderer.blockquote = function ({ tokens }) {\n    let openTag = '"
  },
  {
    "path": "src/core/render/compiler/code.js",
    "chars": 711,
    "preview": "import * as Prism from 'prismjs';\n// See https://github.com/PrismJS/prism/pull/1367\nimport 'prismjs/components/prism-mar"
  },
  {
    "path": "src/core/render/compiler/heading.js",
    "chars": 1343,
    "preview": "import {\n  getAndRemoveConfig,\n  removeAtag,\n  getAndRemoveDocsifyIgnoreConfig,\n} from '../utils.js';\nimport { slugify }"
  },
  {
    "path": "src/core/render/compiler/image.js",
    "chars": 1248,
    "preview": "import { getAndRemoveConfig } from '../utils.js';\nimport { isAbsolutePath, getPath, getParentPath } from '../../router/u"
  },
  {
    "path": "src/core/render/compiler/link.js",
    "chars": 1885,
    "preview": "import { getAndRemoveConfig } from '../utils.js';\nimport { isAbsolutePath } from '../../router/util.js';\n\nexport const l"
  },
  {
    "path": "src/core/render/compiler/media.js",
    "chars": 744,
    "preview": "export const compileMedia = {\n  markdown(url) {\n    return {\n      url,\n    };\n  },\n  mermaid(url) {\n    return {\n      "
  },
  {
    "path": "src/core/render/compiler/paragraph.js",
    "chars": 484,
    "preview": "import { helper as helperTpl } from '../tpl.js';\n\nexport const paragraphCompiler = ({ renderer }) =>\n  (renderer.paragra"
  },
  {
    "path": "src/core/render/compiler/tableCell.js",
    "chars": 477,
    "preview": "export const tableCellCompiler = ({ renderer }) =>\n  (renderer.tablecell = function (token) {\n    let content;\n\n    if ("
  },
  {
    "path": "src/core/render/compiler/taskList.js",
    "chars": 702,
    "preview": "export const taskListCompiler = ({ renderer }) =>\n  (renderer.list = function (token) {\n    const ordered = token.ordere"
  },
  {
    "path": "src/core/render/compiler/taskListItem.js",
    "chars": 1138,
    "preview": "export const taskListItemCompiler = ({ renderer }) =>\n  (renderer.listitem = function (item) {\n    let text = '';\n    if"
  },
  {
    "path": "src/core/render/compiler.js",
    "chars": 7928,
    "preview": "import { marked } from 'marked';\nimport { isAbsolutePath, getPath, getParentPath } from '../router/util.js';\nimport { is"
  },
  {
    "path": "src/core/render/embed.js",
    "chars": 6806,
    "preview": "import { stripIndent } from 'common-tags';\nimport { get } from '../util/ajax.js';\n\nconst cached = {};\n\n/**\n * Extracts t"
  },
  {
    "path": "src/core/render/emoji-data.js",
    "chars": 84876,
    "preview": "// =============================================================================\n// DO NOT EDIT: This file is auto-gener"
  },
  {
    "path": "src/core/render/emojify.js",
    "chars": 1603,
    "preview": "import emojiData from './emoji-data.js';\n\nfunction replaceEmojiShorthand(m, $1, useNativeEmoji) {\n  const emojiMatch = e"
  },
  {
    "path": "src/core/render/gen-tree.js",
    "chars": 707,
    "preview": "/**\n * Gen toc tree\n * @link https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/sol"
  },
  {
    "path": "src/core/render/index.js",
    "chars": 18908,
    "preview": "import tinydate from 'tinydate';\nimport * as dom from '../util/dom.js';\nimport { getPath, isAbsolutePath } from '../rout"
  },
  {
    "path": "src/core/render/progressbar.js",
    "chars": 1204,
    "preview": "import * as dom from '../util/dom.js';\n\nlet barEl;\nlet timeId;\n\n/**\n * Init progress component\n */\nfunction init() {\n  c"
  },
  {
    "path": "src/core/render/slugify.js",
    "chars": 752,
    "preview": "let cache = {};\nconst re = /[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g;\n\nfunction lower(string) {\n  "
  },
  {
    "path": "src/core/render/tpl.js",
    "chars": 4551,
    "preview": "import { isMobile } from '../util/env.js';\n\n/**\n * Render github corner\n * @param  {Object} data URL for the View Source"
  },
  {
    "path": "src/core/render/utils.js",
    "chars": 2844,
    "preview": "/**\n * Converts a colon formatted string to a object with properties.\n *\n * This is process a provided string and look f"
  },
  {
    "path": "src/core/router/history/base.js",
    "chars": 2876,
    "preview": "import {\n  cleanPath,\n  getPath,\n  isAbsolutePath,\n  replaceSlug,\n  resolvePath,\n  stringifyQuery,\n} from '../util.js';\n"
  },
  {
    "path": "src/core/router/history/hash.js",
    "chars": 3142,
    "preview": "import { isExternal, noop } from '../../util/core.js';\nimport { on } from '../../util/dom.js';\nimport { parseQuery, clea"
  },
  {
    "path": "src/core/router/history/html5.js",
    "chars": 1673,
    "preview": "import { isExternal, noop } from '../../util/core.js';\nimport { on } from '../../util/dom.js';\nimport { parseQuery, getP"
  },
  {
    "path": "src/core/router/index.js",
    "chars": 1482,
    "preview": "import * as dom from '../util/dom.js';\nimport { noop } from '../util/core.js';\nimport { HashHistory } from './history/ha"
  },
  {
    "path": "src/core/router/util.js",
    "chars": 2852,
    "preview": "import { cached } from '../util/core.js';\n\nconst decode = decodeURIComponent;\nconst encode = encodeURIComponent;\n\n/**\n *"
  },
  {
    "path": "src/core/util/ajax.js",
    "chars": 2894,
    "preview": "// @ts-check\n\nimport progressbar from '../render/progressbar.js';\nimport { noop } from './core.js';\n\n/** @typedef {{upda"
  },
  {
    "path": "src/core/util/core.js",
    "chars": 1979,
    "preview": "/**\n * Create a cached version of fn that given an input string returns a\n * cached return value mapped from the string,"
  },
  {
    "path": "src/core/util/dom.js",
    "chars": 3940,
    "preview": "import { isFn } from '../util/core.js';\n\n/** @type {Record<string, Element>} */\nconst cacheNode = {};\n\n/**\n * Get Node\n "
  },
  {
    "path": "src/core/util/env.js",
    "chars": 274,
    "preview": "const computedStyle = getComputedStyle(document.documentElement, null);\n\nexport const mobileBreakpoint = computedStyle.g"
  },
  {
    "path": "src/core/util/index.js",
    "chars": 88,
    "preview": "export * from './core.js';\nexport * from './env.js';\nexport * from '../router/util.js';\n"
  },
  {
    "path": "src/core/util/prism.js",
    "chars": 6918,
    "preview": "import * as Prism from 'prismjs';\n/**\n *\n * The dependencies map which syncs from\n * https://github.com/PrismJS/prism/bl"
  },
  {
    "path": "src/core/virtual-routes/exact-match.js",
    "chars": 527,
    "preview": "/**\n * Adds beginning of input (^) and end of input ($) assertions if needed into a regex string\n * @param {string} matc"
  },
  {
    "path": "src/core/virtual-routes/index.js",
    "chars": 3444,
    "preview": "import { makeExactMatcher } from './exact-match.js';\nimport { createNextFunction } from './next.js';\n\n/** @typedef {impo"
  },
  {
    "path": "src/core/virtual-routes/next.js",
    "chars": 572,
    "preview": "/** @typedef {(value: any) => void} CB */\n/** @typedef {(cb: CB) => void} OnNext */\n/** @typedef {(value: any) => void} "
  },
  {
    "path": "src/plugins/disqus.js",
    "chars": 1528,
    "preview": "const fixedPath = location.href.replace('/-/', '/#/');\nif (fixedPath !== location.href) {\n  location.href = fixedPath;\n}"
  },
  {
    "path": "src/plugins/emoji.js",
    "chars": 486,
    "preview": "import emojiData from '../core/render/emoji-data.js';\n\nconst window = /** @type {any} */ (globalThis);\n\n// Deprecation n"
  },
  {
    "path": "src/plugins/external-script.js",
    "chars": 748,
    "preview": "const window = /** @type {any} */ (globalThis);\n\nfunction handleExternalScript() {\n  const container = Docsify.dom.getNo"
  },
  {
    "path": "src/plugins/front-matter/index.js",
    "chars": 592,
    "preview": "import parser from './parser.js';\n\nconst install = function (hook, vm) {\n  // Used to remove front matter from embedded "
  },
  {
    "path": "src/plugins/front-matter/parser.js",
    "chars": 1138,
    "preview": "/**\n * Fork https://github.com/egoist/docute/blob/master/src/utils/front-matter.js\n */\n/* eslint-disable */\nimport parse"
  },
  {
    "path": "src/plugins/front-matter/yaml.js",
    "chars": 12123,
    "preview": "// @ts-nocheck\n/**\n * Forked from https://github.com/egoist/docute/blob/master/src/utils/yaml.js\n */\n/* eslint-disable *"
  },
  {
    "path": "src/plugins/ga.js",
    "chars": 1029,
    "preview": "// From https://github.com/egoist/vue-ga/blob/master/src/index.js\nfunction appendScript() {\n  const script = document.cr"
  },
  {
    "path": "src/plugins/gitalk.js",
    "chars": 757,
    "preview": "const window = /** @type {any} */ (globalThis);\n\nfunction install(hook) {\n  const dom = Docsify.dom;\n\n  hook.mounted(_ ="
  },
  {
    "path": "src/plugins/gtag.js",
    "chars": 1690,
    "preview": "// From ./ga.js\n\nfunction appendScript(id) {\n  const script = document.createElement('script');\n  script.async = true;\n "
  },
  {
    "path": "src/plugins/matomo.js",
    "chars": 1159,
    "preview": "function appendScript(options) {\n  const script = document.createElement('script');\n  script.async = true;\n  script.src "
  },
  {
    "path": "src/plugins/search/component.js",
    "chars": 4057,
    "preview": "import { escapeHtml, search } from './search.js';\nimport cssText from './style.css';\n\nlet NO_DATA_TEXT = '';\n\nfunction t"
  },
  {
    "path": "src/plugins/search/index.js",
    "chars": 2652,
    "preview": "import {\n  init as initComponent,\n  update as updateComponent,\n} from './component.js';\nimport { init as initSearch } fr"
  },
  {
    "path": "src/plugins/search/markdown-to-txt.js",
    "chars": 4661,
    "preview": "/**\n * This is a function to convert markdown to txt based on markedjs v13+.\n * Copies the escape/unescape functions fro"
  },
  {
    "path": "src/plugins/search/search.js",
    "chars": 8945,
    "preview": "import {\n  getAndRemoveConfig,\n  getAndRemoveDocsifyIgnoreConfig,\n  removeAtag,\n} from '../../core/render/utils.js';\nimp"
  },
  {
    "path": "src/plugins/search/style.css",
    "chars": 3867,
    "preview": "/* prettier-ignore */\n:root {\n  --plugin-search-input-bg           : var(--form-element-bg);\n  --plugin-search-input-bor"
  },
  {
    "path": "src/plugins/zoom-image.js",
    "chars": 680,
    "preview": "import mediumZoom from 'medium-zoom';\n\nfunction install(hook) {\n  let zoom;\n\n  hook.doneEach(_ => {\n    let elms = /** @"
  },
  {
    "path": "test/README.md",
    "chars": 2097,
    "preview": "# Docsify Testing\n\n## Environment\n\n- [Jest](https://jestjs.io): A test framework used for assertions, mocks, spies, etc."
  },
  {
    "path": "test/config/jest.setup-tests.js",
    "chars": 3264,
    "preview": "/* global afterEach, beforeAll, beforeEach */\n\nimport _mock from 'xhr-mock';\n\nconst mock = _mock.default;\n\nconst sideEff"
  },
  {
    "path": "test/config/jest.setup.js",
    "chars": 99,
    "preview": "import { startServer } from './server.js';\n\nexport default async () => {\n  await startServer();\n};\n"
  },
  {
    "path": "test/config/jest.teardown.js",
    "chars": 91,
    "preview": "import { stopServer } from './server.js';\n\nexport default async () => {\n  stopServer();\n};\n"
  },
  {
    "path": "test/config/playwright.setup.js",
    "chars": 97,
    "preview": "import { startServer } from './server.js';\n\nexport default async config => {\n  startServer();\n};\n"
  },
  {
    "path": "test/config/playwright.teardown.js",
    "chars": 95,
    "preview": "import { stopServer } from './server.js';\n\nexport default async config => {\n  stopServer();\n};\n"
  },
  {
    "path": "test/config/server.js",
    "chars": 841,
    "preview": "import * as process from 'node:process';\nimport { create } from 'browser-sync';\nimport { testConfig } from '../../server"
  },
  {
    "path": "test/consume-types/README.md",
    "chars": 1239,
    "preview": "# Vanilla ESM TypeScript Example\n\nThis is an example of a project that imports Docsify via plain ESM in browser,\nwith ty"
  },
  {
    "path": "test/consume-types/example.js",
    "chars": 1833,
    "preview": "// This file demonstrates consuming Docsify as an ES Module with TypeScript types.\n// Things to try:\n// - Running 'Go to"
  },
  {
    "path": "test/consume-types/index.html",
    "chars": 856,
    "preview": "<head>\n  <meta charset=\"utf-8\" />\n  <meta\n    name=\"viewport\"\n    content=\"width=device-width, initial-scale=1, viewport"
  },
  {
    "path": "test/consume-types/package.json",
    "chars": 265,
    "preview": "{\n  \"scripts\": {\n    \"typecheck\": \"tsc --noEmit\",\n    \"serve\": \"five-server . --open=false --ignorePattern=node_modules\""
  },
  {
    "path": "test/consume-types/prism.js",
    "chars": 870,
    "preview": "// Small ESM wrapper, used in the importmap for 'prismjs', to import PrismJS by\n// tricking its CommonJS format to see m"
  },
  {
    "path": "test/consume-types/register-sw.js",
    "chars": 2505,
    "preview": "// This whole thing is ugly. It is only so that we can fix improper import\n// statements in libraries from node_modules."
  },
  {
    "path": "test/consume-types/sw.js",
    "chars": 2911,
    "preview": "// The purpose of this service worker is to help with loading\n// node_modules modules when using ES modules in the brows"
  },
  {
    "path": "test/consume-types/tsconfig.json",
    "chars": 294,
    "preview": "{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"checkJs\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node"
  },
  {
    "path": "test/e2e/configuration.test.js",
    "chars": 6678,
    "preview": "/* global fail */\nimport docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify"
  },
  {
    "path": "test/e2e/example.test.js",
    "chars": 8639,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/fixtures/docsify-init-fixture.js",
    "chars": 569,
    "preview": "import { test as _test, expect as _expect } from '@playwright/test';\n\nexport const test = _test.extend({\n  page: async ("
  },
  {
    "path": "test/e2e/gtag.test.js",
    "chars": 2166,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/index-file.test.js",
    "chars": 878,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/plugins.test.js",
    "chars": 6143,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { waitForFunction } from '../helpers/wait-for.js';\nimport {"
  },
  {
    "path": "test/e2e/search.test.js",
    "chars": 9757,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/security.test.js",
    "chars": 1024,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/sidebar.test.js",
    "chars": 4360,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/virtual-routes.test.js",
    "chars": 7336,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect } from './fixtures/docsify-init-fixture.js';"
  },
  {
    "path": "test/e2e/vue.test.js",
    "chars": 6485,
    "preview": "import { stripIndent } from 'common-tags';\nimport docsifyInit from '../helpers/docsify-init.js';\nimport { test, expect }"
  },
  {
    "path": "test/helpers/docsify-init.js",
    "chars": 11220,
    "preview": "/* globals page */\nimport _mock, { proxy } from 'xhr-mock';\n\nimport axios from 'axios';\nimport prettier from 'prettier';"
  },
  {
    "path": "test/helpers/wait-for.js",
    "chars": 3640,
    "preview": "const defaults = {\n  delay: 100,\n  timeout: 4000,\n};\n\n/**\n * Waits for specified function to resolve to a truthy value.\n"
  },
  {
    "path": "test/integration/__snapshots__/docs.test.js.snap",
    "chars": 3037,
    "preview": "// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing\n\nexports[`Docs Site coverpage renders and is unchanged 1`] "
  },
  {
    "path": "test/integration/__snapshots__/emoji.test.js.snap",
    "chars": 4388,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Emoji Ignores all emoji shorthand codes (noEmoji:true) 1`] = `\"<p>:"
  },
  {
    "path": "test/integration/docs.test.js",
    "chars": 1874,
    "preview": "import { jest } from '@jest/globals';\nimport docsifyInit from '../helpers/docsify-init.js';\n\n// Suite\n// ---------------"
  },
  {
    "path": "test/integration/docsify.test.js",
    "chars": 1554,
    "preview": "import { jest } from '@jest/globals';\nimport docsifyInit from '../helpers/docsify-init.js';\n\n// Suite\n// ---------------"
  },
  {
    "path": "test/integration/emoji.test.js",
    "chars": 4368,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\n\n// Suite\n// -----------------------------------------------------"
  },
  {
    "path": "test/integration/example.test.js",
    "chars": 9511,
    "preview": "import { waitForFunction, waitForText } from '../helpers/wait-for.js';\nimport docsifyInit from '../helpers/docsify-init."
  },
  {
    "path": "test/integration/global-apis.test.js",
    "chars": 840,
    "preview": "import initGlobalAPI from '../../src/core/global-api.js';\n\n// Suite\n// -------------------------------------------------"
  },
  {
    "path": "test/integration/render.test.js",
    "chars": 12476,
    "preview": "import { stripIndent } from 'common-tags';\nimport docsifyInit from '../helpers/docsify-init.js';\nimport { waitForText } "
  },
  {
    "path": "test/integration/sidebar.test.js",
    "chars": 3708,
    "preview": "import docsifyInit from '../helpers/docsify-init.js';\n\ndescribe('Test sidebar render toc structure', function () {\n  tes"
  },
  {
    "path": "test/unit/core-util.test.js",
    "chars": 2087,
    "preview": "import { isExternal } from '../../src/core/util/index.js';\n\n// Core util\n// --------------------------------------------"
  },
  {
    "path": "test/unit/render-util.test.js",
    "chars": 7324,
    "preview": "import {\n  removeAtag,\n  getAndRemoveConfig,\n  getAndRemoveDocsifyIgnoreConfig,\n} from '../../src/core/render/utils.js';"
  },
  {
    "path": "test/unit/router-history-base.test.js",
    "chars": 3067,
    "preview": "import { History } from '../../src/core/router/history/base.js';\n\nclass MockHistory extends History {\n  parse(path) {\n  "
  },
  {
    "path": "test/unit/router-util.test.js",
    "chars": 753,
    "preview": "import { resolvePath } from '../../src/core/util/index.js';\n\n// Suite\n// -----------------------------------------------"
  },
  {
    "path": "tsconfig.json",
    "chars": 1307,
    "preview": "{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"checkJs\": true,\n\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"nod"
  },
  {
    "path": "vercel.json",
    "chars": 352,
    "preview": "{\n  \"headers\": [\n    {\n      \"source\": \"/(.*)\",\n      \"headers\": [{ \"key\": \"x-robots-tag\", \"value\": \"noindex\" }]\n    }\n "
  }
]

About this extraction

This page contains the full source code of the docsifyjs/docsify GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 174 files (722.0 KB), approximately 222.8k tokens, and a symbol index with 208 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!