From 596589f28511612538224d2597cf433c66da7198 Mon Sep 17 00:00:00 2001 From: Gavin Date: Fri, 19 Jan 2024 15:44:46 +0800 Subject: [PATCH] Initial commit --- .github/workflows/build-deploy-website.yaml | 63 + .gitignore | 1 + .prettierignore | 2 + .prettierrc | 27 + CHANGELOG.md | 87 ++ CODE_OF_CONDUCT.md | 76 ++ CONTRIBUTING.md | 40 + LICENSE | 21 + README.md | 38 + build.sh | 31 + src/content/adding-content.adoc | 8 + src/docinfo-footer.html | 9 + src/docinfo.html | 39 + src/index.adoc | 156 +++ src/manifest.webmanifest | 25 + src/robots.txt | 2 + src/service-worker.js | 64 + src/static/css/style.css | 363 ++++++ src/static/highlight/highlight.min.js | 1149 +++++++++++++++++ .../styles/github-light-dark.min.css | 6 + src/static/img/admonition_icons/caution.png | Bin 0 -> 1125 bytes src/static/img/admonition_icons/important.png | Bin 0 -> 965 bytes src/static/img/admonition_icons/note.png | Bin 0 -> 862 bytes src/static/img/admonition_icons/tip.png | Bin 0 -> 1201 bytes src/static/img/admonition_icons/warning.png | Bin 0 -> 1040 bytes src/static/img/clear_cross.svg | 1 + src/static/img/favicon.ico | Bin 0 -> 152126 bytes src/static/img/icon-192.png | Bin 0 -> 3517 bytes src/static/img/icon-512.png | Bin 0 -> 10554 bytes src/static/img/moon.svg | 1 + src/static/img/sun.svg | 1 + src/static/img/up-arrow.svg | 1 + src/static/js/script.js | 186 +++ 33 files changed, 2397 insertions(+) create mode 100644 .github/workflows/build-deploy-website.yaml create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.sh create mode 100644 src/content/adding-content.adoc create mode 100644 src/docinfo-footer.html create mode 100644 src/docinfo.html create mode 100644 src/index.adoc create mode 100644 src/manifest.webmanifest create mode 100644 src/robots.txt create mode 100644 src/service-worker.js create mode 100644 src/static/css/style.css create mode 100644 src/static/highlight/highlight.min.js create mode 100644 src/static/highlight/styles/github-light-dark.min.css create mode 100644 src/static/img/admonition_icons/caution.png create mode 100644 src/static/img/admonition_icons/important.png create mode 100644 src/static/img/admonition_icons/note.png create mode 100644 src/static/img/admonition_icons/tip.png create mode 100644 src/static/img/admonition_icons/warning.png create mode 100644 src/static/img/clear_cross.svg create mode 100644 src/static/img/favicon.ico create mode 100644 src/static/img/icon-192.png create mode 100644 src/static/img/icon-512.png create mode 100644 src/static/img/moon.svg create mode 100644 src/static/img/sun.svg create mode 100644 src/static/img/up-arrow.svg create mode 100644 src/static/js/script.js diff --git a/.github/workflows/build-deploy-website.yaml b/.github/workflows/build-deploy-website.yaml new file mode 100644 index 0000000..01a86a5 --- /dev/null +++ b/.github/workflows/build-deploy-website.yaml @@ -0,0 +1,63 @@ +name: Build and deploy website + +on: + push: + branches: + - main + paths: + - ".github/workflows/**" + - "src/**" + - build.sh + pull_request: + branches: + - main + paths: + - ".github/workflows/**" + - "src/**" + - build.sh + workflow_dispatch: # Allows manual execution of workflow + +jobs: + build-website: + if: startsWith(github.ref, 'refs/pull/') + runs-on: ubuntu-latest + container: "docker://asciidoctor/docker-asciidoctor:latest" + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Build site using Asciidoctor + run: | + # Give execution permission to buildscript + chmod +x build.sh + + # Run buildscript + ./build.sh + + build-deploy-website: + if: startsWith(github.ref, 'refs/heads/') + runs-on: ubuntu-latest + container: "docker://asciidoctor/docker-asciidoctor:latest" + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Build site using Asciidoctor + run: | + # Give execution permission to buildscript + chmod +x build.sh + + # Run buildscript + ./build.sh + + - name: Install package for Deploy Action + run: | + apk update + apk add rsync + + - name: Deploy to GitHub Pages + uses: JamesIves/github-pages-deploy-action@4.1.8 + with: + branch: gh-pages + folder: build + clean: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..b16794f --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +build/ +src/static/highlight/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..797272e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,27 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "cursorOffset": -1, + "embeddedLanguageFormatting": "auto", + "endOfLine": "auto", + "filepath": "", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxBracketSameLine": false, + "jsxSingleQuote": false, + "overrides": [], + "plugins": [], + "pluginSearchDirs": [], + "printWidth": 80, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "rangeEnd": null, + "rangeStart": 0, + "requirePragma": false, + "semi": true, + "singleQuote": false, + "tabWidth": 4, + "trailingComma": "none", + "useTabs": true, + "vueIndentScriptAndStyle": false +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..961a882 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,87 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.5] - 2022-01-31 + +### Added + +- A site build start message in the build script. +- A 'add label/topic' message in `index.adoc`. + +### Changed + +- The footer's alignment. It is now centered rather than being left aligned. +- The build script completion message. + +## [0.1.4] - 2021-12-29 + +### Added + +- An `alt` attribute and a fixed width and height to the image in the 'Adding Content' sub-section in `index.adoc`. + +### Changed + +- The Highlight.js stylesheet. + - _Asciidoctor Jet_ now uses a [custom Highlight.js library](https://docs.asciidoctor.org/asciidoctor/latest/syntax-highlighting/highlightjs/#use-a-custom-highlight-js-library), which is a combination of the [Highlight.js's GitHub Light and Dark themes](src/static/highlight/styles/github-light-dark.min.css). + +### Fixed + +- The broken workflow link in `index.adoc`. + +## [0.1.3] - 2021-12-29 + +### Added + +- A line in `index.adoc` on the **existing** image lazy loading feature. + - This feature existed since v0.1.0, but was not documented. +- The NPM package `serve` and the Python module `http.server` to the 'Serving the Site Locally' sub-section. +- A [`clean: true` option](https://github.com/marketplace/actions/deploy-to-github-pages#:~:text=No-,clean,-You%20can%20use) in the `build-deploy-website.yaml` workflow Deploy job. + - `clean` is `true` by default, so this addition is just to explicitly state that the feature is enabled. +- A link to the Changelog in `index.adoc`. + +### Fixed + +- The footer text colour in light mode. (Issue [#5](https://github.com/HarshKapadia2/asciidoctor-jet/issues/5)) +- The 'no language' Highlight.js console warning for the code block in the 'File Structure' section. + +### Changed + +- The link to _Asciidoctor Jet_ in the footer (`docinfo-footer.html`) to the template itself rather than the GitHub repo. +- The link to contact the maintainer in `index.adoc`. + +### Removed + +- The `:highlightjs-languages:` document attribute because the required `shell` language is already included in the base version. +- The [VS Code Live Server extension](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) from the 'Serving the Site Locally' sub-section due to issues with the service worker. + +## [0.1.2] - 2021-12-26 + +### Added + +- The file structure of the `src` directory to `index.adoc` and made corresponding changes. + +### Changed + +- The version of the service worker to match the version of the website. + +## [0.1.1] - 2021-12-25 + +### Fixed + +- The GitHub Actions workflow now downloads the missing `rsync` package [required by the Deploy Action](https://github.com/marketplace/actions/deploy-to-github-pages#using-a-container-). + +## [0.1.0] - 2021-12-25 + +### Added + +- `index.adoc` and other `.adoc` files for the website content. +- A buildscript to build the Asciidoctor site. +- A service worker, webmanifest and icons to convert the site to a PWA. +- A 'back to top' button. +- A theme switcher. +- A `robots.txt` file. +- Images for the demo site. +- A GitHub Actions workflow to build the site (for PRs) and to build and deploy the site to GitHub Pages (on merges and pushes). diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..b7824eb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at contact@harshkapadia.me. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..b7ab538 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# Contributing to _Asciidoctor Jet_ + +- Please check the [issues tab](https://github.com/HarshKapadia2/asciidoctor-jet/issues) for things to work on. +- Please [raise an issue](https://github.com/HarshKapadia2/asciidoctor-jet/issues) to request a feature/modification or for reporting a bug, if it has not already been raised. + +## Tech Stack + +- Front end: Asciidoctor, HTML, CSS, JS +- CI/CD: GitHub Actions + +## Local Setup + +- Fork this repo. (Top right corner.) +- Clone the forked repo using the [`git clone` command](https://harshkapadia2.github.io/git_basics/#_git_clone). +- `cd` into the cloned repo directory. +- Follow the [Getting Started guide](https://harshkapadia2.github.io/git_basics/#_getting_started) on the demo site and explore other sections to understand how the template is structured. +- Write meaningful commit messages and include the number (#) of the issue being resolved (if any) at the end of the commit message. + + Example: `:bug: fix: Resolve 'isCorrect' function error (#0)` + + [Commit message format](https://harshkapadia2.github.io/git_basics/#_commit_messagetitle) + +- Open a Pull Request (PR). + - [Learn how to open a PR.](https://github.com/firstcontributions/first-contributions) + - Solve one issue per PR, without any extra changes. + - Include extra changes in a separate PR. + +## Version Change Checklist + +Make sure the following changes are made when releasing a new version + +- Update the [changelog](CHANGELOG.md) with the appropriate version number and changes. + - Refer to the [Keep a Changelog website](https://keepachangelog.com/en/1.0.0) for instructions. +- Update the version in the [service worker](src/service-worker.js). (On line number 1.) +- Update the version in the [index.adoc](src/index.adoc) file. (On line number 3.) +- Create an annotated tag (`git tag -a vx.x.x -m "Release vx.x.x"`) on the latest commit of that release. + +## Further Help + +If any further help is needed, do not hesitate to contact the author ([Harsh Kapadia](https://harshkapadia.me)) via Twitter [@harshgkapadia](https://twitter.com/harshgkapadia), [LinkedIn](https://www.linkedin.com/in/harshgkapadia) or e-mail ([contact@harshkapadia.me](mailto:contact@harshkapadia.me)). An [issue](https://github.com/HarshKapadia2/asciidoctor-jet/issues) can be raised as well. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2018fb8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Harsh Kapadia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8da2d9f --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +
+

+ +

+ +

Asciidoctor Jet

+
+ +

+ A ready-to-use jet black themed template for building static sites using Asciidoctor. +
+
+ Explore the docs » +
+
+ Added Features +   ·   + Live Demos +   ·   + Getting Started +
+
+ +

+
+ +### Changelogs + +The changelog has been maintained in the [`CHANGELOG.md` file](CHANGELOG.md). + +### Contributing + +- Contributors are welcome! +- Please read the [`CONTRIBUTING.md` file](CONTRIBUTING.md) for contributing guidelines and the local setup guide. + +### Code of Conduct + +Please be mindful of the [Code of Conduct](CODE_OF_CONDUCT.md) while contributing and interacting. diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..40cd868 --- /dev/null +++ b/build.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +set -eu; + +script_dir=$(dirname "${0}"); + +echo "Building site..."; + +# Create the 'build' directory if it doesn't exist +mkdir -p "${script_dir}/build"; + +# Remove all files from the 'build' directory to prevent residual files +rm -rf "${script_dir}/build/"*; + +# Copy files to the 'build' directory +for path in \ + "static" \ + "manifest.webmanifest" \ + "robots.txt" \ + "service-worker.js" \ +; do + cp -r "${script_dir}/src/${path}" "${script_dir}/build"; +done; + +# Build site +asciidoctor "${script_dir}/src/index.adoc" -a webfonts! -o "${script_dir}/build/index.html"; + +# Lazy load images +sed -i -e 's/Asciidoctor Jet Logo + Created using  + Asciidoctor Jet. + diff --git a/src/docinfo.html b/src/docinfo.html new file mode 100644 index 0000000..18a52ca --- /dev/null +++ b/src/docinfo.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/index.adoc b/src/index.adoc new file mode 100644 index 0000000..1d87f1c --- /dev/null +++ b/src/index.adoc @@ -0,0 +1,156 @@ += Asciidoctor Jet +Harsh Kapadia +v0.1.5 +:author: Harsh Kapadia +:toc: left +:favicon: ./static/img/favicon.ico +:imagesdir: ./static/img +:icons: image +:iconsdir: ./static/img/admonition_icons +:docinfo: shared +:source-highlighter: highlight.js +:highlightjsdir: ./static/highlight +:highlightjs-theme: github-light-dark +:sectanchors: +:figure-caption!: +:nofooter: + +== About + +_Asciidoctor Jet_ is a ready-to-use jet black themed template for building static websites using link:https://asciidoctor.org[Asciidoctor^] with link:#_features[features and fonts added] to the default Asciidoctor template. + +link:#_getting_started[Getting started] is very straightforward! + +== Features + +* PWA + ** Custom install prompt +* Themes + ** Theme switcher + *** Dark mode (Jet black) + *** Light mode + ** First load theme depends on the browser theme and if toggled, is thereafter set as per user preference. +* Lazy loading of images + ** link:https://caniuse.com/mdn-html_elements_img_loading[Subject to browser support.^] +* Fonts + ** Montserrat + ** PT Mono (Only for `code snippets`.) +* Back to top button +* Custom scrollbar +* The repository includes a link:https://github.com/HarshKapadia2/asciidoctor-jet/tree/main/.github/workflows[workflow to build and deploy the site^] on GitHub Pages. + +== Live Demos + +Sites using the _Asciidoctor Jet_ template + +* link:https://harshkapadia2.github.io/git_basics[git_basics^] +* link:https://catchup.ourtech.community/summary[OTC CatchUp Summary^] + +[NOTE] +==== +* link:https://github.com/HarshKapadia2/asciidoctor-jet/issues[Raise an issue^] on the repository to be featured here! (Please add a link to the site.) +* Make sure to add the `asciidoctor-jet` label/topic to the site's repository for visibility! +==== + +== Using Asciidoctor Jet + +=== Getting Started + +* link:https://asciidoctor.org/#installation[Install Asciidoctor.^] +* link:https://github.com/HarshKapadia2/asciidoctor-jet[Use this template.^] +* Explore the link:#_file_structure[file structure]. +* link:#_adding_content[Add content.] +* Run the command `sh build.sh` in the root directory of the project to build the site to the `build` directory. +* link:#_serving_the_site_locally[Serve the built site locally] to check if all is good. +* Push to GitHub and a workflow should automatically build and commit files to the `gh-pages` branch, which can be deployed using GitHub Pages. + +=== Adding Content + +include::./content/adding-content.adoc[] + +=== Serving the Site Locally + +After running the `sh build.sh` command, the site is built out to the `build` directory. It has to be served from there. + +There are various ways to serve file locally. **Run any of the following commands from the root directory of the project.** + +* Using the NPM package link:https://www.npmjs.com/package/http-server[`http-server`^] is preferred. + +[source, shell] +---- +$ npx http-server "build" + +# OR + +$ npm install --global http-server +$ http-server "build" +---- + +* The NPM package link:https://www.npmjs.com/package/serve[`serve`^] can be used. + +[source, shell] +---- +$ npx serve "build" + +# OR + +$ npm install --global serve +$ serve "build" +---- + +* The Python module link:https://docs.python.org/3/library/http.server.html[`http.server`^] can also be used. + +[source, shell] +---- +$ python -m http.server + +# OR + +$ python3 -m http.server # python -m http.server +---- + +=== File Structure + +The main content of the website resides in the link:https://github.com/HarshKapadia2/asciidoctor-jet/tree/main/src[`src` directory^] and the entry point for Asciidoctor is the link:https://github.com/HarshKapadia2/asciidoctor-jet/blob/main/src/index.adoc[`index.adoc` file^] in the `src` directory. + +The default structure of the `src` directory + +[source, shell] +---- +src +├───content +│ └───adding-content.adoc +├───static +│ ├───css +│ ├───img +│ └───js +├───docinfo-footer.html +├───docinfo.html +├───index.adoc +├───manifest.webmanifest +├───robots.txt +└───service-worker.js +---- + +== Contributing + +* Contributors are welcome! +* For any bugs or feature requests/modifications, feel free to link:https://github.com/HarshKapadia2/asciidoctor-jet/issues[raise an issue^] if it hasn't already been raised. +* Go through the link:https://github.com/HarshKapadia2/asciidoctor-jet/blob/main/CONTRIBUTING.md[`CONTRIBUTING.md` file^] for local development environment setup instructions. +* Feel free to link:https://github.com/HarshKapadia2/asciidoctor-jet/blob/main/CONTRIBUTING.md#further-help[contact the maintainer^] for any issues. +* Check the link:https://github.com/HarshKapadia2/asciidoctor-jet/blob/main/CHANGELOG.md[changelog^] for changes in particular versions. + +''' + +// DO NOT remove the HTML block below as it is required for the PWA install prompt and the 'back to top' button. +++++ + + + +++++ diff --git a/src/manifest.webmanifest b/src/manifest.webmanifest new file mode 100644 index 0000000..9884361 --- /dev/null +++ b/src/manifest.webmanifest @@ -0,0 +1,25 @@ +{ + "name": "Asciidoctor Jet", + "short_name": "Asciidoctor Jet", + "display": "standalone", + "orientation": "portrait", + "scope": "/asciidoctor-jet/", + "start_url": "/asciidoctor-jet/", + "id": "/asciidoctor-jet/", + "theme_color": "#000000", + "background_color": "#000000", + "icons": [ + { + "src": "./static/img/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "./static/img/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ] +} diff --git a/src/robots.txt b/src/robots.txt new file mode 100644 index 0000000..c2a49f4 --- /dev/null +++ b/src/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/src/service-worker.js b/src/service-worker.js new file mode 100644 index 0000000..2138d3f --- /dev/null +++ b/src/service-worker.js @@ -0,0 +1,64 @@ +const cacheName = "v0.1.5"; +const cacheAssets = [ + "./", + "./index.html", + "./robots.txt", + "./static/css/style.css", + "./static/js/script.js", + "./static/img/admonition_icons/tip.png", + "./static/img/admonition_icons/warning.png", + "./static/img/admonition_icons/note.png", + "./static/img/admonition_icons/caution.png", + "./static/img/admonition_icons/important.png", + "./static/img/clear_cross.svg", + "./static/img/favicon.ico", + "./static/img/icon-192.png", + "./static/img/icon-512.png", + "./static/img/moon.svg", + "./static/img/sun.svg", + "./static/img/up-arrow.svg" +]; + +self.addEventListener("install", (e) => { + // Cache files + e.waitUntil( + caches + .open(cacheName) + .then((cache) => cache.addAll(cacheAssets)) + .then(() => self.skipWaiting()) + .catch((err) => console.error(`Cache error: ${err}`)) + ); +}); + +self.addEventListener("activate", (e) => { + e.waitUntil( + // Delete any previous cache + caches.keys().then((cacheKeys) => { + return Promise.all( + cacheKeys.map((cacheKey) => { + if (cacheKey !== cacheName) return caches.delete(cacheKey); + }) + ); + }) + ); +}); + +self.addEventListener("fetch", (e) => { + e.respondWith( + fetch(e.request) + .then((response) => { + const resClone = response.clone(); + + // Add response to cache + if (e.request.url.indexOf("http") === 0) + caches + .open(cacheName) + .then((cache) => cache.put(e.request, resClone)); + + return response; + }) + .catch((err) => + caches.match(e.request).then((response) => response) + ) + ); +}); diff --git a/src/static/css/style.css b/src/static/css/style.css new file mode 100644 index 0000000..7094017 --- /dev/null +++ b/src/static/css/style.css @@ -0,0 +1,363 @@ +a { + color: #2156a5; + text-decoration-thickness: 1px; + text-underline-offset: 4px; +} + +a code { + color: #2156a5; +} + +a:hover, +a:hover code, +a code:hover { + color: #1d4b8f !important; +} + +#footer a { + color: #90caf9 !important; +} + +#footer a:hover { + color: #42a5f5 !important; +} + +.imageblock { + display: flex; + flex-direction: column; + align-items: center; +} + +.icon img { + width: 40px; + height: 40px; +} + +pre, +code { + background-color: #eeeeee !important; +} + +h1, +.title { + color: #ba3925 !important; +} + +.pwa-install-div { + position: fixed; + bottom: 2.5vh; + left: 2vw; + display: flex; + align-items: center; + background-color: white; + padding: 0.5em; + box-shadow: 0 0 3px #bdbdbd; + border-radius: 5px; + z-index: 1000; +} + +#pwa-install-btn { + color: white; + background-color: black; + padding: 0.3em 0.6em; + margin-right: 0.5em; + font-size: 15px; + border-radius: 5px; + border: 1px solid black; + box-shadow: 0 0 3px #bdbdbd; + cursor: pointer; +} + +#pwa-install-btn { + margin: 0 0.8em 0 0.5em; +} + +#pwa-install-dismiss { + background-color: transparent; + border: none; + display: grid; + place-items: center; + cursor: pointer; +} + +#pwa-install-dismiss img { + height: 1.5em; + width: 1.5em; +} + +.pwa-install-div-summon { + animation: 3s ease summon-div; +} + +@keyframes summon-div { + from { + transform: translateX(-100vw); + } + + to { + transform: translateX(0); + } +} + +.pwa-install-div-dismiss { + animation: 2s ease dismiss-div; +} + +@keyframes dismiss-div { + from { + transform: translateX(0); + } + + to { + transform: translateX(-100vw); + } +} + +.btn { + display: grid; + place-items: center; + background-color: white; + border-radius: 2em; + border: 1px solid white; + box-shadow: 0 0 5px #bdbdbd; + cursor: pointer; + z-index: 1000; + outline: none; +} + +.btn:focus { + box-shadow: 0 0 5px #757575; +} + +.btn img { + height: 1em; + width: 1em; +} + +.back-to-top-btn { + padding: 1em; + position: fixed; + bottom: 2.5vh; + right: 2vw; +} + +.theme-switcher { + padding: 1.5em; + position: absolute; + top: 2.5vh; + right: 2vw; + background: url("../img/moon.svg") no-repeat center; +} + +.hidden { + display: none; +} + +#footer { + background-color: black; + color: #e0e0e0; + display: flex; + justify-content: center; + align-items: center; +} + +/* ================================================== MOBILE EDGE CASES ==================================================== */ + +body.mobile-edge-case .word-break-all { + word-break: break-all; +} + +.x-overflow { + overflow-x: auto; +} + +/* ================================================== TOC (LIGHT MODE) ============================================== */ + +#toctitle, +.sectlevel1 li a { + color: #ba3925 !important; +} + +.sectlevel1 li a:hover { + color: #ba3925 !important; + text-decoration: underline !important; +} + +.sectlevel2 li a { + color: #2156a5 !important; +} + +.sectlevel2 li a:hover { + color: #1d4b8f !important; + text-decoration: underline !important; +} + +/* ================================================= SCROLLBAR (LIGHT MODE) =================================================== */ + +body::-webkit-scrollbar { + width: 0.7em; +} + +#toc::-webkit-scrollbar { + width: 0.5em; +} + +body::-webkit-scrollbar-track, +#toc::-webkit-scrollbar-track { + background-color: #eeeeee; +} + +body::-webkit-scrollbar-thumb, +#toc::-webkit-scrollbar-thumb { + background-color: #bdbdbd; + border-radius: 2px; +} + +/* ======================================================= DARK MODE =========================================================== */ + +body.dark, +body.dark .btn, +body.dark table, +body.dark th { + background-color: black; + color: #e0e0e0; +} + +body.dark .btn { + box-shadow: 0 0 5px #616161; + border: 1px solid black; +} + +body.dark .btn:focus { + box-shadow: 0 0 5px #9e9e9e; +} + +body.dark .theme-switcher { + background: url("../img/sun.svg") no-repeat center; +} + +body.dark h1, +body.dark h2, +body.dark h3, +body.dark h4, +body.dark h5, +body.dark h6, +body.dark #toctitle, +body.dark .sidebarblock .title, +body.dark .imageblock .title { + color: #ff8a80 !important; +} + +body.dark blockquote::before { + color: #d32f2f !important; +} + +body.dark code, +body.dark pre { + background-color: #424242 !important; + color: #e0e0e0; +} + +body.dark .sectlevel1 li a { + color: #ff8a80 !important; +} + +body.dark a, +body.dark a code, +body.dark .sectlevel2 li a { + color: #90caf9 !important; +} + +body.dark a:hover, +body.dark a:hover code, +body.dark a code:hover, +body.dark .sectlevel2 li a:hover { + color: #42a5f5 !important; +} + +body.dark #toc, +body.dark .pwa-install-div { + background-color: black !important; +} + +body.dark #toc { + border-left-color: #212121; + border-right-color: #212121; +} + +body.dark .pwa-install-div { + box-shadow: 0 0 5px #424242; +} + +body.dark #pwa-install-btn { + box-shadow: 0 0 5px #424242; + background-color: #e0e0e0; + border: 1px solid #e0e0e0; + color: black; +} + +body.dark li, +body.dark p, +body.dark .details, +body.dark td, +body.dark blockquote, +body.dark .attribution cite { + color: #e0e0e0 !important; +} + +body.dark .sidebarblock { + background-color: #212121 !important; +} + +body.dark::-webkit-scrollbar-track, +body.dark #toc::-webkit-scrollbar-track { + background-color: #212121; +} + +body.dark::-webkit-scrollbar-thumb, +body.dark #toc::-webkit-scrollbar-thumb { + background-color: #616161; +} + +/* ================================================ FONTS ================================================== */ + +body, +.admonitionblock td.content > .title, +.audioblock > .title, +.exampleblock > .title, +.imageblock > .title, +.listingblock > .title, +.literalblock > .title, +.stemblock > .title, +.openblock > .title, +.paragraph > .title, +.quoteblock > .title, +table.tableblock > .title, +.verseblock > .title, +.videoblock > .title, +.dlist > .title, +.olist > .title, +.ulist > .title, +.qlist > .title, +.hdlist > .title, +h1, +h2, +h3, +#toctitle, +.sidebarblock > .content > .title, +h4, +h5, +h6, +#toc ul, +.admonitionblock > table td.icon .title, +.verseblock pre, +.conum[data-value] { + font-family: "Montserrat", sans-serif; +} + +code, +kbd, +pre, +samp { + font-family: "PT Mono", monospace; +} diff --git a/src/static/highlight/highlight.min.js b/src/static/highlight/highlight.min.js new file mode 100644 index 0000000..8b7953c --- /dev/null +++ b/src/static/highlight/highlight.min.js @@ -0,0 +1,1149 @@ +/*! +Highlight.js v11.3.1 (git: 2a972d8658) +(c) 2006-2021 Ivan Sagalaev and other contributors +License: BSD-3-Clause +*/ +var hljs=function(){"use strict";var e={exports:{}};function n(e){ +return e instanceof Map?e.clear=e.delete=e.set=()=>{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((t=>{var a=e[t] +;"object"!=typeof a||Object.isFrozen(a)||n(a)})),e} +e.exports=n,e.exports.default=n;var t=e.exports;class a{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function r(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] +;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const s=e=>!!e.kind +;class o{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=i(e)}openNode(e){if(!s(e))return;let n=e.kind +;n=e.sublanguage?"language-"+n:((e,{prefix:n})=>{if(e.includes(".")){ +const t=e.split(".") +;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") +}return`${n}${e}`})(n,{prefix:this.classPrefix}),this.span(n)}closeNode(e){ +s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class l{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const n={kind:e,children:[]} +;this.add(n),this.stack.push(n)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ +return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), +n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} +addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root +;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function d(e){ +return e?"string"==typeof e?e:e.source:null}function g(e){return m("(?=",e,")")} +function u(e){return m("(?:",e,")*")}function b(e){return m("(?:",e,")?")} +function m(...e){return e.map((e=>d(e))).join("")}function p(...e){const n=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(e);return"("+(n.capture?"":"?:")+e.map((e=>d(e))).join("|")+")"} +function _(e){return RegExp(e.toString()+"|").exec("").length-1} +const h=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function f(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t +;let a=d(e),i="";for(;a.length>0;){const e=h.exec(a);if(!e){i+=a;break} +i+=a.substring(0,e.index), +a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], +"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} +const E="[a-zA-Z]\\w*",y="[a-zA-Z_]\\w*",N="\\b\\d+(\\.\\d+)?",w="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",O={ +begin:"\\\\[\\s\\S]",relevance:0},x={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[O]},M={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[O]},k=(e,n,t={})=>{const a=r({scope:"comment",begin:e,end:n, +contains:[]},t);a.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const i=p("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return a.contains.push({begin:m(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a +},S=k("//","$"),A=k("/\\*","\\*/"),C=k("#","$");var T=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:E,UNDERSCORE_IDENT_RE:y, +NUMBER_RE:N,C_NUMBER_RE:w,BINARY_NUMBER_RE:v, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=m(n,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:O,APOS_STRING_MODE:x,QUOTE_STRING_MODE:M,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:k,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:C, +NUMBER_MODE:{scope:"number",begin:N,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:w,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:v,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[O,{begin:/\[/,end:/\]/,relevance:0, +contains:[O]}]}]},TITLE_MODE:{scope:"title",begin:E,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:y,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}})});function R(e,n){ +"."===e.input[e.index-1]&&n.ignoreMatch()}function D(e,n){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function I(e,n){ +n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=R,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function L(e,n){ +Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}function B(e,n){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function $(e,n){ +void 0===e.relevance&&(e.relevance=1)}const F=(e,n)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] +})),e.keywords=t.keywords,e.begin=m(t.beforeMatch,g(t.begin)),e.starts={ +relevance:0,contains:[Object.assign(t,{endsParent:!0})] +},e.relevance=0,delete t.beforeMatch +},z=["of","and","for","in","not","or","if","then","parent","list","value"] +;function U(e,n,t="keyword"){const a=Object.create(null) +;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ +Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ +n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") +;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ +return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},q=(e,...n)=>{console.log("WARN: "+e,...n)},H=(e,n)=>{ +P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) +},Z=Error();function G(e,n,{key:t}){let a=0;const i=e[t],r={},s={} +;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=_(n[e-1]) +;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +Z +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +Z;G(e,e.begin,{key:"beginScope"}),e.begin=f(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +Z +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +Z;G(e,e.end,{key:"endScope"}),e.end=f(e.end,{joinWith:""})}})(e)}function Q(e){ +function n(n,t){ +return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) +}class t{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,n){ +n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), +this.matchAt+=_(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(f(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const n=this.matcherRe.exec(e);if(!n)return null +;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] +;return n.splice(0,t),Object.assign(n,a)}}class a{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t +;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), +n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ +this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ +const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex +;let t=n.exec(e) +;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ +const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} +return t&&(this.regexIndex+=t.position+1, +this.regexIndex===this.count&&this.considerAll()),t}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=r(e.classNameAliases||{}),function t(i,s){const o=i +;if(i.isCompiled)return o +;[D,B,W,F].forEach((e=>e(i,s))),e.compilerExtensions.forEach((e=>e(i,s))), +i.__beforeBegin=null,[I,L,$].forEach((e=>e(i,s))),i.isCompiled=!0;let l=null +;return"object"==typeof i.keywords&&i.keywords.$pattern&&(i.keywords=Object.assign({},i.keywords), +l=i.keywords.$pattern, +delete i.keywords.$pattern),l=l||/\w+/,i.keywords&&(i.keywords=U(i.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(i.begin||(i.begin=/\B|\b/),o.beginRe=n(o.begin),i.end||i.endsWithParent||(i.end=/\B|\b/), +i.end&&(o.endRe=n(o.end)), +o.terminatorEnd=d(o.end)||"",i.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(i.end?"|":"")+s.terminatorEnd)), +i.illegal&&(o.illegalRe=n(i.illegal)), +i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>r(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?r(e,{ +starts:e.starts?r(e.starts):null +}):Object.isFrozen(e)?r(e):e))("self"===e?i:e)))),i.contains.forEach((e=>{t(e,o) +})),i.starts&&t(i.starts,s),o.matcher=(e=>{const n=new a +;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ +return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ +constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} +const J=i,Y=r,ee=Symbol("nomatch");var ne=(e=>{ +const n=Object.create(null),i=Object.create(null),r=[];let s=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",l={ +disableAutodetect:!0,name:"Plain text",contains:[]};let d={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:c};function _(e){ +return d.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" +;"object"==typeof n?(a=e, +t=n.ignoreIllegals,i=n.language):(H("10.7.0","highlight(lang, code, ...args) has been deprecated."), +H("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};M("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,M("after:highlight",s),s}function f(e,t,i,r){ +const l=Object.create(null);function c(){if(!x.keywords)return void k.addText(S) +;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(S),t="" +;for(;n;){t+=S.substring(e,n.index) +;const i=N.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){ +const[e,a]=r +;if(k.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(A+=a),e.startsWith("_"))t+=n[0];else{ +const t=N.classNameAliases[e]||e;k.addKeyword(n[0],t)}}else t+=n[0] +;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(S)}var a +;t+=S.substr(e),k.addText(t)}function g(){null!=x.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof x.subLanguage){ +if(!n[x.subLanguage])return void k.addText(S) +;e=f(x.subLanguage,S,!0,M[x.subLanguage]),M[x.subLanguage]=e._top +}else e=E(S,x.subLanguage.length?x.subLanguage:null) +;x.relevance>0&&(A+=e.relevance),k.addSublanguage(e._emitter,e.language) +})():c(),S=""}function u(e,n){let t=1;for(;void 0!==n[t];){if(!e._emit[t]){t++ +;continue}const a=N.classNameAliases[e[t]]||e[t],i=n[t] +;a?k.addKeyword(i,a):(S=i,c(),S=""),t++}}function b(e,n){ +return e.scope&&"string"==typeof e.scope&&k.openNode(N.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(k.addKeyword(S,N.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,n),S="")),x=Object.create(e,{parent:{ +value:x}}),x}function m(e,n,t){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,t);if(i){if(e["on:end"]){const t=new a(e) +;e["on:end"](n,t),t.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,n,t)}function p(e){ +return 0===x.matcher.regexIndex?(S+=e[0],1):(R=!0,0)}function _(e){ +const n=e[0],a=t.substr(e.index),i=m(x,e,a);if(!i)return ee;const r=x +;x.endScope&&x.endScope._wrap?(g(), +k.addKeyword(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(g(), +u(x.endScope,e)):r.skip?S+=n:(r.returnEnd||r.excludeEnd||(S+=n), +g(),r.excludeEnd&&(S=n));do{ +x.scope&&k.closeNode(),x.skip||x.subLanguage||(A+=x.relevance),x=x.parent +}while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} +let h={};function y(n,r){const o=r&&r[0];if(S+=n,null==o)return g(),0 +;if("begin"===h.type&&"end"===r.type&&h.index===r.index&&""===o){ +if(S+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) +;throw n.languageName=e,n.badRule=h.rule,n}return 1} +if(h=r,"begin"===r.type)return(e=>{ +const n=e[0],t=e.rule,i=new a(t),r=[t.__beforeBegin,t["on:begin"]] +;for(const t of r)if(t&&(t(e,i),i.isMatchIgnored))return p(n) +;return t.skip?S+=n:(t.excludeBegin&&(S+=n), +g(),t.returnBegin||t.excludeBegin||(S=n)),b(t,e),t.returnBegin?0:n.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"")+'"') +;throw e.mode=x,e}if("end"===r.type){const e=_(r);if(e!==ee)return e} +if("illegal"===r.type&&""===o)return 1 +;if(T>1e5&&T>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=o,o.length}const N=v(e) +;if(!N)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const w=Q(N);let O="",x=r||w;const M={},k=new d.__emitter(d);(()=>{const e=[] +;for(let n=x;n!==N;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>k.openNode(e)))})();let S="",A=0,C=0,T=0,R=!1;try{ +for(x.matcher.considerAll();;){ +T++,R?R=!1:x.matcher.considerAll(),x.matcher.lastIndex=C +;const e=x.matcher.exec(t);if(!e)break;const n=y(t.substring(C,e.index),e) +;C=e.index+n}return y(t.substr(C)),k.closeAllNodes(),k.finalize(),O=k.toHTML(),{ +language:e,value:O,relevance:A,illegal:!1,_emitter:k,_top:x}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:C, +context:t.slice(C-100,C+100),mode:n.mode,resultSoFar:O},_emitter:k};if(s)return{ +language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:k,_top:x} +;throw n}}function E(e,t){t=t||d.languages||Object.keys(n);const a=(e=>{ +const n={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new d.__emitter(d)} +;return n._emitter.addText(e),n})(e),i=t.filter(v).filter(x).map((n=>f(n,e,!1))) +;i.unshift(a);const r=i.sort(((e,n)=>{ +if(e.relevance!==n.relevance)return n.relevance-e.relevance +;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 +;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,c=s +;return c.secondBest=o,c}function y(e){let n=null;const t=(e=>{ +let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" +;const t=d.languageDetectRe.exec(n);if(t){const n=v(t[1]) +;return n||(q(o.replace("{}",t[1])), +q("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} +return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return +;if(M("before:highlightElement",{el:e,language:t +}),e.children.length>0&&(d.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/issues/2886"), +console.warn(e)), +d.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) +;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) +;e.innerHTML=r.value,((e,n,t)=>{const a=n&&i[n]||t +;e.classList.add("hljs"),e.classList.add("language-"+a) +})(e,t,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),M("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){ +"loading"!==document.readyState?document.querySelectorAll(d.cssSelector).forEach(y):N=!0 +}function v(e){return e=(e||"").toLowerCase(),n[e]||n[i[e]]} +function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function x(e){const n=v(e) +;return n&&!n.disableAutodetect}function M(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +N&&w()}),!1),Object.assign(e,{highlight:h,highlightAuto:E,highlightAll:w, +highlightElement:y, +highlightBlock:e=>(H("10.7.0","highlightBlock will be removed entirely in v12.0"), +H("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{d=Y(d,e)}, +initHighlighting:()=>{ +w(),H("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +w(),H("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(t,a)=>{let i=null;try{i=a(e)}catch(e){ +if(K("Language definition for '{}' could not be registered.".replace("{}",t)), +!s)throw e;K(e),i=l} +i.name||(i.name=t),n[t]=i,i.rawDefinition=a.bind(null,e),i.aliases&&O(i.aliases,{ +languageName:t})},unregisterLanguage:e=>{delete n[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(n),getLanguage:v,registerAliases:O, +autoDetection:x,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ +e["before:highlightBlock"](Object.assign({block:n.el},n)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ +e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)} +}),e.debugMode=()=>{s=!1},e.safeMode=()=>{s=!0 +},e.versionString="11.3.1",e.regex={concat:m,lookahead:g,either:p,optional:b, +anyNumberOfTimes:u};for(const e in T)"object"==typeof T[e]&&t(T[e]) +;return Object.assign(e,T),e})({});const te=e=>({IMPORTANT:{scope:"meta", +begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ +scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, +FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, +ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/} +}),ae=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],ie=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],re=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],se=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],oe=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-height","max-width","min-height","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),le=re.concat(se) +;var ce="\\.([0-9](_*[0-9])*)",de="[0-9a-fA-F](_*[0-9a-fA-F])*",ge={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${ce})|\\.)?|(${ce}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${ce})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${ce})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${de})\\.?|(${de})?\\.(${de}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${de})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function ue(e,n,t){return-1===t?"":e.replace(n,(a=>ue(e,n,t-1)))} +const be="[A-Za-z$_][0-9A-Za-z$_]*",me=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],pe=["true","false","null","undefined","NaN","Infinity"],_e=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],he=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],fe=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Ee=["arguments","this","super","console","window","document","localStorage","module","global"],ye=[].concat(fe,_e,he) +;function Ne(e){const n=e.regex,t=be,a={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const t=e[0].length+e.index,a=e.input[t] +;if("<"===a||","===a)return void n.ignoreMatch();let i +;">"===a&&(((e,{after:n})=>{const t="",x={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,n.lookahead(O)],className:{ +1:"keyword",3:"title.function"},contains:[_]};return{name:"Javascript", +aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{PARAMS_CONTAINS:p, +CLASS_REFERENCE:f},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang", +binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,u,o,f,{className:"attr", +begin:t+n.lookahead(":"),relevance:0},x,{ +begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[u,e.REGEXP_MODE,{ +className:"function",begin:O,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, +excludeEnd:!0,keywords:i,contains:p}]}]},{begin:/,/,relevance:0},{match:/\s+/, +relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, +"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ +begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},E,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[_,e.inherit(e.TITLE_MODE,{begin:t, +className:"title.function"})]},{match:/\.\.\./,relevance:0},w,{match:"\\$"+t, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[_]},y,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},h,v,{match:/\$[(.]/}]}} +const we=e=>m(/\b/,e,/\w$/.test(e)?/\b/:/\B/),ve=["Protocol","Type"].map(we),Oe=["init","self"].map(we),xe=["Any","Self"],Me=["actor","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],ke=["false","nil","true"],Se=["assignment","associativity","higherThan","left","lowerThan","none","right"],Ae=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],Ce=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Te=p(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Re=p(Te,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),De=m(Te,Re,"*"),Ie=p(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Le=p(Ie,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Be=m(Ie,Le,"*"),$e=m(/[A-Z]/,Le,"*"),Fe=["autoclosure",m(/convention\(/,p("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",m(/objc\(/,Be,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],ze=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;var Ue=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},r={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(s);const o={begin:/\$\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{ +className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}, +grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},s={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={ +className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0 +},d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},u=[l,r,t,e.C_BLOCK_COMMENT_MODE,o,s],b={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:g,contains:u.concat([{begin:/\(/,end:/\)/,keywords:g, +contains:u.concat(["self"]),relevance:0}]),relevance:0},m={ +begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)", +keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[e.inherit(c,{ +className:"title.function"})],relevance:0},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:g,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,s,o,r,{begin:/\(/,end:/\)/,keywords:g, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,o,r]}] +},r,t,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C",aliases:["h"],keywords:g, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:l, +strings:s,keywords:g}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),a="[a-zA-Z_]\\w*::",i="(?!struct)(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={ +className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0 +},d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},u={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) +},b=[u,l,r,t,e.C_BLOCK_COMMENT_MODE,o,s],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:g,contains:b.concat([{begin:/\(/,end:/\)/,keywords:g, +contains:b.concat(["self"]),relevance:0}]),relevance:0},p={className:"function", +begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)", +keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[c],relevance:0},{ +begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,o]},{ +relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:g, +relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,s,o,r,{begin:/\(/,end:/\)/, +keywords:g,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,o,r]}] +},r,t,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:g,illegal:"",keywords:g,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:g},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, +keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) +;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], +o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t] +},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,a,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ +const n=e.regex,t=te(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ +name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ +keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, +contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+re.join("|")+")"},{begin:":(:)?("+se.join("|")+")"}] +},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+oe.join("|")+")\\b"},{ +begin:/:/,end:/[;}{]/, +contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] +},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]",relevance:0, +illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/},{ +begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:ie.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+ae.join("|")+")\\b"}]}},grmr_diff:e=>{ +const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ +className:"meta",relevance:10, +match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}},grmr_go:e=>{const n={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{ +const n=e.regex,t={className:"number",relevance:0,variants:[{ +begin:/([+-]+)?[\d]+_[\d_]+/},{begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{ +begin:/;/,end:/$/},{begin:/#/,end:/$/}];const i={className:"variable", +variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/}]},r={ +className:"literal",begin:/\bon|off|true|false|yes|no\b/},s={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 +},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ +e.regex +;const n="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",t=n+ue("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),a={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},i={className:"meta",begin:"@"+n,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},r={className:"params",begin:/\(/, +end:/\)/,keywords:a,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:a,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{ +1:"keyword",3:"title.class"}},{begin:[n,/\s+/,n,/\s+/,/=/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword", +3:"title.class"},contains:[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+t+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:a,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:a,relevance:0, +contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,ge,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},ge,i]}},grmr_javascript:Ne, +grmr_json:e=>({name:"JSON",contains:[{className:"attr", +begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/, +className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,{ +beginKeywords:"true false null" +},e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}), +grmr_kotlin:e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"})]}] +},l=ge,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 +},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{className:"class", +beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/, +excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},l]}},grmr_less:e=>{ +const n=te(e),t=le,a="([\\w-]+|@\\{[\\w-]+\\})",i=[],r=[],s=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),o=(e,n,t)=>({className:e,begin:n, +relevance:t}),l={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:ie.join(" ")},c={begin:"\\(",end:"\\)",contains:r,keywords:l, +relevance:0} +;r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s("'"),s('"'),n.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},n.HEXCOLOR,c,o("variable","@@?[\\w-]+",10),o("variable","@\\{[\\w-]+\\}"),o("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},n.IMPORTANT);const d=r.concat({begin:/\{/,end:/\}/,contains:i}),g={ +beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" +}].concat(r)},u={begin:a+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, +contains:[{begin:/-(webkit|moz|ms|o)-/},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+oe.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, +illegal:"[<=$]",relevance:0,contains:r}}]},b={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:l,returnEnd:!0,contains:r,relevance:0}},m={ +className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ +begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:d}},p={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:a,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,o("keyword","all\\b"),o("variable","@\\{[\\w-]+\\}"),{ +begin:"\\b("+ae.join("|")+")\\b",className:"selector-tag" +},n.CSS_NUMBER_MODE,o("selector-tag",a,0),o("selector-id","#"+a),o("selector-class","\\."+a,0),o("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+re.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+se.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:d},{begin:"!important"},n.FUNCTION_DISPATCH]},_={ +begin:`[\\w-]+:(:)?(${t.join("|")})`,returnBegin:!0,contains:[p]} +;return i.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,b,m,_,u,p),{ +name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:i}},grmr_lua:e=>{ +const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] +},i=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",t,{contains:[a], +relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:i}].concat(i) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ +const n=e.regex,t=n.concat(/[A-Z_]/,n.optional(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),a={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,contains:[{className:"meta",begin://, +relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{className:"meta", +begin://,contains:[i,r,o,s]}]}]},e.COMMENT(//,{ +relevance:10}),{begin://,relevance:10},a,{ +className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:n.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ +className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ +className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} +},grmr_markdown:e=>{const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml", +relevance:0},t={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], +variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},i={ +className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ +begin:/_(?!_)/,end:/_/,relevance:0}]};a.contains.push(i),i.contains.push(a) +;let r=[n,t] +;return a.contains=a.contains.concat(r),i.contains=i.contains.concat(r), +r=r.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:r},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:r}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:r, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_objectivec:e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{$pattern:n, +keyword:["int","float","while","char","export","sizeof","typedef","const","struct","for","union","unsigned","long","volatile","static","bool","mutable","if","do","return","goto","void","enum","else","break","extern","asm","case","short","default","double","register","explicit","signed","typename","this","switch","continue","wchar_t","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","super","unichar","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["BOOL","dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ +$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, +end:/\}/},s={variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},o=[e.BACKSLASH_ESCAPE,i,s],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{ +const r="\\1"===i?i:n.concat(i,a) +;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) +},d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),r,{className:"string",contains:o,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:c("s|tr|y",n.either(...l,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{ +begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...l,{capture:!0 +}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a, +contains:g}},grmr_php:e=>{const n={className:"variable", +begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ +className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ +begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, +end:/\}/}]},i=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),r=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),s=e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o={className:"string", +contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(i,{begin:"b'",end:"'" +}),e.inherit(r,{begin:'b"',end:'"'}),r,i,s]},l={className:"number",variants:[{ +begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" +}],relevance:0},c={ +keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", +literal:"false null true", +built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" +};return{case_insensitive:!0,keywords:c, +contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] +}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] +}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, +keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},n,{ +begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", +relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, +illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ +begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0,keywords:c, +contains:["self",n,e.C_BLOCK_COMMENT_MODE,o,l]}]},{className:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", +contains:[e.UNDERSCORE_TITLE_MODE]},o,l]}},grmr_php_template:e=>({ +name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, +subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', +end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{ +illegal:null,className:null,contains:null,skip:!0 +}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text",aliases:["text","txt"], +disableAutodetect:!0}),grmr_python:e=>{ +const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a={ +$pattern:/[A-Za-z]\w+|__\w+__/, +keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:a,illegal:/#/},s={begin:/\{\{/,relevance:0},o={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i,s,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,s,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,s,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,s,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},l="[0-9](_?[0-9])*",c=`(\\b(${l}))?\\.(${l})|\\b(${l})\\.`,d={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${l})|(${c}))[eE][+-]?(${l})[jJ]?\\b`},{begin:`(${c})[jJ]?`},{ +begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ +begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ +begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${l})[jJ]\\b`}]},g={ +className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:a,contains:[{ +begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},u={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a, +contains:["self",i,d,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,d,i],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:a, +illegal:/(<\/|->|\?)|=>/,contains:[i,d,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},o,g,e.HASH_COMMENT_MODE,{match:[/def/,/\s+/,t],scope:{1:"keyword", +3:"title.function"},contains:[u]},{variants:[{ +match:[/class/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/class/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[d,u,o]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta",starts:{ +end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ +begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ +const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:t, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, +match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ +const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a={ +keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", +built_in:"proc lambda",literal:"true false nil"},i={className:"doctag", +begin:"@[A-Za-z]+"},r={begin:"#<",end:">"},s=[e.COMMENT("#","$",{contains:[i] +}),e.COMMENT("^=begin","^=end",{contains:[i],relevance:10 +}),e.COMMENT("^__END__","\\n$")],o={className:"subst",begin:/#\{/,end:/\}/, +keywords:a},l={className:"string",contains:[e.BACKSLASH_ESCAPE,o],variants:[{ +begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, +end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ +begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, +end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ +begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ +begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,o]})]}]},c="[0-9](_?[0-9])*",d={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${c}))?([eE][+-]?(${c})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},g={className:"params",begin:"\\(",end:"\\)", +endsParent:!0,keywords:a},u=[l,{className:"class",beginKeywords:"class module", +end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{ +begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ +begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE,relevance:0}]}].concat(s)},{ +className:"function",begin:n.concat(/def\s+/,n.lookahead(t+"\\s*(\\(|;|$)")), +relevance:0,keywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:t +}),g].concat(s)},{begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[l,{begin:t}],relevance:0},d,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:a},{ +begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ +className:"regexp",contains:[e.BACKSLASH_ESCAPE,o],illegal:/\n/,variants:[{ +begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", +end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] +}].concat(r,s),relevance:0}].concat(r,s);o.contains=u,g.contains=u;const b=[{ +begin:/^\s*=>/,starts:{end:"$",contains:u}},{className:"meta", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",contains:u}}];return s.unshift(r),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(b).concat(s).concat(u)}}, +grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0, +begin:n.concat(/\b/,/(?!let\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) +},a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bin!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?", +type:["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"], +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t]}}, +grmr_scss:e=>{const n=te(e),t=se,a=re,i="@[a-z-]+",r={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, +illegal:"[=/|']", +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+ae.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+a.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, +contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+oe.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT] +},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:ie.join(" ")},contains:[{begin:i, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] +},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]}),grmr_sql:e=>{ +const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ +begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t +;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:l.concat(s),literal:a,type:i}},{className:"type", +begin:n.either("double precision","large object","with timezone","without timezone") +},c,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ +begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ +begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{className:"operator", +begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}, +grmr_swift:e=>{const n={match:/\s+/,relevance:0},t=e.COMMENT("/\\*","\\*/",{ +contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={match:[/\./,p(...ve,...Oe)], +className:{2:"keyword"}},r={match:m(/\./,p(...Me)),relevance:0 +},s=Me.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:p(...Me.filter((e=>"string"!=typeof e)).concat(xe).map(we),...Oe)}]},l={ +$pattern:p(/\b\w+/,/#\w+/),keyword:s.concat(Ae),literal:ke},c=[i,r,o],d=[{ +match:m(/\./,p(...Ce)),relevance:0},{className:"built_in", +match:m(/\b/,p(...Ce),/(?=\()/)}],u={match:/->/,relevance:0},b=[u,{ +className:"operator",relevance:0,variants:[{match:De},{match:`\\.(\\.|${Re})+`}] +}],_="([0-9a-fA-F]_*)+",h={className:"number",relevance:0,variants:[{ +match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ +match:`\\b0x(${_})(\\.(${_}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ +match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},f=(e="")=>({ +className:"subst",variants:[{match:m(/\\/,e,/[0\\tnr"']/)},{ +match:m(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),E=(e="")=>({className:"subst", +match:m(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),y=(e="")=>({className:"subst", +label:"interpol",begin:m(/\\/,e,/\(/),end:/\)/}),N=(e="")=>({begin:m(e,/"""/), +end:m(/"""/,e),contains:[f(e),E(e),y(e)]}),w=(e="")=>({begin:m(e,/"/), +end:m(/"/,e),contains:[f(e),y(e)]}),v={className:"string", +variants:[N(),N("#"),N("##"),N("###"),w(),w("#"),w("##"),w("###")]},O={ +match:m(/`/,Be,/`/)},x=[O,{className:"variable",match:/\$\d+/},{ +className:"variable",match:`\\$${Le}+`}],M=[{match:/(@|#)available/, +className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:ze, +contains:[...b,h,v]}]}},{className:"keyword",match:m(/@/,p(...Fe))},{ +className:"meta",match:m(/@/,Be)}],k={match:g(/\b[A-Z]/),relevance:0,contains:[{ +className:"type", +match:m(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Le,"+") +},{className:"type",match:$e,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:m(/\s+&\s+/,g($e)),relevance:0}]},S={ +begin://,keywords:l,contains:[...a,...c,...M,u,k]};k.contains.push(S) +;const A={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ +match:m(Be,/\s*:/),keywords:"_|0",relevance:0 +},...a,...c,...d,...b,h,v,...x,...M,k]},C={begin://,contains:[...a,k] +},T={begin:/\(/,end:/\)/,keywords:l,contains:[{ +begin:p(g(m(Be,/\s*:/)),g(m(Be,/\s+/,Be,/\s*:/))),end:/:/,relevance:0, +contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:Be}] +},...a,...c,...b,h,v,...M,k,A],endsParent:!0,illegal:/["']/},R={ +match:[/func/,/\s+/,p(O.match,Be,De)],className:{1:"keyword",3:"title.function" +},contains:[C,T,n],illegal:[/\[/,/%/]},D={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[C,T,n],illegal:/\[|%/},I={match:[/operator/,/\s+/,De],className:{ +1:"keyword",3:"title"}},L={begin:[/precedencegroup/,/\s+/,$e],className:{ +1:"keyword",3:"title"},contains:[k],keywords:[...Se,...ke],end:/}/} +;for(const e of v.variants){const n=e.contains.find((e=>"interpol"===e.label)) +;n.keywords=l;const t=[...c,...d,...b,h,v,...x];n.contains=[...t,{begin:/\(/, +end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, +contains:[...a,R,D,{beginKeywords:"struct protocol class extension enum actor", +end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ +className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] +},I,L,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 +},...c,...d,...b,h,v,...x,...M,k,A]}},grmr_typescript:e=>{ +const n=Ne(e),t=["any","void","number","boolean","string","object","never","enum"],a={ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0, +contains:[n.exports.CLASS_REFERENCE]},i={beginKeywords:"interface",end:/\{/, +excludeEnd:!0,keywords:{keyword:"interface extends",built_in:t}, +contains:[n.exports.CLASS_REFERENCE]},r={$pattern:be, +keyword:me.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]), +literal:pe,built_in:ye.concat(t),"variable.language":Ee},s={className:"meta", +begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},o=(e,n,t)=>{ +const a=e.contains.findIndex((e=>e.label===n)) +;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} +;return Object.assign(n.keywords,r), +n.exports.PARAMS_CONTAINS.push(s),n.contains=n.contains.concat([s,a,i]), +o(n,"shebang",e.SHEBANG()),o(n,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ +name:"TypeScript",aliases:["ts","tsx"]}),n},grmr_vbnet:e=>{ +const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ +className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ +begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ +begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] +},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},o,l,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[l]}]}},grmr_yaml:e=>{ +const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, +end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", +contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", +begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] +;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:l}}});const je=ne;for(const e of Object.keys(Ue)){ +const n=e.replace("grmr_","").replace("_","-");je.registerLanguage(n,Ue[e])} +return je}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/src/static/highlight/styles/github-light-dark.min.css b/src/static/highlight/styles/github-light-dark.min.css new file mode 100644 index 0000000..82dcb49 --- /dev/null +++ b/src/static/highlight/styles/github-light-dark.min.css @@ -0,0 +1,6 @@ +/* ========================================================= LIGHT MODE ========================================================= */ +/* Taken from: https://github.com/highlightjs/highlight.js/blob/main/src/styles/github.css */ +.hljs{color:#24292e;background:#ffffff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:bold}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:bold}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}.hljs-char.escape_,.hljs-link,.hljs-params,.hljs-property,.hljs-punctuation,.hljs-tag{} +/* ========================================================= DARK MODE ========================================================= */ +/* Taken from: https://github.com/highlightjs/highlight.js/blob/main/src/styles/github-dark.css */ +body.dark .hljs{color:#c9d1d9;background:#0d1117}body.dark .hljs-doctag,body.dark .hljs-keyword,body.dark .hljs-meta .hljs-keyword,body.dark .hljs-template-tag,body.dark .hljs-template-variable,body.dark .hljs-type,body.dark .hljs-variable.language_{color:#ff7b72}body.dark .hljs-title,body.dark .hljs-title.class_,body.dark .hljs-title.class_.inherited__,body.dark .hljs-title.function_{color:#d2a8ff}body.dark .hljs-attr,body.dark .hljs-attribute,body.dark .hljs-literal,body.dark .hljs-meta,body.dark .hljs-number,body.dark .hljs-operator,body.dark .hljs-selector-attr,body.dark .hljs-selector-class,body.dark .hljs-selector-id,body.dark .hljs-variable{color:#79c0ff}body.dark .hljs-meta .hljs-string,body.dark .hljs-regexp,body.dark .hljs-string{color:#a5d6ff}body.dark .hljs-built_in,body.dark .hljs-symbol{color:#ffa657}body.dark .hljs-code,body.dark .hljs-comment,body.dark .hljs-formula{color:#8b949e}body.dark .hljs-name,body.dark .hljs-quote,body.dark .hljs-selector-pseudo,body.dark .hljs-selector-tag{color:#7ee787}body.dark .hljs-subst{color:#c9d1d9}body.dark .hljs-section{color:#1f6feb;font-weight:bold}body.dark .hljs-bullet{color:#f2cc60}body.dark .hljs-emphasis{color:#c9d1d9;font-style:italic}body.dark .hljs-strong{color:#c9d1d9;font-weight:bold}body.dark .hljs-addition{color:#aff5b4;background-color:#033a16}body.dark .hljs-deletion{color:#ffdcd7;background-color:#67060c}body.dark .hljs-char.escape_,body.dark .hljs-link,body.dark .hljs-params,body.dark .hljs-property,body.dark .hljs-punctuation,body.dark .hljs-tag{} \ No newline at end of file diff --git a/src/static/img/admonition_icons/caution.png b/src/static/img/admonition_icons/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..91712f8ae75bf6823dc2346ae8f9c83f07c2a063 GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@CmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`*Dg;1l8sRPe>g{IiqU zXGha7&So#%^nm0y7t^mU=AT{6{)cJ7UZ1&&R z_?rXB9FPK#AXo~d()7QB1CaaC-SU%@=~pL+;bz~Q%sx4qfK4;~>T2-?tP!jWWW^_t zcC#;zWB0E?O~Q}#6V)C!tt-0v+e*>nt#ihil=h>1t;;{F2QS-x zi0j?db3OvLcLOiKlseh$Za16fipm9^)hV04adfOcoSzA_modrP-6eN78^c;4hrPtp z*OmP#Grx$o!r}FEq=3>3JY5_^JdRJj79M=aL4YCQNLNSK0>Ns=jY;og->|X@23F<& z{y)Ffg7eM2)|hXan`h@gD@xT@6SlWvIHTr#k&_|zZkvbyT!;077q1H>7%Kc)Yb0sl zkh7`5vCz=ukN*KZA2$cic8$VSDIrsORFtm=Z;UQ$3T}2kVYi!!y?us^V9}Y#Ey6y2C!6LMp0Jd>$*MH{ z&f3D(lcq}MUbk+}`kGwSePZsUefget6B=!mJ}p@?KYrH9aHo3$oGX5on|>EmQEBk# z*nHmp8){{PiihpaQXzkZ6hQ+SbS%;Y}@7sRh>T|MWMJa7Nz8(cHkCjg^QwZt`| zBqgyV)hf9t6-Y4{85kMr8W`&unuZt|SeY1G8Chx@7+4t?XeiwALD7(#pOTqYiCaTt SZOR9r1_n=8KbLh*2~7Y$mf7C` literal 0 HcmV?d00001 diff --git a/src/static/img/admonition_icons/important.png b/src/static/img/admonition_icons/important.png new file mode 100644 index 0000000000000000000000000000000000000000..03ceb16afb4d2dccd9902bcfa5f9a1e1b8d89888 GIT binary patch literal 965 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@CmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lsFvV6XFV_zq%WLbu|Cv zZ1&a3?2C)pS7-At&Zb|SfD9l4F}^tfMS#fcD^M1szzoR#;$;5W+5EGUDUkiy+4M6| zFIfDmlf`GC2$%~t!R(8x`F~^M&n{*_D?YfGesMMZ>}dKGq|p?p@e5D{Y&eh$RR77* z}rU(!J!n)|I<2 zLPJ_sL^_lg8qNk9#hB#n?&9$8X3PyBhrPtp*OmP#Grx$o?Cj$gxPj7JJY5_^JdUrO z_Iz5Cfk5lV1q*Iei|<~P{XX^H|FvQ#6R$pDyJ1^hfA6*WWR|o=8W9T%ES9i@sjND7 zBG9MT?N7b@^^#u`)*ZENbeYsJiBmIS$t9Mlev&gzqB(Xne~}a6 zt^SKV7(@Qth~ZkY{j8bS!3meL*9XUhtP7D1Jry(Imu9#9!CAAf{4g%{7QQ!WSNE0H z^7fy+3!g3PHfde)@Q3cf{M{bW9Z`Mv1^=w;E@@ryd5iCc*|u(998zx8$^T$(<8ipM zy;k&xa~qH2l3R5=Ka|^g97HzPeo5<*G;*7Hw|0VU;t7^iMb(}+n$F8KxRX|Z96 zVfXL#st?n-JB@Rq?kK$2BK2>&>gNBuV!obzFx{wM`;Pfvo8BHC!7zPbl&Y4vMwFx^ zmZVxG7o`Fz1|tI_LtO)7T|?6lBLgcFV=E&|Z36=<0|O0(J3c5Ha`RI%(<*Umh^$Td Q0Mx+X>FVdQ&MBb@0ILF+NB{r; literal 0 HcmV?d00001 diff --git a/src/static/img/admonition_icons/note.png b/src/static/img/admonition_icons/note.png new file mode 100644 index 0000000000000000000000000000000000000000..d43f29e56b0acabed38e38738c2836faf69bc7cb GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@CmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l$aUd6XFV_rui3sUwO$X1y8Nom?A`Kchb;jzdyR>2GDVaB|(0{43fsSlg>Q#=(}sWRHo;T_wD4eM91qp8%j+)xu+>VDs!72 zxk~iY{@M4t?uN9inD212w(Hq+pk~G-Z+90Xhf6*ufE@M`PhVH|r_B5!+Hy?i8aD!^ zTRmMILp+YJo%V8ClL1dFV`+u5ui%e<2VX13kS{(o(57@RlfL7`?eRZi{H0h2z=1+!LVABv))rNNzZEPPkq{Pl_b^CiW{TkMWnpZ**7{FK4&6N=NbUhh98aQ#=q&aJ}RpGoZA zE?91%6Kps!N%`l;C(P%MZx3tr7Zb9|S#(U{hFjwAO(N<~i>4m=FVdQ&MBb@0JoQH3;+NC literal 0 HcmV?d00001 diff --git a/src/static/img/admonition_icons/tip.png b/src/static/img/admonition_icons/tip.png new file mode 100644 index 0000000000000000000000000000000000000000..f55e567c2dde1b4da59174e9582c23dc4fa72a60 GIT binary patch literal 1201 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@CmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`$r4;1l8sRPcWe!~a2zwFOD4-S~ z7lI%PAbQ~<5EFppe6V_mULXnd0+5`I>gIkVF2s)z?W-96!#x5tAEFD$fEx~B0}Y%9 zwgngzKoN*t|Nl4skY5iBxYUv$zhDNT*!>rue9O}CT=MI9i1{q}+y|)*PtVLR{JAi2 zZfL8fici)wl)?Fe0wc-_4@jR1^dtMGS;Yk^X`IeRoQ<>wGRay zEw)v2{BErHmSWLcaOk%iSL?(Jm04*>cRfQ*z=VE=`7SjH>tyX&rwWB2_Ke zLqtR$Ecf93F!h1WtgW^U@k-4B;oqN`H%u20XApD!cVJSN4wH_`k<kA2oMV&1UwRW!qGt0d`!(;-K# zcV{J(vnPZ!zcFQuYLmNk$Jl(yqJ8^v|AxO~HW6mue~0CUxyqVYc8iW~c80IpG*9X= zvmZ*3@JU-dsj2h**+zttI*$9@-iaKu0VZ#u)npYf~~r)TIt zXNX}r$I9?L()i`3;CYFLacO-US9`3DWC*{x`BI_G^3AK)hE@FJpD}rZOo!?SQ!{-DBSTu(U6;;l9^VCTSH`R R$_JnZ22WQ%mvv4FO#m>%2@n7P literal 0 HcmV?d00001 diff --git a/src/static/img/admonition_icons/warning.png b/src/static/img/admonition_icons/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..7fffafdaf6abe31b6343659349849e4091a2a662 GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@CmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)2C;1l8sRPcW$!~f}E zat6bHAnFH`KtTu>C^ZYr1~TBvfFckDt6&VE6h!@OB<<5+8i7(kEkG{ZSRfl>8pK$L z6%Z4EBwQKXSfC)pWQZDw$v|Zg?GQnTE{GN&dlJ}ope|&^aFr0f5E5eY|NpC(olgda zNJL4HUoeBRLg@8N0#}>#zb^7Sm?!<9*J@29+nLG+)z?nWGkpDABeo}{q~zucR#dgL z8hq^wa?38)*+0yt^pY`sUlXlLJUe(EdR!{w{+wJ?07hSn1=^#Eaoa+tH z4#p&JcbCXno4!Z@IqW5#zOL*~nfXPu<(SSjZUjot_H=O!@i=~TT4eYk1A*4X3cvR? zFX~X@XzJ)_QtDu8YS?l9|9{n>ORAYcv-Z8Hon8HT?h@mdmX0stw{Fc9+;EezEN2== z#A&9-1xZI<3b@56oL2SPVaxTXkXtD(;Hju`jl&7`mLHx+^qp85f)32#XvyV# zAoxa42gBkHPNCF^FVd9QWR98%eq`bIJYufkSsBPRU2~_8l<>=*J!#_CtBYoON-IS^ z)%d-`F5uM~!HL2C^(*q-&M}-^t=+ewaE(-@UEqbPlBT(fo{3broLr}CaWpKl_>C%G zkfNI6{{!hQp^2SYy?eW!w}h@X@|Zhk`<*M?msY>-WGi^&eJbb01huJgiJM(#`p(k0 zB>quqxA~T6mCmwuzWnzp+pGO|&oyiO;^1N1`(pFU!w)`omj2edl(gw9zj4Z&X-+*e zGJ2ZR)g&G!7^O}UpHnh3!RlhXo$IN8IYHCj+>|*|-uN@;DZj;ClRsh&j85F|Sa__| zG7sK8QlK}f?S-gLR_C;^iRNGOL?yM?GZn7A$G?qV`+#~~VNEUf>*wd^#qOVWY2Lb0 z@!v|om{TorjVMV;EJ?LWE=mPb3`Pb \ No newline at end of file diff --git a/src/static/img/favicon.ico b/src/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c26c2cde5e9594ebf83f43328105040b1f0d5cb7 GIT binary patch literal 152126 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 literal 0 HcmV?d00001 diff --git a/src/static/img/icon-512.png b/src/static/img/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..585196ff1cd52c592688811482707ecf9d0c25f7 GIT binary patch literal 10554 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 \ No newline at end of file diff --git a/src/static/img/sun.svg b/src/static/img/sun.svg new file mode 100644 index 0000000..dfb4eac --- /dev/null +++ b/src/static/img/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/static/img/up-arrow.svg b/src/static/img/up-arrow.svg new file mode 100644 index 0000000..402ad3b --- /dev/null +++ b/src/static/img/up-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/static/js/script.js b/src/static/js/script.js new file mode 100644 index 0000000..95431b9 --- /dev/null +++ b/src/static/js/script.js @@ -0,0 +1,186 @@ +const pwaInstallDiv = document.querySelector(".pwa-install-div"); +const pwaInstallBtn = document.querySelector("#pwa-install-btn"); +const pwaInstallDismiss = document.querySelector("#pwa-install-dismiss"); +const backToTopBtn = document.querySelector(".back-to-top-btn"); +const header = document.querySelector("#header"); +const body = document.querySelector("body"); + +const dbName = "asciidoctor-jet"; +const dbVersion = 1; +const objStoreName = "theme"; + +let pwaInstallEvent; +let theme; +let themeBtn; +let systemDarkTheme = window.matchMedia("(prefers-color-scheme: dark)"); + +// Service worker and PWA + +if (navigator.serviceWorker) { + window.addEventListener("load", () => { + navigator.serviceWorker + .register("service-worker.js") + .catch((err) => console.error(`Service Worker error: ${err}`)); + }); + + window.addEventListener("beforeinstallprompt", (e) => { + e.preventDefault(); + pwaInstallEvent = e; + showPWAInstallPrompt(); + }); + + pwaInstallBtn.addEventListener("click", () => { + pwaInstallEvent.prompt(); + pwaInstallDiv.classList.add("hidden"); + }); + + pwaInstallDismiss.addEventListener("click", () => + dismissPWAInstallPrompt() + ); +} + +// Window load listener + +window.addEventListener("load", async () => { + await loadDatabase(); // Initially sets 'theme' variable. + createThemeSwitcher(); + applyTheme(); + mobileEdgeCaseStyling(); +}); + +// System/browser theme change listener + +if (!systemDarkTheme.addEventListener) + systemDarkTheme.addEventListener = (event, listener) => + systemDarkTheme.addListener(listener); + +systemDarkTheme.addEventListener("change", async (e) => { + if (e.matches) theme = "dark"; + else theme = "light"; + + applyTheme(); +}); + +// Back to top button + +const observer = new IntersectionObserver(scrollToTop); +observer.observe(header); + +backToTopBtn.addEventListener("click", () => header.scrollIntoView(true)); + +// Functions + +function showPWAInstallPrompt() { + pwaInstallDiv.classList.remove("hidden"); + pwaInstallDiv.classList.add("pwa-install-div-summon"); +} + +function dismissPWAInstallPrompt() { + pwaInstallDiv.classList.add("pwa-install-div-dismiss"); + setTimeout(() => pwaInstallDiv.classList.add("hidden"), 2000); +} + +function scrollToTop(entries, observer) { + entries.forEach((entry) => { + if (entry.isIntersecting) backToTopBtn.classList.add("hidden"); + else backToTopBtn.classList.remove("hidden"); + }); +} + +function createThemeSwitcher() { + themeBtn = document.createElement("button"); + + themeBtn.classList.add("btn", "theme-switcher"); + themeBtn.addEventListener("click", switchTheme); + body.appendChild(themeBtn); +} + +async function switchTheme() { + if (theme === "light") { + themeBtn.setAttribute("aria-label", "Light mode"); + body.classList.add("dark"); + theme = "dark"; + await saveDatabase(); + } else { + themeBtn.setAttribute("aria-label", "Dark mode"); + body.classList.remove("dark"); + theme = "light"; + await saveDatabase(); + } +} + +async function applyTheme() { + if (theme === "light") { + themeBtn.setAttribute("aria-label", "Dark mode"); + body.classList.remove("dark"); + await saveDatabase(); + } else { + themeBtn.setAttribute("aria-label", "Light mode"); + body.classList.add("dark"); + await saveDatabase(); + } +} + +async function loadDatabase() { + return new Promise((resolve, reject) => { + let request = indexedDB.open(dbName, dbVersion); + + request.addEventListener("error", reject); + + request.addEventListener("upgradeneeded", (e) => { + let db = e.target.result; + + if (!db.objectStoreNames.contains(objStoreName)) + db.createObjectStore(objStoreName); + }); + + request.addEventListener("success", (e) => { + let db = e.target.result; + + let transaction = db.transaction(objStoreName, "readonly"); + let store = transaction.objectStore(objStoreName); + + let getTheme = store.get("theme"); + getTheme.addEventListener("error", reject); + getTheme.addEventListener("success", (e) => { + let idbTheme = e.target.result; + + if (idbTheme) theme = idbTheme; + else { + if (systemDarkTheme.matches) theme = "dark"; + else theme = "light"; + } + + resolve(); + }); + }); + }); +} + +async function saveDatabase() { + return new Promise((resolve, reject) => { + let request = indexedDB.open(dbName, dbVersion); + + request.addEventListener("error", reject); + + request.addEventListener("success", (e) => { + let db = e.target.result; + + let transaction = db.transaction(objStoreName, "readwrite"); + let store = transaction.objectStore(objStoreName); + + store.put(theme, "theme"); + resolve(); + }); + }); +} + +function mobileEdgeCaseStyling() { + const userAgent = navigator.userAgent; + + if ( + (userAgent.indexOf("Edg") > -1 && userAgent.indexOf("Mobile") > -1) || + userAgent.indexOf("iPhone") > -1 + ) + body.classList.add("mobile-edge-case"); +}