From 1e84d9a58500ed0947334b474ad28f8240d9983e Mon Sep 17 00:00:00 2001 From: James Mills Date: Wed, 25 Dec 2024 12:09:10 +1000 Subject: [PATCH] Add zs init command to initialize new site --- default/.gitignore | 5 + default/.zs/config.yml | 14 + default/.zs/editthispage | 9 + default/.zs/include | 14 + default/.zs/layout.html | 64 ++ default/.zs/list | 90 +++ default/.zs/nav | 57 ++ default/.zs/onthispage | 9 + default/.zs/posthook | 19 + default/.zs/prehook | 3 + default/.zs/scripts | 14 + default/.zs/styles | 9 + default/.zsignore | 6 + default/LICENSE | 13 + default/Makefile | 29 + default/apple-touch-icon.png | Bin 0 -> 4938 bytes default/assets/css/highlight.css | 9 + default/assets/css/reset.css | 48 ++ default/assets/css/site.css | 447 +++++++++++ default/assets/js/highlight.js | 1202 ++++++++++++++++++++++++++++++ default/assets/js/live.js | 233 ++++++ default/assets/js/main.js | 41 + default/favicon-16x16.png | Bin 0 -> 347 bytes default/favicon-32x32.png | Bin 0 -> 675 bytes default/index.md | 5 + default/logo.png | Bin 0 -> 77203 bytes go.mod | 13 +- go.sum | 64 +- main.go | 145 +++- 29 files changed, 2494 insertions(+), 68 deletions(-) create mode 100644 default/.gitignore create mode 100644 default/.zs/config.yml create mode 100755 default/.zs/editthispage create mode 100755 default/.zs/include create mode 100644 default/.zs/layout.html create mode 100755 default/.zs/list create mode 100755 default/.zs/nav create mode 100755 default/.zs/onthispage create mode 100755 default/.zs/posthook create mode 100755 default/.zs/prehook create mode 100755 default/.zs/scripts create mode 100755 default/.zs/styles create mode 100644 default/.zsignore create mode 100644 default/LICENSE create mode 100644 default/Makefile create mode 100644 default/apple-touch-icon.png create mode 100644 default/assets/css/highlight.css create mode 100644 default/assets/css/reset.css create mode 100644 default/assets/css/site.css create mode 100644 default/assets/js/highlight.js create mode 100644 default/assets/js/live.js create mode 100644 default/assets/js/main.js create mode 100644 default/favicon-16x16.png create mode 100644 default/favicon-32x32.png create mode 100644 default/index.md create mode 100644 default/logo.png diff --git a/default/.gitignore b/default/.gitignore new file mode 100644 index 0000000..c7ab8f5 --- /dev/null +++ b/default/.gitignore @@ -0,0 +1,5 @@ +*~ +*.bak +**/.DS_Store + +/.pub diff --git a/default/.zs/config.yml b/default/.zs/config.yml new file mode 100644 index 0000000..7d4328d --- /dev/null +++ b/default/.zs/config.yml @@ -0,0 +1,14 @@ +--- +title: Twtxt Docs +description: Twtxt documentation for developers +keywords: docs, twtxt, markdown, text, format, documentation + +extensions: + - anchor + - definitionlist + - linkify + - footnote + - strikethrough + - table + - typography + - wikilink diff --git a/default/.zs/editthispage b/default/.zs/editthispage new file mode 100755 index 0000000..32917b0 --- /dev/null +++ b/default/.zs/editthispage @@ -0,0 +1,9 @@ +#!/bin/sh + +GITEA_BASE_URL="https://git.mills.io" +REPO="yarnsocial/twtxt.dev" +BRANCH="main" + +url="${GITEA_BASE_URL}/${REPO}/_edit/${BRANCH}/${ZS_FILE}" + +printf "✍️ Edit Page on Gitea" "$url" diff --git a/default/.zs/include b/default/.zs/include new file mode 100755 index 0000000..84e73a5 --- /dev/null +++ b/default/.zs/include @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +if [ ! $# = 1 ]; then + printf "Usage: %s \n" "$(basename "$0")" + exit 0 +fi + +if [ -f "$1" ]; then + cat "$1" +else + echo "error: file not found $1" +fi diff --git a/default/.zs/layout.html b/default/.zs/layout.html new file mode 100644 index 0000000..a2fbaf2 --- /dev/null +++ b/default/.zs/layout.html @@ -0,0 +1,64 @@ + + + + + + + + {{ title }} + + + + + + + + {{ styles }} + + + + +
+
+ + +
+
+ + +
+
{{ content }}
+
+ + +
+
+ + {{ editthispage }} + +

+ Last modified + Built with zs +

+ +
+
+ + + {{ scripts }} + + + + \ No newline at end of file diff --git a/default/.zs/list b/default/.zs/list new file mode 100755 index 0000000..860db52 --- /dev/null +++ b/default/.zs/list @@ -0,0 +1,90 @@ +#!/bin/sh + +# Define the directory to iterate over from the first argument +dir="$1" + +# Initialize the variable to hold the HTML list and date-file pairs +html="" +date_file_pairs="" + +# Check if the directory exists +if [ -d "$dir" ]; then + # Find all Markdown files in the directory and store them in a variable + md_files=$(find "$dir" -maxdepth 1 -type f -name "*.md") + + # Process each Markdown file in a regular loop (not in a subshell) + for md_file in $md_files; do + # Extract front matter using sed, ensure the file is quoted + front_matter=$(sed -n '/^---$/,/^---$/p' "$md_file") + + # Extract date + date=$(echo "$front_matter" | grep '^date:' | sed 's/^date:[[:space:]]*//') + + # If no date is found, use a default date + if [ -z "$date" ]; then + date="1970-01-01" # Default date if none is found + fi + + # Add the date and file to the date_file_pairs variable, using printf to correctly append newlines + date_file_pairs=$(printf "%s\n%s|%s" "$date_file_pairs" "$date" "$md_file") + done + + # Sort the date and file pairs by date + sorted_date_file_pairs=$(printf "%s" "$date_file_pairs" | sort) + + # Create a file descriptor to avoid subshell issues + exec 3<" + while IFS= read -r pair <&3; do + # Split the pair into date and filename using | as a delimiter + date=$(printf "%s" "$pair" | cut -d'|' -f1) + md_file=$(printf "%s" "$pair" | cut -d'|' -f2) + + # Ensure md_file is not empty (safety check) + [ -z "$md_file" ] && continue + + # Extract front matter again using sed, ensure md_file is quoted + front_matter=$(sed -n '/^---$/,/^---$/p' "$md_file") + + # Extract title + title=$(echo "$front_matter" | grep '^title:' | sed 's/^title:[[:space:]]*//') + + # Use filename as a fallback if title is empty + if [ -z "$title" ]; then + # Get the base filename without extension, quote the argument + base_name=$(basename "$md_file" .md) + # Replace hyphens and underscores with spaces for display + title=$(echo "$base_name" | sed 's/-/ /g' | sed 's/_/ /g') + # Capitalize each word + title=$(echo "$title" | awk '{ for (i=1; i<=NF; i++) $i=toupper(substr($i,1,1)) substr($i,2); print }') + fi + + # Format the date using POSIX-compliant date formatting + if formatted_date=$(date -d "$date" '+%Y-%m-%d' 2>/dev/null); then + : # formatted_date is valid + else + formatted_date="$date" + fi + + # Construct the link href, quote the argument + href="/$dir/$(basename "${md_file%.md}.html")" + + # Append to the HTML list + html="$html
  • $title (published: $formatted_date)
  • " + done + html="$html" + + # Close file descriptor + exec 3<&- + +else + # If the directory doesn't exist, set a message + html="

    No pages found.

    " +fi + +# Output the HTML list +echo "$html" diff --git a/default/.zs/nav b/default/.zs/nav new file mode 100755 index 0000000..6488a12 --- /dev/null +++ b/default/.zs/nav @@ -0,0 +1,57 @@ +#!/bin/sh + +# Get the directory of the current page +current_dir=$(dirname "$ZS_SOURCE_FILE") + +# Remove leading './' if present +case "$current_dir" in +./*) current_dir="${current_dir#./}" ;; +esac + +# Initialize the navigation HTML with the 'Home' link +if [ "$ZS_URL" = "index.html" ]; then + nav_html="
  • Home
  • " +else + nav_html="
  • Home
  • " +fi + +# Create a temporary file to store filenames +tmpfile=$(mktemp) + +# Find all Markdown files in the current directory, excluding 'README.md' and 'index.md' +find "$current_dir" -maxdepth 1 -type f -name "*.md" ! -name "README.md" ! -name "index.md" -print >"$tmpfile" + +# Sort the files alphabetically +sort "$tmpfile" >"${tmpfile}.sorted" + +# Read each file and process +while IFS= read -r md_file; do + # Get the base filename without extension + base_name=$(basename "$md_file" .md) + + # Replace hyphens and underscores with spaces for display + display_name=$(echo "$base_name" | tr '-' ' ' | tr '_' ' ') + + # Capitalize the first letter of each word using awk + display_name=$(echo "$display_name" | awk '{ for (i=1; i<=NF; i++) { $i = toupper(substr($i,1,1)) substr($i,2) } print }') + + # Construct the link href relative to the site root + if [ "$current_dir" = "." ]; then + href="/${base_name}.html" + else + href="/${current_dir}/${base_name}.html" + fi + + # Append the navigation item + if [ "$ZS_URL" = "$base_name.html" ]; then + nav_html="${nav_html}
  • ${display_name}
  • " + else + nav_html="${nav_html}
  • ${display_name}
  • " + fi +done <"${tmpfile}.sorted" + +# Remove temporary files +rm -f "$tmpfile" "${tmpfile}.sorted" + +# Output the navigation HTML +echo "$nav_html" diff --git a/default/.zs/onthispage b/default/.zs/onthispage new file mode 100755 index 0000000..ce04f34 --- /dev/null +++ b/default/.zs/onthispage @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +{ + echo "**On this page**" + echo + toc -d 2 -s 1 "$ZS_FILE" +} | zs gen diff --git a/default/.zs/posthook b/default/.zs/posthook new file mode 100755 index 0000000..bcf1d52 --- /dev/null +++ b/default/.zs/posthook @@ -0,0 +1,19 @@ +#!/bin/sh + +set -e + +minify_assets() { + p="$1" + t="$2" + + find "$p" -type f -name "*.$t" | while read -r file; do + name="${file#"$p"}" + name="${name#"/"}" + minify -o "${p}/${name}" "$file" + done +} + +if command -v minify > /dev/null; then + minify_assets "$ZS_OUTDIR" "css" + minify_assets "$ZS_OUTDIR" "js" +fi diff --git a/default/.zs/prehook b/default/.zs/prehook new file mode 100755 index 0000000..c52d3c2 --- /dev/null +++ b/default/.zs/prehook @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0 diff --git a/default/.zs/scripts b/default/.zs/scripts new file mode 100755 index 0000000..1a74570 --- /dev/null +++ b/default/.zs/scripts @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +JS="highlight main" + +# Load live.js for non-production builds for faster development +if [ -z "$ZS_PRODUCTION" ]; then + JS="$JS live" +fi + +for js in $JS; do + printf "\n" "$js" +done diff --git a/default/.zs/styles b/default/.zs/styles new file mode 100755 index 0000000..852e5fd --- /dev/null +++ b/default/.zs/styles @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +CSS="highlight site" + +for css in $CSS; do + printf "\n" "$css" +done diff --git a/default/.zsignore b/default/.zsignore new file mode 100644 index 0000000..99280f6 --- /dev/null +++ b/default/.zsignore @@ -0,0 +1,6 @@ +*~ +*.bak + +LICENSE +Makefile +README.md diff --git a/default/LICENSE b/default/LICENSE new file mode 100644 index 0000000..5c93f45 --- /dev/null +++ b/default/LICENSE @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/default/Makefile b/default/Makefile new file mode 100644 index 0000000..8845b8f --- /dev/null +++ b/default/Makefile @@ -0,0 +1,29 @@ +.PHONY: deps dev build image clean + +GOCMD=go +IMAGE := r.mills.io/prologic/twtxt.dev +TAG := latest + +all: build + +deps: + @$(GOCMD) install go.mills.io/zs@latest + @$(GOCMD) install github.com/tdewolff/minify/v2/cmd/minify@latest + +dev : DEBUG=1 +dev : build + @zs serve + +build: + @zs build + +ifeq ($(PUBLISH), 1) +image: + @docker buildx build --platform linux/amd64,linux/arm64 --push -t $(IMAGE):$(TAG) . +else +image: + @docker build -t $(IMAGE):$(TAG) . +endif + +clean: + @git clean -f -d diff --git a/default/apple-touch-icon.png b/default/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdf6cc185e9e7186b5dd675531c41fecf2e691b GIT binary patch literal 4938 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 IM6N<$f`jLQb^rhX literal 0 HcmV?d00001 diff --git a/default/assets/css/highlight.css b/default/assets/css/highlight.css new file mode 100644 index 0000000..e266dfc --- /dev/null +++ b/default/assets/css/highlight.css @@ -0,0 +1,9 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub Dark Dimmed + Description: Dark dimmed theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Colors taken from GitHub's CSS +*/.hljs{color:#adbac7;background:#22272e}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#f47067}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#dcbdfb}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#6cb6ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#96d0ff}.hljs-built_in,.hljs-symbol{color:#f69d50}.hljs-code,.hljs-comment,.hljs-formula{color:#768390}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#8ddb8c}.hljs-subst{color:#adbac7}.hljs-section{color:#316dca;font-weight:700}.hljs-bullet{color:#eac55f}.hljs-emphasis{color:#adbac7;font-style:italic}.hljs-strong{color:#adbac7;font-weight:700}.hljs-addition{color:#b4f1b4;background-color:#1b4721}.hljs-deletion{color:#ffd8d3;background-color:#78191b} \ No newline at end of file diff --git a/default/assets/css/reset.css b/default/assets/css/reset.css new file mode 100644 index 0000000..e29c0f5 --- /dev/null +++ b/default/assets/css/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/default/assets/css/site.css b/default/assets/css/site.css new file mode 100644 index 0000000..4813e47 --- /dev/null +++ b/default/assets/css/site.css @@ -0,0 +1,447 @@ +/* site.css */ + +/* Default Light Theme Variables */ +:root { + --background-color: #ffffff; + --text-color: #333333; + --link-color: #1d5ed0; + --link-hover-color: #0a47ab; + /* Improved hover contrast for light mode */ + --header-background: #f8f9fa; + --footer-background: #f8f9fa; + --button-background: transparent; + --button-color: #333333; + --nav-link-color: #333333; + --nav-link-active: #ccc; + --quote-border-color: #ccc; + --quote-text-color: #555; + --quote-background-color: #f9f9f9; +} + +/* Dark Theme Variables */ +[data-theme="dark"] { + --background-color: #121212; + --text-color: #e0e0e0; + --link-color: #64B5F6; + /* Light blue with good contrast */ + --link-hover-color: #2196F3; + /* Brighter blue for hover effect */ + --header-background: #1f1f1f; + --footer-background: #1f1f1f; + --button-background: transparent; + --button-color: #e0e0e0; + --nav-link-color: #e0e0e0; + --nav-link-active: #333333; + --quote-border-color: #555; + --quote-text-color: #ccc; + --quote-background-color: #1e1e1e; +} + +/* Global Styles */ +body { + margin: 0; + font-family: Arial, sans-serif; + background-color: var(--background-color); + color: var(--text-color); + overflow-x: hidden; + /* Prevent horizontal scrolling */ +} + +/* Global Link Styles */ +a { + color: var(--link-color); + text-decoration: none; +} + +a:hover, +a:focus { + color: var(--link-hover-color); + text-decoration: underline; +} + +/* Adjusted Container */ +.container { + width: 95%; + max-width: 900px; + margin: 0 auto; + padding: 0; + box-sizing: border-box; + /* Include padding and border in width */ +} + +/* Adjust margins for child elements */ +.container h1, +.container h2, +.container h3, +.container h4, +.container h5, +.container h6, +.container p, +.container ul, +.container ol, +.container pre, +.container code, +.container blockquote { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +/* Header */ +header { + background-color: var(--header-background); + padding: 0.5em 0; +} + +header .container { + display: flex; + flex-direction: column; +} + +.header-top { + display: flex; + align-items: center; + justify-content: space-between; +} + +header .logo { + font-size: 1.5em; + font-weight: bold; + color: var(--text-color); + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Theme Toggle Button */ +#theme-toggle { + background: var(--button-background); + border: none; + cursor: pointer; + color: var(--button-color); + font-size: 1.5em; + margin-left: 1em; +} + +/* Menu Toggle Button */ +#menu-toggle { + background: var(--button-background); + border: none; + cursor: pointer; + color: var(--button-color); + font-size: 1.5em; + display: none; + /* Hidden by default */ +} + +/* Navigation Menu */ +nav#main-nav { + margin-top: 0.5em; +} + +nav ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + gap: 0.5em; + flex-wrap: wrap; +} + +nav ul li { + margin: 0; +} + +nav ul li a { + display: block; + color: var(--nav-link-color); + text-decoration: none; + padding: 0.5em; +} + +nav ul li a.active { + background-color: var(--nav-link-active); +} + +nav ul li a:hover { + background-color: var(--nav-link-active); + text-decoration: none; + color: var(--nav-link-color); +} + +/* Navigation Logo Styling */ +header .logo { + display: flex; + /* Make the logo a flex container */ + align-items: center; + /* Vertically center the content */ + font-size: 1.5em; + font-weight: bold; + color: var(--text-color); + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +header .logo img { + height: 40px; + /* Adjust logo size */ + width: auto; + margin-right: 0.5em; + /* Space between the logo and the text */ +} + +@media (max-width: 800px) { + + /* Adjust header layout */ + .header-top { + flex-wrap: nowrap; + justify-content: space-between; + /* Push the elements to the left and right ends */ + } + + /* Show the menu toggle button */ + #menu-toggle { + display: block; + order: 2; + /* Move the menu toggle to the right */ + } + + /* Keep the logo on the left */ + header .logo { + order: 1; + margin-left: 0.5em; + font-size: 1.2em; + } + + /* Adjust theme toggle button */ + #theme-toggle { + order: 3; + margin-left: auto; + } + + /* Hide the navigation menu by default */ + nav#main-nav { + display: none; + order: 4; + width: 100%; + } + + /* Show the navigation menu when toggled */ + nav#main-nav.open { + display: block; + } + + /* Stack the navigation links vertically */ + nav ul { + flex-direction: column; + gap: 0; + } + + nav ul li a { + padding: 0.75em 0 0.75rem 0.75em; + } +} + +@media (min-width: 801px) { + + /* Hide the menu toggle button on large screens */ + #menu-toggle { + display: none; + } + + /* Ensure navigation is visible on large screens */ + nav#main-nav { + display: block !important; + } + + /* Reset order and margins */ + .header-top { + flex-wrap: wrap; + } + + header .logo { + order: 0; + margin-left: 0; + } + + #theme-toggle { + order: 0; + margin-left: 1em; + } +} + +/* Main Content */ +main { + padding: 1em 0; +} + +article { + line-height: 1.6; +} + +article h2 { + margin-top: 1.5em; +} + +aside { + width: 33%; + padding-left: .5rem; + margin-left: .5rem; + float: right; + border-left: 2px solid var(--button-color); + font-style: italic; +} + +aside>p { + margin: .5rem; +} + +/* Inline Code */ +code { + background-color: #f5f5f5; + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + border-radius: 3px; +} + +[data-theme="dark"] code { + background-color: #1e1e1e; + color: #e0e0e0; +} + +/* Code Blocks */ +pre { + background-color: #f5f5f5; + padding: 0.5em; + overflow-x: auto; + margin-top: 0.5em; + margin-bottom: 0.5em; + max-width: 100%; + box-sizing: border-box; +} + +[data-theme="dark"] pre { + background-color: #1e1e1e; +} + +pre code { + background-color: inherit; + /* Use the same background as pre */ + padding: 0; + margin: 0; + font-size: inherit; + color: inherit; + border-radius: 0; +} + +/* Images and Media */ +img, +iframe, +video { + max-width: 100%; + height: auto; +} + +/* Footer */ +footer { + background-color: var(--footer-background); + padding: 1em 0; +} + +footer .container { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 1em; + /* Adds space between footer items */ +} + +footer p { + margin: 0; + /* Ensure there's no margin collapse and the text stays separated */ +} + +footer .edit-page-link { + margin-left: auto; + /* Push the edit page link to the far right */ +} + +footer .edit-page-link a { + color: var(--link-color); +} + +footer .edit-page-link a:hover { + text-decoration: underline; + color: var(--link-hover-color); + /* Improved hover color in footer */ +} + +/* Responsive Footer */ +@media (max-width: 600px) { + footer .container { + flex-direction: column; + align-items: flex-start; + gap: 0.5em; + /* Adds vertical space between items */ + } + + footer .edit-page-link { + margin-left: 0; + margin-top: 0.5em; + } +} + +/* Styles for Page Lists */ +.list { + list-style-type: none; + padding-left: 0; +} + +.list li { + margin-bottom: 0.5em; +} + +.list li::before { + content: "• "; + color: var(--link-color); +} + +/* Blockquote Styles */ +blockquote { + border-left: 4px solid var(--quote-border-color); + padding-left: 1em; + margin-left: 0; + margin-right: 0; + color: var(--quote-text-color); + background-color: var(--quote-background-color); + font-style: italic; + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +/* Optional Inline Quote Styles */ +q { + quotes: "“""”""‘""’"; + font-style: italic; + color: var(--quote-text-color); +} + +/* Anchors */ +h1:hover .anchor:before, +h2:hover .anchor:before, +h3:hover .anchor:before, +h4:hover .anchor:before, +h5:hover .anchor:before, +h6:hover .anchor:before { + width: 16px; + height: 16px; + content: ' '; + display: inline-block; + background-color: currentColor; + -webkit-mask-image: url("data:image/svg+xml,"); + mask-image: url("data:image/svg+xml,"); +} \ No newline at end of file diff --git a/default/assets/js/highlight.js b/default/assets/js/highlight.js new file mode 100644 index 0000000..4cbf349 --- /dev/null +++ b/default/assets/js/highlight.js @@ -0,0 +1,1202 @@ +/*! + Highlight.js v11.7.0 (git: 82688fad18) + (c) 2006-2022 undefined 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;class t{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function a(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function i(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 r=e=>!!e.scope||e.sublanguage&&e.language;class s{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=a(e)}openNode(e){if(!r(e))return;let n="" +;n=e.sublanguage?"language-"+e.language:((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}`})(e.scope,{prefix:this.classPrefix}),this.span(n)} +closeNode(e){r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const o=(e={})=>{const n={children:[]} +;return Object.assign(n,e),n};class l{constructor(){ +this.rootNode=o(),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=o({scope:e}) +;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.sublanguage=!0,t.language=n,this.add(t)}toHTML(){ +return new s(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*",w="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",O={ +begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[O]},x={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[O]},M=(e,n,t={})=>{const a=i({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 r=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(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a +},S=M("//","$"),A=M("/\\*","\\*/"),C=M("#","$");var T=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:E,UNDERSCORE_IDENT_RE:y, +NUMBER_RE:w,C_NUMBER_RE:N,BINARY_NUMBER_RE:v, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=m(n,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:O,APOS_STRING_MODE:k,QUOTE_STRING_MODE:x,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:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:C, +NUMBER_MODE:{scope:"number",begin:w,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:N,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 z=(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 +},F=["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=>F.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},q=(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=i(e.classNameAliases||{}),function t(r,s){const o=r +;if(r.isCompiled)return o +;[D,B,W,z].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), +r.__beforeBegin=null,[I,L,$].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +l=r.keywords.$pattern, +delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=U(r.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(o.endRe=n(o.end)), +o.terminatorEnd=d(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), +r.illegal&&(o.illegalRe=n(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>i(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?i(e,{ +starts:e.starts?i(e.starts):null +}):Object.isFrozen(e)?i(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) +})),r.starts&&t(r.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=a,Y=i,ee=Symbol("nomatch");var ne=(n=>{ +const a=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):(q("10.7.0","highlight(lang, code, ...args) has been deprecated."), +q("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};x("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,x("after:highlight",s),s}function f(e,n,i,r){ +const l=Object.create(null);function c(){if(!k.keywords)return void M.addText(S) +;let e=0;k.keywordPatternRe.lastIndex=0;let n=k.keywordPatternRe.exec(S),t="" +;for(;n;){t+=S.substring(e,n.index) +;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,k.keywords[a]);if(r){ +const[e,a]=r +;if(M.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(A+=a),e.startsWith("_"))t+=n[0];else{ +const t=w.classNameAliases[e]||e;M.addKeyword(n[0],t)}}else t+=n[0] +;e=k.keywordPatternRe.lastIndex,n=k.keywordPatternRe.exec(S)}var a +;t+=S.substring(e),M.addText(t)}function g(){null!=k.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof k.subLanguage){ +if(!a[k.subLanguage])return void M.addText(S) +;e=f(k.subLanguage,S,!0,x[k.subLanguage]),x[k.subLanguage]=e._top +}else e=E(S,k.subLanguage.length?k.subLanguage:null) +;k.relevance>0&&(A+=e.relevance),M.addSublanguage(e._emitter,e.language) +})():c(),S=""}function u(e,n){let t=1;const a=n.length-1;for(;t<=a;){ +if(!e._emit[t]){t++;continue}const a=w.classNameAliases[e[t]]||e[t],i=n[t] +;a?M.addKeyword(i,a):(S=i,c(),S=""),t++}}function b(e,n){ +return e.scope&&"string"==typeof e.scope&&M.openNode(w.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,n),S="")),k=Object.create(e,{parent:{ +value:k}}),k}function m(e,n,a){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new t(e) +;e["on:end"](n,a),a.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,n,a)}function p(e){ +return 0===k.matcher.regexIndex?(S+=e[0],1):(R=!0,0)}function _(e){ +const t=e[0],a=n.substring(e.index),i=m(k,e,a);if(!i)return ee;const r=k +;k.endScope&&k.endScope._wrap?(g(), +M.addKeyword(t,k.endScope._wrap)):k.endScope&&k.endScope._multi?(g(), +u(k.endScope,e)):r.skip?S+=t:(r.returnEnd||r.excludeEnd||(S+=t), +g(),r.excludeEnd&&(S=t));do{ +k.scope&&M.closeNode(),k.skip||k.subLanguage||(A+=k.relevance),k=k.parent +}while(k!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:t.length} +let h={};function y(a,r){const o=r&&r[0];if(S+=a,null==o)return g(),0 +;if("begin"===h.type&&"end"===r.type&&h.index===r.index&&""===o){ +if(S+=n.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],a=e.rule,i=new t(a),r=[a.__beforeBegin,a["on:begin"]] +;for(const t of r)if(t&&(t(e,i),i.isMatchIgnored))return p(n) +;return a.skip?S+=n:(a.excludeBegin&&(S+=n), +g(),a.returnBegin||a.excludeBegin||(S=n)),b(a,e),a.returnBegin?0:n.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(k.scope||"")+'"') +;throw e.mode=k,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 w=v(e) +;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const N=Q(w);let O="",k=r||N;const x={},M=new d.__emitter(d);(()=>{const e=[] +;for(let n=k;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>M.openNode(e)))})();let S="",A=0,C=0,T=0,R=!1;try{ +for(k.matcher.considerAll();;){ +T++,R?R=!1:k.matcher.considerAll(),k.matcher.lastIndex=C +;const e=k.matcher.exec(n);if(!e)break;const t=y(n.substring(C,e.index),e) +;C=e.index+t} +return y(n.substring(C)),M.closeAllNodes(),M.finalize(),O=M.toHTML(),{ +language:e,value:O,relevance:A,illegal:!1,_emitter:M,_top:k}}catch(t){ +if(t.message&&t.message.includes("Illegal"))return{language:e,value:J(n), +illegal:!0,relevance:0,_illegalBy:{message:t.message,index:C, +context:n.slice(C-100,C+100),mode:t.mode,resultSoFar:O},_emitter:M};if(s)return{ +language:e,value:J(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:k} +;throw t}}function E(e,n){n=n||d.languages||Object.keys(a);const t=(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=n.filter(v).filter(k).map((n=>f(n,e,!1))) +;i.unshift(t);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||(H(o.replace("{}",t[1])), +H("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(x("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/wiki/security"), +console.warn("The element with unescaped HTML:"), +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 +}),x("after:highlightElement",{el:e,result:r,text:a})}let w=!1;function N(){ +"loading"!==document.readyState?document.querySelectorAll(d.cssSelector).forEach(y):w=!0 +}function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} +function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function k(e){const n=v(e) +;return n&&!n.disableAutodetect}function x(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +w&&N()}),!1),Object.assign(n,{highlight:h,highlightAuto:E,highlightAll:N, +highlightElement:y, +highlightBlock:e=>(q("10.7.0","highlightBlock will be removed entirely in v12.0"), +q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{d=Y(d,e)}, +initHighlighting:()=>{ +N(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +N(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,t)=>{let i=null;try{i=t(n)}catch(n){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!s)throw n;K(n),i=l} +i.name||(i.name=e),a[e]=i,i.rawDefinition=t.bind(null,n),i.aliases&&O(i.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete a[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:O, +autoDetection:k,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)} +}),n.debugMode=()=>{s=!1},n.safeMode=()=>{s=!0 +},n.versionString="11.7.0",n.regex={concat:m,lookahead:g,either:p,optional:b, +anyNumberOfTimes:u};for(const n in T)"object"==typeof T[n]&&e.exports(T[n]) +;return Object.assign(n,T),n})({});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-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","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-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-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","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","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-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","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-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","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","scrollbar-color","scrollbar-gutter","scrollbar-width","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 we(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="",k={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(O)], +keywords:"async",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,{match:/\$\d+/},o,f,{ +className:"attr",begin:t+n.lookahead(":"),relevance:0},k,{ +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},N,{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 Ne=e=>m(/\b/,e,/\w$/.test(e)?/\b/:/\B/),ve=["Protocol","Type"].map(Ne),Oe=["init","self"].map(Ne),ke=["Any","Self"],xe=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","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"],Me=["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,"*"),ze=["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"],Fe=["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][a-z0-9._-]+\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","scoped","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:[...a,{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;return{name:"GraphQL",aliases:["gql"], +case_insensitive:!0,disableAutodetect:!1,keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{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=>{ +const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+ue("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ +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","sealed","yield","permits"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,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+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[r,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,r]}},grmr_javascript:we, +grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", +beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{ +className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ +match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,t,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"}),"self"]}] +},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]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"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:/[<\(,){\s]|$/, +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,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);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,g,n.FUNCTION_DISPATCH), +{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(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),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,unicodeRegex:!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",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{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}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] +}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) +;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) +})),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, +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:{"variable.language":["this","super"],$pattern:n, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","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:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},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=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ +scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s) +}),o,e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(s)})]},d={scope:"number", +variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{ +begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__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","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["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","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ +keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ +n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) +})),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ +match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ +1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ +match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", +3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},E={scope:"attr", +match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, +begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] +},w={relevance:0, +match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(w) +;const N=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, +keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, +contains:["self",...N]},...N,{scope:"meta",match:i}] +},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ +scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,w,f,{ +match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, +contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"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.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} +},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=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, +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"] +},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, +end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{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,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` +}]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, +contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, +illegal:/(<\/|->|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", +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=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ +begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] +}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, +end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], +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,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|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"}]},b={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ +match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], +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(o,l),relevance:0}].concat(o,l) +;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, +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_bytes!","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!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r, +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",relevance:0};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:/[;}{]/,relevance:0, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] +},{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.prompt", +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(...xe)),relevance:0 +},s=xe.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:p(...xe.filter((e=>"string"!=typeof e)).concat(ke).map(Ne),...Oe)}]},l={ +$pattern:p(/\b\w+/,/#\w+/),keyword:s.concat(Ae),literal:Me},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:/\)/}),w=(e="")=>({begin:m(e,/"""/), +end:m(/"""/,e),contains:[f(e),E(e),y(e)]}),N=(e="")=>({begin:m(e,/"/), +end:m(/"/,e),contains:[f(e),y(e)]}),v={className:"string", +variants:[w(),w("#"),w("##"),w("###"),N(),N("#"),N("##"),N("###")]},O={ +match:m(/`/,Be,/`/)},k=[O,{className:"variable",match:/\$\d+/},{ +className:"variable",match:`\\$${Le}+`}],x=[{match:/(@|#(un)?)available/, +className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:Fe, +contains:[...b,h,v]}]}},{className:"keyword",match:m(/@/,p(...ze))},{ +className:"meta",match:m(/@/,Be)}],M={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,...x,u,M]};M.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,...k,...x,M]},C={begin://,contains:[...a,M] +},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,...x,M,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:[M],keywords:[...Se,...Me],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,...k];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,...k,...x,M,A]}},grmr_typescript:e=>{ +const n=we(e),t=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],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","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), +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_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) +;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}},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/default/assets/js/live.js b/default/assets/js/live.js new file mode 100644 index 0000000..1eccb58 --- /dev/null +++ b/default/assets/js/live.js @@ -0,0 +1,233 @@ + /* + Live.js - One script closer to Designing in the Browser + Written for Handcraft.com by Martin Kool (@mrtnkl). + + Version 4. + Recent change: Made stylesheet and mimetype checks case insensitive. + + http://livejs.com + http://livejs.com/license (MIT) + @livejs + + Include live.js#css to monitor css changes only. + Include live.js#js to monitor js changes only. + Include live.js#html to monitor html changes only. + Mix and match to monitor a preferred combination such as live.js#html,css + + By default, just include live.js to monitor all css, js and html changes. + + Live.js can also be loaded as a bookmarklet. It is best to only use it for CSS then, + as a page reload due to a change in html or css would not re-include the bookmarklet. + To monitor CSS and be notified that it has loaded, include it as: live.js#css,notify +*/ +(function () { + + var headers = { "Etag": 1, "Last-Modified": 1, "Content-Length": 1, "Content-Type": 1 }, + resources = {}, + pendingRequests = {}, + currentLinkElements = {}, + oldLinkElements = {}, + interval = 1000, + loaded = false, + active = { "html": 1, "css": 1, "js": 1 }; + + var Live = { + + // performs a cycle per interval + heartbeat: function () { + if (document.body) { + // make sure all resources are loaded on first activation + if (!loaded) Live.loadresources(); + Live.checkForChanges(); + } + setTimeout(Live.heartbeat, interval); + }, + + // loads all local css and js resources upon first activation + loadresources: function () { + + // helper method to assert if a given url is local + function isLocal(url) { + var loc = document.location, + reg = new RegExp("^\\.|^\/(?!\/)|^[\\w]((?!://).)*$|" + loc.protocol + "//" + loc.host); + return url.match(reg); + } + + // gather all resources + var scripts = document.getElementsByTagName("script"), + links = document.getElementsByTagName("link"), + uris = []; + + // track local js urls + for (var i = 0; i < scripts.length; i++) { + var script = scripts[i], src = script.getAttribute("src"); + if (src && isLocal(src)) + uris.push(src); + if (src && src.match(/\blive.js#/)) { + for (var type in active) + active[type] = src.match("[#,|]" + type) != null + if (src.match("notify")) + alert("Live.js is loaded."); + } + } + if (!active.js) uris = []; + if (active.html) uris.push(document.location.href); + + // track local css urls + for (var i = 0; i < links.length && active.css; i++) { + var link = links[i], rel = link.getAttribute("rel"), href = link.getAttribute("href", 2); + if (href && rel && rel.match(new RegExp("stylesheet", "i")) && isLocal(href)) { + uris.push(href); + currentLinkElements[href] = link; + } + } + + // initialize the resources info + for (var i = 0; i < uris.length; i++) { + var url = uris[i]; + Live.getHead(url, function (url, info) { + resources[url] = info; + }); + } + + // add rule for morphing between old and new css files + var head = document.getElementsByTagName("head")[0], + style = document.createElement("style"), + rule = "transition: all .3s ease-out;" + css = [".livejs-loading * { ", rule, " -webkit-", rule, "-moz-", rule, "-o-", rule, "}"].join(''); + style.setAttribute("type", "text/css"); + head.appendChild(style); + style.styleSheet ? style.styleSheet.cssText = css : style.appendChild(document.createTextNode(css)); + + // yep + loaded = true; + }, + + // check all tracking resources for changes + checkForChanges: function () { + for (var url in resources) { + if (pendingRequests[url]) + continue; + + Live.getHead(url, function (url, newInfo) { + var oldInfo = resources[url], + hasChanged = false; + resources[url] = newInfo; + for (var header in oldInfo) { + // do verification based on the header type + var oldValue = oldInfo[header], + newValue = newInfo[header], + contentType = newInfo["Content-Type"]; + switch (header.toLowerCase()) { + case "etag": + if (!newValue) break; + // fall through to default + default: + hasChanged = oldValue != newValue; + break; + } + // if changed, act + if (hasChanged) { + Live.refreshResource(url, contentType); + break; + } + } + }); + } + }, + + // act upon a changed url of certain content type + refreshResource: function (url, type) { + switch (type.toLowerCase()) { + // css files can be reloaded dynamically by replacing the link element + case "text/css": + var link = currentLinkElements[url], + html = document.body.parentNode, + head = link.parentNode, + next = link.nextSibling, + newLink = document.createElement("link"); + + html.className = html.className.replace(/\s*livejs\-loading/gi, '') + ' livejs-loading'; + newLink.setAttribute("type", "text/css"); + newLink.setAttribute("rel", "stylesheet"); + newLink.setAttribute("href", url + "?now=" + new Date() * 1); + next ? head.insertBefore(newLink, next) : head.appendChild(newLink); + currentLinkElements[url] = newLink; + oldLinkElements[url] = link; + + // schedule removal of the old link + Live.removeoldLinkElements(); + break; + + // check if an html resource is our current url, then reload + case "text/html": + if (url != document.location.href) + return; + + // local javascript changes cause a reload as well + case "text/javascript": + case "application/javascript": + case "application/x-javascript": + document.location.reload(); + } + }, + + // removes the old stylesheet rules only once the new one has finished loading + removeoldLinkElements: function () { + var pending = 0; + for (var url in oldLinkElements) { + // if this sheet has any cssRules, delete the old link + try { + var link = currentLinkElements[url], + oldLink = oldLinkElements[url], + html = document.body.parentNode, + sheet = link.sheet || link.styleSheet, + rules = sheet.rules || sheet.cssRules; + if (rules.length >= 0) { + oldLink.parentNode.removeChild(oldLink); + delete oldLinkElements[url]; + setTimeout(function () { + html.className = html.className.replace(/\s*livejs\-loading/gi, ''); + }, 100); + } + } catch (e) { + pending++; + } + if (pending) setTimeout(Live.removeoldLinkElements, 50); + } + }, + + // performs a HEAD request and passes the header info to the given callback + getHead: function (url, callback) { + pendingRequests[url] = true; + var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XmlHttp"); + xhr.open("HEAD", url, true); + xhr.onreadystatechange = function () { + delete pendingRequests[url]; + if (xhr.readyState == 4 && xhr.status != 304) { + xhr.getAllResponseHeaders(); + var info = {}; + for (var h in headers) { + var value = xhr.getResponseHeader(h); + // adjust the simple Etag variant to match on its significant part + if (h.toLowerCase() == "etag" && value) value = value.replace(/^W\//, ''); + if (h.toLowerCase() == "content-type" && value) value = value.replace(/^(.*?);.*?$/i, "$1"); + info[h] = value; + } + callback(url, info); + } + } + xhr.send(); + } + }; + + // start listening + if (document.location.protocol != "file:") { + if (!window.liveJsLoaded) + Live.heartbeat(); + + window.liveJsLoaded = true; + } + else if (window.console) + console.log("Live.js doesn't support the file protocol. It needs http."); +})(); \ No newline at end of file diff --git a/default/assets/js/main.js b/default/assets/js/main.js new file mode 100644 index 0000000..04f158d --- /dev/null +++ b/default/assets/js/main.js @@ -0,0 +1,41 @@ +// Toggle the navigation menu and theme +document.addEventListener('DOMContentLoaded', function() { + var menuToggle = document.getElementById('menu-toggle'); + var mainNav = document.getElementById('main-nav'); + var themeToggle = document.getElementById('theme-toggle'); + var body = document.body; + + // Menu toggle functionality + menuToggle.addEventListener('click', function() { + mainNav.classList.toggle('open'); + }); + + // Theme toggle functionality + themeToggle.addEventListener('click', function() { + // Toggle between 'light' and 'dark' themes + var currentTheme = body.getAttribute('data-theme') || 'light'; + var newTheme = currentTheme === 'dark' ? 'light' : 'dark'; + body.setAttribute('data-theme', newTheme); + localStorage.setItem('theme', newTheme); + }); + + // On page load, set the theme from localStorage or system preference + var storedTheme = localStorage.getItem('theme'); + if (storedTheme) { + body.setAttribute('data-theme', storedTheme); + } else { + // Detect system preference + var prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)').matches; + var defaultTheme = prefersDarkScheme ? 'dark' : 'light'; + body.setAttribute('data-theme', defaultTheme); + } + + // Listen for changes in the system color scheme + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) { + var storedTheme = localStorage.getItem('theme'); + if (!storedTheme) { + var newColorScheme = e.matches ? 'dark' : 'light'; + body.setAttribute('data-theme', newColorScheme); + } + }); +}); diff --git a/default/favicon-16x16.png b/default/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..adba0ac77ec16ac3be8592c8463f33dbea5edbfa GIT binary patch literal 347 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 literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index 22b5ffe..1ea4aca 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/13rac1/goldmark-embed v0.0.0-20201220231550-e6806f2de66a github.com/FurqanSoftware/goldmark-d2 v0.0.0-20230207071629-ec535d32ca47 github.com/alecthomas/chroma/v2 v2.7.0 + github.com/gabriel-vasile/mimetype v1.4.7 github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 github.com/sirupsen/logrus v1.9.0 github.com/spf13/cobra v1.6.1 @@ -16,7 +17,7 @@ require ( go.abhg.dev/goldmark/anchor v0.1.1 go.abhg.dev/goldmark/wikilink v0.5.0 go.mills.io/static v0.0.0-20230401145044-4ee04f8d2f65 - golang.org/x/sync v0.1.0 + golang.org/x/sync v0.9.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -55,13 +56,13 @@ require ( github.com/subosito/gotenv v1.4.2 // indirect github.com/unrolled/logger v0.0.0-20201216141554-31a3694fe979 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.7.0 // indirect + golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect golang.org/x/image v0.6.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/term v0.26.0 // indirect + golang.org/x/text v0.20.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gonum.org/v1/plot v0.12.0 // indirect google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec // indirect diff --git a/go.sum b/go.sum index 53595b4..9092ee9 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -cdr.dev/slog v1.4.2-0.20221206192828-e4803b10ae17 h1:Jf+VOk2lif79HeTlnLaZ70zYTsuVSUEu/47U9VaG2Rw= -cdr.dev/slog v1.4.2-0.20221206192828-e4803b10ae17/go.mod h1:YPVZsUbRMaLaPgme0RzlPWlC7fI7YmDj/j/kZLuvICs= cdr.dev/slog v1.4.2 h1:fIfiqASYQFJBZiASwL825atyzeA96NsqSxx2aL61P8I= cdr.dev/slog v1.4.2/go.mod h1:0EkH+GkFNxizNR+GAXUEdUHanxUH5t9zqPILmPM/Vn8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -55,18 +53,15 @@ github.com/FurqanSoftware/goldmark-d2 v0.0.0-20230207071629-ec535d32ca47 h1:TTYi github.com/FurqanSoftware/goldmark-d2 v0.0.0-20230207071629-ec535d32ca47/go.mod h1:re06sclYNSEKe8tBIZ7KweUIZECQewQSCaKKFyc1TpE= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= -github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= +github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink= github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= -github.com/alecthomas/chroma/v2 v2.2.0 h1:Aten8jfQwUqEdadVFFjNyjx7HTexhKP0XuqBG67mRDY= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= github.com/alecthomas/chroma/v2 v2.7.0 h1:hm1rY6c/Ob4eGclpQ7X/A3yhqBOZNUTk9q+yhyLIViI= github.com/alecthomas/chroma/v2 v2.7.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw= -github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae h1:zzGwJfFlFGD94CyyYwCJeSuD32Gj9GTaSi5y9hoVzdY= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= @@ -93,13 +88,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dlclark/regexp2 v1.8.0 h1:rJD5HeGIT/2b5CDk63FVCwZA3qgYElfg+oQK7uH5pfE= -github.com/dlclark/regexp2 v1.8.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2 v1.8.1 h1:6Lcdwya6GjPUNsBct8Lg/yRPwMhABj269AAzdGSiR+0= github.com/dlclark/regexp2 v1.8.1/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20230203172422-5460598cfa32 h1:audXtK7nV3y4W9ckAxRBE+eQV5Bljf5Non4NTa9kLVE= -github.com/dop251/goja v0.0.0-20230203172422-5460598cfa32/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= github.com/dop251/goja v0.0.0-20230304130813-e2f543bf4b4c h1:/utv6nmTctV6OVgfk5+O6lEMEWL+6KJy4h9NZ5fnkQQ= github.com/dop251/goja v0.0.0-20230304130813-e2f543bf4b4c/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= @@ -111,13 +102,13 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -194,6 +185,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= @@ -227,16 +219,12 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mazznoer/csscolorparser v0.1.3 h1:vug4zh6loQxAUxfU1DZEu70gTPufDPspamZlHAkKcxE= github.com/mazznoer/csscolorparser v0.1.3/go.mod h1:Aj22+L/rYN/Y6bj3bYqO3N6g1dtdHtGfQ32xZ5PJQic= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= @@ -249,16 +237,14 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -304,8 +290,6 @@ go.abhg.dev/goldmark/anchor v0.1.1 h1:NUH3hAzhfeymRqZKOkSoFReZlEAmfXBZlbXEzpD2Qg go.abhg.dev/goldmark/anchor v0.1.1/go.mod h1:zYKiaHXTdugwVJRZqInVdmNGQRM3ZRJ6AGBC7xP7its= go.abhg.dev/goldmark/wikilink v0.5.0 h1:/Gndy7+PoXzOc3reVWtXAh7Cni7wSqSxiuXDfmoYlm4= go.abhg.dev/goldmark/wikilink v0.5.0/go.mod h1:W1NzvDIpo6uoayolBTCsIL6y/QRAHmLTKfUUDfR75DA= -go.mills.io/static v0.0.0-20230316074605-51908d346ffc h1:BMeFNGUZAQCfgo8DxUKxgGNrXQa1KglS5gZ4Kn5fUsQ= -go.mills.io/static v0.0.0-20230316074605-51908d346ffc/go.mod h1:TmaEDwM+IgrCRyMxtVWtmSdoxLP3N6ehBa7AiOZj2Mk= go.mills.io/static v0.0.0-20230401145044-4ee04f8d2f65 h1:1uqQoVNdJsKdNBLiUmO7nVj9vgfzTvlRnDEzZTt3ub8= go.mills.io/static v0.0.0-20230401145044-4ee04f8d2f65/go.mod h1:TmaEDwM+IgrCRyMxtVWtmSdoxLP3N6ehBa7AiOZj2Mk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -316,7 +300,9 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -324,12 +310,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -340,15 +323,11 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg= -golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A= golang.org/x/image v0.6.0 h1:bR8b5okrPI3g/gyZakLZHeWxAR8Dn5CyxXv1hLH5g/4= golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -410,10 +389,9 @@ golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -434,8 +412,9 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -481,14 +460,14 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -498,11 +477,10 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -675,12 +653,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -oss.terrastruct.com/d2 v0.1.6 h1:TdNET4uzt3Djl66UriSR3sbItWYcCV9ugpHzF9w2eIY= -oss.terrastruct.com/d2 v0.1.6/go.mod h1:7sIRmEj3QeXVB6erSPW6dOfFUX7orsQkO0twmTYILEA= oss.terrastruct.com/d2 v0.3.0 h1:hhrtD2P8mLbUDlxMzyu7sgJ3O7Y59EYpLozDdi+DT3g= oss.terrastruct.com/d2 v0.3.0/go.mod h1:7aLT1RP98WkuV6PQFtmCvdO83gOk2unuDiqYHFP2Ww8= -oss.terrastruct.com/util-go v0.0.0-20230124232704-39c2226d2b5e h1:pCKxiUFOLQamCtmyMZsM3Hc8MuKVpDg/4VunhVOVW/4= -oss.terrastruct.com/util-go v0.0.0-20230124232704-39c2226d2b5e/go.mod h1:Fwy72FDIOOM4K8F96ScXkxHHppR1CPfUyo9+x9c1PBU= oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972 h1:HS7fg2GzGsqRLApsoh7ztaLMvXzxSln/Hfz4wy4tIDA= oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/main.go b/main.go index 20560ff..e04a497 100644 --- a/main.go +++ b/main.go @@ -4,9 +4,11 @@ package main import ( "bytes" "context" + "embed" "errors" "fmt" "io" + "io/fs" "io/ioutil" "os" "os/exec" @@ -17,16 +19,17 @@ import ( "text/template" "time" - embed "github.com/13rac1/goldmark-embed" - d2 "github.com/FurqanSoftware/goldmark-d2" - chromahtml "github.com/alecthomas/chroma/v2/formatters/html" - ignore "github.com/sabhiram/go-gitignore" + embedExt "github.com/13rac1/goldmark-embed" + d2Ext "github.com/FurqanSoftware/goldmark-d2" + chromaHTMLExt "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/gabriel-vasile/mimetype" + gitIgnore "github.com/sabhiram/go-gitignore" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" - fences "github.com/stefanfritsch/goldmark-fences" + fencesExt "github.com/stefanfritsch/goldmark-fences" "github.com/yuin/goldmark" - highlighting "github.com/yuin/goldmark-highlighting/v2" + highlightingExt "github.com/yuin/goldmark-highlighting/v2" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/parser" "github.com/yuin/goldmark/renderer/html" @@ -62,7 +65,7 @@ README.md` ) // Ignore holds a set of patterns to ignore from parsing a .zsignore file -var Ignore *ignore.GitIgnore +var Ignore *gitIgnore.GitIgnore // Parser holds a configured global instance of the goldmark markdown parser var Parser goldmark.Markdown @@ -70,6 +73,9 @@ var Parser goldmark.Markdown var ( configFile string enabledExtensions []string + + //go:embed default default/.zs + defaultFS embed.FS ) // Extensions is a mapping of name to extension and the default set of extensions enabled @@ -84,16 +90,16 @@ var Extensions = map[string]goldmark.Extender{ "footnote": extension.Footnote, "typography": extension.Typographer, "cjk": extension.CJK, - "highlighting": highlighting.NewHighlighting( - highlighting.WithStyle("github"), - highlighting.WithFormatOptions( - chromahtml.WithLineNumbers(true), + "highlighting": highlightingExt.NewHighlighting( + highlightingExt.WithStyle("github"), + highlightingExt.WithFormatOptions( + chromaHTMLExt.WithLineNumbers(true), ), ), "anchor": &anchor.Extender{Texter: anchor.Text(" ")}, - "d2": &d2.Extender{}, - "embed": embed.New(), - "fences": &fences.Extender{}, + "d2": &d2Ext.Extender{}, + "embed": embedExt.New(), + "fences": &fencesExt.Extender{}, "wikilink": &wikilink.Extender{}, } @@ -137,6 +143,8 @@ var RootCmd = &cobra.Command{ - Use placeholders for variables and plugins in your markdown or html files, e.g. {{ title }} or {{ command arg1 arg2 }}. - Write extensions in any language you like and put them into the .zs sub-directory. - Everything the extensions prints to stdout becomes the value of the placeholder. + + Quick Start: zs init `, PersistentPreRunE: func(cmd *cobra.Command, args []string) error { debug, err := cmd.Flags().GetBool("debug") @@ -214,6 +222,39 @@ var GenerateCmd = &cobra.Command{ }, } +// InitCmd is the init sub-command that creates a new zs site +var InitCmd = &cobra.Command{ + Use: "init", + Aliases: []string{"new"}, + Short: "Initializes a new Zen Static site", + Long: `The init command creates a new Zen Static site in the current directory`, + Args: cobra.RangeArgs(0, 1), + RunE: func(cmd *cobra.Command, args []string) error { + var ( + dir string + err error + ) + + if len(args) > 0 || (len(args) == 1 && args[0] == ".") { + dir = args[0] + if err := os.MkdirAll(dir, 0755); err != nil { + return fmt.Errorf("error creating directory %q: %w", dir, err) + } + } else { + dir, err = os.Getwd() + if err != nil { + return fmt.Errorf("error getting current directory: %w", err) + } + } + + if err := initSite(dir); err != nil { + return fmt.Errorf("error initializing site: %w", err) + } + + return nil + }, +} + // ServeCmd is the serve sub-command that performs whole builds or single builds var ServeCmd = &cobra.Command{ Use: "serve [flags]", @@ -683,6 +724,70 @@ func generate(r io.Reader, w io.Writer, v Vars) error { return nil } +// copyFile copies a file from the src fs.FS to the dst directory. +// +// This function assumes that the dst directory already exists. +func copyFile(src fs.FS, dst string, path string) error { + r, err := src.Open(path) + if err != nil { + return err + } + + f, err := os.Create(filepath.Join(dst, path)) + if err != nil { + return err + } + defer f.Close() + + if _, err := io.Copy(f, r); err != nil { + return err + } + + return nil +} + +// initSite initializes the site +func initSite(dir string) error { + defaultFS, err := fs.Sub(defaultFS, "default") + if err != nil { + return fmt.Errorf("failed to get default fs: %w", err) + } + + // Copy files and directories from the default structure from defaultFS + if err := fs.WalkDir(defaultFS, ".", func(path string, d fs.DirEntry, err error) error { + if path == "." || path == ".." { + return nil + } + + if d.IsDir() { + os.Mkdir(filepath.Join(dir, path), 0755) + return nil + } + + if err := copyFile(defaultFS, dir, path); err != nil { + return fmt.Errorf("failed to copy file: %w", err) + } + + fileType, err := mimetype.DetectFile(filepath.Join(dir, path)) + if err != nil { + return fmt.Errorf("failed to detect file type: %w", err) + } + + // If the fileType is an executable application or script, make it executable + if fileType.Is("application/x-executable") { + if err := os.Chmod(filepath.Join(dir, path), 0755); err != nil { + return fmt.Errorf("failed to set executable permissions: %w", err) + } + } + + return nil + }); err != nil { + return fmt.Errorf("failed to walk default fs: %w", err) + } + + return nil +} + // serve runs a static web server and builds and continuously watches for changes to rebuild func serve(ctx context.Context, bind, root string) error { os.Mkdir(root, 0755) @@ -763,6 +868,7 @@ func init() { RootCmd.AddCommand(BuildCmd) RootCmd.AddCommand(GenerateCmd) + RootCmd.AddCommand(InitCmd) RootCmd.AddCommand(ServeCmd) RootCmd.AddCommand(VarCmd) RootCmd.AddCommand(WatchCmd) @@ -770,6 +876,11 @@ func init() { // prepend .zs to $PATH, so plugins will be found before OS commands w, _ := os.Getwd() ensureFirstPath(filepath.Join(w, ZSDIR)) + + // Extend mimetype to support application/x-shellscript and text/x-shellscript + mimetype.Extend(func(raw []byte, limit uint32) bool { + return len(raw) >= 2 && raw[0] == '#' && raw[1] == '!' + }, "application/x-executable", "") } // initConfig reads in config file and ENV variables if set. @@ -797,13 +908,13 @@ func initConfig() { } // ParseIgnoreFile parsers a .zsignore file or uses the default if an error occurred -func ParseIgnoreFile(fn string) *ignore.GitIgnore { - obj, err := ignore.CompileIgnoreFile(ZSIGNORE) +func ParseIgnoreFile(fn string) *gitIgnore.GitIgnore { + obj, err := gitIgnore.CompileIgnoreFile(ZSIGNORE) if err != nil { if !errors.Is(err, os.ErrNotExist) { log.WithError(err).Warnf("error parsing .zsignore: %s (using defaults)s", fn) } - return ignore.CompileIgnoreLines(DefaultIgnore) + return gitIgnore.CompileIgnoreLines(DefaultIgnore) } return obj