From c5e1b81a764db3ca4debd1826c1e779e9e56b4b2 Mon Sep 17 00:00:00 2001 From: clover caruso Date: Mon, 16 Feb 2026 02:38:02 -0800 Subject: [PATCH] chore: drop MDX, replacing it with Markodown Through this process i've found how unstable my marko adapter is. instead of salvaging it, it will be better to just drop the entire rendering engine. Marko is doing great for me and I feel safe investing into their ecosystem. --- framework/engine/marko-runtime.ts | 139 - framework/generate.ts | 130 +- framework/hot.ts | 17 +- framework/lib/add-script.marko | 1 + framework/lib/sitegen.ts | 7 +- framework/lib/view.ts | 28 +- framework/marko.ts | 45 +- framework/mdx-hack.tsx | 32 - framework/sitegen-wrap.marko | 2 + lib/render.ts | 3 + lib/render/meta.ts | 6 +- package-lock.json | 2533 +---- package.json | 29 +- src/blog/drafts/webdev/marko-intro.markodown | 4 +- ...lations.mdx => community-translations.mdo} | 12 +- .../{en.mdx => en.mdo} | 184 +- .../{es.mdx => es.mdo} | 167 +- .../{ko.mdx => ko.mdo} | 147 +- src/blog/tags/blog-layout.marko | 107 + src/blog/tags/code-block.marko | 15 + src/blog/tags/heading.marko | 5 + src/blog/tags/heading.tsx | 10 - src/blog/tags/layout.tsx | 106 - src/blog/tags/table-of-contents.marko | 29 + src/blog/tags/table-of-contents.tsx | 10 - src/file-viewer/highlight-grammar/mdx.plist | 9527 ----------------- src/pages/admin/{index.mdx => index.mdo} | 9 +- src/pages/{license.mdx => license.mdo} | 24 +- src/pages/{log.mdx => log.mdo} | 32 +- src/q+a/clover-markdown.tsx | 271 - src/q+a/layout.tsx | 29 - src/q+a/markdown.tsx | 81 + src/q+a/pages/admin.q+a.marko | 2 +- src/q+a/pages/q+a.404.marko | 4 +- src/q+a/pages/q+a.marko | 4 +- src/q+a/scripts/editor.client.tsx | 25 +- src/q+a/simple-markdown.ts | 1090 -- src/q+a/{ => tags}/header.client.ts | 0 src/q+a/tags/question-layout.marko | 22 + src/q+a/tags/question.marko | 6 +- src/q+a/views/backend-inbox.marko | 4 +- src/q+a/views/editor.marko | 2 +- src/q+a/views/fail.marko | 5 +- src/q+a/views/permalink.marko | 5 +- src/q+a/views/success.marko | 6 +- tsconfig.json | 3 +- 46 files changed, 840 insertions(+), 14079 deletions(-) delete mode 100644 framework/engine/marko-runtime.ts create mode 100644 framework/lib/add-script.marko delete mode 100644 framework/mdx-hack.tsx create mode 100644 framework/sitegen-wrap.marko rename src/blog/pages/{community-translations.mdx => community-translations.mdo} (54%) rename src/blog/pages/webdev/one-year-next-app-router/{en.mdx => en.mdo} (89%) rename src/blog/pages/webdev/one-year-next-app-router/{es.mdx => es.mdo} (91%) rename src/blog/pages/webdev/one-year-next-app-router/{ko.mdx => ko.mdo} (92%) create mode 100644 src/blog/tags/blog-layout.marko create mode 100644 src/blog/tags/code-block.marko create mode 100644 src/blog/tags/heading.marko delete mode 100644 src/blog/tags/heading.tsx delete mode 100644 src/blog/tags/layout.tsx create mode 100644 src/blog/tags/table-of-contents.marko delete mode 100644 src/blog/tags/table-of-contents.tsx delete mode 100644 src/file-viewer/highlight-grammar/mdx.plist rename src/pages/admin/{index.mdx => index.mdo} (51%) rename src/pages/{license.mdx => license.mdo} (70%) rename src/pages/{log.mdx => log.mdo} (98%) delete mode 100644 src/q+a/clover-markdown.tsx delete mode 100644 src/q+a/layout.tsx create mode 100644 src/q+a/markdown.tsx delete mode 100644 src/q+a/simple-markdown.ts rename src/q+a/{ => tags}/header.client.ts (100%) create mode 100644 src/q+a/tags/question-layout.marko diff --git a/framework/engine/marko-runtime.ts b/framework/engine/marko-runtime.ts deleted file mode 100644 index 5341b51d017491449112aa3b4015a0d5bc5d7361..0000000000000000000000000000000000000000 --- a/framework/engine/marko-runtime.ts +++ /dev/null @@ -1,139 +0,0 @@ -// This file is used to integrate Marko into the Clover Engine and Sitegen -// To use, replace the "marko/html" import with this file. -export * from "#marko/html"; - -export const _template: typeof marko._template = ( - templateId, - renderer, -) => { - const { render: renderFn } = marko._template(templateId, renderer); - function wrap({ content, ...attrs }: Record, n: number) { - // Marko Custom Tags - const cloverAsyncMarker = { isAsync: false }; - const r = render.current; - // Support using Marko outside of Clover SSR - const props = { - content: content ? () => content : undefined, - ...attrs, - }; - if (!r) { - return renderer(props, n); - } - render.setCurrent(null); - const markoResult = renderFn.call(renderer, { - ...props, - $global: { clover: r, cloverAsyncMarker }, - }); - if (cloverAsyncMarker.isAsync) { - return markoResult.then(render.raw); - } - const rr = markoResult.toString(); - return render.raw(rr); - } - wrap.render = renderFn; - wrap.unwrapped = renderer; - return wrap as unknown as Template; -}; - -export const _dynamic_tag: typeof marko._dynamic_tag = ( - scopeId, - accessor, - tag, - inputOrArgs, - content, - inputIsArgs, - serializeReason, -) => { - if (typeof tag === "function") { - clover: { - const unwrapped = (tag as any).unwrapped; - if (unwrapped) { - tag = unwrapped; - break clover; - } - const r = render.current ?? (marko.$global().clover as render.State); - if (!r) throw new Error("No Clover Render Active"); - const subRender = render.init(r.async !== -1, r.context); - const resolved = render.resolveNode( - subRender, - render.element( - tag as render.Component, - inputOrArgs as Record, - ), - ); - - if (subRender.async > 0) { - const marker = marko.$global().cloverAsyncMarker as Async; - marker.isAsync = true; - - // Wait for async work to finish - const { resolve, reject, promise } = Promise.withResolvers(); - subRender.asyncDone = () => { - const rejections = subRender.rejections; - if (!rejections) return resolve(render.stringifyNode(resolved)); - (r.rejections ??= []).push(...rejections); - return reject(new Error("Render had errors")); - }; - marko._await( - scopeId, - accessor, - promise, - (string: string) => marko._html(string), - 0, - ); - } else { - marko._html(render.stringifyNode(resolved)); - } - return; - } - } - return marko._dynamic_tag( - scopeId, - accessor, - tag, - inputOrArgs, - content, - inputIsArgs, - serializeReason, - ); -}; - -export const _await: typeof marko._await = ( - scopeId, - accessor, - promise, - callback, - serializeMarker, -) => { - const marker = marko.$global().cloverAsyncMarker as Async; - marker.isAsync = true; - marko._await(scopeId, accessor, promise, callback, serializeMarker); -}; - -export function _escape(input: unknown) { - // The rationale of this check is that the default toString method - // creating `[object Object]` is universally useless to any end user. - if ( - input == null || - (typeof input === "object" && - input && - // only block this if it's the default `toString` - input.toString === Object.prototype.toString) - ) { - throw new Error( - `Unexpected value in template placeholder: '` + - render.inspect(input) + - "'. " + - `To emit a literal '${input}', use \${String(value)}`, - ); - } - return marko._escape(input); -} - -interface Async { - isAsync: boolean; -} - -import type { Template } from "marko/common/types"; -import * as render from "lib/render.ts"; -import * as marko from "#marko/html"; diff --git a/framework/generate.ts b/framework/generate.ts index 83d0bef3832f1aa4bd3d91c4cd7a8718927548d3..3a9978ef1a6b2bb47c6b9ba08f6784a870a3e047 100644 --- a/framework/generate.ts +++ b/framework/generate.ts @@ -183,7 +183,7 @@ export async function scanSiteSection(io: Io, section: sg.Section) { dir: sectionPath("pages"), list: pages, prefix: section.base, - include: [".tsx", ".mdx", ".marko"], + include: [".tsx", ".marko", ".mdo"], exclude: [".client.ts", ".client.tsx"], page: true, }, @@ -205,7 +205,7 @@ export async function scanSiteSection(io: Io, section: sg.Section) { dir: sectionPath("views"), list: views, prefix: rootPrefix, - include: [".tsx", ".mdx", ".marko"], + include: [".tsx", ".marko", ".mdo"], exclude: [".client.ts", ".client.tsx"], page: false, }, @@ -251,70 +251,79 @@ export async function preparePage( io: Io, { item, metaTemplate }: { item: sg.FileItem; metaTemplate: meta.Template }, ) { - // -- load and validate module -- - let { - default: Page, - meta: metadata, - theme: pageTheme, - layout, - regenerate, - } = await io.import(item.file); - if (!Page) throw new Error("Page is missing a 'default' export."); - if (!metadata) throw new Error("Page is missing 'meta' export with a title."); + try { + // -- load and validate module -- + let { + default: Page, + meta: metadata, + theme: pageTheme, + layout, + regenerate, + markoOnly, + } = await io.import(item.file); + if (!Page) throw new Error("Page is missing a 'default' export."); + if (!metadata) { + throw new Error("Page is missing 'meta' export with a title."); + } - // -- css -- - if (layout?.theme) pageTheme = layout.theme; - const theme: css.Theme = { - ...css.defaultTheme, - ...pageTheme, - }; - const cssImports = Array.from( - new Set([globalCssPath, ...hot.getCssImports(item.file)]), - (file) => path.relative(hot.projectSrc, file), - ); + // -- css -- + if (layout?.theme) pageTheme = layout.theme; + const theme: css.Theme = { + ...css.defaultTheme, + ...pageTheme, + }; + const cssImports = Array.from( + new Set([globalCssPath, ...hot.getCssImports(item.file)]), + (file) => path.relative(hot.projectSrc, file), + ); - // -- metadata -- - const renderedMetaPromise = Promise.resolve( - typeof metadata === "function" ? metadata({ ssr: true }) : metadata, - ).then((m) => - meta.render({ + // -- metadata -- + const renderedMeta = meta.render({ canonical: item.id, - ...m, - }, metaTemplate) - ); + ...typeof metadata === "function" + ? await metadata({ ssr: true }) + : metadata, + }, metaTemplate); + if (!renderedMeta.includes("")) { + throw new Error( + "Page is missing 'meta.title'. " + "All pages need a title tag.", + ); + } - // -- html -- - let page = render.element(Page); - if (layout?.default) { - page = render.element(layout.default, { content: page }); - } + // -- html -- + let text: string; + const sitegen = sg.context.init(); + if ("render" in Page) { + text = await SitegenWrap.render({ + cloverScripts: sitegen.scripts, + page: Page, + attrs: {}, + }); + } else { + let page = render.element(Page); + if (layout?.default) { + page = render.element(layout.default, { content: page }); + } - const sitegen = sg.context.init(); - const bodyPromise = render.async(page, [sitegen]); + text = (await render.async(page, [sitegen])).text; + } - const [{ text }, renderedMeta] = await Promise.all([ - bodyPromise, - renderedMetaPromise, - ]); - if (!renderedMeta.includes("<title>")) { - throw new Error( - "Page is missing 'meta.title'. " + "All pages need a title tag.", - ); + const styleKey = css.styleKey(cssImports, theme); + return { + type: "page", + id: item.id, + file: item.file, + regenerate, + html: text, + meta: renderedMeta, + cssImports, + theme: theme ?? null, + styleKey, + clientRefs: Array.from(sitegen.scripts), + } as const; + } catch (e) { + error.rethrowWithMetadata(e, { page: item.id }); } - - const styleKey = css.styleKey(cssImports, theme); - return { - type: "page", - id: item.id, - file: item.file, - regenerate, - html: text, - meta: renderedMeta, - cssImports, - theme: theme ?? null, - styleKey, - clientRefs: Array.from(sitegen.scripts), - } as const; } export async function prepareView(io: Io, item: sg.FileItem) { @@ -410,6 +419,9 @@ import * as render from "lib/render.ts"; import * as sg from "#sitegen"; import type { FileItem } from "#sitegen"; import * as progress from "../lib/progress.ts"; +import * as error from "lib/error.ts"; + +import SitegenWrap from "./sitegen-wrap.marko"; import * as bundle from "./bundle.ts"; import * as css from "./css.ts"; diff --git a/framework/hot.ts b/framework/hot.ts index 5ce9f43c15e68ae7bcad14a471b41583f9cca8b2..4bd825bbebf23e7bec611665441db37aa3c6dc0b 100644 --- a/framework/hot.ts +++ b/framework/hot.ts @@ -28,7 +28,7 @@ exts[".ts"] = loadEsbuild; exts[".tsx"] = loadEsbuild; exts[".jsx"] = loadEsbuild; exts[".marko"] = loadMarko; -exts[".mdx"] = loadMdx; +exts[".mdo"] = loadMarkodown; exts[".css"] = loadCss; // Intercept all module load calls to track CSS imports + file times. @@ -173,16 +173,9 @@ function loadMarko(module: NodeJS.Module, filepath: string) { lazyMarko ??= require<typeof import("./marko.ts")>("./framework/marko.ts"); lazyMarko.loadMarko(module, filepath); } - -function loadMdx(module: NodeJS.Module, filepath: string) { - const input = fs.readFileSync(filepath); - const out = mdx.compileSync(input, { - jsxImportSource: "#jsx", - providerImportSource: "#mdx", - rehypePlugins: [rehypeMdxCodeProps], - }).value; - const src = typeof out === "string" ? out : Buffer.from(out).toString("utf8"); - return loadEsbuildCode(module, filepath, src); +function loadMarkodown(module: NodeJS.Module, filepath: string) { + lazyMarko ??= require<typeof import("./marko.ts")>("./framework/marko.ts"); + lazyMarko.loadMarkodown(module, filepath); } function loadCss(module: NodeJS.Module, _filepath: string) { @@ -328,8 +321,6 @@ import * as path from "node:path"; import { pathToFileURL } from "node:url"; import * as esbuild from "esbuild"; import { createRequire } from "node:module"; -import * as mdx from "@mdx-js/mdx"; -import rehypeMdxCodeProps from "rehype-mdx-code-props"; import * as self from "./hot.ts"; import { Buffer } from "node:buffer"; import { UNWRAP } from "lib/assert.ts"; diff --git a/framework/lib/add-script.marko b/framework/lib/add-script.marko new file mode 100644 index 0000000000000000000000000000000000000000..52a1d9a98330e3a0e0b3ed8410294418393f4fa3 --- /dev/null +++ b/framework/lib/add-script.marko @@ -0,0 +1 @@ +<const/_=$global.cloverScripts.add(input.value) /> diff --git a/framework/lib/sitegen.ts b/framework/lib/sitegen.ts index 81562bc4cf7206fb7e38ceed72f98f34c669ee0a..5b85bee0486de5dde60e21bc3e68fd8b57710ef9 100644 --- a/framework/lib/sitegen.ts +++ b/framework/lib/sitegen.ts @@ -2,6 +2,7 @@ export type ScriptId = string; export interface PageExports extends ViewExports { regenerate?: PageRegenerateOptions; + markoOnly?: boolean; } export interface ViewExports { default: render.Component; @@ -10,9 +11,9 @@ export interface ViewExports { layout?: Layout; } export interface Layout { - default: render.Component; + default?: render.Component; theme?: css.Theme; - // TODO: nested layout + markoOnly?: boolean; } export interface PageRegenerateOptions { tags?: string[]; @@ -97,6 +98,8 @@ export function joinScripts(scriptSources: string[]) { "].map(e=>e())"; } +export { default as CloverScriptInclude } from "./add-script.marko"; + import * as render from "lib/render.ts"; import type * as meta from "lib/render/meta.ts"; import type * as css from "../css.ts"; diff --git a/framework/lib/view.ts b/framework/lib/view.ts index dcf67a905e1581c3e583851479b78c11adb96bd1..9c844437833035b83eedeb5d6115063a70c62d96 100644 --- a/framework/lib/view.ts +++ b/framework/lib/view.ts @@ -53,10 +53,10 @@ type PropsFromModule<M extends any> = M extends { export async function renderToString<K extends Key>( id: K, - props: PropsFromModule<ViewMap[K]>, + attrs: PropsFromModule<ViewMap[K]>, ) { const { - component, + component: Page, inlineCss, layout, meta: metadata, @@ -67,18 +67,29 @@ export async function renderToString<K extends Key>( // -- metadata -- const renderedMetaPromise = Promise.resolve( - typeof metadata === "function" ? metadata(props) : metadata, + typeof metadata === "function" ? metadata(attrs) : metadata, ).then((m) => meta.render(m, codegen.metaTemplate)); - // -- html -- - let page: render.Element = render.element(component, props); - if (layout) page = render.element(layout, { content: page }); + let text; const sitegen = sg.context.init(); - const { text: body } = await render.async(page, [sitegen]); + if ("render" in Page) { + text = await SitegenWrap.render({ + cloverScripts: sitegen.scripts, + page: Page, + attrs, + }); + } else { + let page = render.element(Page, attrs); + if (layout?.default) { + page = render.element(layout.default, { content: page }); + } + + text = (await render.async(page, [sitegen])).text; + } // -- join document and send -- return sg.wrapDocument({ - body, + body: text, head: await renderedMetaPromise, inlineCss, scripts: sg.joinScripts( @@ -116,3 +127,4 @@ import type { RegisteredViews as ViewMap, } from "../../.clover/ts/view.d.ts"; import { UNWRAP } from "lib/assert.ts"; +import SitegenWrap from "../sitegen-wrap.marko"; diff --git a/framework/marko.ts b/framework/marko.ts index 0b3b829d5e638adac2e101b7cb506b7b491532ad..9a16892286070d475b07e93d58441b77f09dd977 100644 --- a/framework/marko.ts +++ b/framework/marko.ts @@ -6,9 +6,47 @@ export interface MarkoCacheEntry { export const markoCache = new Map<string, MarkoCacheEntry>(); export function loadMarko(module: NodeJS.Module, filepath: string) { + return loadMarkoExtra(module, filepath, "html"); +} +export function loadMarkodown(module: NodeJS.Module, filepath: string) { + return loadMarkoExtra(module, filepath, "markdown"); +} + +function loadMarkoExtra( + module: NodeJS.Module, + filepath: string, + mode: "html" | "markdown", +) { let cache = markoCache.get(filepath); if (!cache) { let src = fs.readFileSync(filepath, "utf8"); + if (mode === "markdown") { + let transform; + try { + transform = markodown.transform({ + source: src, + selfImport: `./${path.basename(filepath)}`, + }); + } catch (err) { + throw new Error(`Failed ${filepath}: Markodown Compiler Panic`, { + cause: err, + }); + } + if (!transform.success) { + // TODO: better error handling + throw new Error( + "Failed " + filepath + ": " + JSON.stringify(transform.errors), + ); + } + src = transform.text; + + fs.writeMkdirSync( + ".clover/marko/" + path.relative(".", filepath).replace(/^src\//, "") + + ".marko", + src, + ); + } + // A non-standard thing here is Clover Sitegen implements // its own client side scripting stuff, so it overrides // bare client import statements to it's own usage. @@ -26,16 +64,16 @@ export function loadMarko(module: NodeJS.Module, filepath: string) { ) } />`; }, - ) + '\nimport { addScript as CloverScriptInclude } from "#sitegen";\n'; + ) + '\nimport { CloverScriptInclude } from "#sitegen";\n'; } - const compiled = marko.compileSync(src, filepath, { + let compiled = marko.compileSync(src, filepath, { sourceMaps: true, }); // workaround an esbuild bug? (compiled.map as unknown as { sourceRoot: string }).sourceRoot = "/"; compiled.map.sources[0] = filepath; - src = compiled.code.replace("marko/debug/html", "#marko/runtime") + + src = compiled.code + "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + Buffer.from(JSON.stringify(compiled.map), "utf-8").toString("base64"); cache = { src, scannedClientRefs: Array.from(scannedClientRefs) }; @@ -54,6 +92,7 @@ export function loadMarko(module: NodeJS.Module, filepath: string) { } import * as marko from "@marko/compiler"; +import * as markodown from "@clo/markodown"; import * as hot from "./hot.ts"; import * as fs from "#sitegen/fs"; import * as path from "node:path"; diff --git a/framework/mdx-hack.tsx b/framework/mdx-hack.tsx deleted file mode 100644 index ffbe656306588a39ed90348050099dccca0a2088..0000000000000000000000000000000000000000 --- a/framework/mdx-hack.tsx +++ /dev/null @@ -1,32 +0,0 @@ -export function useMDXComponents() { - return { - pre: async ( - { filename, whitespace, tint, content: [, , { className, content }] }, - ) => { - const lang = className?.split("-")?.[1] ?? null; - const code = ["tsx", "jsx", "json", "html", "ts", "js"].includes(lang) - ? await highlight.highlightCode( - content.trim(), - lang, - ) - : content.trim(); - return ( - <figure class={["code", tint]}> - {filename && <figcaption>{filename}</figcaption>} - <pre - style={whitespace ? { "white-space": whitespace } : {}} - ><code>{render.raw(code)}</code></pre> - </figure> - ); - }, - code: ({ content }) => { - return ( - <code> - {content} - </code> - ); - }, - }; -} -import * as highlight from "../src/file-viewer/highlight.ts"; -import * as render from "lib/render.ts"; diff --git a/framework/sitegen-wrap.marko b/framework/sitegen-wrap.marko new file mode 100644 index 0000000000000000000000000000000000000000..87a2137357e15fb135531b53bf498356127d9daf --- /dev/null +++ b/framework/sitegen-wrap.marko @@ -0,0 +1,2 @@ +<const/_=$global.cloverScripts=input.cloverScripts /> +<${input.page} ...input.attrs /> diff --git a/lib/render.ts b/lib/render.ts index 80cdba64d2d1dcb224065e5b51a870f43dc6d4ca..a4da679e9690741b76021189452f8077e5690207 100644 --- a/lib/render.ts +++ b/lib/render.ts @@ -1,4 +1,7 @@ /** + * @deprecated replacing with pure Marko + * https://git.paperclover.net/clo/sitegen/issues/90 + * * Clover's rendering engine is the backbone of her website generator. It * converts objects and components (functions returning {@linkcode Node}) into * HTML. the engine is simple, self-contained, and easily extendable. diff --git a/lib/render/meta.ts b/lib/render/meta.ts index c709399a190b4ec50a4c3164fca7bbd6b0a7f064..7815c28e1794af01ce769aa9c443acd12c713313 100644 --- a/lib/render/meta.ts +++ b/lib/render/meta.ts @@ -148,7 +148,7 @@ function renderMetadata(meta: Meta, template: Template): string { const referrer = meta.referrer ?? template.referrer ?? null; const themeColor = meta.themeColor ?? template.themeColor ?? null; const viewport = meta.viewport ?? template.viewport ?? - "width=device-width, initial-scale=1.0"; + "width=device-width, initial-scale=1, maximum-scale=1"; const embed = meta.embed ?? template.embed ?? null; let openGraph = meta.openGraph ?? template.openGraph ?? null; @@ -168,7 +168,9 @@ function renderMetadata(meta: Meta, template: Template): string { ...twitter, }; if (thumbnail) { - openGraph.image = embed.thumbnail; + const resolved = new URL(thumbnail, template.base).href; + openGraph.image = resolved; + twitter.image = resolved; } if (siteTitle) { openGraph.site_name = siteTitle; diff --git a/package-lock.json b/package-lock.json index 4a11ecdc42106e514ed3d5a02716d8753d77db8a..241e2309ed32d86840b9a7e7a3a051950748f8f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,30 +4,27 @@ "requires": true, "packages": { "": { - "name": "sitegen", "dependencies": { + "@clo/markodown": "npm:@paperclover/markodown@rc", "@hono/node-server": "1.14.3", - "@mdx-js/mdx": "3.1.0", + "@marko/compiler": "^5.39.55", + "@types/node": "24.0.10", + "browserslist": "4.28.1", "codemirror": "6.0.1", - "dashjs": "^5.0.3", - "devalue": "^5.3.2", + "dashjs": "5.0.3", + "devalue": "5.6.2", "esbuild": "0.25.5", "hls.js": "1.6.5", - "hono": "^4.10.3", + "hono": "4.11.9", "lib": "file:lib", - "marko": "6.0.82", + "marko": "^5.38.24", "msgpackr": "1.11.5", "puppeteer": "24.23.0", - "rehype-mdx-code-props": "^3.0.1", "source-map-support": "0.5.21", + "typescript": "5.8.3", "unique-names-generator": "4.7.1", "vscode-oniguruma": "2.0.1", "vscode-textmate": "9.2.0" - }, - "devDependencies": { - "@types/node": "24.0.10", - "baseline-browser-mapping": "^2.9.14", - "typescript": "5.8.3" } }, "lib": {}, @@ -45,223 +42,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", @@ -271,145 +51,26 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, + "node_modules/@clo/markodown": { + "name": "@paperclover/markodown", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@paperclover/markodown/-/markodown-1.0.0-rc.15.tgz", + "integrity": "sha512-c4aTliRZUQ9DwQx3nFaftTE5GCvjAvCl0EF3nton6ah9zDoRu69nEuFbKOpSlxYrWizWzkPQVBu9xZY6gr+ezQ==", "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@marko/compiler": "^5", + "esbuild": "0.x", + "rollup": "^4" + }, + "peerDependenciesMeta": { + "@marko/compiler": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + } } }, "node_modules/@codemirror/autocomplete": { @@ -905,51 +566,12 @@ "hono": "^4" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@lezer/common": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", @@ -990,25 +612,16 @@ "license": "MIT" }, "node_modules/@marko/compiler": { - "version": "5.39.40", - "resolved": "https://registry.npmjs.org/@marko/compiler/-/compiler-5.39.40.tgz", - "integrity": "sha512-gQSdfJ5XOy01DtP7ULiqI1onp7Cix1QvnjM0KbfR2HMrWNI14V8V/2JguFAm3BzKEMZmmgvRLk0rvBzSm9FP6Q==", + "version": "5.39.55", + "resolved": "https://registry.npmjs.org/@marko/compiler/-/compiler-5.39.55.tgz", + "integrity": "sha512-QHukS/gMzxKWcF5xALVAH1swVAudCXC5DA2DDC5r+TzBiQ0v+uz7D8oNlwxO2xjTRPu7AUukcufHscbhytcyGg==", "license": "MIT", + "peer": true, "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/core": "^7.28.0", - "@babel/generator": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.0", - "@babel/runtime": "^7.28.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.2", "@luxass/strip-json-comments": "^1.4.0", "complain": "^1.6.1", "he": "^1.2.0", - "htmljs-parser": "^5.7.3", + "htmljs-parser": "^5.7.4", "jsesc": "^3.1.0", "kleur": "^4.1.5", "lasso-package-root": "^1.0.1", @@ -1023,40 +636,18 @@ "node": "18 || 20 || >=22" } }, - "node_modules/@mdx-js/mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", - "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "node_modules/@marko/runtime-tags": { + "version": "6.0.145", + "resolved": "https://registry.npmjs.org/@marko/runtime-tags/-/runtime-tags-6.0.145.tgz", + "integrity": "sha512-3M65F25XylMRoitQZ7NmvSCk8IliBwhT8ay5AJaChJ55NvR9B2l2mnT0YcDvVQjqxKGUYU/xKfNmFYGcCj2RVA==", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-scope": "^1.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "recma-build-jsx": "^1.0.0", - "recma-jsx": "^1.0.0", - "recma-stringify": "^1.0.0", - "rehype-recma": "^1.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "@marko/compiler": "^5.39.53", + "csstype": "^3.2.3", + "magic-string": "^0.30.21" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { @@ -1170,129 +761,11 @@ "node": ">=10" } }, - "node_modules/@svta/cml-608": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-608/-/cml-608-1.0.1.tgz", - "integrity": "sha512-Y/Ier9VPUSOBnf0bJqdDyTlPrt4dDB+jk5mYHa1bnD2kcRl8qn7KkW3PRuj4w1aVN+BS2eHmsLxodt7P2hylUg==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - } - }, - "node_modules/@svta/cml-cmcd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-cmcd/-/cml-cmcd-1.0.1.tgz", - "integrity": "sha512-eox305g+QUJgXqOLVrbgxeQHCgl90ewwQ9O2bIoo7m+hanR8Xswu5CknFnT5qqIbLOHfw80ug+raycoAFHTQ+w==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-cta": "1.0.1", - "@svta/cml-structured-field-values": "1.0.1", - "@svta/cml-utils": "1.0.1" - } - }, - "node_modules/@svta/cml-cmsd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-cmsd/-/cml-cmsd-1.0.1.tgz", - "integrity": "sha512-+nIB8PuSfb/qw+xGaArPhNqPm84tBJUbe3H1DnPL5QUsjSUI7mUIUQwAtRV1ZdEu0+80g9i0op79woB0OIwr/g==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-cta": "1.0.1", - "@svta/cml-structured-field-values": "1.0.1", - "@svta/cml-utils": "1.0.1" - } - }, - "node_modules/@svta/cml-cta": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-cta/-/cml-cta-1.0.1.tgz", - "integrity": "sha512-jcXqNIPv26bmFxIOFh8/c3+6WLH4qBjKpq9qTQcggDPoHuV1YBydMsJLOnYPDeK8rNMKcAkFLbnDRvyJthu5yw==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-structured-field-values": "1.0.1", - "@svta/cml-utils": "1.0.1" - } - }, - "node_modules/@svta/cml-dash": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-dash/-/cml-dash-1.0.1.tgz", - "integrity": "sha512-lYnD1I7FUbbQND+xICI+kcRaRXuT+whKk27R8m8me5VMVu2sMsAMc7Yui6l9sxw2cBKt8pSETPYRm/1+n4LZkw==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-utils": "1.0.1" - } - }, - "node_modules/@svta/cml-id3": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-id3/-/cml-id3-1.0.1.tgz", - "integrity": "sha512-90fGlL1qRI88CcaB89k6NG6cC3kky4Eu2jwqU4HefqK+S5k2OASUxf8JXkGz+DsdaiY7sh51vGPYdolfBZS7ug==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-utils": "1.0.1" - } - }, - "node_modules/@svta/cml-request": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-request/-/cml-request-1.0.1.tgz", - "integrity": "sha512-enL19BuXUjFkDDDF9jdNwUclMNPRsagnjGAetVC7xcmpDMpEx+ZLgsDip6BFNg5p6izSEk/OyujTWW1r8bDNiA==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-utils": "1.0.1", - "@svta/cml-xml": "1.0.1" - } - }, - "node_modules/@svta/cml-structured-field-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-structured-field-values/-/cml-structured-field-values-1.0.1.tgz", - "integrity": "sha512-Kibciki59Pon3Pn/sl5uyrbJcSpZQDKqdCfDrokBvOdLoqqcd0oFrkEPsZBiuuIODX1CB80612xe8hopeFDyBA==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-utils": "1.0.1" - } - }, - "node_modules/@svta/cml-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-utils/-/cml-utils-1.0.1.tgz", - "integrity": "sha512-kso3curTJfp00I1mKFoBliBApjn4aPE+wF8cPucf7TrSDVWZDeLLuF14ASmUE9m7rnrqTTK4878VvmXaXcCCfQ==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=20" - } - }, - "node_modules/@svta/cml-xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@svta/cml-xml/-/cml-xml-1.0.1.tgz", - "integrity": "sha512-11LkJa5kDEcsRMWkVI1ABH3KLCxGoiSVe4kQ293ItVj8ncTTQ7htmCGiJDjS+Cmy35UgF3e/vc0ysJIiWRTx2g==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@svta/cml-utils": "1.0.1" - } + "node_modules/@svta/common-media-library": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@svta/common-media-library/-/common-media-library-0.12.4.tgz", + "integrity": "sha512-9EuOoaNmz7JrfGwjsrD9SxF9otU5TNMnbLu1yU4BeLK0W5cDxVXXR58Z89q9u2AnHjIctscjMTYdlqQ1gojTuw==", + "license": "Apache-2.0" }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", @@ -1300,76 +773,15 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "license": "MIT" }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, "node_modules/@types/node": { "version": "24.0.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.8.0" } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -1380,34 +792,6 @@ "@types/node": "*" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -1441,12 +825,33 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", + "license": "BSD-2-Clause" + }, + "node_modules/argly": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/argly/-/argly-1.2.0.tgz", + "integrity": "sha512-+F3InkcH2XOGK7Jf/ZQis4cwZ4wbfmpBKo5J+SAA9bglT1gVd0e9hroHWarU076pJrAfs8JKuRPwDqwPBOKHnw==", + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -1459,15 +864,6 @@ "node": ">=4" } }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, "node_modules/b4a": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", @@ -1482,15 +878,11 @@ } } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/bare-events": { "version": "2.7.0", @@ -1576,9 +968,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.14", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", - "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -1632,10 +1024,25 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browser-refresh-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/browser-refresh-client/-/browser-refresh-client-1.1.4.tgz", + "integrity": "sha512-FM/UzMFsG7wJ1ocxCSl6U7qGAIWASEk+tlvfJLP2Pd1JfS4kQ1r4d5f+nNmQI8fB8sXSD8+u/mWErEkAMxUu3w==", + "license": "MIT" + }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -1653,11 +1060,11 @@ "license": "MIT", "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1691,9 +1098,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001747", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001747.tgz", - "integrity": "sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==", + "version": "1.0.30001770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", "funding": [ { "type": "opencollective", @@ -1710,54 +1117,18 @@ ], "license": "CC-BY-4.0" }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==", + "license": "MIT", + "dependencies": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + }, + "engines": { + "node": ">= 0.4.0" } }, "node_modules/chromium-bidi": { @@ -1808,16 +1179,6 @@ "@codemirror/view": "^6.0.0" } }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1836,16 +1197,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/complain": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/complain/-/complain-1.6.1.tgz", @@ -1855,12 +1206,6 @@ "error-stack-parser": "^2.0.1" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -1894,24 +1239,18 @@ "license": "MIT" }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/dashjs": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-5.1.1.tgz", - "integrity": "sha512-BzNXlUgzEjhuZ5M5hlSp1qIyQHZ7NpXAR0loP9DAAFVZj/ntL1DHeZ7qp/L3bvI4rq50X5indkAZQ3zEHWJoCA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-5.0.3.tgz", + "integrity": "sha512-TXndNnCUjFjF2nYBxDVba+hWRpVkadkQ8flLp7kHkem+5+wZTfRShJCnVkPUosmjS0YPE9fVNLbYPJxHBeQZvA==", "license": "BSD-3-Clause", "dependencies": { - "@svta/cml-608": "1.0.1", - "@svta/cml-cmcd": "1.0.1", - "@svta/cml-cmsd": "1.0.1", - "@svta/cml-dash": "1.0.1", - "@svta/cml-id3": "1.0.1", - "@svta/cml-request": "1.0.1", - "@svta/cml-xml": "1.0.1", + "@svta/common-media-library": "^0.12.4", "bcp-47-match": "^2.0.3", "bcp-47-normalize": "^2.3.0", "codem-isoboxer": "0.3.10", @@ -1949,17 +1288,25 @@ } } }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "node_modules/deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==", "license": "MIT", "dependencies": { - "character-entities": "^2.0.0" + "type-detect": "0.1.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": "*" + } + }, + "node_modules/deep-eql/node_modules/type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==", + "license": "MIT", + "engines": { + "node": "*" } }, "node_modules/degenerator": { @@ -1976,15 +1323,6 @@ "node": ">= 14" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -2001,19 +1339,6 @@ "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", "license": "MIT" }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/devtools-protocol": { "version": "0.0.1508733", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", @@ -2022,9 +1347,9 @@ "peer": true }, "node_modules/electron-to-chromium": { - "version": "1.5.229", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.229.tgz", - "integrity": "sha512-cwhDcZKGcT/rEthLRJ9eBlMDkh1sorgsuk+6dpsehV0g9CABsIqBxU4rLRjG+d/U6pYU1s37A4lSKrVc5lSQYg==", + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -2069,44 +1394,13 @@ "stackframe": "^1.3.4" } }, - "node_modules/esast-util-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/esast-util-from-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "acorn": "^8.0.0", - "esast-util-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/esbuild": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -2203,109 +1497,6 @@ "node": ">=4.0" } }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", - "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.1.tgz", - "integrity": "sha512-E4fEc8KLhDXnbyDa5XrbdT9PbgSMt0AGZPFUsGFok8N2Q7DTO+F6xAFJjIdw71EkidRg186I1mQCKzZ1ZbEsCw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2315,6 +1506,15 @@ "node": ">=0.10.0" } }, + "node_modules/events-light": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/events-light/-/events-light-1.0.5.tgz", + "integrity": "sha512-jF51LJzg5W+tkJgfZbjlbFCLcyVFEtOjU+xMCBylrXG13X5XHvfp6lNGfyBLF9u1mRTpUsMVYqSDukvpZff1mQ==", + "license": "MIT", + "dependencies": { + "chai": "^3.5.0" + } + }, "node_modules/events-universal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", @@ -2324,12 +1524,6 @@ "bare-events": "^2.7.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -2371,15 +1565,6 @@ "pend": "~1.2.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2418,93 +1603,6 @@ "node": ">= 14" } }, - "node_modules/hast-util-properties-to-mdx-jsx-attributes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hast-util-properties-to-mdx-jsx-attributes/-/hast-util-properties-to-mdx-jsx-attributes-1.0.1.tgz", - "integrity": "sha512-ZzxhjHZ+gyxaPIFp/nuRpVL4GIFoqzfH6vNgjaA3CuUAV6XCxYwAQfRczrZRkgL6msi6DdOl+/QEduOdzszvbg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "estree-util-value-to-estree": "^3.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2521,9 +1619,9 @@ "license": "Apache-2.0" }, "node_modules/hono": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", - "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz", + "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==", "license": "MIT", "peer": true, "engines": { @@ -2547,9 +1645,9 @@ "license": "MIT" }, "node_modules/htmljs-parser": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/htmljs-parser/-/htmljs-parser-5.7.4.tgz", - "integrity": "sha512-PCGI7/Z10oBkpKKqbQ9Wgd0GZjSQ/dV7QlBjOmaqD1FkBsHWk730BW9mJCbnXfRbtZCdLh8M8IA8YeKPu9tGaQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/htmljs-parser/-/htmljs-parser-5.10.0.tgz", + "integrity": "sha512-5aAmTYhhiyBaBArw51R9c1m5BxqN3QBRpvhKRanWwTW1I59Y9YHvfGOBU12dfy7dPqgkwFKCUh0LX+ia34HHFw==", "license": "MIT" }, "node_modules/http-proxy-agent": { @@ -2618,12 +1716,6 @@ "sax": "1.2.1" } }, - "node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", - "license": "MIT" - }, "node_modules/ip-address": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", @@ -2682,28 +1774,6 @@ "node": ">=8" } }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2740,18 +1810,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -2798,6 +1856,12 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/listener-tracker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/listener-tracker/-/listener-tracker-2.0.0.tgz", + "integrity": "sha512-U6NLzBRyrAsJs9AAjuBYifXtNYnAIDPIp81rNpxNoypXBR7qi/LhsuUWX5399zuTg1sBEQyOnWDYFrBQ28vk/w==", + "license": "Apache-2.0" + }, "node_modules/localforage": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", @@ -2807,826 +1871,59 @@ "lie": "3.1.1" } }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/marko": { - "version": "6.0.82", - "resolved": "https://registry.npmjs.org/marko/-/marko-6.0.82.tgz", - "integrity": "sha512-xnBm299wmqrK8++12dhGHBUonm2SZgQVPNhHZjfp3Wc7k4U/qPbKrc7H1DJgU7JrYv8sSdxkconisynDqBYC1g==", + "version": "5.38.24", + "resolved": "https://registry.npmjs.org/marko/-/marko-5.38.24.tgz", + "integrity": "sha512-/F/ZiziJK8T+XMsbfF0/GkXBvqEAnVkZDWHw016Ey6qiFJcSpR/zE5AJ8cXLAqk9WTM4/gRo51wlm2XocpBajg==", "license": "MIT", "dependencies": { - "@marko/compiler": "^5.39.40", - "csstype": "^3.1.3", - "magic-string": "^0.30.17" + "@marko/compiler": "^5.39.53", + "@marko/runtime-tags": "^6.0.145", + "app-module-path": "^2.2.0", + "argly": "^1.2.0", + "browser-refresh-client": "1.1.4", + "complain": "^1.6.1", + "csstype": "^3.2.3", + "events-light": "^1.0.5", + "listener-tracker": "^2.0.0", + "magic-string": "^0.30.21", + "minimatch": "^9.0.5", + "raptor-util": "^3.2.0", + "resolve-from": "^5.0.0", + "self-closing-tags": "^1.0.1", + "warp10": "^2.1.0" + }, + "bin": { + "markoc": "bin/markoc" }, "engines": { "node": "18 || 20 || >=22" } }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "brace-expansion": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", - "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", - "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", - "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", - "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -3695,9 +1992,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/once": { @@ -3753,31 +2050,6 @@ "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -3823,16 +2095,6 @@ "node": ">=0.4.0" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/proxy-agent": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", @@ -3934,156 +2196,12 @@ "integrity": "sha512-uEDMMkBCJvjTqYMBnJNxn+neiS6a0rhybQNA9RaexGor1uvKjwyHA5VcbZMZEuqXhKUWbL+WNS7PhuZVZNB7pw==", "license": "Apache-2.0" }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", - "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", - "license": "MIT", - "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mdx-code-props": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rehype-mdx-code-props/-/rehype-mdx-code-props-3.0.1.tgz", - "integrity": "sha512-BWWKn0N6r7/qd7lbLgv5J8of7imz1l1PyCNoY7BH0AOR9JdJlQIfA9cKqTZVEb2h2GPKh473qrBajF0i01fq3A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-properties-to-mdx-jsx-attributes": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0", - "unified": "^11.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/relative-import-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/relative-import-path/-/relative-import-path-1.0.0.tgz", "integrity": "sha512-ZvbtoduKQmD4PZeJPfH6Ql21qUWhaMxiHkIsH+FUnZqKDwNIXBtGg5zRZyHWomiGYk8n5+KMBPK7Mi4D0XWfNg==", "license": "MIT" }, - "node_modules/remark-mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", - "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4117,15 +2235,6 @@ "node": ">=0.12.0" } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -4164,15 +2273,6 @@ "node": ">= 14" } }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -4192,16 +2292,6 @@ "node": ">=0.10.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -4233,20 +2323,6 @@ "node": ">=8" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4265,24 +2341,6 @@ "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", "license": "MIT" }, - "node_modules/style-to-js": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", - "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.9" - } - }, - "node_modules/style-to-object": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", - "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.4" - } - }, "node_modules/tar-fs": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", @@ -4317,32 +2375,21 @@ "b4a": "^1.6.4" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", @@ -4353,7 +2400,6 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, "license": "Apache-2.0", "peer": true, "bin": { @@ -4394,28 +2440,8 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "devOptional": true, "license": "MIT" }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unique-names-generator": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz", @@ -4425,91 +2451,10 @@ "node": ">=8" } }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -4536,34 +2481,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vscode-oniguruma": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-2.0.1.tgz", @@ -4582,6 +2499,12 @@ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, + "node_modules/warp10": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/warp10/-/warp10-2.1.0.tgz", + "integrity": "sha512-krhkqzJdUxAZv2Cx0Gz6dN1r7TTrG9RDewkDHBbJQIqbNTCdB5ZUHVh7VkA4DgrKW4ZXPPUQKCwmI/3btDse9A==", + "license": "MIT" + }, "node_modules/webdriver-bidi-protocol": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", @@ -4641,12 +2564,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -4692,16 +2609,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/package.json b/package.json index e9f9eba755cc2610f54e21cc837c4dcdaebdc7a9..2b40642119116c7b4264c0ff49fd351c966764f3 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,38 @@ { "type": "module", "dependencies": { + "@clo/markodown": "npm:@paperclover/markodown@rc", "@hono/node-server": "1.14.3", - "@mdx-js/mdx": "3.1.0", + "@marko/compiler": "^5.39.55", + "@types/node": "24.0.10", + "browserslist": "4.28.1", "codemirror": "6.0.1", - "dashjs": "^5.0.3", - "devalue": "^5.3.2", + "dashjs": "5.0.3", + "devalue": "5.6.2", "esbuild": "0.25.5", "hls.js": "1.6.5", - "hono": "^4.10.3", + "hono": "4.11.9", "lib": "file:lib", - "marko": "6.0.82", + "marko": "^5.38.24", "msgpackr": "1.11.5", "puppeteer": "24.23.0", - "rehype-mdx-code-props": "^3.0.1", "source-map-support": "0.5.21", + "typescript": "5.8.3", "unique-names-generator": "4.7.1", "vscode-oniguruma": "2.0.1", "vscode-textmate": "9.2.0" }, - "devDependencies": { - "@types/node": "24.0.10", - "baseline-browser-mapping": "^2.9.14", - "typescript": "5.8.3" - }, "imports": { "#sitegen": "./framework/lib/sitegen.ts", "#sitegen/*": "./framework/lib/*.ts", "#jsx/jsx-runtime": "./lib/render/jsx-runtime.ts", "#jsx/jsx-dev-runtime": "./lib/render/jsx-runtime.ts", - "#marko/runtime": "./framework/engine/marko-runtime.ts", - "#marko/html": { - "types": "marko/html", - "production": "marko/production", - "node": "marko/debug/html" - }, "#hono": "hono", "#hono/conninfo": { "bun": "hono/bun", "deno": "hono/deno", "node": "@hono/node-server/conninfo", "worker": "hono/cloudflare-workers" - }, - "#mdx": "./framework/mdx-hack.tsx" + } } } diff --git a/src/blog/drafts/webdev/marko-intro.markodown b/src/blog/drafts/webdev/marko-intro.markodown index 8a7df80aeb80d2c561975c3a6ba5ed5c42f22672..456bdeee8e047e4a0a6d894a6c2aa209cf6bd029 100644 --- a/src/blog/drafts/webdev/marko-intro.markodown +++ b/src/blog/drafts/webdev/marko-intro.markodown @@ -322,7 +322,7 @@ export const transitionDate = 1735639200000; >${formatQuestionTimestamp(date)}</time> </a> - <CloverMarkdown ...{ text } /> + <QuestionMarkdown=text/> </> // this singleton script will make all the '<time>' tags clickable. @@ -330,7 +330,7 @@ client import "./clickable-links.client.ts"; import type { Question } from "@/q+a/models/Question.ts"; import { formatQuestionTimestamp, formatQuestionISOTimestamp } from "@/q+a/format.ts"; -import { CloverMarkdown } from "@/q+a/clover-markdown.tsx"; +import { QuestionMarkdown } from "@/q+a/markdown.tsx"; ``` The integration is great, `client import` is quite a magical concept, and I've diff --git a/src/blog/pages/community-translations.mdx b/src/blog/pages/community-translations.mdo similarity index 54% rename from src/blog/pages/community-translations.mdx rename to src/blog/pages/community-translations.mdo index 6bcc15c553f9eb9efdd9e15ba2e228d3d0775c33..bc2393ebc8d82a5b6433f3c6bdf3100be3252725 100644 --- a/src/blog/pages/community-translations.mdx +++ b/src/blog/pages/community-translations.mdo @@ -1,7 +1,10 @@ -export const meta = { title: "about clover's community translations" }; -export const layout = { default: ({ content }) => <main>{content}</main> }; +--- +meta: + title: clover's community translations +--- -<a href="/">back to the home page</a> +<main> +<nav>[back to the home page](/)</nav> # blog community translations @@ -10,5 +13,6 @@ members of the (world's) community. if you natively speak a language that i don't have a blog page translated into, and would like to help spread my words to more readers, please get in touch. -<code><a href="mailto:me@paperclover.net">me@paperclover.net</a></code> +[`me@paperclover.net`](mailto:me@paperclover.net) +</main> diff --git a/src/blog/pages/webdev/one-year-next-app-router/en.mdx b/src/blog/pages/webdev/one-year-next-app-router/en.mdo similarity index 89% rename from src/blog/pages/webdev/one-year-next-app-router/en.mdx rename to src/blog/pages/webdev/one-year-next-app-router/en.mdo index fa2963d0b7ac75a3f74d25f0bc44a24c84724c8f..48a754c85ebf278623101710fe6cedf7ad52b62e 100644 --- a/src/blog/pages/webdev/one-year-next-app-router/en.mdx +++ b/src/blog/pages/webdev/one-year-next-app-router/en.mdo @@ -1,28 +1,15 @@ -import Heading from "@/blog/tags/heading.tsx"; -import TableOfContents from "@/blog/tags/table-of-contents.tsx"; -import { Layout } from "@/blog/tags/layout.tsx"; -export { theme } from "@/blog/tags/layout.tsx"; - -export const meta = { - title: "One Year with Next.js App Router — Why We're Moving On", - description: "A critique of React Server Components and Next.js 15.", - keywords: ["webdev", "technical analysis", "opinion"], - authors: ["clover caruso"], - embed: { - thumbnail: "/open-graph/next-js.png" - }, - twitter: { - image: "https://paperclover.net/open-graph/next-js.png" - }, - canonical: "/blog/webdev/one-year-next-app-router" -}; - -<Layout - meta={meta} - date={'Oct 21st, 2025'} - slug="webdev/one-year-next-app-router" - tags={meta.keywords} -> +--- +layout: "@/blog/tags/blog-layout.marko" +meta: + title: One Year with Next.js App Router — Why We're Moving On + description: A critique of React Server Components and Next.js 15. + keywords: ["webdev", "technical analysis", "opinion"] + authors: ["clover caruso"] + embed: + thumbnail: /open-graph/next-js.png + canonical: /blog/webdev/one-year-next-app-router +date: "Oct 21st, 2025" +--- As I've been using [Next.js] professionally on my employer's web app, I find the core design of their App Router and [React Server Components] (RSC) to be @@ -38,50 +25,30 @@ my colleagues escaped this hell, seamlessly migrating our entire frontend to [Next.js]: https://nextjs.org [React Server Components]: https://react.dev/reference/rsc/server-components -<TableOfContents> +<table-of-contents /> -- [A Technical Review: What are Server Components?][§1] -- [Real-world Pitfalls of the App Router][§2] - - [Optimistic Updates are Impossible][§2.1] - - [Every Navigation is Another Fetch][§2.2] - - [Layouts are Artificially Restricted][§2.3] - - [You Still Download All the Content Twice][§2.4] - - [Turbopack Sucks][§2.5] -- [Seamlessly Ditching Next.js and Vercel at Work][§3] - - [`next/metadata` is Great][§3.1] - - [`next/og` is Good Too][§3.2] -- [My Experience Feels Like the Usual][§4] -- [Prefer Tools that Respect You][§5] - -</TableOfContents> - -[§1]: #technical-review - -<Heading - level='h2' - slug='technical-review' ->A Technical Review: What are Server Components?</Heading> +<h2#technical-review>A Technical Review: What are Server Components?</> The pitch of RSC is that components are put into two categories, -<b class='server'>"server"</b> components and <b class='client'>"client"</b> +<b.server>"server"</b> components and <b.client>"client"</b> components. Server components don't have `useState`, `useEffect`, but can be `async function`s and refer to backend tools like directly calling into a database. Client components are the existing model, where there is code on the backend to generate HTML text and frontend code to manage the DOM using `window.document.*`. -> The first disaster: naming!! React is now using the words -> <b class='server'>"server"</b> and <b class='client'>"client"</b> to refer to +> The first disaster: naming!! React is now using the wors +> <b.server>"server"</b> and <b.client>"client"</b> to refer to > a very specific things, ignoring their existing definitions. This would be -> fine, except <b class='client'>Client</b> components can run on the backend +> fine, except <b.client>Client</b> components can run on the backend > too! In this article, I'll be using the terms <b>"backend"</b> and > <b>"frontend"</b> to describe the two execution environments that web apps -> exist in: a Node.js process and a Web browser, respectively. +> exist in: a Node.js process and a Web browser, respectively. -This <b class='server'>Server</b>/<b class='client'>Client</b> component model +This <b.server>Server</b>/<b.client>Client</b> component model is interesting. Since built-ins like `<Suspense />` get serialized across the -network, data fetching can be very trivially modeled with async <b -class='server'>server components</b>, and the fallback UI works as if it were +network, data fetching can be very trivially modeled with async +<b.server>server components</b>, and the fallback UI works as if it were client-side. ```tsx filename="src/app/[username]/page.tsx" tint="server" @@ -117,12 +84,12 @@ async function UserPostList({ username }) { const posts = await fetchUserPostList(username); return /* post list ui omitted for brevity */; } -``` +``` If we ignore the 40kB gzipped bundle size of React itself, the above example has zero JavaScript for the UI and data fetching — it just streams the markup! For example, the imagined markdown parser within the `<Markdown />` -component stays on the backend. When an interactive frontend is needed, <b class='client'>Client +component stays on the backend. When an interactive frontend is needed, <b.client>Client components</b> can be created by putting them in a file starting with `"use client"`. @@ -155,12 +122,7 @@ export function Card() { } ``` -[§2]: #real-world-pitfalls - -<Heading - level='h2' - slug='real-world-pitfalls' ->Real-world Pitfalls of the App Router</Heading> +<h2 id="real-world-pitfalls">Real-world Pitfalls of the App Router</> After quitting [Bun] as a runtime engineer (I implemented [Server Components bundling] and [a RSC template][bun-rsc] there), I joined a small company working on the @@ -174,16 +136,11 @@ what should be a non-issue is an immovable object. [Server Components bundling]: https://github.com/oven-sh/bun/blob/67f0c3e016aa479738469adac2b79a1862b88122/src/bake/bake.d.ts [bun-rsc]: https://github.com/oven-sh/bun/tree/e7790894d92b730758ecadf971cb935063508dfb/src/bake/bun-framework-react -[§2.1]: #optimistic-updates - -<Heading - level='h3' - slug='optimistic-updates' ->Optimistic Updates are Impossible</Heading> +<h3 id='optimistic-updates'>Optimistic Updates are Impossible</> The Next.js documentation for performing mutations [does not mention optimistic updates][nextjs-updating-data]; it appears this case was not thought about. -Components rendered by the <b class='server'>React Server</b>, by design, can +Components rendered by the <b.server>React Server</b>, by design, can not be modified after mounting. Elements that could change need to be inside a client component, but data fetching cannot happen on the client components, even during SSR on the backend. This results in awkwardly small server @@ -245,9 +202,9 @@ export const queryUserInfo = (username) => ({ ``` ```tsx filename="src/app/user/[username]/page.tsx" tint="server" export default async function Page({ params }) { - const { username } = await params; + const { username } = await params; - // There's no global state in the React Server. Since layouts + // There's no global state in the React Server. Since layouts // are executed in parallel, the TanStack `QueryClient` has to // be reconstructed multiple times per route. const queryClient = new QueryClient(); @@ -266,7 +223,7 @@ export function ClientPage() { const { username } = useParams(); const { data: user } = useSuspenseQuery(queryUserInfo(username)); - // ... some hooks + // ... some hooks return <main> {/* ... an interactive web page */} @@ -283,13 +240,7 @@ tree-shaking that `getStaticProps` and `getServerSideProps` has. [ws]: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API [nextjs-updating-data]: https://nextjs.org/docs/app/getting-started/updating-data - -[§2.2]: #redundant-fetches - -<Heading - level='h3' - slug='redundant-fetches' ->Every Navigation is Another Fetch</Heading> +<h3 id='redundant-fetches'>Every Navigation is Another Fetch</> Since the App Router starts every page as a server component, with (ideally) small areas of interactivity, a navigation to a new page *has* to fetch the @@ -389,17 +340,12 @@ export default function PageLoadingSkeleton() { > just *update the existing DOM* and preserve state, but it just doesn't. > Thankfully, the time the blank RSC call takes is short enough. -[§2.3]: #layout-restrictions - -<Heading - level='h3' - slug='layout-restrictions' ->Layouts are Artificially Restricted</Heading> +<h3 id='layout-restrictions'>Layouts are Artificially Restricted</> Layouts can perform data fetching, but they can't observe or alter the request in any way. This is done so that Next.js can fetch and cache layouts whenever they want. In every other framework, layouts are just regular components that have -no feature difference compared to page components. +no feature difference compared to page components. Fetching layouts in isolation is a cute idea, but it ends up being silly because it also means that any data fetching has to be re-done per layout. You @@ -412,13 +358,8 @@ I'm going to blow it up soon don't worry."* These rules are too hard for normal developers to understand. [nextjs-fetch]: https://nextjs.org/docs/app/api-reference/functions/fetch - -[§2.4]: #rsc-payload -<Heading - level='h3' - slug='rsc-payload' ->You Still Download All the Content Twice</Heading> +<h3 id='rsc-payload'>You Still Download All the Content Twice</> Unlike the ["Islands Architecture"][islands], Server Components still have to be hydrated on the frontend to support `Suspense` and preserving client @@ -463,7 +404,7 @@ would send in a dynamic page render would be something like this: // the RSC payload for the suspense boundary self.__next_f.push([2,"14:[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\"{...}"]) </script> - + <!-- HTML and script tags repeat until the entire page is done --> </body> </html> @@ -494,14 +435,9 @@ times. What the hell, guys? Is your bandwidth free??? [islands]: https://www.patterns.dev/vanilla/islands-architecture/ -[§2.5]: #turbopack +<h3 id='turbopack'>Turbopack Sucks</> -<Heading - level='h3' - slug='turbopack' ->Turbopack Sucks</Heading> - -This section is not constructive. +This section is not constructive. - Turbopack isn't fast - Turbopack emits code that is hard to debug in a debugger (in development mode) @@ -513,7 +449,7 @@ point out three actual examples directly from the project. The first is a place where during some refactoring to satisfy the Server/Client component models, I accidentally made a Client component `async`. This one was quite annoying because it didn't say at all where the issue was, but only -contained the <b class='server'>server</b> stack trace. +contained the <b.server>server</b> stack trace. ![Next.js error](/file/2025/blog-everyone-hates-nextjs/asyncerror.png) @@ -531,12 +467,7 @@ and other bullshit. Okay. This all sucks. What can we do? -[§3]: #ditching-nextjs - -<Heading - level='h2' - slug='ditching-nextjs' ->Seamlessly Ditching Next.js and Vercel at Work</Heading> +<h2 id='ditching-nextjs'>Seamlessly Ditching Next.js and Vercel at Work</> There are two types of web projects: @@ -647,19 +578,14 @@ We're not the only ones seeing the change. While I try and keep myself off of social media, someone sent me [the results of Brian Anglin's work at Superwall][superwall-twitter], showing incredible CPU reductions on TanStack Start. I also recall ChatGPT switching from Next.js to Remix (random online -chatter: [[1][chatgpt-1]] [[2][chatgpt-2]] [[3][chatgpt-3]]) a year ago. +chatter: [[1][chatgpt-1]] [[2][chatgpt-2]] [[3][chatgpt-3]]) a year ago. [superwall-twitter]: https://twitter.com/BriansAngles/status/1978834116079436242#m [chatgpt-1]: https://xcancel.com/ryanflorence/status/1831379475654947233 [chatgpt-2]: https://old.reddit.com/r/reactjs/comments/1f97zgr/chatgpt_migrates_from_nextjs_to_remix [chatgpt-3]: https://old.reddit.com/r/nextjs/comments/1f92jdv/chatgptcom_switched_from_nextjs_to_remix -[§3.1]: #next-metadata - -<Heading - level='h3' - slug='next-metadata' -><code>next/metadata</code> is Great</Heading> +<h3 id='next-metadata'>`next/metadata` is Great</> In my opinion, this is one of the only good APIs Next.js has, and was the one place in our code where moving to TanStack made things harder to do. Instead of @@ -701,7 +627,7 @@ export const Route = createFileRoute("/blog")({ // The defaults are good, but it supports more options. embed: { image: "/img/blog.webp", - }, + }, // Every exotic meta tag is done with a JSX fragment. This // doesn't render React, it just loops through the tags. @@ -725,21 +651,11 @@ object, but instead uses inline JSX to fill that gap. [lib-jsr]: https://jsr.io/@clo/lib [lib-npm]: https://npmjs.com/@paperclover/lib -[§3.2]: #vercel-og - -<Heading - level='h3' - slug='ditching-nextjs' -><code>next/og</code> is Good Too</Heading> +<h3 id='vercel-og'>`next/og` is Good Too</> No strong opinions. I just want to remind everyone that the `@vercel/og` package exists. -[§4]: #experience-feels-like-the-usual - -<Heading - level='h2' - slug='experience-feels-like-the-usual' ->My Experience Feels like the Usual</Heading> +<h2 id='experience-feels-like-the-usual'>My Experience Feels like the Usual</> At the Next.js Conf 2024, everyone there was raving about Server Components. I forget exactly who I talked to, but the big people were all in on this. I, @@ -755,12 +671,7 @@ at Vercel told me they don't like how Next.js is to actually use. I hope as TanStack Start stabilizes, it becomes the Next.js replacement everyone wants. -[§5]: #prefer-respectful-tools - -<Heading - level='h2' - slug='prefer-respectful-tools' ->Prefer Tools that Respect You</Heading> +<h2 id='prefer-respectful-tools'>Prefer Tools that Respect You</> A lot of in the JavaScript ecosystem is a mess. That mess is why web development gets made fun of. There were a lot of times I thought that working @@ -829,8 +740,3 @@ subscribe to the email list: <footer> 2025 (c) paper clover </footer> - -</Layout> - -<br /> - diff --git a/src/blog/pages/webdev/one-year-next-app-router/es.mdx b/src/blog/pages/webdev/one-year-next-app-router/es.mdo similarity index 91% rename from src/blog/pages/webdev/one-year-next-app-router/es.mdx rename to src/blog/pages/webdev/one-year-next-app-router/es.mdo index 5901196a6a53d5d98a28e67d66d8cd43ea8ed479..1ef5def43f25301a4e8429da5aaa67dff9f3f14a 100644 --- a/src/blog/pages/webdev/one-year-next-app-router/es.mdx +++ b/src/blog/pages/webdev/one-year-next-app-router/es.mdo @@ -1,34 +1,20 @@ -import Heading from "@/blog/tags/heading.tsx"; -import TableOfContents from "@/blog/tags/table-of-contents.tsx"; -import { Layout } from "@/blog/tags/layout.tsx"; -export { theme } from "@/blog/tags/layout.tsx"; - -export const meta = { - title: "Un año con el enrutador de aplicación (App Router) de Next.js — por qué decidimos cambiar", - description: "Una crítica de los componentes de servidor de React y Next.js 15.", - keywords: ["webdev", "technical analysis", "opinion"], - authors: ["clover caruso"], - embed: { - thumbnail: "/open-graph/next-js.es.png" - }, - twitter: { - image: "https://paperclover.net/open-graph/next-js.png" - }, - canonical: "/blog/webdev/one-year-next-app-router.es" -}; - -<Layout - meta={meta} - date={'Oct 21st, 2025'} - slug="webdev/one-year-next-app-router" - tags={meta.keywords} - translation={{ - lang: "es", - author: "@trubiso", - href: null, - date: "Jan 13th, 2026" - }} -> +--- +layout: "@/blog/tags/blog-layout.marko" +meta: + title: Un año con el enrutador de aplicación (App Router) de Next.js — por qué decidimos cambiar + description: Una crítica de los componentes de servidor de React y Next.js 15. + keywords: ["webdev", "technical analysis", "opinion"] + authors: ["clover caruso", "trubiso"] + embed: + thumbnail: /open-graph/next-js.es.png + canonical: /blog/webdev/one-year-next-app-router.es +date: "Oct 21st, 2025" +translation: + lang: es + author: "@trubiso" + href: null + date: Jan 13th, 2026 +--- He estado usando [Next.js] profesionalmente para el desarrollo de aplicaciones web en mi trabajo y el diseño de su enrutador de aplicación (App Router) y los @@ -45,29 +31,9 @@ Start] sin problemas. [Next.js]: https://nextjs.org [rsc]: https://react.dev/reference/rsc/server-components -<TableOfContents> +<table-of-contents /> -- [Un repaso técnico: ¿qué son los componentes de servidor?][§1] -- [Los inconvenientes del enrutador de aplicaciones][§2] - - [Las actualizaciones optimistas son imposibles][§2.1] - - [Cada navegación supone una petición][§2.2] - - [Los layouts tienen restricciones artificiales][§2.3] - - [Te llevas todo el contenido dos veces de todas formas][§2.4] - - [Turbopack da asco][§2.5] -- [Dejando atrás Next.js y Vercel en el trabajo][§3] - - [`next/metadata` es maravilloso][§3.1] - - [`next/og` está bien también][§3.2] -- [Mi experiencia parece ser la típica][§4] -- [Opta por herramientas que te respeten][§5] - -</TableOfContents> - -[§1]: #technical-review - -<Heading - level='h2' - slug='technical-review' ->Un repaso técnico: ¿qué son los componentes de servidor?</Heading> +<h2#technical-review>Un repaso técnico: ¿qué son los componentes de servidor?</> El punto clave de RSC es que los componentes se dividen en dos categorías, componentes de <b class='server'>"servidor"</b> y componentes de <b class='client'>"cliente"</b>. Los componentes de servidor pueden usar ni @@ -117,7 +83,7 @@ async function UserPostList({ username }) { const posts = await fetchUserPostList(username); return /* interfaz de usuario de la lista de publicaciones omitida por brevedad */; } -``` +``` El ejemplo anterior no usa nada de JavaScript (sin contar el tamaño del empaquetado _gzipped_ de 40kB del propio React) para la interfaz de usuario ni para la @@ -156,12 +122,7 @@ export function Card() { } ``` -[§2]: #real-world-pitfalls - -<Heading - level='h2' - slug='real-world-pitfalls' ->Los inconvenientes del enrutador de aplicación</Heading> +<h2#real-world-pitfalls>Los inconvenientes del enrutador de aplicación</> Tras dejar [Bun] como ingeniero de runtime (donde implementé el [empaquetado de componentes de servidor][Server Components bundling] y [una plantilla de @@ -177,12 +138,7 @@ inamovible. [Server Components bundling]: https://github.com/oven-sh/bun/blob/67f0c3e016aa479738469adac2b79a1862b88122/src/bake/bake.d.ts [bun-rsc]: https://github.com/oven-sh/bun/tree/e7790894d92b730758ecadf971cb935063508dfb/src/bake/bun-framework-react -[§2.1]: #optimistic-updates - -<Heading - level='h3' - slug='optimistic-updates' ->Las actualizaciones optimistas son imposibles</Heading> +<h3#optimistic-updates>Las actualizaciones optimistas son imposibles</> La documentación de Next.js respecto a la mutación [no menciona las actualizaciones optimistas][nextjs-updating-data], parece ser que no pensaron en @@ -252,7 +208,7 @@ export const queryUserInfo = (username) => ({ ``` ```tsx filename="src/app/user/[username]/page.tsx" tint="server" export default async function Page({ params }) { - const { username } = await params; + const { username } = await params; // No hay estado global en el servidor de React. Como los layouts // se ejecutan en paralelo, toca reconstruir el `QueryClient` de @@ -291,13 +247,7 @@ que poseen `getStaticProps` y `getServerSideProps`. [ws]: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API [nextjs-updating-data]: https://nextjs.org/docs/app/getting-started/updating-data - -[§2.2]: #redundant-fetches - -<Heading - level='h3' - slug='redundant-fetches' ->Cada navegación supone una petición</Heading> +<h3#redundant-fetches>Cada navegación supone una petición</h3> Como el enrutador de aplicación inicia cada página como componente de servidor, con áreas pequeñas de interactividad (idealmente), navegar a una nueva página @@ -405,12 +355,7 @@ export default function PageLoadingSkeleton() { > directamente no lo hace. Por suerte, el tiempo que tarda la llamada RSC en > blanco es suficientemente corto. -[§2.3]: #layout-restrictions - -<Heading - level='h3' - slug='layout-restrictions' ->Los layouts tienen restricciones artificiales</Heading> +<h3#layout-restrictions>Los layouts tienen restricciones artificiales</h3> Los layouts pueden obtener datos, pero no pueden observar o alterar la petición de ninguna manera. Está hecho así para que Next.js pueda obtener y cachear los @@ -429,13 +374,8 @@ de Next.js, no te preocupes, que le voy a dar fuego pronto"*. Estas reglas son demasiado difíciles para que un desarrollador promedio las entienda. [nextjs-fetch]: https://nextjs.org/docs/app/api-reference/functions/fetch - -[§2.4]: #rsc-payload -<Heading - level='h3' - slug='rsc-payload' ->Te llevas todo el contenido dos veces de todas formas</Heading> +<h3#rsc-payload>Te llevas todo el contenido dos veces de todas formas</h3> A diferencia de la ["arquitectura de islas"][islands], los componentes de servidor deben ser hidratados en el frontend para poder emplear `Suspense` y @@ -483,7 +423,7 @@ página sería algo así: // la carga de RSC para la frontera de Suspense self.__next_f.push([2,"14:[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\"{...}"]) </script> - + <!-- se repiten etiquetas HTML y script hasta que la página acaba --> </body> </html> @@ -514,18 +454,13 @@ aparece 27 veces. ¿Qué diablos? ¿¿¿Dais el ancho de banda por gratis??? [islands]: https://www.patterns.dev/vanilla/islands-architecture/ -[§2.5]: #turbopack - -<Heading - level='h3' - slug='turbopack' ->Turbopack da asco</Heading> +<h3#turbopack>Turbopack da asco</h3> Esta sección no es constructiva. - Turbopack no es ágil - Turbopack emite código difícil de depurar (en modo de desarrollo) -- Turbopack produce mensajes de error malos en muchos casos +- Turbopack produce mensajes de error malos en muchos casos Normalmente no le habría dado una sección en el blog a este punto, pero quiero mostrar tres ejemplos de verdad, directamente extraídos del proyecto. @@ -551,12 +486,7 @@ y más mierda. Vale. Todo esto da asco. ¿Qué podemos hacer? -[§3]: #ditching-nextjs - -<Heading - level='h2' - slug='ditching-nextjs' ->Dejando atrás Next.js y Vercel en el trabajo</Heading> +<h2#ditching-nextjs>Dejando atrás Next.js y Vercel en el trabajo</h2> Hay dos tipos de proyectos web: @@ -639,7 +569,7 @@ la página principal del sitio funcionara en TanStack Start e hicimos _merge_. > En esta primera PR (solicitud de incorporación de cambios) sólo funcionaba una > de nuestras páginas, y conseguí que funcionara con unas mil líneas de código > añadido y 40 líneas eliminadas. Algunos parches previos eliminaban los pocos -> usos de `next/image` y `next/font`. +> usos de `next/image` y `next/font`. Lo que quedaba era portar el resto de rutas. Lo único que perdemos al migrar de Next.js a cualquier otro framework es el poder usar `await` con funciones de @@ -679,12 +609,7 @@ año (conversaciones relevantes: [[1][chatgpt-1]] [[2][chatgpt-2]] [[3][chatgpt- [chatgpt-2]: https://old.reddit.com/r/reactjs/comments/1f97zgr/chatgpt_migrates_from_nextjs_to_remix [chatgpt-3]: https://old.reddit.com/r/nextjs/comments/1f92jdv/chatgptcom_switched_from_nextjs_to_remix -[§3.1]: #next-metadata - -<Heading - level='h3' - slug='next-metadata' -><code>next/metadata</code> es maravilloso</Heading> +<h3#next-metadata><code>next/metadata</code> es maravilloso</h3> Bajo mi punto de vista, esta es una de las pocas APIs buenas que tiene Next.js, y fue el único lugar en nuestro código en el que el cambio a TanStack resultó en @@ -728,7 +653,7 @@ export const Route = createFileRoute("/blog")({ // pero se pueden especificar más opciones. embed: { image: "/img/blog.webp", - }, + }, // Todas las etiquetas meta exóticas se hacen con un fragmento // JSX. No se renderiza React, sólo se itera sobre las etiquetas. @@ -752,22 +677,12 @@ metadatos de Next.js; usa JSX en línea (_inline_) para llenar ese hueco. [lib-jsr]: https://jsr.io/@clo/lib [lib-npm]: https://npmjs.com/@paperclover/lib -[§3.2]: #vercel-og - -<Heading - level='h3' - slug='ditching-nextjs' -><code>next/og</code> está bien también</Heading> +<h3#vercel-og><code>next/og</code> está bien también</h3> No tengo una opinión fuerte al respecto. Sólo quiero recordar a todos que existe el paquete `@vercel/og`. -[§4]: #experience-feels-like-the-usual - -<Heading - level='h2' - slug='experience-feels-like-the-usual' ->Mi experiencia parece ser la típica</Heading> +<h2#experience-feels-like-the-usual>Mi experiencia parece ser la típica</h2> En la Next.js Conf 2024, todos hablaban maravillas de los componentes de servidor. No recuerdo exactamente con quién fue que hablé, pero todos los @@ -785,12 +700,7 @@ de Vercel me ha dicho que no les gusta cómo es usar Next.js. Espero que, al estabilizarse TanStack Start, se vuelva el nuevo sustituto de Next.js que todos quieran. -[§5]: #prefer-respectful-tools - -<Heading - level='h2' - slug='prefer-respectful-tools' ->Opta por herramientas que te respeten</Heading> +<h2#prefer-respectful-tools>Opta por herramientas que te respeten</h2> El ecosistema de JavaScript es un desastre y ese desastre es por el que la gente se burla del desarrollo web. Muchas veces he pensado que el desastre de trabajar @@ -861,8 +771,3 @@ integrados). Si te interesa, por favor suscríbete a la lista de correos: <footer> 2025 (c) paper clover </footer> - -</Layout> - -<br /> - diff --git a/src/blog/pages/webdev/one-year-next-app-router/ko.mdx b/src/blog/pages/webdev/one-year-next-app-router/ko.mdo similarity index 92% rename from src/blog/pages/webdev/one-year-next-app-router/ko.mdx rename to src/blog/pages/webdev/one-year-next-app-router/ko.mdo index 6b5198ab3f818595ae21ec37ca921a08e6b9b871..5b1b907d21c690e6d3f0e14fc318bc381961a53a 100644 --- a/src/blog/pages/webdev/one-year-next-app-router/ko.mdx +++ b/src/blog/pages/webdev/one-year-next-app-router/ko.mdo @@ -1,33 +1,20 @@ -import Heading from "@/blog/tags/heading.tsx"; -import TableOfContents from "@/blog/tags/table-of-contents.tsx"; -import { Layout } from "@/blog/tags/layout.tsx"; -export { theme } from "@/blog/tags/layout.tsx"; - -export const meta = { - title: "Next.js 앱 라우터와 함께한 1년 — 우리가 떠나기로 한 이유", - description: "리액트 서버 컴포넌트와 Next.js 15에 대한 비판", - keywords: ["webdev", "technical analysis", "opinion"], - authors: ["clover caruso", "Chanhee Kim"], - embed: { +--- +layout: "@/blog/tags/blog-layout.marko" +meta: + title: Next.js 앱 라우터와 함께한 1년 — 우리가 떠나기로 한 이유 + description: 리액트 서버 컴포넌트와 Next.js 15에 대한 비판 + keywords: ["webdev", "technical analysis", "opinion"] + authors: ["clover caruso", "Chanhee Kim"] + embed: thumbnail: "/open-graph/next-js.ko.png" - }, - twitter: { - image: "https://paperclover.net/open-graph/next-js.ko.png" - }, canonical: "/blog/webdev/one-year-next-app-router.ko" -}; - -<Layout - meta={meta} - date={'Oct 21st, 2025'} - slug="webdev/one-year-next-app-router" - translation={{ - lang: "ko", - author: "Chanhee Kim", - href: "https://substack.com/@chanheekim377573", - date: "Dec 8th, 2025" - }} -> +date: "Oct 21st, 2025" +translation: + lang: "ko" + author: "Chanhee Kim" + href: "https:/\/substack.com/@chanheekim377573" + date: "Dec 8th, 2025" +--- 직장에서 웹 앱 개발에 Next.js를 전문적으로 사용해오면서, 앱 라우터와 [리액트 서버 컴포넌트(React Server Components, RSC)][rsc]의 핵심 설계가 매우 답답하게 느껴졌습니다. 사소한 버그나 API의 혼란스러움이 아니라, Vercel과 리액트 팀이 이를 구축할 때 내린 근본적인 설계 결정에 대한 큰 이견이 있기 때문입니다. @@ -36,29 +23,9 @@ export const meta = { [TanStack Start]: https://tanstack.com/start/latest [rsc]: https://react.dev/reference/rsc/server-components -<TableOfContents> +<table-of-contents /> -- [기술 리뷰: 서버 컴포넌트란 무엇인가요?][§1] -- [실제로 발생하는 앱 라우터의 문제점들][§2] - - [낙관적 업데이트는 불가능합니다][§2.1] - - [모든 탐색은 또 다른 페치 요청입니다][§2.2] - - [레이아웃은 인위적으로 제한됩니다][§2.3] - - [여전히 모든 콘텐츠를 두 번 다운로드합니다][§2.4] - - [터보팩은 구립니다][§2.5] -- [업무에서 Next.js와 Vercel을 매끄럽게 대체하기][§3] - - [`next/metadata`는 훌륭합니다][§3.1] - - [`next/og` 또한 좋습니다][§3.2] -- [제 경험은 일반적인 것 같아요][§4] -- [사용자를 존중하는 도구를 선택하세요][§5] - -</TableOfContents> - -[§1]: #technical-review - -<Heading - level='h2' - slug='technical-review' ->기술 리뷰: 서버 컴포넌트란 무엇인가요?</Heading> +<h2#technical-review>기술 리뷰: 서버 컴포넌트란 무엇인가요?</h2> RSC의 핵심은 컴포넌트를 <b class='server'>"서버"</b> 컴포넌트와 <b class='client'>"클라이언트"</b> 컴포넌트 두 가지 범주로 분류한다는 점입니다. 서버 컴포넌트는 `useState`나 `useEffect`를 사용하지 않지만, `async function`일 수 있으며 데이터베이스에 직접 호출하는 등 백엔드 도구를 참조할 수 있습니다. 클라이언트 컴포넌트는 기존 모델로, 백엔드에서 HTML 텍스트를 생성하는 코드와 `window.document.*`를 사용하여 DOM을 관리하는 프론트엔드 코드가 존재합니다. @@ -131,12 +98,8 @@ export function Card() { } ``` -[§2]: #real-world-pitfalls -<Heading - level='h2' - slug='real-world-pitfalls' ->실제로 발생하는 앱 라우터의 문제점들</Heading> +<h2#real-world-pitfalls>실제로 발생하는 앱 라우터의 문제점들</h2> 런타임 엔지니어로 근무하던 [Bun]을 그만둔 후([서버 컴포넌트 번들링]과 [RSC 템플릿][bun-rsc]을 구현했습니다), 저는 최전선에서 일하는 소규모 회사에 합류했습니다. Hono 백엔드를 가진 Next.js 애플리케이션이었습니다. 다음 내용들은 실제 현장에서 유지보수 및 신규 기능 개발 시 마주친 문제들을 단순화한 것입니다. 이 모든 것들의 결과로 인해, 모두가 설계상의 결함을 우회하거나, 당연히 해결되어야 할 문제가 왜 해결 불가능한 장애물이 되었는지 서로 설명하는 데 시간을 낭비하게 되었습니다. @@ -144,12 +107,8 @@ export function Card() { [서버 컴포넌트 번들링]: https://github.com/oven-sh/bun/blob/67f0c3e016aa479738469adac2b79a1862b88122/src/bake/bake.d.ts [bun-rsc]: https://github.com/oven-sh/bun/tree/e7790894d92b730758ecadf971cb935063508dfb/src/bake/bun-framework-react -[§2.1]: #optimistic-updates -<Heading - level='h3' - slug='optimistic-updates' ->낙관적 업데이트는 불가능합니다</Heading> +<h3#optimistic-updates>낙관적 업데이트는 불가능합니다</h3> Next.js 문서에는 변경 수행 시 [낙관적 업데이트에 대한 언급이 없습니다][nextjs-updating-data]. 이 경우를 고려하지 않은 것으로 보입니다. <b class='server'>리액트 서버</b>에서 렌더링되는 컴포넌트는 설계상 마운팅 후 수정할 수 없습니다. 변경될 수 있는 요소는 클라이언트 컴포넌트 내에 있어야 하지만, 백엔드에서 SSR(서버 측 렌더링) 중에도 클라이언트 컴포넌트에서 데이터 가져오기가 불가능합니다. 이로 인해 데이터 가져오기만 수행하는 어색하게 작은 서버 컴포넌트와, 대부분 정적인 버전의 페이지를 포함하는 클라이언트 컴포넌트가 분리되어 있는 구조가 됩니다. @@ -201,7 +160,7 @@ export const queryUserInfo = (username) => ({ ``` ```tsx filename="src/app/user/[username]/page.tsx" tint="server" export default async function Page({ params }) { - const { username } = await params; + const { username } = await params; // 리액트 서버에는 글로벌 상태가 없습니다. // 레이아웃이 병렬로 실행되기 때문에 TanStack `QueryClient`는 경로 마다 여러 번 재구성되어야 합니다. @@ -221,7 +180,7 @@ export function ClientPage() { const { username } = useParams(); const { data: user } = useSuspenseQuery(queryUserInfo(username)); - // ... 이외의 다른 훅들 + // ... 이외의 다른 훅들 return <main> {/* ... 인터랙티브 웹 페이지 */} @@ -231,12 +190,8 @@ export function ClientPage() { 이 예제는 서버 컴포넌트 번들링 규칙 때문에 반드시 세 개의 별도 파일로 구성되어야 합니다. (클라이언트 컴포넌트는 `"use client"`가 필요하며, 서버 전용 임포트 때문에 서버 컴포넌트 파일은 클라이언트에서 종종 임포트할 수 없습니다.) Pages 라우터에서는 `getStaticProps`와 `getServerSideProps`가 트리 셰이킹을 지원하기 때문에 단일 파일로 구현할 수 있었습니다. -[§2.2]: #redundant-fetches -<Heading - level='h3' - slug='redundant-fetches' ->모든 탐색(navigation)은 또 다른 페치 요청입니다</Heading> +<h3#redundant-fetches>모든 탐색(navigation)은 또 다른 페치 요청입니다</h3> 앱 라우터는 모든 페이지를 서버 컴포넌트로 시작하며 이상적으로는 상호작용 영역이 작기 때문에, 새 페이지로 이동할 때는 클라이언트가 이미 보유한 데이터와 무관하게 Next.js 서버를 다시 호출해야 합니다! `loading.tsx` 파일이 있더라도, `/`를 열고 `/other`로 이동한 후 다시 `/`로 돌아오면 홈페이지를 재로딩하는 동안 로딩 상태가 표시됩니다. @@ -298,12 +253,8 @@ export default function PageLoadingSkeleton() { > 업무에서는 단순히 `loading.tsx` 파일에 `useQuery` 호출을 포함하고 스켈레톤만 표시하도록 만듭니다. Next.js가 실제 서버 컴포넌트를 로드할 때면 어쨌든 페이지 전체가 재마운트되기 때문입니다. 여기서는 VDOM 비교가 발생하지 않으므로, 요청 완료 후 모든 훅(useState)이 약간의 지연후에 초기화됩니다. 기존 DOM만 업데이트하고 상태를 유지하도록 Next.js에 간청하는 간단한 사례를 재현해 보려 했지만, 그렇게 되지 않았습니다. 다행히 빈 RSC 호출에 소요되는 시간은 충분히 짧습니다. -[§2.3]: #layout-restrictions -<Heading - level='h3' - slug='layout-restrictions' ->레이아웃은 인위적으로 제한됩니다</Heading> +<h3#layout-restrictions>레이아웃은 인위적으로 제한됩니다</h3> 레이아웃은 데이터를 가져올 수는 있지만, 요청을 어떤 방식으로든 관찰하거나 변경할 수 없습니다. 이는 Next.js가 원하는 때에 레이아웃을 가져오고 캐시할 수 있도록 하기 위함입니다. 다른 모든 프레임워크에서는 레이아웃이 단순히 일반 컴포넌트일 뿐이며 페이지 컴포넌트와 기능상 차이는 없습니다. @@ -313,12 +264,8 @@ export default function PageLoadingSkeleton() { 동료가 Next.js가 왜 특정 코드를 거부하는지 묻는다면, 기술적 복잡성을 설명하는 건 포기하고 그냥 "Next.js 기술 문제야, 곧 해결할 테니까 걱정 마"라고 말하곤 합니다. 이 규칙들은 일반 개발자들이 이해하기엔 너무 까다롭습니다. -[§2.4]: #rsc-payload -<Heading - level='h3' - slug='rsc-payload' ->여전히 모든 콘텐츠를 두 번 다운로드합니다</Heading> +<h3#rsc-payload>여전히 모든 콘텐츠를 두 번 다운로드합니다</h3> ["아일랜드 아키텍처"][islands]와 달리 서버 컴포넌트는 `Suspense` 지원 및 클라이언트 컴포넌트 상태 보존을 위해 프론트엔드에서 여전히 하이드레이션되어야 합니다. 소프트 네비게이션 시 "RSC 페이로드"(HTML이 전혀 아님)는 `fetch`로 가져옵니다. 새로 고침 시 첫 번째 페인트에는 HTML이 필요하지만, 클라이언트 컴포넌트와 `Suspense` 관련 정보는 해당 HTML에 포함되어 있지 않습니다. 리액트의 해결책은 <b>전체 페이지 마크업의 두 번째 사본을 전송하는 것</b>입니다. Next.js 프로덕션 서버가 동적 페이지 렌더링 시 전송하는 예시는 다음과 같습니다. @@ -357,7 +304,7 @@ export default function PageLoadingSkeleton() { // 서스펜스 경계에 대한 RSC 페이로드 self.__next_f.push([2,"14:[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\"{...}"]) </script> - + <!-- HTML 및 스크립트 태그는 페이지 전체가 완료될 때까지 반복됩니다 --> </body> </html> @@ -371,12 +318,8 @@ Mac에서는 <kbd>Cmd</kbd> + <kbd>Opt</kbd> + <kbd>u</kbd>를, 다른 플랫폼 이런 RSC 형식은 분명히 더 많은 낭비를 낳습니다. 하지만 정말로 `/_next/static/chunks/6192a3719cda7dcc.js`라는 문자열이 27번이나 따로따로 나타나는 이유를 캐내고 싶진 않네요. 뭐야, 너희들. 대역폭이 공짜냐??? -[§2.5]: #turbopack -<Heading - level='h3' - slug='turbopack' ->터보팩은 구립니다</Heading> +<h3#turbopack>터보팩은 구립니다</h3> 이 섹션은 건설적이지 않습니다. @@ -400,12 +343,8 @@ Mac에서는 <kbd>Cmd</kbd> + <kbd>Opt</kbd> + <kbd>u</kbd>를, 다른 플랫폼 네. 이 모든게 구립니다. 어쩌면 좋을까요? -[§3]: #ditching-nextjs -<Heading - level='h2' - slug='ditching-nextjs' ->업무에서 Next.js와 Vercel을 매끄럽게 대체하기</Heading> +<h2#ditching-nextjs>업무에서 Next.js와 Vercel을 매끄럽게 대체하기</h2> 웹 프로젝트에는 두 가지 유형이 있습니다. @@ -490,12 +429,8 @@ export default function LinkAdapter({ href, ...rest }: LinkProps) { [chatgpt-2]: https://old.reddit.com/r/reactjs/comments/1f97zgr/chatgpt_migrates_from_nextjs_to_remix [chatgpt-3]: https://old.reddit.com/r/nextjs/comments/1f92jdv/chatgptcom_switched_from_nextjs_to_remix -[§3.1]: #next-metadata -<Heading - level='h3' - slug='next-metadata' -><code>next/metadata</code>는 훌륭합니다</Heading> +<h3#next-metadata><code>next/metadata</code>는 훌륭합니다</h3> 제 생각에 이건 Next.js가 가진 몇 안 되는 좋은 API 중 하나이며, TanStack으로 전환하면서 코드에서 유일하게 작업이 더 어려워진 부분이었습니다. 코드를 악화시키기보다는, 그냥 그들의 메타데이터 API를 일반 함수로 포팅해서 누구나 사용할 수 있게 했습니다. 원래는 NPM에 1:1 포팅 버전을 올렸지만, 올해 초에 API를 간결하고 이해하기 쉬운 하나의 파일로 단순화했습니다. 이 블로그 글 작성 시점 기준으로, TanStack 호환 `meta.toTags` API를 추가했으며, [JSR][lib-jsr]이나 [NPM][lib-npm]에서 설치하거나 단순히 프로젝트에 복사해서 사용할 수 있습니다. @@ -526,7 +461,7 @@ export const Route = createFileRoute("/blog")({ // 기본값도 괜찮지만, 더 많은 옵션을 지원합니다. embed: { image: "/img/blog.webp", - }, + }, // 모든 특수 메타 태그는 JSX 프래그먼트로 처리됩니다. // 이는 리액트 렌더링하지 않고 단순히 태그를 순회합니다. @@ -549,21 +484,11 @@ function Page() { [lib-jsr]: https://jsr.io/@clo/lib [lib-npm]: https://npmjs.com/@paperclover/lib -[§3.2]: #vercel-og - -<Heading - level='h3' - slug='ditching-nextjs' -><code>next/og</code> 또한 좋습니다</Heading> +<h3#vercel-og><code>next/og</code> 또한 좋습니다</h3> 특별한 의견은 없습니다. 그냥 `@vercel/og` 패키지가 있다는 점을 모두에게 상기시키고 싶을 뿐입니다. -[§4]: #experience-feels-like-the-usual - -<Heading - level='h2' - slug='experience-feels-like-the-usual' ->제 경험은 일반적인 것 같아요</Heading> +<h2#experience-feels-like-the-usual>제 경험은 일반적인 것 같아요</h2> Next.js Conf 2024에서 참석자 모두가 서버 컴포넌트(Server Components)에 열광했습니다. 정확히 누구와 이야기했는지는 기억나지 않지만, 주요 인사들은 모두 이 기술에 주목하고 있었습니다. RSC의 번들러 부분을 구현한 저는 이 포맷의 몇 가지 문제점을 목격했습니다. Next 15가 지난해 App Router를 "안정화"하면서 많은 기업들이 이를 기반으로 제품을 구축하고 있으며, 이러한 문제점들을 직접 경험하고 있습니다. @@ -571,12 +496,8 @@ Next.js Conf 2024에서 참석자 모두가 서버 컴포넌트(Server Component TanStack Start가 안정화되면서 모두가 원하는 Next.js 대체 솔루션이 되길 바랍니다. -[§5]: #prefer-respectful-tools -<Heading - level='h2' - slug='prefer-respectful-tools' ->사용자를 존중하는 도구를 선택하세요</Heading> +<h2#prefer-respectful-tools>사용자를 존중하는 도구를 선택하세요</h2> 자바스크립트 생태계는 상당 부분 엉망이고, 그 때문인지 웹 개발은 종종 조롱의 대상이 됩니다.. 저는 웹 작업을 회복 불가능한 난장판이라고 생각했던 적이 수없이 많았지만, 그 혼란은 사실 제가 둘러싸고 있던 흔히 쓰이는 라이브러리들 때문이었습니다. 그 껍질을 벗겨내면 현대 웹 개발 기술은 정말 대단합니다. @@ -618,7 +539,3 @@ Next.js Conf 2025는 글을 쓰는 시점 기준으로 [내일][next-conf]입니 <footer> 2025 (c) paper clover </footer> - -</Layout> - -<br /> diff --git a/src/blog/tags/blog-layout.marko b/src/blog/tags/blog-layout.marko new file mode 100644 index 0000000000000000000000000000000000000000..0aac1d4174caa2b76618fb52239b229ebf58b27b --- /dev/null +++ b/src/blog/tags/blog-layout.marko @@ -0,0 +1,107 @@ +import "../blog.css"; +export const theme = { + bg: "#271a30", + fg: "#ffffff", + primary: "#91ffc6", +}; +export const components = { + heading: Heading, + codeBlock: CodeBlock +}; + +export interface Module { + meta: { + title: string; + description: string; + keywords: string[]; + canonical: string; + }; + date: string; + content: render.Node; + translation?: { + lang: string; + author: string; + href: string; + date: string; + }; +} +export interface Input { + module: Module; +} + +export interface Context { + outline: markodown.Heading[]; +} + +export const markoOnly = true; + +<const/module: Module = input.module /> +<const/{ date, translation } = module /> +<const/{ title, description, keywords, canonical } = module.meta /> +<const/slug = canonical.replace(/^\/blog\/|\.[a-zA-Z_-]+$/g, '') /> + +<const/translations= + Path.resolve(import.meta.dirname, "../pages/" + slug).readDirSync() + .filter((x) => x.ext === ".mdo" && x.baseWithoutExt !== "en") + .map((x) => x.baseWithoutExt) /> +<const/t = UNWRAP(localization.languages[translation?.lang ?? "en"]) /> + +<const/_=(() => { + $global.cloverOutline = input.outline; +})() /> + +<main> +<header> +<a href="/">${t.return}</a> + +<h1 style={ 'max-width': "30ch" }>${title}</> +<p class="description"><em>${description}</em></p> + +<div.meta> + <a class="meta-author" href="/">${t.writtenByClover}</a> + <span>•</span> + <if=translation> + <a.meta-translate href=translation.href> + ${t.translatedBy(translation)} + </a> + <span>•</span> + </> + <span.meta-date>${date}</span> +</div> +<div.tag-list> + <if=translations.length> + <a + class=["custom tag lang lang-original", { active: !translation }] + href=`/blog/${slug}` + > + ${localization.languages.en.title} + </a> + <for|code| of=translations> + <a + class=["custom tag lang", { active: code === translation?.lang }] + href=`/blog/${slug}.${code}` + > + ${UNWRAP(localization.languages[code]).title} + </a> + </> + <a.custom.tag.square href="/blog/community-translations">${"+"}</a> + <span.bar /> + </> + <for|tag| of=keywords> + <div.tag>${tag}</div> + </> +</div> + +<hr /> +</header> + +<${input.content} /> + +</main> + +import * as localization from "../localization.tsx"; +import * as markodown from "@clo/markodown"; +import Heading from "./heading.marko"; +import CodeBlock from "./code-block.marko"; +import { Path } from "#sitegen/path"; +import { UNWRAP } from "lib/assert.ts"; diff --git a/src/blog/tags/code-block.marko b/src/blog/tags/code-block.marko new file mode 100644 index 0000000000000000000000000000000000000000..7e7a4ecc16eef4230ded971dea5f1e3dc978a298 --- /dev/null +++ b/src/blog/tags/code-block.marko @@ -0,0 +1,15 @@ +<const/{ filename, language, tint, whitespace, content } = input /> + +<const/highlightedPromise = ["tsx", "jsx", "json", "html", "ts", "js"].includes(language) + ? highlight.highlightCode(content.trim(), language) + : content.trim() +/> + +<figure class=["code", tint]> +<if=filename><figcaption>${filename}</figcaption></> +<await|highlighted|=highlightedPromise> + <pre style=whitespace ? { "white-space": whitespace } : {}><code>$!{highlighted}</code></pre> +</> +</figure> + +import * as highlight from "@/file-viewer/highlight.ts"; diff --git a/src/blog/tags/heading.marko b/src/blog/tags/heading.marko new file mode 100644 index 0000000000000000000000000000000000000000..681937968af399872bced2cee9cf6a697c18eef7 --- /dev/null +++ b/src/blog/tags/heading.marko @@ -0,0 +1,5 @@ +<const/{ level, content, ...attrs } = input /> +<${'h' + level} ...attrs> + <a.return href="#toc">§</a> + <${content} /> +</> diff --git a/src/blog/tags/heading.tsx b/src/blog/tags/heading.tsx deleted file mode 100644 index 7c0044481a5372040aeae4c6a0d4f3455ec79849..0000000000000000000000000000000000000000 --- a/src/blog/tags/heading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -export default function ({ level: Level, slug, content }) { - return ( - <> - <Level id={slug}> - <a class="return" href="#toc">§</a> - {content} - </Level> - </> - ); -} diff --git a/src/blog/tags/layout.tsx b/src/blog/tags/layout.tsx deleted file mode 100644 index 85450d6f0c4a52cf0bc5ae1149258aa5d77402a5..0000000000000000000000000000000000000000 --- a/src/blog/tags/layout.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import "../blog.css"; -import { Path } from "#sitegen/path"; - -export const theme = { - bg: "#271a30", - fg: "#ffffff", - primary: "#91ffc6", -}; - -interface LayoutProps { - meta: { title: string; description: string; keywords: string[] }; - date: string; - slug: string; - content: render.Node; - translation?: { - lang: string; - - author: string; - href: string; - - date: string; - }; -} - -export async function Layout({ - meta: { title, description, keywords }, - date, - slug, - content, - translation, -}: LayoutProps) { - const translations = - (await Path.resolve(import.meta.dirname, "../pages/" + slug).readDir()) - .filter((x) => x.ext === ".mdx" && x.baseWithoutExt !== "en") - .map((x) => x.baseWithoutExt); - const t = UNWRAP(localization.languages[translation?.lang ?? "en"]); - return ( - <> - <main> - <header> - <a href="/">{t.return}</a> - - <h1 style="max-width: 30ch">{title}</h1> - <p class="description"> - <em>{description}</em> - </p> - <div class="meta"> - <a class="meta-author" href="/">{t.writtenByClover}</a> - <span>•</span> - {translation - ? ( - <> - <a href={translation.href} class="meta-translate"> - {t.translatedBy(translation)} - </a> - <span>•</span> - </> - ) - : ""} - <span class="meta-date">{date}</span> - </div> - <div class="tag-list"> - {translations.length > 0 - ? ( - <> - <a - href={`/blog/${slug}`} - class={["custom", "tag", "lang", "lang-original", { - active: !translation, - }]} - > - {localization.languages.en.title} - </a> - {translations.map((code) => ( - <a - class={["custom", "tag", "lang", { - active: code === translation?.lang, - }]} - href={`/blog/${slug}.${code}`} - > - {UNWRAP(localization.languages[code]).title} - </a> - ))} - <a - href="/blog/community-translations" - class="custom tag square" - > - + - </a> - <span class="bar"></span> - </> - ) - : ""} - {keywords.map((tag) => <div class="tag">{tag}</div>)} - </div> - <hr /> - </header> - {content} - </main> - </> - ); -} - -import * as localization from "../localization.tsx"; -import { UNWRAP } from "lib/assert.ts"; -import * as render from "lib/render.ts"; diff --git a/src/blog/tags/table-of-contents.marko b/src/blog/tags/table-of-contents.marko new file mode 100644 index 0000000000000000000000000000000000000000..0c58760526fad2cc6fe9415656a5e3abe946f1cc --- /dev/null +++ b/src/blog/tags/table-of-contents.marko @@ -0,0 +1,29 @@ +import "./table-of-contents.css"; + +export interface Node { + heading: markodown.Heading; + children: Node[]; +} + +<const/outline = $global.cloverOutline /> +<const/groups = markodown.outlineToTree(outline) /> + +<define/Recurse|input: markodown.HeadingTree|> + <a href=`#${input.id}`><${input.content} /></a> + <if=input.children.length> + <ul> + <for|item| of=input.children> + <li><Recurse ...item /></li> + </> + </ul> + </> +</> + +<div#toc> + <h2>Contents:</h2> + <ul><for|item| of=groups> + <li><Recurse ...item /></li> + </></ul> +</div> + +import * as markodown from "@clo/markodown"; diff --git a/src/blog/tags/table-of-contents.tsx b/src/blog/tags/table-of-contents.tsx deleted file mode 100644 index bf04ef4df73493c7e179d236df3c8e7f1e7e97a1..0000000000000000000000000000000000000000 --- a/src/blog/tags/table-of-contents.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import "./table-of-contents.css"; - -export default function ({ content }) { - return ( - <div id="toc"> - <h2>Contents:</h2> - {content} - </div> - ); -} diff --git a/src/file-viewer/highlight-grammar/mdx.plist b/src/file-viewer/highlight-grammar/mdx.plist deleted file mode 100644 index bc24b8ef27da54a9128eeb0de1f3312eddb1c320..0000000000000000000000000000000000000000 --- a/src/file-viewer/highlight-grammar/mdx.plist +++ /dev/null @@ -1,9527 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> - <dict> - <key>fileTypes</key> - <array> - <string>mdx</string> - </array> - <key>name</key> - <string>MDX</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-frontmatter</string> - </dict> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>repository</key> - <dict> - <key>markdown-frontmatter</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#extension-toml</string> - </dict> - <dict> - <key>include</key> - <string>#extension-yaml</string> - </dict> - </array> - </dict> - <key>markdown-sections</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#commonmark-block-quote</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced</string> - </dict> - <dict> - <key>include</key> - <string>#extension-gfm-footnote-definition</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-definition</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-heading-atx</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-thematic-break</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-heading-setext</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-list-item</string> - </dict> - <dict> - <key>include</key> - <string>#extension-gfm-table</string> - </dict> - <dict> - <key>include</key> - <string>#extension-math-flow</string> - </dict> - <dict> - <key>include</key> - <string>#extension-mdx-esm</string> - </dict> - <dict> - <key>include</key> - <string>#extension-mdx-expression-flow</string> - </dict> - <dict> - <key>include</key> - <string>#extension-mdx-jsx-flow</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-paragraph</string> - </dict> - </array> - </dict> - <key>markdown-string</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#commonmark-character-escape</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-character-reference</string> - </dict> - </array> - </dict> - <key>markdown-text</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#commonmark-attention</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-character-escape</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-character-reference</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-text</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-hard-break-trailing</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-hard-break-escape</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-label-end</string> - </dict> - <dict> - <key>include</key> - <string>#extension-gfm-footnote-call</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-label-start</string> - </dict> - <dict> - <key>include</key> - <string>#extension-gfm-autolink-literal</string> - </dict> - <dict> - <key>include</key> - <string>#extension-gfm-strikethrough</string> - </dict> - <dict> - <key>include</key> - <string>#extension-github-gemoji</string> - </dict> - <dict> - <key>include</key> - <string>#extension-github-mention</string> - </dict> - <dict> - <key>include</key> - <string>#extension-github-reference</string> - </dict> - <dict> - <key>include</key> - <string>#extension-math-text</string> - </dict> - <dict> - <key>include</key> - <string>#extension-mdx-expression-text</string> - </dict> - <dict> - <key>include</key> - <string>#extension-mdx-jsx-text</string> - </dict> - </array> - </dict> - <key>commonmark-attention</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(?<=\S)\*{3,}|\*{3,}(?=\S)</string> - <key>name</key> - <string>string.other.strong.emphasis.asterisk.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=[\p{L}\p{N}])_{3,}(?![\p{L}\p{N}])|(?<=\p{P})_{3,}|(?<![\p{L}\p{N}]|\p{P})_{3,}(?!\s)</string> - <key>name</key> - <string>string.other.strong.emphasis.underscore.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=\S)\*{2}|\*{2}(?=\S)</string> - <key>name</key> - <string>string.other.strong.asterisk.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=[\p{L}\p{N}])_{2}(?![\p{L}\p{N}])|(?<=\p{P})_{2}|(?<![\p{L}\p{N}]|\p{P})_{2}(?!\s)</string> - <key>name</key> - <string>string.other.strong.underscore.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=\S)\*|\*(?=\S)</string> - <key>name</key> - <string>string.other.emphasis.asterisk.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=[\p{L}\p{N}])_(?![\p{L}\p{N}])|(?<=\p{P})_|(?<![\p{L}\p{N}]|\p{P})_(?!\s)</string> - <key>name</key> - <string>string.other.emphasis.underscore.mdx</string> - </dict> - </array> - </dict> - <key>commonmark-block-quote</key> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(>)[ ]?</string> - <key>beginCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>markup.quote.mdx</string> - </dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.quote.begin.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>name</key> - <string>markup.quote.mdx</string> - <key>while</key> - <string>(>)[ ]?</string> - <key>whileCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>markup.quote.mdx</string> - </dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.quote.begin.mdx</string> - </dict> - </dict> - </dict> - <key>commonmark-character-escape</key> - <dict> - <key>match</key> - <string>\\(?:[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])</string> - <key>name</key> - <string>constant.language.character-escape.mdx</string> - </dict> - <key>commonmark-character-reference</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#whatwg-html-data-character-reference-named-terminated</string> - </dict> - <dict> - <key>match</key> - <string>(&)(#)([Xx])([0-9A-Fa-f]{1,6})(;)</string> - <key>name</key> - <string>constant.language.character-reference.numeric.hexadecimal.html</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.begin.html</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.numeric.html</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.numeric.hexadecimal.html</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>constant.numeric.integer.hexadecimal.html</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.end.html</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(&)(#)([0-9]{1,7})(;)</string> - <key>name</key> - <string>constant.language.character-reference.numeric.decimal.html</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.begin.html</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.numeric.html</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>constant.numeric.integer.decimal.html</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.end.html</string> - </dict> - </dict> - </dict> - </array> - </dict> - <key>commonmark-code-fenced</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-apib</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-asciidoc</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-c</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-clojure</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-coffee</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-console</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-cpp</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-cs</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-css</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-diff</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-dockerfile</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-elixir</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-elm</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-erlang</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-gitconfig</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-go</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-graphql</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-haskell</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-html</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-ini</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-java</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-js</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-json</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-julia</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-kotlin</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-less</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-less</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-lua</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-makefile</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-md</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-mdx</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-objc</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-perl</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-php</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-php</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-python</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-r</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-raku</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-ruby</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-rust</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-scala</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-scss</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-shell</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-shell-session</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-sql</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-svg</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-swift</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-toml</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-ts</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-tsx</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-vbnet</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-xml</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-yaml</string> - </dict> - <dict> - <key>include</key> - <string>#commonmark-code-fenced-unknown</string> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-unknown</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?:[^\t\n\r` ])+)(?:[\t ]+((?:[^\n\r`])+))?)?(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>contentName</key> - <string>markup.raw.code.fenced.mdx</string> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.other.mdx</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?:[^\t\n\r ])+)(?:[\t ]+((?:[^\n\r])+))?)?(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>contentName</key> - <string>markup.raw.code.fenced.mdx</string> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.other.mdx</string> - </dict> - </array> - </dict> - <key>commonmark-code-text</key> - <dict> - <key>match</key> - <string>(?<!`)(`+)(?!`)(.+?)(?<!`)(\1)(?!`)</string> - <key>name</key> - <string>markup.code.other.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>markup.raw.code.mdx markup.inline.raw.code.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.end.code.mdx</string> - </dict> - </dict> - </dict> - <key>commonmark-definition</key> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(\[)((?:[^\[\\\]]|\\[\[\\\]]?)+?)(\])(:)[ \t]*(?:(<)((?:[^\n<\\>]|\\[<\\>]?)*)(>)|(\g<destination_raw>))(?:[\t ]+(?:(")((?:[^"\\]|\\["\\]?)*)(")|(')((?:[^'\\]|\\['\\]?)*)(')|(\()((?:[^\)\\]|\\[\)\\]?)*)(\))))?$(?<destination_raw>(?!\<)(?:(?:[^\p{Cc}\ \\\(\)]|\\[\(\)\\]?)|\(\g<destination_raw>*\))+){0}</string> - <key>name</key> - <string>meta.link.reference.def.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.identifier.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>punctuation.separator.key-value.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.begin.destination.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>string.other.link.destination.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.end.destination.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>string.other.link.destination.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>10</key> - <dict> - <key>name</key> - <string>string.quoted.double.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>11</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>12</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>13</key> - <dict> - <key>name</key> - <string>string.quoted.single.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>14</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>15</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>16</key> - <dict> - <key>name</key> - <string>string.quoted.paren.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>17</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - </dict> - </dict> - <key>commonmark-hard-break-escape</key> - <dict> - <key>match</key> - <string>\\$</string> - <key>name</key> - <string>constant.language.character-escape.line-ending.mdx</string> - </dict> - <key>commonmark-hard-break-trailing</key> - <dict> - <key>match</key> - <string>( ){2,}$</string> - <key>name</key> - <string>carriage-return constant.language.character-escape.line-ending.mdx</string> - </dict> - <key>commonmark-heading-atx</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(#{1}(?!#))(?:[ \t]+([^\r\n]+?)(?:[ \t]+(#+?))?)?[ \t]*$</string> - <key>name</key> - <string>markup.heading.atx.1.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.section.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(#{2}(?!#))(?:[ \t]+([^\r\n]+?)(?:[ \t]+(#+?))?)?[ \t]*$</string> - <key>name</key> - <string>markup.heading.atx.2.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.section.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(#{3}(?!#))(?:[ \t]+([^\r\n]+?)(?:[ \t]+(#+?))?)?[ \t]*$</string> - <key>name</key> - <string>markup.heading.atx.3.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.section.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(#{4}(?!#))(?:[ \t]+([^\r\n]+?)(?:[ \t]+(#+?))?)?[ \t]*$</string> - <key>name</key> - <string>markup.heading.atx.4.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.section.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(#{5}(?!#))(?:[ \t]+([^\r\n]+?)(?:[ \t]+(#+?))?)?[ \t]*$</string> - <key>name</key> - <string>markup.heading.atx.5.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.section.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(#{6}(?!#))(?:[ \t]+([^\r\n]+?)(?:[ \t]+(#+?))?)?[ \t]*$</string> - <key>name</key> - <string>markup.heading.atx.6.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.section.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.heading.mdx</string> - </dict> - </dict> - </dict> - </array> - </dict> - <key>commonmark-heading-setext</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(={1,})[ \t]*$</string> - <key>name</key> - <string>markup.heading.setext.1.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*(-{1,})[ \t]*$</string> - <key>name</key> - <string>markup.heading.setext.2.mdx</string> - </dict> - </array> - </dict> - <key>commonmark-label-end</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(\])(\()[\t ]*(?:(?:(<)((?:[^\n<\\>]|\\[<\\>]?)*)(>)|(\g<destination_raw>))(?:[\t ]+(?:(")((?:[^"\\]|\\["\\]?)*)(")|(')((?:[^'\\]|\\['\\]?)*)(')|(\()((?:[^\)\\]|\\[\)\\]?)*)(\))))?)?[\t ]*(\))(?<destination_raw>(?!\<)(?:(?:[^\p{Cc}\ \\\(\)]|\\[\(\)\\]?)|\(\g<destination_raw>*\))+){0}</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.begin.destination.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>string.other.link.destination.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.end.destination.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>string.other.link.destination.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>string.quoted.double.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>10</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>11</key> - <dict> - <key>name</key> - <string>string.quoted.single.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>12</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>13</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>14</key> - <dict> - <key>name</key> - <string>string.quoted.paren.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>15</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>16</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(\])(\[)((?:[^\[\\\]]|\\[\[\\\]]?)+?)(\])</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>string.other.begin.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>entity.name.identifier.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(\])</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.mdx</string> - </dict> - </dict> - </dict> - </array> - </dict> - <key>commonmark-label-start</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>\!\[(?!\^)</string> - <key>name</key> - <string>string.other.begin.image.mdx</string> - </dict> - <dict> - <key>match</key> - <string>\[</string> - <key>name</key> - <string>string.other.begin.link.mdx</string> - </dict> - </array> - </dict> - <key>commonmark-list-item</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*((?:[*+-]))(?:[ ]{4}(?![ ])|\t)(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>variable.unordered.list.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)[ ]{1}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*((?:[*+-]))(?:[ ]{3}(?![ ]))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>variable.unordered.list.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*((?:[*+-]))(?:[ ]{2}(?![ ]))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>variable.unordered.list.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)[ ]{3}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*((?:[*+-]))(?:[ ]{1}|(?=\n))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>variable.unordered.list.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)[ ]{2}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*([0-9]{9})((?:\.|\)))(?:[ ]{4}(?![ ])|\t(?![\t ]))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){3}[ ]{2}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{9})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{8})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){3}[ ]{1}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{9})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{8})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{7})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){3}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{9})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{8})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{7})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{6})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){2}[ ]{3}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{8})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{7})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{6})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{5})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){2}[ ]{2}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{7})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{6})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{5})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{4})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){2}[ ]{1}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{6})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{5})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{4})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{3})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t){2}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{5})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{4})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{3})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{2})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)[ ]{3}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{4})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{3})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{2})((?:\.|\)))(?:[ ]{3}(?![ ]))|([0-9]{1})((?:\.|\)))(?:[ ]{4}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>9</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)[ ]{2}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{3})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9]{2})((?:\.|\)))(?:[ ]{2}(?![ ]))|([0-9]{1})((?:\.|\)))(?:[ ]{3}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)[ ]{1}</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?:([0-9]{2})((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))|([0-9])((?:\.|\)))(?:[ ]{2}(?![ ])))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)</string> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*([0-9])((?:\.|\)))(?:[ ]{1}|(?=[ \t]*\n))(\[[\t Xx]\](?=[\t\n\r ]+(?:$|[^\t\n\r ])))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.number.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>variable.ordered.list.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>keyword.other.tasklist.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)[ ]{3}</string> - </dict> - </array> - </dict> - <key>commonmark-paragraph</key> - <dict> - <key>begin</key> - <string>(?![\t ]*$)</string> - <key>name</key> - <string>meta.paragraph.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - <key>while</key> - <string>(?:^|\G)(?:[ ]{4}|\t)</string> - </dict> - <key>commonmark-thematic-break</key> - <dict> - <key>match</key> - <string>(?:^|\G)[\t ]*([-*_])[ \t]*(?:\1[ \t]*){2,}$</string> - <key>name</key> - <string>meta.separator.mdx</string> - </dict> - <key>extension-gfm-autolink-literal</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(?<=^|[\t\n\r \(\*\_\[\]~])(?=(?i:www)\.[^\n\r])(?:(?:[\p{L}\p{N}]|-|[\._](?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[]))))+\g<path>?)?(?<path>(?:(?:[^\t\n\r !"&'\(\)\*,\.:;<\?\]_~]|&(?![A-Za-z]*;(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[])))|[!"'\)\*,\.:;\?_~](?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[]))))|\(\g<path>*\))+){0}</string> - <key>name</key> - <string>string.other.link.autolink.literal.www.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=^|[^A-Za-z])(?i:https?://)(?=[\p{L}\p{N}])(?:(?:[\p{L}\p{N}]|-|[\._](?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[]))))+\g<path>?)?(?<path>(?:(?:[^\t\n\r !"&'\(\)\*,\.:;<\?\]_~]|&(?![A-Za-z]*;(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[])))|[!"'\)\*,\.:;\?_~](?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[]))))|\(\g<path>*\))+){0}</string> - <key>name</key> - <string>string.other.link.autolink.literal.http.mdx</string> - </dict> - <dict> - <key>match</key> - <string>(?<=^|[^A-Za-z/])(?i:mailto:|xmpp:)?(?:[0-9A-Za-z+\-\._])+@(?:(?:[0-9A-Za-z]|[-_](?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[]))))+(?:\.(?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[])))))+(?:[A-Za-z]|[-_](?!(?:[!"'\)\*,\.:;<\?_~]*(?:[\s<]|\][\t\n \(\[]))))+</string> - <key>name</key> - <string>string.other.link.autolink.literal.email.mdx</string> - </dict> - </array> - </dict> - <key>extension-gfm-footnote-call</key> - <dict> - <key>match</key> - <string>(\[)(\^)((?:[^\t\n\r \[\\\]]|\\[\[\\\]]?)+)(\])</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.link.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>string.other.begin.footnote.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>entity.name.identifier.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>string.other.end.footnote.mdx</string> - </dict> - </dict> - </dict> - <key>extension-gfm-footnote-definition</key> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(\[)(\^)((?:[^\t\n\r \[\\\]]|\\[\[\\\]]?)+)(\])(:)[\t ]*</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.link.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>string.other.begin.footnote.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>entity.name.identifier.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>string.other.end.footnote.mdx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-sections</string> - </dict> - </array> - <key>while</key> - <string>^(?=[\t ]*$)|(?:^|\G)(?:[ ]{4}|\t)</string> - </dict> - <key>extension-gfm-strikethrough</key> - <dict> - <key>match</key> - <string>(?<=\S)(?<!~)~{1,2}(?!~)|(?<!~)~{1,2}(?=\S)(?!~)</string> - <key>name</key> - <string>string.other.strikethrough.mdx</string> - </dict> - <key>extension-gfm-table</key> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(?=\|[^\n\r]+\|[ \t]*$)</string> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(?<=\||(?:^|\G))[\t ]*((?:[^\n\r\\\|]|\\[\\\|]?)+?)[\t ]*(?=\||$)</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-text</string> - </dict> - </array> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?:\|)</string> - <key>name</key> - <string>markup.list.table-delimiter.mdx</string> - </dict> - </array> - <key>end</key> - <string>^(?=[\t ]*$)|$</string> - </dict> - <key>extension-github-gemoji</key> - <dict> - <key>match</key> - <string>(:)((?:(?:(?:hand_with_index_finger_and_thumb_cros|mailbox_clo|fist_rai|confu)s|r(?:aised_hand_with_fingers_splay|e(?:gister|l(?:iev|ax)))|disappointed_reliev|confound|(?:a(?:ston|ngu)i|flu)sh|unamus|hush)e|(?:chart_with_(?:down|up)wards_tre|large_orange_diamo|small_(?:orang|blu)e_diamo|large_blue_diamo|parasol_on_grou|loud_sou|rewi)n|(?:rightwards_pushing_h|hourglass_flowing_s|leftwards_(?:pushing_)?h|(?:raised_back_of|palm_(?:down|up)|call_me)_h|(?:(?:(?:clippert|ascensi)on|norfolk)_is|christmas_is|desert_is|bouvet_is|new_zea|thai|eng|fin|ire)l|rightwards_h|pinching_h|writing_h|s(?:w(?:itzer|azi)|cot)l|magic_w|ok_h|icel)an|s(?:un_behind_(?:large|small|rain)_clou|hallow_pan_of_foo|tar_of_davi|leeping_be|kateboar|a(?:tisfie|uropo)|hiel|oun|qui)|(?:ear_with_hearing_a|pouring_liqu)i|(?:identification_c|(?:arrow_(?:back|for)|fast_for)w|credit_c|woman_be|biohaz|man_be|l(?:eop|iz))ar|m(?:usical_key|ortar_)boar|(?:drop_of_bl|canned_f)oo|c(?:apital_abc|upi)|person_bal|(?:black_bi|(?:cust|plac)a)r|(?:clip|key)boar|mermai|pea_po|worrie|po(?:la|u)n|threa|dv)d|(?:(?:(?:face_with_open_eyes_and_hand_over|face_with_diagonal|open|no)_mou|h(?:and_over_mou|yacin)|mammo)t|running_shirt_with_sas|(?:(?:fishing_pole_and_|blow)fi|(?:tropical_f|petri_d)i|(?:paint|tooth)bru|banglade|jellyfi)s|(?:camera_fl|wavy_d)as|triump|menora|pouc|blus|watc|das|has)h|(?:s(?:o(?:(?:uth_georgia_south_sandwich|lomon)_island|ck)|miling_face_with_three_heart|t_kitts_nevi|weat_drop|agittariu|c(?:orpiu|issor)|ymbol|hort)|twisted_rightwards_arrow|(?:northern_mariana|heard_mcdonald|(?:british_virgi|us_virgi|pitcair|cayma)n|turks_caicos|us_outlying|(?:falk|a)land|marshall|c(?:anary|ocos)|faroe)_island|(?:face_holding_back_tea|(?:c(?:ard_index_divid|rossed_fing)|pinched_fing)e|night_with_sta)r|(?:two_(?:wo)?men_holding|people_holding|heart|open)_hand|(?:sunrise_over_mountai|(?:congratul|united_n)atio|jea)n|(?:caribbean_)?netherland|(?:f(?:lower_playing_car|ace_in_clou)|crossed_swor|prayer_bea)d|(?:money_with_win|nest_with_eg|crossed_fla|hotsprin)g|revolving_heart|(?:high_brightne|(?:expression|wire)le|(?:tumbler|wine)_gla|milk_gla|compa|dre)s|performing_art|earth_america|orthodox_cros|l(?:ow_brightnes|a(?:tin_cros|o)|ung)|no_pedestrian|c(?:ontrol_kno|lu)b|b(?:ookmark_tab|rick|ean)|nesting_doll|cook_island|(?:fleur_de_l|tenn)i|(?:o(?:ncoming_b|phiuch|ctop)|hi(?:ppopotam|bisc)|trolleyb|m(?:(?:rs|x)_cla|auriti|inib)|belar|cact|abac|(?:cyp|tau)r)u|medal_sport|(?:chopstic|firewor)k|rhinocero|(?:p(?:aw_prin|eanu)|footprin)t|two_heart|princes|(?:hondur|baham)a|barbado|aquariu|c(?:ustom|hain)|maraca|comoro|flag|wale|hug|vh)s|(?:(?:diamond_shape_with_a_dot_ins|playground_sl)id|(?:(?:first_quarter|last_quarter|full|new)_moon_with|(?:zipper|money)_mouth|dotted_line|upside_down|c(?:rying_c|owboy_h)at|(?:disguis|nauseat)ed|neutral|monocle|panda|tired|woozy|clown|nerd|zany|fox)_fac|s(?:t(?:uck_out_tongue_winking_ey|eam_locomotiv)|(?:lightly_(?:frown|smil)|neez|h(?:ush|ak))ing_fac|(?:tudio_micropho|(?:hinto_shr|lot_mach)i|ierra_leo|axopho)n|mall_airplan|un_with_fac|a(?:luting_fac|tellit|k)|haved_ic|y(?:nagogu|ring)|n(?:owfl)?ak|urinam|pong)|(?:black_(?:medium_)?small|white_(?:(?:medium_)?small|large)|(?:black|white)_medium|black_large|orange|purple|yellow|b(?:rown|lue)|red)_squar|(?:(?:perso|woma)n_with_|man_with_)?probing_can|(?:p(?:ut_litter_in_its_pl|outing_f)|frowning_f|cold_f|wind_f|hot_f)ac|(?:arrows_c(?:ounterc)?lockwi|computer_mou|derelict_hou|carousel_hor|c(?:ity_sunri|hee)|heartpul|briefca|racehor|pig_no|lacros)s|(?:(?:face_with_head_band|ideograph_advant|adhesive_band|under|pack)a|currency_exchan|l(?:eft_l)?ugga|woman_jud|name_bad|man_jud|jud)g|face_with_peeking_ey|(?:(?:e(?:uropean_post_off|ar_of_r)|post_off)i|information_sour|ambulan)c|artificial_satellit|(?:busts?_in_silhouet|(?:vulcan_sal|parach)u|m(?:usical_no|ayot)|ro(?:ller_ska|set)|timor_les|ice_ska)t|(?:(?:incoming|red)_envelo|s(?:ao_tome_princi|tethosco)|(?:micro|tele)sco|citysca)p|(?:(?:(?:convenience|department)_st|musical_sc)o|f(?:light_depar|ramed_pic)tu|love_you_gestu|heart_on_fi|japanese_og|cote_divoi|perseve|singapo)r|b(?:ullettrain_sid|eliz|on)|(?:(?:female_|male_)?dete|radioa)ctiv|(?:christmas|deciduous|evergreen|tanabata|palm)_tre|(?:vibration_mo|cape_ver)d|(?:fortune_cook|neckt|self)i|(?:fork_and_)?knif|athletic_sho|(?:p(?:lead|arty)|drool|curs|melt|yawn|ly)ing_fac|vomiting_fac|(?:(?:c(?:urling_st|ycl)|meat_on_b|repeat_|headst)o|(?:fire_eng|tanger|ukra)i|rice_sce|(?:micro|i)pho|champag|pho)n|(?:cricket|video)_gam|(?:boxing_glo|oli)v|(?:d(?:ragon|izzy)|monkey)_fac|(?:m(?:artin|ozamb)iq|fond)u|wind_chim|test_tub|flat_sho|m(?:a(?:ns_sho|t)|icrob|oos|ut)|(?:handsh|fish_c|moon_c|cupc)ak|nail_car|zimbabw|ho(?:neybe|l)|ice_cub|airplan|pensiv|c(?:a(?:n(?:dl|o)|k)|o(?:ffe|oki))|tongu|purs|f(?:lut|iv)|d(?:at|ov)|n(?:iu|os)|kit|rag|ax)e|(?:(?:british_indian_ocean_territo|(?:plate_with_cutl|batt)e|medal_milita|low_batte|hunga|wea)r|family_(?:woman_(?:woman_(?:girl|boy)|girl|boy)|man_(?:woman_(?:girl|boy)|man_(?:girl|boy)|girl|boy))_bo|person_feeding_bab|woman_feeding_bab|s(?:u(?:spension_railwa|nn)|t(?:atue_of_libert|_barthelem|rawberr))|(?:m(?:ountain_cable|ilky_)|aerial_tram)wa|articulated_lorr|man_feeding_bab|mountain_railwa|partly_sunn|(?:vatican_c|infin)it|(?:outbox_tr|inbox_tr|birthd|motorw|paragu|urugu|norw|x_r)a|butterfl|ring_buo|t(?:urke|roph)|angr|fogg)y|(?:(?:perso|woma)n_in_motorized_wheelchai|(?:(?:notebook_with_decorative_c|four_leaf_cl)ov|(?:index_pointing_at_the_vie|white_flo)w|(?:face_with_thermome|non\-potable_wa|woman_firefigh|desktop_compu|m(?:an_firefigh|otor_scoo)|(?:ro(?:ller_coa|o)|oy)s|potable_wa|kick_scoo|thermome|firefigh|helicop|ot)t|(?:woman_factory_wor|(?:woman_office|woman_health|health)_wor|man_(?:factory|office|health)_wor|(?:factory|office)_wor|rice_crac|black_jo|firecrac)k|telephone_receiv|(?:palms_up_toget|f(?:ire_extinguis|eat)|teac)h|(?:(?:open_)?file_fol|level_sli)d|police_offic|f(?:lying_sauc|arm)|woman_teach|roll_of_pap|(?:m(?:iddle_f|an_s)in|woman_sin|hambur|plun|dag)g|do_not_litt|wilted_flow|woman_farm|man_(?:teach|farm)|(?:bell_pe|hot_pe|fli)pp|l(?:o(?:udspeak|ve_lett|bst)|edg|add)|tokyo_tow|c(?:ucumb|lapp|anc)|b(?:e(?:ginn|av)|adg)|print|hamst)e|(?:perso|woma)n_in_manual_wheelchai|m(?:an(?:_in_motorized|(?:_in_man)?ual)|otorized)_wheelchai|(?:person_(?:white|curly|red)_|wheelc)hai|triangular_rule|(?:film_project|e(?:l_salv|cu)ad|elevat|tract|anch)o|s(?:traight_rul|pace_invad|crewdriv|nowboard|unflow|peak|wimm|ing|occ|how|urf|ki)e|r(?:ed_ca|unne|azo)|d(?:o(?:lla|o)|ee)|barbe)r|(?:(?:cloud_with_(?:lightning_and_)?ra|japanese_gobl|round_pushp|liechtenste|mandar|pengu|dolph|bahra|pushp|viol)i|(?:couple(?:_with_heart_wo|kiss_)man|construction_worker|(?:mountain_bik|bow|row)ing|lotus_position|(?:w(?:eight_lift|alk)|climb)ing|white_haired|curly_haired|raising_hand|super(?:villain|hero)|red_haired|basketball|s(?:(?:wimm|urf)ing|assy)|haircut|no_good|(?:vampir|massag)e|b(?:iking|ald)|zombie|fairy|mage|elf|ng)_(?:wo)?ma|(?:(?:couple_with_heart_man|isle_of)_m|(?:couplekiss_woman_|(?:b(?:ouncing_ball|lond_haired)|tipping_hand|pregnant|kneeling|deaf)_|frowning_|s(?:tanding|auna)_|po(?:uting_|lice)|running_|blonde_|o(?:lder|k)_)wom|(?:perso|woma)n_with_turb|(?:b(?:ouncing_ball|lond_haired)|tipping_hand|pregnant|kneeling|deaf)_m|f(?:olding_hand_f|rowning_m)|man_with_turb|(?:turkmen|afghan|pak)ist|s(?:tanding_m|(?:outh_s)?ud|auna_m)|po(?:uting_|lice)m|running_m|azerbaij|k(?:yrgyz|azakh)st|tajikist|uzbekist|o(?:lder_m|k_m|ce)|(?:orang|bh)ut|taiw|jord)a|s(?:mall_red_triangle_dow|(?:valbard_jan_may|int_maart|ev)e|afety_pi|top_sig|t_marti|(?:corpi|po|o)o|wede)|(?:heavy_(?:d(?:ivision|ollar)|equals|minus|plus)|no_entry|female|male)_sig|(?:arrow_(?:heading|double)_d|p(?:erson_with_cr|oint_d)|arrow_up_d|thumbsd)ow|(?:house_with_gard|l(?:ock_with_ink_p|eafy_gre)|dancing_(?:wo)?m|fountain_p|keycap_t|chick|ali|yem|od)e|(?:izakaya|jack_o)_lanter|(?:funeral_u|(?:po(?:stal_h|pc)|capric)o|unico)r|chess_paw|b(?:a(?:llo|c)o|eni|rai)|l(?:anter|io)|c(?:o(?:ff)?i|row)|melo|rame|oma|yar)n|(?:s(?:t(?:uck_out_tongue_closed_ey|_vincent_grenadin)|kull_and_crossbon|unglass|pad)|(?:french_souther|palestinia)n_territori|(?:face_with_spiral|kissing_smiling)_ey|united_arab_emirat|kissing_closed_ey|(?:clinking_|dark_sun|eye)glass|(?:no_mobile_|head)phon|womans_cloth|b(?:allet_sho|lueberri)|philippin|(?:no_bicyc|seychel)l|roll_ey|(?:cher|a)ri|p(?:ancak|isc)|maldiv|leav)es|(?:f(?:amily_(?:woman_(?:woman_)?|man_(?:woman_|man_)?)girl_gir|earfu)|(?:woman_playing_hand|m(?:an_playing_hand|irror_)|c(?:onfetti|rystal)_|volley|track|base|8)bal|(?:(?:m(?:ailbox_with_(?:no_)?m|onor)|cockt|e\-m)a|(?:person|bride|woman)_with_ve|man_with_ve|light_ra|braz|ema)i|(?:transgender|baby)_symbo|passport_contro|(?:arrow_(?:down|up)_sm|rice_b|footb)al|(?:dromedary_cam|ferris_whe|love_hot|high_he|pretz|falaf|isra)e|page_with_cur|me(?:dical_symbo|ta)|(?:n(?:ewspaper_ro|o_be)|bellhop_be)l|rugby_footbal|s(?:chool_satche|(?:peak|ee)_no_evi|oftbal|crol|anda|nai|hel)|(?:peace|atom)_symbo|hear_no_evi|cora|hote|bage|labe|rof|ow)l|(?:(?:negative_squared_cross|heavy_exclamation|part_alternation)_mar|(?:eight_spoked_)?asteris|(?:ballot_box_with_che|(?:(?:mantelpiece|alarm|timer)_c|un)lo|(?:ha(?:(?:mmer_and|ir)_p|tch(?:ing|ed)_ch)|baby_ch|joyst)i|railway_tra|lipsti|peaco)c|heavy_check_mar|white_check_mar|tr(?:opical_drin|uc)|national_par|pickup_truc|diving_mas|floppy_dis|s(?:tar_struc|hamroc|kun|har)|chipmun|denmar|duc|hoo|lin)k|(?:leftwards_arrow_with_h|arrow_right_h|(?:o(?:range|pen)|closed|blue)_b)ook|(?:woman_playing_water_pol|m(?:an(?:_(?:playing_water_pol|with_gua_pi_ma|in_tuxed)|g)|ontenegr|o(?:roc|na)c|e(?:xic|tr|m))|(?:perso|woma)n_in_tuxed|(?:trinidad_toba|vir)g|water_buffal|b(?:urkina_fas|a(?:mbo|nj)|ent)|puerto_ric|water_pol|flaming|kangaro|(?:mosqu|burr)it|(?:avoc|torn)ad|curaca|lesoth|potat|ko(?:sov|k)|tomat|d(?:ang|od)|yo_y|hoch|t(?:ac|og)|zer)o|(?:c(?:entral_african|zech)|dominican)_republic|(?:eight_pointed_black_s|six_pointed_s|qa)tar|(?:business_suit_levitat|(?:classical_buil|breast_fee)d|(?:woman_cartwhee|m(?:an_(?:cartwhee|jugg)|en_wrest)|women_wrest|woman_jugg|face_exha|cartwhee|wrest|dump)l|c(?:hildren_cross|amp)|woman_facepalm|woman_shrugg|man_(?:facepalm|shrugg)|people_hugg|(?:person_fe|woman_da|man_da)nc|fist_oncom|horse_rac|(?:no_smo|thin)k|laugh|s(?:eedl|mok)|park|w(?:arn|edd))ing|f(?:a(?:mily(?:_(?:woman_(?:woman_(?:girl|boy)|girl|boy)|man_(?:woman_(?:girl|boy)|man_(?:girl|boy)|girl|boy)))?|ctory)|o(?:u(?:ntain|r)|ot|g)|r(?:owning)?|i(?:re|s[ht])|ly|u)|(?:(?:(?:information_desk|handball|bearded)_|(?:frowning|ok)_|juggling_|mer)pers|(?:previous_track|p(?:lay_or_p)?ause|black_square|white_square|next_track|r(?:ecord|adio)|eject)_butt|(?:wa[nx]ing_(?:crescent|gibbous)_m|bowl_with_sp|crescent_m|racc)o|(?:b(?:ouncing_ball|lond_haired)|tipping_hand|pregnant|kneeling|deaf)_pers|s(?:t(?:_pierre_miquel|op_butt|ati)|tanding_pers|peech_ballo|auna_pers)|r(?:eminder_r)?ibb|thought_ballo|watermel|badmint|c(?:amero|ray)|le(?:ban|m)|oni|bis)on|(?:heavy_heart_exclama|building_construc|heart_decora|exclama)tion|(?:(?:triangular_flag_on_po|(?:(?:woman_)?technolog|m(?:ountain_bicycl|an_technolog)|bicycl)i|(?:wo)?man_scienti|(?:wo)?man_arti|s(?:afety_ve|cienti)|empty_ne)s|(?:vertical_)?traffic_ligh|(?:rescue_worker_helm|military_helm|nazar_amul|city_suns|wastebask|dropl|t(?:rump|oil)|bouqu|buck|magn|secr)e|one_piece_swimsui|(?:(?:arrow_(?:low|upp)er|point)_r|bridge_at_n|copyr|mag_r)igh|(?:bullettrain_fro|(?:potted_pl|croiss|e(?:ggpl|leph))a)n|s(?:t(?:ar_and_cresc|ud)en|cream_ca|mi(?:ley?|rk)_ca|(?:peed|ail)boa|hir)|(?:arrow_(?:low|upp)er|point)_lef|woman_astronau|r(?:o(?:tating_ligh|cke)|eceip)|heart_eyes_ca|man_astronau|(?:woman_stud|circus_t|man_stud|trid)en|(?:ringed_pla|file_cabi)ne|nut_and_bol|(?:older_)?adul|k(?:i(?:ssing_ca|wi_frui)|uwai|no)|(?:pouting_c|c(?:ut_of_m|old_sw)e|womans_h|montserr|(?:(?:motor_|row)b|lab_c)o|heartbe|toph)a|(?:woman_pil|honey_p|man_pil|[cp]arr|teap|rob)o|hiking_boo|arrow_lef|fist_righ|flashligh|f(?:ist_lef|ee)|black_ca|astronau|(?:c(?:hest|oco)|dough)nu|innocen|joy_ca|artis|(?:acce|egy)p|co(?:me|a)|pilo)t|(?:heavy_multiplication_|t\-re)x|(?:s(?:miling_face_with_te|piral_calend)|oncoming_police_c|chocolate_b|ra(?:ilway|cing)_c|police_c|polar_be|teddy_be|madagasc|blue_c|calend|myanm)ar|c(?:l(?:o(?:ud(?:_with_lightning)?|ck(?:1[0-2]?|[2-9]))|ap)?|o(?:uple(?:_with_heart|kiss)?|nstruction|mputer|ok|p|w)|a(?:r(?:d_index)?|mera)|r(?:icket|y)|h(?:art|ild))|(?:m(?:artial_arts_unifo|echanical_a)r|(?:cherry_)?blosso|b(?:aggage_clai|roo)|ice_?crea|facepal|mushroo|restroo|vietna|dru|yu)m|(?:woman_with_headscar|m(?:obile_phone_of|aple_lea)|fallen_lea|wol)f|(?:(?:closed_lock_with|old)_|field_hoc|ice_hoc|han|don)key|g(?:lobe_with_meridians|r(?:e(?:y_(?:exclama|ques)tion|e(?:n(?:_(?:square|circle|salad|apple|heart|book)|land)|ce)|y_heart|nada)|i(?:mac|nn)ing|apes)|u(?:inea_bissau|ernsey|am|n)|(?:(?:olfing|enie)_(?:wo)?|uards(?:wo)?)man|(?:inger_roo|oal_ne|hos)t|(?:uadeloup|ame_di|iraff|oos)e|ift_heart|i(?:braltar|rl)|(?:uatemal|(?:eorg|amb)i|orill|uyan|han)a|uide_dog|(?:oggl|lov)es|arlic|emini|uitar|abon|oat|ear|b)|construction_worker|(?:(?:envelope_with|bow_and)_ar|left_right_ar|raised_eyeb)row|(?:(?:oncoming_automob|crocod)i|right_anger_bubb|l(?:eft_speech_bubb|otion_bott|ady_beet)|congo_brazzavil|eye_speech_bubb|(?:large_blue|orange|purple|yellow|brown)_circ|(?:(?:european|japanese)_cas|baby_bot)t|b(?:alance_sca|eet)|s(?:ewing_need|weat_smi)|(?:black|white|red)_circ|(?:motor|re)cyc|pood|turt|tama|waff|musc|eag)le|first_quarter_moon|s(?:m(?:all_red_triangle|i(?:ley?|rk))|t(?:uck_out_tongue|ar)|hopping|leeping|p(?:arkle|ider)|unrise|nowman|chool|cream|k(?:ull|i)|weat|ix|a)|(?:(?:b(?:osnia_herzegovi|ana)|wallis_futu|(?:french_gui|botsw)a|argenti|st_hele)n|(?:(?:equatorial|papua_new)_guin|north_kor|eritr)e|t(?:ristan_da_cunh|ad)|(?:(?:(?:french_poly|indo)ne|tuni)s|(?:new_caledo|ma(?:urita|cedo)|lithua|(?:tanz|alb|rom)a|arme|esto)n|diego_garc|s(?:audi_arab|t_luc|lov(?:ak|en)|omal|erb)|e(?:arth_as|thiop)|m(?:icrone|alay)s|(?:austra|mongo)l|c(?:ambod|roat)|(?:bulga|alge)r|(?:colom|nami|zam)b|boliv|l(?:iber|atv))i|(?:wheel_of_dhar|cine|pana)m|(?:(?:(?:closed|beach|open)_)?umbrel|ceuta_melil|venezue|ang(?:uil|o)|koa)l|c(?:ongo_kinshas|anad|ub)|(?:western_saha|a(?:mpho|ndor)|zeb)r|american_samo|video_camer|m(?:o(?:vie_camer|ldov)|alt|eg)|(?:earth_af|costa_)ric|s(?:outh_afric|ri_lank|a(?:mo|nt))|bubble_te|(?:antarct|jama)ic|ni(?:caragu|geri|nj)|austri|pi(?:nat|zz)|arub|k(?:eny|aab)|indi|u7a7|l(?:lam|ib[ry])|dn)a|l(?:ast_quarter_moon|o(?:tus|ck)|ips|eo)|(?:hammer_and_wren|c(?:ockroa|hur)|facepun|wren|crut|pun)ch|s(?:nowman_with_snow|ignal_strength|weet_potato|miling_imp|p(?:ider_web|arkle[rs])|w(?:im_brief|an)|a(?:n(?:_marino|dwich)|lt)|topwatch|t(?:a(?:dium|r[2s])|ew)|l(?:e(?:epy|d)|oth)|hrimp|yria|carf|(?:hee|oa)p|ea[lt]|h(?:oe|i[pt])|o[bs])|(?:s(?:tuffed_flatbre|p(?:iral_notep|eaking_he))|(?:exploding_h|baguette_br|flatbr)e)ad|(?:arrow_(?:heading|double)_u|(?:p(?:lace_of_wor|assenger_)sh|film_str|tul)i|page_facing_u|biting_li|(?:billed_c|world_m)a|mouse_tra|(?:curly_lo|busst)o|thumbsu|lo(?:llip)?o|clam|im)p|(?:anatomical|light_blue|sparkling|kissing|mending|orange|purple|yellow|broken|b(?:rown|l(?:ack|ue))|pink)_heart|(?:(?:transgender|black)_fla|mechanical_le|(?:checkered|pirate)_fla|electric_plu|rainbow_fla|poultry_le|service_do|white_fla|luxembour|fried_eg|moneyba|h(?:edgeh|otd)o|shru)g|(?:cloud_with|mountain)_snow|(?:(?:antigua_barb|berm)u|(?:kh|ug)an|rwan)da|(?:3r|2n)d_place_medal|1(?:st_place_medal|234|00)|lotus_position|(?:w(?:eight_lift|alk)|climb)ing|(?:(?:cup_with_str|auto_ricksh)a|carpentry_sa|windo|jigsa)w|(?:(?:couch_and|diya)_la|f(?:ried_shri|uelpu))mp|(?:woman_mechan|man_mechan|alemb)ic|(?:european_un|accord|collis|reun)ion|(?:flight_arriv|hospit|portug|seneg|nep)al|card_file_box|(?:(?:oncoming_)?tax|m(?:o(?:unt_fuj|ya)|alaw)|s(?:paghett|ush|ar)|b(?:r(?:occol|une)|urund)|(?:djibou|kiriba)t|hait|fij)i|(?:shopping_c|white_he|bar_ch)art|d(?:isappointed|ominica|e(?:sert)?)|raising_hand|super(?:villain|hero)|b(?:e(?:verage_box|ers|d)|u(?:bbles|lb|g)|i(?:k(?:ini|e)|rd)|o(?:o(?:ks|t)|a[rt]|y)|read|a[cn]k)|ra(?:ised_hands|bbit2|t)|(?:hindu_tem|ap)ple|thong_sandal|a(?:r(?:row_(?:right|down|up)|t)|bc?|nt)?|r(?:a(?:i(?:sed_hand|nbow)|bbit|dio|m)|u(?:nning)?|epeat|i(?:ng|ce)|o(?:ck|se))|takeout_box|(?:flying_|mini)disc|(?:(?:interrob|yin_y)a|b(?:o(?:omera|wli)|angba)|(?:ping_p|hong_k)o|calli|mahjo)ng|b(?:a(?:llot_box|sket|th?|by)|o(?:o(?:k(?:mark)?|m)|w)|u(?:tter|s)|e(?:ll|er?|ar))?|heart_eyes|basketball|(?:paperclip|dancer|ticket)s|point_up_2|(?:wo)?man_cook|n(?:ew(?:spaper)?|o(?:tebook|_entry)|iger)|t(?:e(?:lephone|a)|o(?:oth|p)|r(?:oll)?|wo)|h(?:o(?:u(?:rglass|se)|rse)|a(?:mmer|nd)|eart)|paperclip|full_moon|(?:b(?:lack_ni|athtu|om)|her)b|(?:long|oil)_drum|pineapple|(?:clock(?:1[0-2]?|[2-9])3|u6e8)0|p(?:o(?:int_up|ut)|r(?:ince|ay)|i(?:ck|g)|en)|e(?:nvelope|ight|u(?:ro)?|gg|ar|ye|s)|m(?:o(?:u(?:ntain|se)|nkey|on)|echanic|a(?:ilbox|g|n)|irror)?|new_moon|d(?:iamonds|olls|art)|question|k(?:iss(?:ing)?|ey)|haircut|no_good|(?:vampir|massag)e|g(?:olf(?:ing)?|u(?:inea|ard)|e(?:nie|m)|ift|rin)|h(?:a(?:ndbag|msa)|ouses|earts|ut)|postbox|toolbox|(?:pencil|t(?:rain|iger)|whale|cat|dog)2|belgium|(?:volca|kimo)no|(?:vanuat|tuval|pala|naur|maca)u|tokelau|o(?:range|ne?|m|k)?|office|dancer|ticket|dragon|pencil|zombie|w(?:o(?:mens|rm|od)|ave|in[gk]|c)|m(?:o(?:sque|use2)|e(?:rman|ns)|a(?:li|sk))|jersey|tshirt|w(?:heel|oman)|dizzy|j(?:apan|oy)|t(?:rain|iger)|whale|fairy|a(?:nge[lr]|bcd|tm)|c(?:h(?:a(?:ir|d)|ile)|a(?:ndy|mel)|urry|rab|o(?:rn|ol|w2)|[dn])|p(?:ager|e(?:a(?:ch|r)|ru)|i(?:g2|ll|e)|oop)|n(?:otes|ine)|t(?:onga|hree|ent|ram|[mv])|f(?:erry|r(?:ies|ee|og)|ax)|u(?:7(?:533|981|121)|5(?:5b6|408|272)|6(?:307|70[89]))|mage|e(?:yes|nd)|i(?:ra[nq]|t)|cat|dog|elf|z(?:zz|ap)|yen|j(?:ar|p)|leg|id|u[kps]|ng|o[2x]|vs|kr|[\+\x2D]1|x|v)(:)</string> - <key>name</key> - <string>string.emoji.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.gemoji.begin.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>keyword.control.gemoji.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.gemoji.end.mdx</string> - </dict> - </dict> - </dict> - <key>extension-github-mention</key> - <dict> - <key>match</key> - <string>(?<![0-9A-Za-z_`])(@)((?:[0-9A-Za-z][0-9A-Za-z-]{0,38})(?:\/(?:[0-9A-Za-z][0-9A-Za-z-]{0,38}))?)(?![0-9A-Za-z_`])</string> - <key>name</key> - <string>string.mention.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.mention.begin.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>string.other.link.mention.mdx</string> - </dict> - </dict> - </dict> - <key>extension-github-reference</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>match</key> - <string>(?<![0-9A-Za-z_])(?:((?i:ghsa-|cve-))([A-Za-z0-9]+)|((?i:gh-|#))([0-9]+))(?![0-9A-Za-z_])</string> - <key>name</key> - <string>string.reference.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.reference.begin.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>string.other.link.reference.security-advisory.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.reference.begin.mdx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>string.other.link.reference.issue-or-pr.mdx</string> - </dict> - </dict> - </dict> - <dict> - <key>match</key> - <string>(?<![^\t\n\r \(@\[\{])((?:[0-9A-Za-z][0-9A-Za-z-]{0,38})(?:\/(?:(?:\.git[0-9A-Za-z_-]|\.(?!git)|[0-9A-Za-z_-])+))?)(#)([0-9]+)(?![0-9A-Za-z_])</string> - <key>name</key> - <string>string.reference.mdx</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.link.reference.user.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.reference.begin.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.link.reference.issue-or-pr.mdx</string> - </dict> - </dict> - </dict> - </array> - </dict> - <key>extension-math-flow</key> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(\${2,})([^\n\r\$]*)$</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.math.flow.mdx</string> - </dict> - <key>2</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>contentName</key> - <string>markup.raw.math.flow.mdx</string> - <key>end</key> - <string>(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.math.flow.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.other.mdx</string> - </dict> - <key>extension-math-text</key> - <dict> - <key>match</key> - <string>(?<!\$)(\${2,})(?!\$)(.+?)(?<!\$)(\1)(?!\$)</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.math.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>markup.raw.math.mdx markup.inline.raw.math.mdx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>string.other.end.math.mdx</string> - </dict> - </dict> - </dict> - <key>extension-mdx-esm</key> - <dict> - <key>name</key> - <string>meta.embedded.tsx</string> - <key>begin</key> - <string>(?:^|\G)(?=(?i:export|import)[ ])</string> - <key>end</key> - <string>^(?=[\t ]*$)|$</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx#statements</string> - </dict> - </array> - </dict> - <key>extension-mdx-expression-flow</key> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(\{)(?!.*\}[\t ]*.)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.expression.mdx.js</string> - </dict> - </dict> - <key>contentName</key> - <string>meta.embedded.tsx</string> - <key>end</key> - <string>(\})(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.expression.mdx.js</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx#expression</string> - </dict> - </array> - </dict> - <key>extension-mdx-expression-text</key> - <dict> - <key>begin</key> - <string>\{</string> - <key>beginCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>string.other.begin.expression.mdx.js</string> - </dict> - </dict> - <key>contentName</key> - <string>meta.embedded.tsx</string> - <key>end</key> - <string>\}</string> - <key>endCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>string.other.begin.expression.mdx.js</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx#expression</string> - </dict> - </array> - </dict> - <key>extension-mdx-jsx-flow</key> - <dict> - <key>begin</key> - <string>(?<=^|\G|\>)[\t ]*(<)(?=(?![\t\n\r ]))(?:\s*(/))?(?:\s*(?:(?:((?:[_$[:alpha:]][-_$[:alnum:]]*))\s*(:)\s*((?:[_$[:alpha:]][-_$[:alnum:]]*)))|((?:(?:[_$[:alpha:]][_$[:alnum:]]*)(?:\s*\.\s*(?:[_$[:alpha:]][-_$[:alnum:]]*))+))|((?:[_$[:upper:]][_$[:alnum:]]*))|((?:[_$[:alpha:]][-_$[:alnum:]]*)))(?=[\s\/\>\{]))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.end.jsx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.closing.jsx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>entity.name.tag.namespace.jsx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>punctuation.separator.namespace.jsx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>entity.name.tag.local.jsx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>support.class.component.jsx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>support.class.component.jsx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>entity.name.tag.jsx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx#jsx-tag-attribute-name</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-tag-attribute-assignment</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-string-double-quoted</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-string-single-quoted</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-evaluated-code</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-tag-attributes-illegal</string> - </dict> - </array> - <key>end</key> - <string>(?:(\/)\s*)?(>)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.self-closing.jsx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.end.jsx</string> - </dict> - </dict> - </dict> - <key>extension-mdx-jsx-text</key> - <dict> - <key>begin</key> - <string>(<)(?=(?![\t\n\r ]))(?:\s*(/))?(?:\s*(?:(?:((?:[_$[:alpha:]][-_$[:alnum:]]*))\s*(:)\s*((?:[_$[:alpha:]][-_$[:alnum:]]*)))|((?:(?:[_$[:alpha:]][_$[:alnum:]]*)(?:\s*\.\s*(?:[_$[:alpha:]][-_$[:alnum:]]*))+))|((?:[_$[:upper:]][_$[:alnum:]]*))|((?:[_$[:alpha:]][-_$[:alnum:]]*)))(?=[\s\/\>\{]))?</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.end.jsx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.closing.jsx</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>entity.name.tag.namespace.jsx</string> - </dict> - <key>4</key> - <dict> - <key>name</key> - <string>punctuation.separator.namespace.jsx</string> - </dict> - <key>5</key> - <dict> - <key>name</key> - <string>entity.name.tag.local.jsx</string> - </dict> - <key>6</key> - <dict> - <key>name</key> - <string>support.class.component.jsx</string> - </dict> - <key>7</key> - <dict> - <key>name</key> - <string>support.class.component.jsx</string> - </dict> - <key>8</key> - <dict> - <key>name</key> - <string>entity.name.tag.jsx</string> - </dict> - </dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx#jsx-tag-attribute-name</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-tag-attribute-assignment</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-string-double-quoted</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-string-single-quoted</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-evaluated-code</string> - </dict> - <dict> - <key>include</key> - <string>source.tsx#jsx-tag-attributes-illegal</string> - </dict> - </array> - <key>end</key> - <string>(?:(\/)\s*)?(>)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.self-closing.jsx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>punctuation.definition.tag.end.jsx</string> - </dict> - </dict> - </dict> - <key>extension-toml</key> - <dict> - <key>begin</key> - <string>\A\+{3}$</string> - <key>end</key> - <string>^\+{3}$</string> - <key>beginCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>string.other.begin.toml</string> - </dict> - </dict> - <key>endCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>string.other.end.toml</string> - </dict> - </dict> - <key>contentName</key> - <string>meta.embedded.toml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.toml</string> - </dict> - </array> - </dict> - <key>extension-yaml</key> - <dict> - <key>begin</key> - <string>\A-{3}$</string> - <key>end</key> - <string>^-{3}$</string> - <key>beginCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>string.other.begin.yaml</string> - </dict> - </dict> - <key>endCaptures</key> - <dict> - <key>0</key> - <dict> - <key>name</key> - <string>string.other.end.yaml</string> - </dict> - </dict> - <key>contentName</key> - <string>meta.embedded.yaml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.yaml</string> - </dict> - </array> - </dict> - <key>whatwg-html-data-character-reference-named-terminated</key> - <dict> - <key>match</key> - <string>(&)((?:C(?:(?:o(?:unterClockwiseCo)?|lockwiseCo)ntourIntegra|cedi)|(?:(?:Not(?:S(?:quareSu(?:per|b)set|u(?:cceeds|(?:per|b)set))|Precedes|Greater|Tilde|Less)|Not(?:Righ|Lef)tTriangle|(?:Not(?:(?:Succeed|Precede|Les)s|Greater)|(?:Precede|Succeed)s|Less)Slant|SquareSu(?:per|b)set|(?:Not(?:Greater|Tilde)|Tilde|Less)Full|RightTriangle|LeftTriangle|Greater(?:Slant|Full)|Precedes|Succeeds|Superset|NotHump|Subset|Tilde|Hump)Equ|int(?:er)?c|DotEqu)a|DoubleContourIntegra|(?:n(?:short)?parall|shortparall|p(?:arall|rur))e|(?:rightarrowta|l(?:eftarrowta|ced|ata|Ata)|sced|rata|perm|rced|rAta|ced)i|Proportiona|smepars|e(?:qvpars|pars|xc|um)|Integra|suphso|rarr[pt]|n(?:pars|tg)|l(?:arr[pt]|cei)|Rarrt|(?:hybu|fora)l|ForAl|[GKLNR-Tcknt]cedi|rcei|iexc|gime|fras|[uy]um|oso|dso|ium|Ium)l|D(?:o(?:uble(?:(?:L(?:ong(?:Left)?R|eftR)ight|L(?:ongL)?eft|UpDown|Right|Up)Arrow|Do(?:wnArrow|t))|wn(?:ArrowUpA|TeeA|a)rrow)|iacriticalDot|strok|ashv|cy)|(?:(?:(?:N(?:(?:otN)?estedGreater|ot(?:Greater|Less))|Less(?:Equal)?)Great|GreaterGreat|l[lr]corn|mark|east)e|Not(?:Double)?VerticalBa|(?:Not(?:Righ|Lef)tTriangleB|(?:(?:Righ|Lef)tDown|Right(?:Up)?|Left(?:Up)?)VectorB|RightTriangleB|Left(?:Triangle|Arrow)B|RightArrowB|V(?:er(?:ticalB|b)|b)|UpArrowB|l(?:ur(?:ds|u)h|dr(?:us|d)h|trP|owb|H)|profal|r(?:ulu|dld)h|b(?:igst|rvb)|(?:wed|ve[er])b|s(?:wn|es)w|n(?:wne|ese|sp|hp)|gtlP|d(?:oll|uh|H)|(?:hor|ov)b|u(?:dh|H)|r(?:lh|H)|ohb|hb|St)a|D(?:o(?:wn(?:(?:Left(?:Right|Tee)|RightTee)Vecto|(?:(?:Righ|Lef)tVector|Arrow)Ba)|ubleVerticalBa)|a(?:gge|r)|sc|f)|(?:(?:(?:Righ|Lef)tDown|(?:Righ|Lef)tUp)Tee|(?:Righ|Lef)tUpDown)Vecto|VerticalSeparato|(?:Left(?:Right|Tee)|RightTee)Vecto|less(?:eqq?)?gt|e(?:qslantgt|sc)|(?:RightF|LeftF|[lr]f)loo|u(?:[lr]corne|ar)|timesba|(?:plusa|cirs|apa)ci|U(?:arroci|f)|(?:dzigr|s(?:u(?:pl|br)|imr|[lr])|zigr|angz|nvH|l(?:tl|B)|r[Br])ar|UnderBa|(?:plus|harr|top|mid|of)ci|O(?:verBa|sc|f)|dd?agge|s(?:olba|sc)|g(?:t(?:rar|ci)|sc|f)|c(?:opys|u(?:po|ep)|sc|f)|(?:n(?:(?:v[lr]|w|r)A|l[Aa]|h[Aa]|eA)|x[hlr][Aa]|u(?:ua|da|A)|s[ew]A|rla|o[lr]a|rba|rAa|l[Ablr]a|h(?:oa|A)|era|d(?:ua|A)|cra|vA)r|o(?:lci|sc|ro|pa)|ropa|roar|l(?:o(?:pa|ar)|sc|Ar)|i(?:ma|s)c|ltci|dd?ar|a(?:ma|s)c|R(?:Bar|sc|f)|I(?:mac|f)|(?:u(?:ma|s)|oma|ema|Oma|Ema|[wyz]s|qs|ks|fs|Zs|Ys|Xs|Ws|Vs|Us|Ss|Qs|Ns|Ms|Ks|Is|Gs|Fs|Cs|Bs)c|Umac|x(?:sc|f)|v(?:sc|f)|rsc|n(?:ld|f)|m(?:sc|ld|ac|f)|rAr|h(?:sc|f)|b(?:sc|f)|psc|P(?:sc|f)|L(?:sc|ar|f)|jsc|J(?:sc|f)|E(?:sc|f)|[HT]sc|[yz]f|wf|tf|qf|pf|kf|jf|Zf|Yf|Xf|Wf|Vf|Tf|Sf|Qf|Nf|Mf|Kf|Hf|Gf|Ff|Cf|Bf)r|(?:Diacritical(?:Double)?A|[EINOSYZaisz]a)cute|(?:(?:N(?:egative(?:VeryThin|Thi(?:ck|n))|onBreaking)|NegativeMedium|ZeroWidth|VeryThin|Medium|Thi(?:ck|n))Spac|Filled(?:Very)?SmallSquar|Empty(?:Very)?SmallSquar|(?:N(?:ot(?:Succeeds|Greater|Tilde|Less)T|t)|DiacriticalT|VerticalT|PrecedesT|SucceedsT|NotEqualT|GreaterT|TildeT|EqualT|LessT|at|Ut|It)ild|(?:(?:DiacriticalG|[EIOUaiu]g)ra|(?:u|U)?bre|(?:o|e)?gra)v|(?:doublebar|curly|big|x)wedg|H(?:orizontalLin|ilbertSpac)|Double(?:Righ|Lef)tTe|(?:(?:measured|uw)ang|exponentia|dwang|ssmi|fema)l|(?:Poincarepla|reali|pho|oli)n|(?:black)?lozeng|(?:VerticalL|(?:prof|imag)l)in|SmallCircl|(?:black|dot)squar|rmoustach|l(?:moustach|angl)|(?:b(?:ack)?pr|(?:tri|xo)t|[qt]pr)im|[Tt]herefor|(?:DownB|[Gag]b)rev|(?:infint|nv[lr]tr)i|b(?:arwedg|owti)|an(?:dslop|gl)|(?:cu(?:rly)?v|rthr|lthr|b(?:ig|ar)v|xv)e|n(?:s(?:qsu[bp]|ccu)|prcu)|orslop|NewLin|maltes|Becaus|rangl|incar|(?:otil|Otil|t(?:ra|il))d|[inu]tild|s(?:mil|imn)|(?:sc|pr)cu|Wedg|Prim|Brev)e|(?:CloseCurly(?:Double)?Quo|OpenCurly(?:Double)?Quo|[ry]?acu)te|(?:Reverse(?:Up)?|Up)Equilibrium|C(?:apitalDifferentialD|(?:oproduc|(?:ircleD|enterD|d)o)t|on(?:grue|i)nt|conint|upCap|o(?:lone|pf)|OPY|hi)|(?:(?:(?:left)?rightsquig|(?:longleftr|twoheadr|nleftr|nLeftr|longr|hookr|nR|Rr)ight|(?:twohead|hook)left|longleft|updown|Updown|nright|Right|nleft|nLeft|down|up|Up)a|L(?:(?:ong(?:left)?righ|(?:ong)?lef)ta|eft(?:(?:right)?a|RightA|TeeA))|RightTeeA|LongLeftA|UpTeeA)rrow|(?:(?:RightArrow|Short|Upper|Lower)Left|(?:L(?:eftArrow|o(?:wer|ng))|LongLeft|Short|Upper)Right|ShortUp)Arrow|(?:b(?:lacktriangle(?:righ|lef)|ulle|no)|RightDoubleBracke|RightAngleBracke|Left(?:Doub|Ang)leBracke|(?:vartriangle|downharpoon|c(?:ircl|urv)earrow|upharpoon|looparrow)righ|(?:vartriangle|downharpoon|c(?:ircl|urv)earrow|upharpoon|looparrow|mapsto)lef|(?:UnderBrack|OverBrack|emptys|targ|Sups)e|diamondsui|c(?:ircledas|lubsui|are)|(?:spade|heart)sui|(?:(?:c(?:enter|t)|lmi|ino)d|(?:Triple|mD)D|n(?:otin|e)d|(?:ncong|doteq|su[bp]e|e[gl]s)d|l(?:ess|t)d|isind|c(?:ong|up|ap)?d|b(?:igod|N)|t(?:(?:ri)?d|opb)|s(?:ub|im)d|midd|g(?:tr?)?d|Lmid|DotD|(?:xo|ut|z)d|e(?:s?d|rD|fD|DD)|dtd|Zd|Id|Gd|Ed)o|realpar|i(?:magpar|iin)|S(?:uchTha|qr)|su[bp]mul|(?:(?:lt|i)que|gtque|(?:mid|low)a|e(?:que|xi))s|Produc|s(?:updo|e[cx])|r(?:parg|ec)|lparl|vangr|hamil|(?:homt|[lr]fis|ufis|dfis)h|phmma|t(?:wix|in)|quo|o(?:do|as)|fla|eDo)t|(?:(?:Square)?Intersecti|(?:straight|back|var)epsil|SquareUni|expectati|upsil|epsil|Upsil|eq?col|Epsil|(?:omic|Omic|rca|lca|eca|Sca|[NRTt]ca|Lca|Eca|[Zdz]ca|Dca)r|scar|ncar|herc|ccar|Ccar|iog|Iog)on|Not(?:S(?:quareSu(?:per|b)set|u(?:cceeds|(?:per|b)set))|Precedes|Greater|Tilde|Less)?|(?:(?:(?:Not(?:Reverse)?|Reverse)E|comp|E)leme|NotCongrue|(?:n[gl]|l)eqsla|geqsla|q(?:uat)?i|perc|iiii|coni|cwi|awi|oi)nt|(?:(?:rightleftharpo|leftrightharpo|quaterni)on|(?:(?:N(?:ot(?:NestedLess|Greater|Less)|estedLess)L|(?:eqslant|gtr(?:eqq?)?)l|LessL)e|Greater(?:Equal)?Le|cro)s|(?:rightright|leftleft|upup)arrow|rightleftarrow|(?:(?:(?:righ|lef)tthree|divideon|b(?:igo|ox)|[lr]o)t|InvisibleT)ime|downdownarrow|(?:(?:smallset|tri|dot|box)m|PlusM)inu|(?:RoundImpli|complex|Impli|Otim)e|C(?:ircle(?:Time|Minu|Plu)|ayley|ros)|(?:rationa|mode)l|NotExist|(?:(?:UnionP|MinusP|(?:b(?:ig[ou]|ox)|tri|s(?:u[bp]|im)|dot|xu|mn)p)l|(?:xo|u)pl|o(?:min|pl)|ropl|lopl|epl)u|otimesa|integer|e(?:linter|qual)|setminu|rarrbf|larrb?f|olcros|rarrf|mstpo|lesge|gesle|Exist|[lr]time|strn|napo|fltn|ccap|apo)s|(?:b(?:(?:lack|ig)triangledow|etwee)|(?:righ|lef)tharpoondow|(?:triangle|mapsto)dow|(?:nv|i)infi|ssetm|plusm|lagra|d(?:[lr]cor|isi)|c(?:ompf|aro)|s?frow|(?:hyph|curr)e|kgree|thor|ogo|ye)n|Not(?:Righ|Lef)tTriangle|(?:Up(?:Arrow)?|Short)DownArrow|(?:(?:n(?:triangle(?:righ|lef)t|succ|prec)|(?:trianglerigh|trianglelef|sqsu[bp]se|ques)t|backsim)e|lvertneq|gvertneq|(?:suc|pre)cneq|a(?:pprox|symp)e|(?:succ|prec|vee)e|circe)q|(?:UnderParenthes|OverParenthes|xn)is|(?:(?:Righ|Lef)tDown|Right(?:Up)?|Left(?:Up)?)Vector|D(?:o(?:wn(?:RightVector|LeftVector|Arrow|Tee)|t)|el|D)|l(?:eftrightarrows|br(?:k(?:sl[du]|e)|ac[ek])|tri[ef]|s(?:im[eg]|qb|h)|hard|a(?:tes|ngd|p)|o[pz]f|rm|gE|fr|eg|cy)|(?:NotHumpDownHum|(?:righ|lef)tharpoonu|big(?:(?:triangle|sqc)u|c[au])|HumpDownHum|m(?:apstou|lc)|(?:capbr|xsq)cu|smash|rarr[al]|(?:weie|sha)r|larrl|velli|(?:thin|punc)s|h(?:elli|airs)|(?:u[lr]c|vp)ro|d[lr]cro|c(?:upc[au]|apc[au])|thka|scna|prn?a|oper|n(?:ums|va|cu|bs)|ens|xc[au]|Ma)p|l(?:eftrightarrow|e(?:ftarrow|s(?:dot)?)?|moust|a(?:rrb?|te?|ng)|t(?:ri)?|sim|par|oz|l|g)|n(?:triangle(?:righ|lef)t|succ|prec)|SquareSu(?:per|b)set|(?:I(?:nvisibleComm|ot)|(?:varthe|iio)t|varkapp|(?:vars|S)igm|(?:diga|mco)mm|Cedill|lambd|Lambd|delt|Thet|omeg|Omeg|Kapp|Delt|nabl|zet|to[es]|rdc|ldc|iot|Zet|Bet|Et)a|b(?:lacktriangle|arwed|u(?:mpe?|ll)|sol|o(?:x[HVhv]|t)|brk|ne)|(?:trianglerigh|trianglelef|sqsu[bp]se|ques)t|RightT(?:riangl|e)e|(?:(?:varsu[bp]setn|su(?:psetn?|bsetn?))eq|nsu[bp]seteq|colone|(?:wedg|sim)e|nsime|lneq|gneq)q|DifferentialD|(?:(?:fall|ris)ingdots|(?:suc|pre)ccurly|ddots)eq|A(?:pplyFunction|ssign|(?:tild|grav|brev)e|acute|o(?:gon|pf)|lpha|(?:mac|sc|f)r|c(?:irc|y)|ring|Elig|uml|nd|MP)|(?:varsu[bp]setn|su(?:psetn?|bsetn?))eq|L(?:eft(?:T(?:riangl|e)e|Arrow)|l)|G(?:reaterEqual|amma)|E(?:xponentialE|quilibrium|sim|cy|TH|NG)|(?:(?:RightCeil|LeftCeil|varnoth|ar|Ur)in|(?:b(?:ack)?co|uri)n|vzigza|roan|loan|ffli|amal|sun|rin|n(?:tl|an)|Ran|Lan)g|(?:thick|succn?|precn?|less|g(?:tr|n)|ln|n)approx|(?:s(?:traightph|em)|(?:rtril|xu|u[lr]|xd|v[lr])tr|varph|l[lr]tr|b(?:sem|eps)|Ph)i|(?:circledd|osl|n(?:v[Dd]|V[Dd]|d)|hsl|V(?:vd|D)|Osl|v[Dd]|md)ash|(?:(?:RuleDelay|imp|cuw)e|(?:n(?:s(?:hort)?)?|short|rn)mi|D(?:Dotrah|iamon)|(?:i(?:nt)?pr|peri)o|odsol|llhar|c(?:opro|irmi)|(?:capa|anda|pou)n|Barwe|napi|api)d|(?:cu(?:rlyeq(?:suc|pre)|es)|telre|[ou]dbla|Udbla|Odbla|radi|lesc|gesc|dbla)c|(?:circled|big|eq|[is]|c|x|a|S|[hw]|W|H|G|E|C)circ|rightarrow|R(?:ightArrow|arr|e)|Pr(?:oportion)?|(?:longmapst|varpropt|p(?:lustw|ropt)|varrh|numer|(?:rsa|lsa|sb)qu|m(?:icr|h)|[lr]aqu|bdqu|eur)o|UnderBrace|ImaginaryI|B(?:ernoullis|a(?:ckslash|rv)|umpeq|cy)|(?:(?:Laplace|Mellin|zee)tr|Fo(?:uriertr|p)|(?:profsu|ssta)r|ordero|origo|[ps]op|nop|mop|i(?:op|mo)|h(?:op|al)|f(?:op|no)|dop|bop|Rop|Pop|Nop|Lop|Iop|Hop|Dop|[GJKMOQSTV-Zgjkoqvwyz]op|Bop)f|nsu[bp]seteq|t(?:ri(?:angleq|e)|imesd|he(?:tav|re4)|au)|O(?:verBrace|r)|(?:(?:pitchfo|checkma|t(?:opfo|b)|rob|rbb|l[bo]b)r|intlarh|b(?:brktbr|l(?:oc|an))|perten|NoBrea|rarrh|s[ew]arh|n[ew]arh|l(?:arrh|hbl)|uhbl|Hace)k|(?:NotCupC|(?:mu(?:lti)?|x)m|cupbrc)ap|t(?:riangle|imes|heta|opf?)|Precedes|Succeeds|Superset|NotEqual|(?:n(?:atural|exist|les)|s(?:qc[au]p|mte)|prime)s|c(?:ir(?:cled[RS]|[Ee])|u(?:rarrm|larrp|darr[lr]|ps)|o(?:mmat|pf)|aps|hi)|b(?:sol(?:hsu)?b|ump(?:eq|E)|ox(?:box|[Vv][HLRhlr]|[Hh][DUdu]|[DUdu][LRlr])|e(?:rnou|t[ah])|lk(?:34|1[24])|cy)|(?:l(?:esdot|squ|dqu)o|rsquo|rdquo|ngt)r|a(?:n(?:g(?:msda[a-h]|st|e)|d[dv])|st|p[Ee]|mp|fr|c[Edy])|(?:g(?:esdoto|E)|[lr]haru)l|(?:angrtvb|lrhar|nis)d|(?:(?:th(?:ic)?k|succn?|p(?:r(?:ecn?|n)?|lus)|rarr|l(?:ess|arr)|su[bp]|par|scn|g(?:tr|n)|ne|sc|n[glv]|ln|eq?)si|thetasy|ccupss|alefsy|botto)m|trpezium|(?:hks[ew]|dr?bk|bk)arow|(?:(?:[lr]a|d|c)empty|b(?:nequi|empty)|plank|nequi|odi)v|(?:(?:sc|rp|n)pol|point|fpart)int|(?:c(?:irf|wco)|awco)nint|PartialD|n(?:s(?:u[bp](?:set)?|c)|rarr|ot(?:ni|in)?|warr|e(?:arr)?|a(?:tur|p)|vlt|p(?:re?|ar)|um?|l[et]|ge|i)|n(?:atural|exist|les)|d(?:i(?:am(?:ond)?|v(?:ide)?)|tri|ash|ot|d)|backsim|l(?:esdot|squ|dqu)o|g(?:esdoto|E)|U(?:p(?:Arrow|si)|nion|arr)|angrtvb|p(?:l(?:anckh|us(?:d[ou]|[be]))|ar(?:sl|t)|r(?:od|nE|E)|erp|iv|m)|n(?:ot(?:niv[a-c]|in(?:v[a-c]|E))|rarr[cw]|s(?:u[bp][Ee]|c[er])|part|v(?:le|g[et])|g(?:es|E)|c(?:ap|y)|apE|lE|iv|Ll|Gg)|m(?:inus(?:du|b)|ale|cy|p)|rbr(?:k(?:sl[du]|e)|ac[ek])|(?:suphsu|tris|rcu|lcu)b|supdsub|(?:s[ew]a|n[ew]a)rrow|(?:b(?:ecaus|sim)|n(?:[lr]tri|bump)|csu[bp])e|equivDD|u(?:rcorn|lcorn|psi)|timesb|s(?:u(?:p(?:set)?|b(?:set)?)|q(?:su[bp]|u)|i(?:gma|m)|olb?|dot|mt|fr|ce?)|p(?:l(?:anck|us)|r(?:op|ec?)?|ara?|i)|o(?:times|r(?:d(?:er)?)?)|m(?:i(?:nusd?|d)|a(?:p(?:sto)?|lt)|u)|rmoust|g(?:e(?:s(?:dot|l)?|q)?|sim|n(?:ap|e)|t|l|g)|(?:spade|heart)s|c(?:u(?:rarr|larr|p)|o(?:m(?:ma|p)|lon|py|ng)|lubs|heck|cups|irc?|ent|ap)|colone|a(?:p(?:prox)?|n(?:g(?:msd|rt)?|d)|symp|f|c)|S(?:quare|u[bp]|c)|Subset|b(?:ecaus|sim)|vsu[bp]n[Ee]|s(?:u(?:psu[bp]|b(?:su[bp]|n[Ee]|E)|pn[Ee]|p[1-3E]|m)|q(?:u(?:ar[ef]|f)|su[bp]e)|igma[fv]|etmn|dot[be]|par|mid|hc?y|c[Ey])|f(?:rac(?:78|5[68]|45|3[458]|2[35]|1[2-68])|fr)|e(?:m(?:sp1[34]|ptyv)|psiv|c(?:irc|y)|t[ah]|ng|ll|fr|e)|(?:kappa|isins|vBar|fork|rho|phi|n[GL]t)v|divonx|V(?:dashl|ee)|gammad|G(?:ammad|cy|[Tgt])|[Ldhlt]strok|[HT]strok|(?:c(?:ylct|hc)|(?:s(?:oft|hch)|hard|S(?:OFT|HCH)|jser|J(?:ser|uk)|HARD|tsh|TSH|juk|iuk|I(?:uk|[EO])|zh|yi|nj|lj|k[hj]|gj|dj|ZH|Y[AIU]|NJ|LJ|K[HJ]|GJ|D[JSZ])c|ubrc|Ubrc|(?:yu|i[eo]|dz|v|p|f)c|TSc|SHc|CHc|Vc|Pc|Mc|Fc)y|(?:(?:wre|jm)at|dalet|a(?:ngs|le)p|imat|[lr]ds)h|[CLRUceglnou]acute|ff?llig|(?:f(?:fi|[ij])|sz|oe|ij|ae|OE|IJ)lig|r(?:a(?:tio|rr|ng)|tri|par|eal)|s[ew]arr|s(?:qc[au]p|mte)|prime|rarrb|i(?:n(?:fin|t)?|sin|t|i|c)|e(?:quiv|m(?:pty|sp)|p(?:si|ar)|cir|l|g)|kappa|isins|ncong|doteq|(?:wedg|sim)e|nsime|rsquo|rdquo|[lr]haru|V(?:dash|ert)|Tilde|lrhar|gamma|Equal|UpTee|n(?:[lr]tri|bump)|C(?:olon|up|ap)|v(?:arpi|ert)|u(?:psih|ml)|vnsu[bp]|r(?:tri[ef]|e(?:als|g)|a(?:rr[cw]|ng[de]|ce)|sh|lm|x)|rhard|sim[gl]E|i(?:sin[Ev]|mage|f[fr]|cy)|harrw|(?:n[gl]|l)eqq|g(?:sim[el]|tcc|e(?:qq|l)|nE|l[Eaj]|gg|ap)|ocirc|starf|utrif|d(?:trif|i(?:ams|e)|ashv|sc[ry]|fr|eg)|[du]har[lr]|T(?:HORN|a[bu])|(?:TRAD|[gl]vn)E|odash|[EUaeu]o(?:gon|pf)|alpha|[IJOUYgjuy]c(?:irc|y)|v(?:arr|ee)|succ|sim[gl]|harr|ln(?:ap|e)|lesg|(?:n[gl]|l)eq|ocir|star|utri|vBar|fork|su[bp]e|nsim|lneq|gneq|csu[bp]|zwn?j|yacy|x(?:opf|i)|scnE|o(?:r(?:d[fm]|v)|mid|lt|hm|gt|fr|cy|S)|scap|rsqb|ropf|ltcc|tsc[ry]|QUOT|[EOUYao]uml|rho|phi|n[GL]t|e[gl]s|ngt|I(?:nt|m)|nis|rfr|rcy|lnE|lEg|ufr|S(?:um|cy)|R(?:sh|ho)|psi|Ps?i|[NRTt]cy|L(?:sh|cy|[Tt])|kcy|Kcy|Hat|REG|[Zdz]cy|wr|lE|wp|Xi|Nu|Mu)(;)</string> - <key>name</key> - <string>constant.language.character-reference.named.html</string> - <key>captures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.begin.html</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>keyword.control.character-reference.html</string> - </dict> - <key>3</key> - <dict> - <key>name</key> - <string>punctuation.definition.character-reference.end.html</string> - </dict> - </dict> - </dict> - <key>commonmark-code-fenced-apib</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:api\x2dblueprint|(?:.*\.)?apib))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.apib.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.apib</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.markdown.source.gfm.apib</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:api\x2dblueprint|(?:.*\.)?apib))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.apib.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.apib</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.markdown.source.gfm.apib</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-asciidoc</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?(?:adoc|asciidoc)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.asciidoc.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.asciidoc</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.asciidoc</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?(?:adoc|asciidoc)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.asciidoc.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.asciidoc</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.asciidoc</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-c</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:dtrace|dtrace\x2dscript|oncrpc|rpc|rpcgen|unified\x2dparallel\x2dc|x\x2dbitmap|x\x2dpixmap|xdr|(?:.*\.)?(?:c|cats|h|idc|opencl|upc|xbm|xpm|xs)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.c.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.c</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.c</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:dtrace|dtrace\x2dscript|oncrpc|rpc|rpcgen|unified\x2dparallel\x2dc|x\x2dbitmap|x\x2dpixmap|xdr|(?:.*\.)?(?:c|cats|h|idc|opencl|upc|xbm|xpm|xs)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.c.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.c</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.c</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-clojure</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:clojure|rouge|(?:.*\.)?(?:boot|cl2|clj|cljc|cljs|cljs\.hl|cljscm|cljx|edn|hic|rg|wisp)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.clojure.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.clojure</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.clojure</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:clojure|rouge|(?:.*\.)?(?:boot|cl2|clj|cljc|cljs|cljs\.hl|cljscm|cljx|edn|hic|rg|wisp)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.clojure.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.clojure</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.clojure</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-coffee</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:coffee\x2dscript|coffeescript|(?:.*\.)?(?:_coffee|cjsx|coffee|cson|em|emberscript|iced)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.coffee.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.coffee</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.coffee</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:coffee\x2dscript|coffeescript|(?:.*\.)?(?:_coffee|cjsx|coffee|cson|em|emberscript|iced)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.coffee.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.coffee</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.coffee</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-console</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:pycon|python\x2dconsole))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.console.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.console</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.python.console</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:pycon|python\x2dconsole))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.console.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.console</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.python.console</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-cpp</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:ags|ags\x2dscript|asymptote|c\+\+|edje\x2ddata\x2dcollection|game\x2dmaker\x2dlanguage|swig|(?:.*\.)?(?:asc|ash|asy|c\+\+|cc|cp|cpp|cppm|cxx|edc|gml|h\+\+|hh|hpp|hxx|inl|ino|ipp|ixx|metal|re|tcc|tpp|txx)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.cpp.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.cpp</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.c++</string> - </dict> - <dict> - <key>include</key> - <string>source.cpp</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:ags|ags\x2dscript|asymptote|c\+\+|edje\x2ddata\x2dcollection|game\x2dmaker\x2dlanguage|swig|(?:.*\.)?(?:asc|ash|asy|c\+\+|cc|cp|cpp|cppm|cxx|edc|gml|h\+\+|hh|hpp|hxx|inl|ino|ipp|ixx|metal|re|tcc|tpp|txx)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.cpp.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.cpp</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.c++</string> - </dict> - <dict> - <key>include</key> - <string>source.cpp</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-cs</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:beef|c#|cakescript|csharp|(?:.*\.)?(?:bf|cake|cs|cs\.pp|csx|eq|linq|uno)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.cs.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.cs</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.cs</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:beef|c#|cakescript|csharp|(?:.*\.)?(?:bf|cake|cs|cs\.pp|csx|eq|linq|uno)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.cs.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.cs</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.cs</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-css</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?css))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.css.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.css</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.css</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?css))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.css.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.css</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.css</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-diff</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:udiff|(?:.*\.)?(?:diff|patch)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.diff.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.diff</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.diff</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:udiff|(?:.*\.)?(?:diff|patch)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.diff.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.diff</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.diff</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-dockerfile</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:containerfile|(?:.*\.)?dockerfile))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.dockerfile.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.dockerfile</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.dockerfile</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:containerfile|(?:.*\.)?dockerfile))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.dockerfile.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.dockerfile</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.dockerfile</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-elixir</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:elixir|(?:.*\.)?(?:ex|exs)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.elixir.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.elixir</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.elixir</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:elixir|(?:.*\.)?(?:ex|exs)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.elixir.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.elixir</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.elixir</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-elm</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?elm))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.elm.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.elm</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.elm</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?elm))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.elm.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.elm</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.elm</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-erlang</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:erlang|(?:.*\.)?(?:app|app\.src|erl|es|escript|hrl|xrl|yrl)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.erlang.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.erlang</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.erlang</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:erlang|(?:.*\.)?(?:app|app\.src|erl|es|escript|hrl|xrl|yrl)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.erlang.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.erlang</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.erlang</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-gitconfig</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:git\x2dconfig|gitmodules|(?:.*\.)?gitconfig))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.gitconfig.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.gitconfig</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.gitconfig</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:git\x2dconfig|gitmodules|(?:.*\.)?gitconfig))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.gitconfig.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.gitconfig</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.gitconfig</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-go</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:golang|(?:.*\.)?go))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.go.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.go</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.go</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:golang|(?:.*\.)?go))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.go.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.go</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.go</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-graphql</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?(?:gql|graphql|graphqls)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.graphql.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.graphql</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.graphql</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?(?:gql|graphql|graphqls)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.graphql.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.graphql</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.graphql</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-haskell</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:c2hs|c2hs\x2dhaskell|frege|haskell|(?:.*\.)?(?:chs|dhall|hs|hs\x2dboot|hsc)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.haskell.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.haskell</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.haskell</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:c2hs|c2hs\x2dhaskell|frege|haskell|(?:.*\.)?(?:chs|dhall|hs|hs\x2dboot|hsc)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.haskell.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.haskell</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.haskell</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-html</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:html|(?:.*\.)?(?:hta|htm|html\.hl|kit|mtml|xht|xhtml)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.html.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.html</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.basic</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:html|(?:.*\.)?(?:hta|htm|html\.hl|kit|mtml|xht|xhtml)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.html.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.html</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.basic</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-ini</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:altium|altium\x2ddesigner|dosini|(?:.*\.)?(?:cnf|dof|ini|lektorproject|outjob|pcbdoc|prefs|prjpcb|properties|schdoc|url)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.ini.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.ini</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.ini</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:altium|altium\x2ddesigner|dosini|(?:.*\.)?(?:cnf|dof|ini|lektorproject|outjob|pcbdoc|prefs|prjpcb|properties|schdoc|url)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.ini.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.ini</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.ini</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-java</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:chuck|unrealscript|(?:.*\.)?(?:ck|jav|java|jsh|uc)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.java.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.java</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.java</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:chuck|unrealscript|(?:.*\.)?(?:ck|jav|java|jsh|uc)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.java.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.java</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.java</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-js</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:cycript|javascript\+erb|json\x2dwith\x2dcomments|node|qt\x2dscript|(?:.*\.)?(?:_js|bones|cjs|code\x2dsnippets|code\x2dworkspace|cy|es6|jake|javascript|js|js\.erb|jsb|jscad|jsfl|jslib|jsm|json5|jsonc|jsonld|jspre|jss|jsx|mjs|njs|pac|sjs|ssjs|sublime\x2dbuild|sublime\x2dcolor\x2dscheme|sublime\x2dcommands|sublime\x2dcompletions|sublime\x2dkeymap|sublime\x2dmacro|sublime\x2dmenu|sublime\x2dmousemap|sublime\x2dproject|sublime\x2dsettings|sublime\x2dtheme|sublime\x2dworkspace|sublime_metrics|sublime_session|xsjs|xsjslib)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.js.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.js</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.js</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:cycript|javascript\+erb|json\x2dwith\x2dcomments|node|qt\x2dscript|(?:.*\.)?(?:_js|bones|cjs|code\x2dsnippets|code\x2dworkspace|cy|es6|jake|javascript|js|js\.erb|jsb|jscad|jsfl|jslib|jsm|json5|jsonc|jsonld|jspre|jss|jsx|mjs|njs|pac|sjs|ssjs|sublime\x2dbuild|sublime\x2dcolor\x2dscheme|sublime\x2dcommands|sublime\x2dcompletions|sublime\x2dkeymap|sublime\x2dmacro|sublime\x2dmenu|sublime\x2dmousemap|sublime\x2dproject|sublime\x2dsettings|sublime\x2dtheme|sublime\x2dworkspace|sublime_metrics|sublime_session|xsjs|xsjslib)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.js.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.js</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.js</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-json</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:ecere\x2dprojects|ipython\x2dnotebook|jupyter\x2dnotebook|max|max/msp|maxmsp|oasv2\x2djson|oasv3\x2djson|(?:.*\.)?(?:4dform|4dproject|avsc|epj|geojson|gltf|har|ice|ipynb|json|json|json|json\x2dtmlanguage|jsonl|maxhelp|maxpat|maxproj|mcmeta|mxt|pat|sarif|tfstate|tfstate\.backup|topojson|webapp|webmanifest|yy|yyp)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.json.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.json</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.json</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:ecere\x2dprojects|ipython\x2dnotebook|jupyter\x2dnotebook|max|max/msp|maxmsp|oasv2\x2djson|oasv3\x2djson|(?:.*\.)?(?:4dform|4dproject|avsc|epj|geojson|gltf|har|ice|ipynb|json|json|json|json\x2dtmlanguage|jsonl|maxhelp|maxpat|maxproj|mcmeta|mxt|pat|sarif|tfstate|tfstate\.backup|topojson|webapp|webmanifest|yy|yyp)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.json.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.json</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.json</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-julia</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:julia|(?:.*\.)?jl))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.julia.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.julia</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.julia</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:julia|(?:.*\.)?jl))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.julia.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.julia</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.julia</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-kotlin</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:gradle\x2dkotlin\x2ddsl|kotlin|(?:.*\.)?(?:gradle\.kts|kt|ktm|kts)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.kotlin.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.kotlin</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.kotlin</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:gradle\x2dkotlin\x2ddsl|kotlin|(?:.*\.)?(?:gradle\.kts|kt|ktm|kts)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.kotlin.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.kotlin</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.kotlin</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-less</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:less\x2dcss|(?:.*\.)?less))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.less.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.less</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.css.less</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:less\x2dcss|(?:.*\.)?less))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.less.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.less</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.css.less</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-lua</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?(?:fcgi|lua|nse|p8|pd_lua|rbxs|rockspec|wlua)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.lua.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.lua</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.lua</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?(?:fcgi|lua|nse|p8|pd_lua|rbxs|rockspec|wlua)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.lua.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.lua</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.lua</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-makefile</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:bsdmake|mf|(?:.*\.)?(?:mak|make|makefile|mk|mkfile)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.makefile.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.makefile</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.makefile</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:bsdmake|mf|(?:.*\.)?(?:mak|make|makefile|mk|mkfile)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.makefile.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.makefile</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.makefile</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-md</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:md|pandoc|rmarkdown|(?:.*\.)?(?:livemd|markdown|mdown|mdwn|mkd|mkdn|mkdown|qmd|rmd|ronn|scd|workbook)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.md.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.md</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.md</string> - </dict> - <dict> - <key>include</key> - <string>source.gfm</string> - </dict> - <dict> - <key>include</key> - <string>text.html.markdown</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:md|pandoc|rmarkdown|(?:.*\.)?(?:livemd|markdown|mdown|mdwn|mkd|mkdn|mkdown|qmd|rmd|ronn|scd|workbook)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.md.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.md</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.md</string> - </dict> - <dict> - <key>include</key> - <string>source.gfm</string> - </dict> - <dict> - <key>include</key> - <string>text.html.markdown</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-mdx</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?mdx))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.mdx.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.mdx</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?mdx))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.mdx.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.mdx</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-objc</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:obj\x2dc|objc|objective\x2dc|objectivec))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.objc.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.objc</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.objc</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:obj\x2dc|objc|objective\x2dc|objectivec))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.objc.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.objc</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.objc</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-perl</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:cperl|(?:.*\.)?(?:cgi|perl|ph|pl|plx|pm|psgi|t)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.perl.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.perl</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.perl</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:cperl|(?:.*\.)?(?:cgi|perl|ph|pl|plx|pm|psgi|t)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.perl.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.perl</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.perl</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-php</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:html\+php|inc|php|(?:.*\.)?(?:aw|ctp|php3|php4|php5|phps|phpt|phtml)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.php.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.php</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.php</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:html\+php|inc|php|(?:.*\.)?(?:aw|ctp|php3|php4|php5|phps|phpt|phtml)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.php.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.php</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.html.php</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-python</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:bazel|easybuild|python|python3|rusthon|snakemake|starlark|xonsh|(?:.*\.)?(?:bzl|eb|gyp|gypi|lmi|py|py3|pyde|pyi|pyp|pyt|pyw|rpy|sage|sagews|smk|snakefile|spec|tac|wsgi|xpy|xsh)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.python.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.python</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.python</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:bazel|easybuild|python|python3|rusthon|snakemake|starlark|xonsh|(?:.*\.)?(?:bzl|eb|gyp|gypi|lmi|py|py3|pyde|pyi|pyp|pyt|pyw|rpy|sage|sagews|smk|snakefile|spec|tac|wsgi|xpy|xsh)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.python.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.python</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.python</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-r</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:rscript|splus|(?:.*\.)?(?:r|rd|rsx)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.r.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.r</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.r</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:rscript|splus|(?:.*\.)?(?:r|rd|rsx)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.r.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.r</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.r</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-raku</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:perl\x2d6|perl6|pod\x2d6|(?:.*\.)?(?:6pl|6pm|nqp|p6|p6l|p6m|pl6|pm6|pod|pod6|raku|rakumod)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.raku.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.raku</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.raku</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:perl\x2d6|perl6|pod\x2d6|(?:.*\.)?(?:6pl|6pm|nqp|p6|p6l|p6m|pl6|pm6|pod|pod6|raku|rakumod)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.raku.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.raku</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.raku</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-ruby</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:jruby|macruby|(?:.*\.)?(?:builder|druby|duby|eye|gemspec|god|jbuilder|mirah|mspec|pluginspec|podspec|prawn|rabl|rake|rb|rbi|rbuild|rbw|rbx|ru|ruby|thor|watchr)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.ruby.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.ruby</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.ruby</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:jruby|macruby|(?:.*\.)?(?:builder|druby|duby|eye|gemspec|god|jbuilder|mirah|mspec|pluginspec|podspec|prawn|rabl|rake|rb|rbi|rbuild|rbw|rbx|ru|ruby|thor|watchr)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.ruby.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.ruby</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.ruby</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-rust</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:rust|(?:.*\.)?(?:rs|rs\.in)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.rust.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.rust</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.rust</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:rust|(?:.*\.)?(?:rs|rs\.in)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.rust.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.rust</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.rust</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-scala</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?(?:kojo|sbt|sc|scala)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.scala.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.scala</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.scala</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?(?:kojo|sbt|sc|scala)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.scala.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.scala</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.scala</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-scss</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?scss))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.scss.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.scss</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.css.scss</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?scss))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.scss.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.scss</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.css.scss</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-shell</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:abuild|alpine\x2dabuild|apkbuild|envrc|gentoo\x2debuild|gentoo\x2declass|openrc|openrc\x2drunscript|shell|shell\x2dscript|(?:.*\.)?(?:bash|bats|command|csh|ebuild|eclass|ksh|sh|sh\.in|tcsh|tmux|tool|zsh|zsh\x2dtheme)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.shell.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.shell</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.shell</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:abuild|alpine\x2dabuild|apkbuild|envrc|gentoo\x2debuild|gentoo\x2declass|openrc|openrc\x2drunscript|shell|shell\x2dscript|(?:.*\.)?(?:bash|bats|command|csh|ebuild|eclass|ksh|sh|sh\.in|tcsh|tmux|tool|zsh|zsh\x2dtheme)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.shell.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.shell</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.shell</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-shell-session</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:bash\x2dsession|console|shellsession|(?:.*\.)?sh\x2dsession))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.shell-session.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.shell-session</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.shell-session</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:bash\x2dsession|console|shellsession|(?:.*\.)?sh\x2dsession))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.shell-session.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.shell-session</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.shell-session</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-sql</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:plpgsql|sqlpl|(?:.*\.)?(?:cql|db2|ddl|mysql|pgsql|prc|sql|sql|sql|tab|udf|viw)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.sql.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.sql</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.sql</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:plpgsql|sqlpl|(?:.*\.)?(?:cql|db2|ddl|mysql|pgsql|prc|sql|sql|sql|tab|udf|viw)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.sql.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.sql</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.sql</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-svg</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?svg))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.svg.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.svg</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.xml.svg</string> - </dict> - <dict> - <key>include</key> - <string>text.xml</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?svg))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.svg.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.svg</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.xml.svg</string> - </dict> - <dict> - <key>include</key> - <string>text.xml</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-swift</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?swift))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.swift.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.swift</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.swift</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?swift))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.swift.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.swift</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.swift</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-toml</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?toml))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.toml.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.toml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.toml</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?toml))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.toml.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.toml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.toml</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-ts</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:typescript|(?:.*\.)?(?:cts|mts|ts)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.ts.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.ts</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.ts</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:typescript|(?:.*\.)?(?:cts|mts|ts)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.ts.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.ts</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.ts</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-tsx</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:(?:.*\.)?tsx))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.tsx.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.tsx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:(?:.*\.)?tsx))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.tsx.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.tsx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.tsx</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-vbnet</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:fb|freebasic|realbasic|vb\x2d\.net|vb\.net|vbnet|vbscript|visual\x2dbasic|visual\x2dbasic\x2d\.net|(?:.*\.)?(?:bi|rbbas|rbfrm|rbmnu|rbres|rbtbar|rbuistate|vb|vbhtml|vbs)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.vbnet.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.vbnet</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.vbnet</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:fb|freebasic|realbasic|vb\x2d\.net|vb\.net|vbnet|vbscript|visual\x2dbasic|visual\x2dbasic\x2d\.net|(?:.*\.)?(?:bi|rbbas|rbfrm|rbmnu|rbres|rbtbar|rbuistate|vb|vbhtml|vbs)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.vbnet.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.vbnet</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.vbnet</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-xml</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:collada|eagle|labview|web\x2dontology\x2dlanguage|xpages|(?:.*\.)?(?:adml|admx|ant|axaml|axml|brd|builds|ccproj|ccxml|clixml|cproject|cscfg|csdef|csproj|ct|dae|depproj|dita|ditamap|ditaval|dll\.config|dotsettings|filters|fsproj|fxml|glade|gmx|grxml|hzp|iml|ivy|jelly|jsproj|kml|launch|lvclass|lvlib|lvproj|mdpolicy|mjml|mxml|natvis|ndproj|nproj|nuspec|odd|osm|owl|pkgproj|proj|props|ps1xml|psc1|pt|qhelp|rdf|resx|rss|sch|sch|scxml|sfproj|shproj|srdf|storyboard|sublime\x2dsnippet|targets|tml|ui|urdf|ux|vbproj|vcxproj|vsixmanifest|vssettings|vstemplate|vxml|wixproj|wsdl|wsf|wxi|wxl|wxs|x3d|xacro|xaml|xib|xlf|xliff|xmi|xml|xml\.dist|xmp|xpl|xproc|xproj|xsd|xsp\x2dconfig|xsp\.metadata|xspec|xul|zcml)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.xml.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.xml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.xml</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:collada|eagle|labview|web\x2dontology\x2dlanguage|xpages|(?:.*\.)?(?:adml|admx|ant|axaml|axml|brd|builds|ccproj|ccxml|clixml|cproject|cscfg|csdef|csproj|ct|dae|depproj|dita|ditamap|ditaval|dll\.config|dotsettings|filters|fsproj|fxml|glade|gmx|grxml|hzp|iml|ivy|jelly|jsproj|kml|launch|lvclass|lvlib|lvproj|mdpolicy|mjml|mxml|natvis|ndproj|nproj|nuspec|odd|osm|owl|pkgproj|proj|props|ps1xml|psc1|pt|qhelp|rdf|resx|rss|sch|sch|scxml|sfproj|shproj|srdf|storyboard|sublime\x2dsnippet|targets|tml|ui|urdf|ux|vbproj|vcxproj|vsixmanifest|vssettings|vstemplate|vxml|wixproj|wsdl|wsf|wxi|wxl|wxs|x3d|xacro|xaml|xib|xlf|xliff|xmi|xml|xml\.dist|xmp|xpl|xproc|xproj|xsd|xsp\x2dconfig|xsp\.metadata|xspec|xul|zcml)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.xml.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.xml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>text.xml</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - <key>commonmark-code-fenced-yaml</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(`{3,})(?:[\t ]*((?i:jar\x2dmanifest|kaitai\x2dstruct|oasv2\x2dyaml|oasv3\x2dyaml|unity3d\x2dasset|yaml|yml|(?:.*\.)?(?:anim|asset|ksy|lkml|lookml|mat|meta|mir|prefab|raml|reek|rviz|sublime\x2dsyntax|syntax|unity|yaml\x2dtmlanguage|yaml\.sed|yml\.mysql)))(?:[\t ]+((?:[^\n\r`])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.yaml.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.yaml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.yaml</string> - </dict> - </array> - </dict> - </array> - </dict> - <dict> - <key>begin</key> - <string>(?:^|\G)[\t ]*(~{3,})(?:[\t ]*((?i:jar\x2dmanifest|kaitai\x2dstruct|oasv2\x2dyaml|oasv3\x2dyaml|unity3d\x2dasset|yaml|yml|(?:.*\.)?(?:anim|asset|ksy|lkml|lookml|mat|meta|mir|prefab|raml|reek|rviz|sublime\x2dsyntax|syntax|unity|yaml\x2dtmlanguage|yaml\.sed|yml\.mysql)))(?:[\t ]+((?:[^\n\r])+))?)(?:[\t ]*$)</string> - <key>beginCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.begin.code.fenced.mdx</string> - </dict> - <key>2</key> - <dict> - <key>name</key> - <string>entity.name.function.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - <key>3</key> - <dict> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>#markdown-string</string> - </dict> - </array> - </dict> - </dict> - <key>end</key> - <string>(?:^|\G)[\t ]*(\1)(?:[\t ]*$)</string> - <key>endCaptures</key> - <dict> - <key>1</key> - <dict> - <key>name</key> - <string>string.other.end.code.fenced.mdx</string> - </dict> - </dict> - <key>name</key> - <string>markup.code.yaml.mdx</string> - <key>patterns</key> - <array> - <dict> - <key>begin</key> - <string>(^|\G)(\s*)(.*)</string> - <key>while</key> - <string>(^|\G)(?![\t ]*([`~]{3,})[\t ]*$)</string> - <key>contentName</key> - <string>meta.embedded.yaml</string> - <key>patterns</key> - <array> - <dict> - <key>include</key> - <string>source.yaml</string> - </dict> - </array> - </dict> - </array> - </dict> - </array> - </dict> - </dict> - <key>scopeName</key> - <string>source.mdx</string> - <key>uuid</key> - <string>fe65e2cd-7c73-4a27-8b5e-5902893626aa</string> - </dict> -</plist> \ No newline at end of file diff --git a/src/pages/admin/index.mdx b/src/pages/admin/index.mdo similarity index 51% rename from src/pages/admin/index.mdx rename to src/pages/admin/index.mdo index 3a78a9316c209037be47e0eb1fb2dabf67f087d3..85b5d2da02e92248703192f4ec343cecfb2b3b14 100644 --- a/src/pages/admin/index.mdx +++ b/src/pages/admin/index.mdo @@ -1,5 +1,8 @@ -export default ({children}) => <main>{children}</main> -export const meta = { title: 'paper clover admin' }; +--- +meta: + title: paper clover admin +--- +<main> # hi chloe @@ -7,3 +10,5 @@ remember that you're loved. - [question admin view](/admin/q+a) - [question inbox](/admin/q+a/inbox) + +</main> diff --git a/src/pages/license.mdx b/src/pages/license.mdo similarity index 70% rename from src/pages/license.mdx rename to src/pages/license.mdo index 2eebe3a8964c81c7d26d19e54cb9466822c4ece9..aefc51890321cde1ab0027d9d61a6a05956dc64d 100644 --- a/src/pages/license.mdx +++ b/src/pages/license.mdo @@ -1,17 +1,17 @@ -export const CurrentYear = () => new Date().getFullYear(); -export default ({ content }) => <main>{content}</main>; -export const theme = { - fg: '#ffe', - bg: '#434', - h1: '#f5f', -}; -export const meta = { - title: "paper clover's media license" -}; +--- +meta: + title: paper clover's media license +theme: + fg: "#ffe" + bg: "#434" + h1: "#f5f" + primary: "#f5f" +--- +<main> # paper clover's media license -copyright 2018-<CurrentYear/> paper clover +copyright 2018-${new Date().getFullYear()} paper clover all rights reserved @@ -29,3 +29,5 @@ paperclover.net provides media files as-is, without any warranty or liability. the above rules are in place to preserve my sanity.<br/> thank you for respecting them. + +</main> diff --git a/src/pages/log.mdx b/src/pages/log.mdo similarity index 98% rename from src/pages/log.mdx rename to src/pages/log.mdo index c247e134bb3a1801d577fdcea34ca428162e0fab..5c526b3be9bdfd55e6cfbdcd822b36512a889331 100644 --- a/src/pages/log.mdx +++ b/src/pages/log.mdo @@ -1,6 +1,9 @@ +--- +meta: + title: clover's log +--- import './log.css'; -export default ({ content }) => <main>{content}</main> -export const meta = { title: 'clover\'s log' }; +static const repo = "${repo}"; [go back to the home page](/) @@ -16,6 +19,8 @@ export const meta = { title: 'clover\'s log' }; [history of japan reanimated]: /history-of-japan-reanimated [react mutation]: /history-of-japan-reanimated +<main> + # clover's log these are like mini blog posts, but more in generally just what the heck i'm up to. @@ -32,7 +37,7 @@ there were two bugs: natively. they made `video.canPlayType("application/x-mpegURL")` return "maybe", which is total propaganda because chrome does not actually support this type of stream. they support some insane subset that isn't real world - use cases. + use cases. - hls polyfill was never being used because of a bundling mistake, so those users would get the unoptimized original file. @@ -240,16 +245,16 @@ tags: [progress.ts], [todo tracker] i finished streaming io on the @clo/lib/[progress.ts]. very proud of it. my git commits describe the tech better than me reiterating. -> ## feat(lib/progress): implement streaming wire protocol +> ## feat(lib/progress): implement streaming wire protocol > resolves `#47` -> +> > `encodeByteStream` converts these events into a `ReadableStream`. by > batching events together, the stream contents remain small, that way the > code that constructs progress nodes do not have to worry about calling > many setters at once, it gets debounced be the serializer. stream > backpressure causes larger time-gaps to be batched (smaller). this > enables servers to respond with rich progress. -> +> > ``` > const root = new progress.Root(); > doActionWithProgress(root).then(root.end, root.error); @@ -263,7 +268,7 @@ commits describe the tech better than me reiterating. > ``` > > and `decodeByteStream` on the client: -> +> > ``` > const output = document.getElementById("output"); > const res = await fetch(...); @@ -285,21 +290,21 @@ commits describe the tech better than me reiterating. > UTF-8, there is `encodeEventStream` which returns a `ReadableStream` of > JSON objects which can be compressed at the developer's discretion. -> ## feat(lib/progress): headless rendering + time estimation +> ## feat(lib/progress): headless rendering + time estimation > node signaling is done by providing a `progress.Root` to every node, > dispatching events to it when the node changes. the root is connected to > an observer to construct a UI out of it. there are two apis planned: -> +> > - `attachToScreen` binds a root to a TTY screen (via the log.Widget API). > the primary use of this is to implement the top level `progress.start`. -> +> > - a serialization system that allows transmitting a `Root` over a wire. > this commit was going to include this but it is an unexpectedly large > component. -> +> > - potentially a browser binding like `attachToDocument`. this will not > be added in this patch. -> +> > additionally, resolves #33 by implementing `estimatedTime` i also did a large part of the work to create a "code todo tracking" tool. i @@ -396,7 +401,7 @@ tags: [home infra], [git], [name paint bot] show i deleted all my github repositories except four: my "readme", a bug reproduction repo, the mirror for [ts lie detector], and a shared private repo with someone that is load bearing. in this process, i've moved all the projects -to my [forgejo instance][git]. +to my [forgejo instance][git]. with this, [name paint bot], one of my few remaining projects that is still active, moves to that forgejo instance using their github migrator. some of my @@ -405,3 +410,4 @@ feels more alive on my site because of the theming and per-repo icons. after a year of forgejo, i am really happy with how it treats me. +</main> diff --git a/src/q+a/clover-markdown.tsx b/src/q+a/clover-markdown.tsx deleted file mode 100644 index e577f33636569c0631b8c2e7551b77d93c622262..0000000000000000000000000000000000000000 --- a/src/q+a/clover-markdown.tsx +++ /dev/null @@ -1,271 +0,0 @@ -function assert(condition: any, message?: string): asserts condition { - if (!condition) { - throw new Error(message || "Assertion failed"); - } -} - -export const customRules = defaultRules.clone(); - -/** A question mention, formatted like `#112233445566` */ -customRules.insertBefore("em", { - name: "mentionQuestion", - match: inlineRegex(/^#([0-9]{10})(?:[0-9]{2})?/), - parse(capture) { - return { - id: capture[1], - }; - }, -}); - -/** A question mention, formatted like `@pheonix-write` */ -customRules.insertBefore("em", { - name: "mentionArtifact", - match: inlineRegex(/^@([a-z0-9-]+)/i), - parse(capture) { - return { - id: capture[1], - }; - }, -}); - -/** The censor bar used for past deadnaming: #name# and #username# */ -customRules.insertBefore("em", { - name: "deadname", - match: inlineRegex(/^#(name|username)#/i), - parse(capture) { - return { - kind: capture[1], - }; - }, -}); - -/** html block. allows arbitrary html, but rn only as an answer. formatted like `@html content here` */ -customRules.insertBefore("paragraph", { - name: "html", - match: blockRegex(/^@html ((?:[^\n]|\n(?! *\n))+)(?:\n *)+\n/), - parse(capture) { - return { - data: capture[1], - }; - }, -}); - -/** for server-rendered search, mark can highlight the seen word */ -customRules.insertBefore("paragraph", { - name: "mark", - match: inlineRegex(/^<!!mark!!>(.*?)<!!mark!!>/), - parse: parseCaptureInline, -}); - -/** Adjust autolinking to use my own components if possible */ -customRules.insertBefore("url", { - name: "autolink_mention", - match: inlineRegex( - /^https?:\/\/(?:paperclover\.net|localhost:\d+)\/([^\s<]+[^<.,:;"')\]\s])/, - ), - parse(capture) { - const qaMatch = capture[1].match(/^q\+a\/([0-9]{10}(?:[0-9]{2})?)/); - if (qaMatch) { - return { - type: "mentionQuestion", - id: qaMatch[1], - }; - } - - const fileMatch = capture[1].match(/^file\/([^#?]*)/); - if (fileMatch) { - // const file = MediaFile.getByPath(decodeURIComponent(fileMatch[1])); - // if (file) { - // return { - // type: "file", - // file, - // }; - // } - } - - return { - type: "link", - content: [ - { - type: "text", - content: capture[1], - }, - ], - target: capture[1], - title: undefined, - }; - }, -}); - -export const questionRules = customRules.clone(); - -questionRules.remove("heading"); - -/** Input paragraphs. any paragraph prefixed with `i:` */ -questionRules.insertBefore("paragraph", { - name: "question", - match: blockRegex(/^(?:q: [^\n]+(?:\n|$))+\s*/), - parse(capture, parse, state) { - const lines = capture[0] - .trim() - .split("\n") - .map((line) => line.trim()) - .filter((x) => x.length > 0) - .map((x) => { - assert(x.startsWith("q: ")); - return x.slice(3); - }); - const content = lines - .map((line, i) => { - const parsed = parseInline(parse, line, state); - if (i < lines.length - 1) { - parsed.push({ type: "br" }); - } - return parsed; - }) - .flat(); - return { - content, - }; - }, -}); - -const cloverParser = createParser(questionRules); - -const basicNodeTagNames: Record<string, string> = { - mark: "mark", - question: "q-", - paragraph: "p", - hr: "hr", - blockQuote: "blockquote", - em: "em", - strong: "strong", - u: "u", - del: "del", - inlineCode: "code", - br: "br", -}; - -function BasicNode(node: ASTNode, children: any) { - const E = basicNodeTagNames[node.type]; - return <E>{children}</E>; -} - -function ListRenderer(node: ASTNode, children: any[]) { - const T = node.ordered ? "ol" : "ul"; - return ( - <T> - {children.map((child) => <li>{child}</li>)} - </T> - ); -} - -function MarkdownLink(node: ASTNode, children: any[]) { - return <a href={node.target}>{children}</a>; -} - -function Deadname(node: ASTNode) { - return <span class="dead">old {node.kind}</span>; -} - -function QuestionRef(node: ASTNode) { - if (node.id.length === 12) node.id = node.id.slice(0, 10); - const timestamp = questionIdToTimestamp(node.id); - if (!timestamp) { - console.error(`Invalid question ref: ${node.id}`); - return <span class="question-ref">[Invalid Question Ref: #{node.id}]</span>; - } - return ( - <a class="custom question-ref" href={`/q+a/${node.id}`}> - {formatQuestionTimestamp(timestamp)} - </a> - ); -} - -function ArtifactRef(node: ASTNode) { - const artifact = artifactMap[node.id]; - if (!artifact) { - return <span class="artifact">[Invalid Artifact Ref: @{node.id}]</span>; - } - const [title, url, type] = artifact; - if (!url) { - return <span>{title}</span>; - } - return ( - <a class={`custom artifact artifact-${type}`} href={url}> - {title} - </a> - ); -} - -const br = <br />; -const ssrFunctions: any = { - // Default Renders - // heading: HeadingRenderer, - hr: BasicNode, - mark: BasicNode, - blockQuote: BasicNode, - // codeBlock: MarkdownCodeBlock, - list: ListRenderer, - // table: TableRenderer, - paragraph: BasicNode, - // tableSeparator: ???, - link: MarkdownLink, - // image: MarkdownImage, - em: BasicNode, - strong: BasicNode, - u: BasicNode, - del: BasicNode, - inlineCode: BasicNode, - br: () => br, - newline: () => br, - deadname: Deadname, - - // Custom Elements - question: BasicNode, - html: (node: any) => render.raw(node.data), - mentionQuestion: QuestionRef, - mentionArtifact: ArtifactRef, -}; - -function renderNode(node: string | ASTNode | ASTNode[]): any { - if (typeof node === "string") { - return node; - } else if (Array.isArray(node)) { - return node.map((item) => renderNode(item)); - } else if (node.type === "text") { - return node.content; - } else { - const render = ssrFunctions[node.type]; - if (!render) { - throw new Error(`No renderer for node type "${node.type}"`); - } - const content = node.content as any; - return render(node, content ? renderNode(content) : undefined); - } -} - -export namespace CloverMarkdown { - export interface Props { - text: string; - inline?: boolean; - } -} - -export function CloverMarkdown(props: CloverMarkdown.Props) { - const ast = cloverParser(props.text, { inline: !!props.inline }); - return renderNode(ast); -} - -import { artifactMap } from "./artifacts.ts"; -import { formatQuestionTimestamp, questionIdToTimestamp } from "./format.ts"; -import { - type ASTNode, - blockRegex, - createParser, - defaultRules, - inlineRegex, - parseCaptureInline, - parseInline, -} from "./simple-markdown.ts"; -import * as render from "lib/render.ts"; diff --git a/src/q+a/layout.tsx b/src/q+a/layout.tsx deleted file mode 100644 index 157d82300eb698cb95f31864ddb91277aae5cf32..0000000000000000000000000000000000000000 --- a/src/q+a/layout.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import "./questions.css"; - -export default function QuestionLayout({ content }: render.Node) { - addScript("./header.client.ts"); - return ( - <main class="qa"> - <h1> - <span class="a" style="color:var(--a);--s:#19607d">answers</span> - <span class="n" style="--s:#999;margin:0 5px">&</span> - <span class="q" style="color:var(--b);--s:#994253">questions</span> - </h1> - {content} - </main> - ); -} - -export const theme = { - fg: "#f0f0f0", - bg: "#1a1b1c", - primary: "#f5a9b8", -}; - -export const minimal = { - default: ({ content }: { content: any }) => <main class="qa">{content}</main>, - theme, -}; - -import { addScript } from "#sitegen"; -import * as render from "lib/render.ts"; diff --git a/src/q+a/markdown.tsx b/src/q+a/markdown.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b1df8b3c02c9b31ec7791a3e18003634e01b2cc1 --- /dev/null +++ b/src/q+a/markdown.tsx @@ -0,0 +1,81 @@ +function labelledRedaction(contents: string) { + return ( + <span class="dead"> + {contents === "name" + ? "old name" + : contents === "username" + ? "old username" + : contents === "domain" + ? "old domain" + : null} + </span> + ); +} + +function questionRef(id: string) { + if (id.length === 12) id = id.slice(0, 10); + const timestamp = questionIdToTimestamp(id); + if (!timestamp) { + console.error(`Invalid question ref: ${id}`); + return <span class="question-ref">[Invalid Question Ref: #{id}]</span>; + } + return ( + <a class="custom question-ref" href={`/q+a/${id}`}> + {formatQuestionTimestamp(timestamp)} + </a> + ); +} + +function artifactRef(id: string) { + const artifact = artifactMap[id]; + if (!artifact) { + return <span class="artifact">[Invalid Artifact Ref: @{id}]</span>; + } + const [title, url, type] = artifact; + if (!url) { + return <span>{title}</span>; + } + return ( + <a class={`custom artifact artifact-${type}`} href={url}> + {title} + </a> + ); +} + +/** classic esbuild trick: use an impossible to guess key for string magic */ +const uniqueKey = crypto.randomUUID().replaceAll("-", ""); + +const renderers = { + A: artifactRef, + Q: questionRef, + R: labelledRedaction, +} as const; + +export function renderMarkdown(source: string) { + const tagNames: markodown.CloverQuestionExtensions = { + question: "q-", + artifactRef: uniqueKey + "_A", + questionRef: uniqueKey + "_Q", + labelledRedaction: uniqueKey + "_R", + }; + const result = markodown.transform({ + source, + markdownOnly: true, + cloverExtensions: tagNames, + }); + if (!result.success) { + throw new Error(JSON.stringify(result.errors)); + } + return result.text + .replace( + new RegExp(`<${uniqueKey}_([AQR])>([^<]*)<\\/${uniqueKey}_[AQR]>`, "g"), + (_, type: "A" | "Q" | "R", content: string) => { + return render.sync(renderers[type](content)).text; + }, + ); +} + +import * as markodown from "@clo/markodown"; +import * as render from "lib/render.ts"; +import { artifactMap } from "./artifacts.ts"; +import { formatQuestionTimestamp, questionIdToTimestamp } from "./format.ts"; diff --git a/src/q+a/pages/admin.q+a.marko b/src/q+a/pages/admin.q+a.marko index 67243cbc9a3358efc91ea7d9490141b874857ccd..306c89eca0c5c229afa6a1225408b04975279605 100644 --- a/src/q+a/pages/admin.q+a.marko +++ b/src/q+a/pages/admin.q+a.marko @@ -1,4 +1,4 @@ -export * as layout from "../layout.tsx"; +export { theme } from "../tags/question-layout.marko"; export interface Input { admin?: boolean; } diff --git a/src/q+a/pages/q+a.404.marko b/src/q+a/pages/q+a.404.marko index ecf69f69329d371ca7e2d92e2a9bd56371d28cc8..bf2138053ab5e4b3e34269440262f062884e57a8 100644 --- a/src/q+a/pages/q+a.404.marko +++ b/src/q+a/pages/q+a.404.marko @@ -1,10 +1,12 @@ -export * as layout from "../layout.tsx"; +export * as layout from "../tags/question-layout.marko"; export const meta: Metadata = { title: "paper clover q+a", }; +<question-layout> <h2>sound the alarms</h2> <p>this page doesn't exist</p> <p> <a href="/q+a">return to the questions list</a> </p> +</question-layout> diff --git a/src/q+a/pages/q+a.marko b/src/q+a/pages/q+a.marko index 69e9ff6223473a584b3940cab789d87ab5fe8ba8..2709b5f13bf8635004afe6096f4986bc939f802c 100644 --- a/src/q+a/pages/q+a.marko +++ b/src/q+a/pages/q+a.marko @@ -2,7 +2,7 @@ export interface Input { admin?: boolean; } -export * as layout from "../layout.tsx"; +export { theme } from "../tags/question-layout.marko"; export const regenerate = { tags: ["q+a"] }; export const meta: Metadata = { title: "paper clover q+a", @@ -12,6 +12,7 @@ export const meta: Metadata = { <const/{ admin = false } = input /> <const/questions = [...Question.getAll()] /> +<question-layout> <if=!admin> <question-form /> </> @@ -21,5 +22,6 @@ export const meta: Metadata = { <footer> fun fact: clover has answered ${questions.length} questions </footer> +</question-layout> import { Question } from "@/q+a/models/Question.ts"; diff --git a/src/q+a/scripts/editor.client.tsx b/src/q+a/scripts/editor.client.tsx index c82d576b051cc10a5fa8e2e3df07c37297ac7f75..0cee070c0732a78dafbb365c5d316ce6269b2f4f 100644 --- a/src/q+a/scripts/editor.client.tsx +++ b/src/q+a/scripts/editor.client.tsx @@ -1,6 +1,5 @@ import { EditorState } from "@codemirror/state"; import { basicSetup, EditorView } from "codemirror"; -import * as render from "lib/render.ts"; import type { ScriptPayload } from "@/q+a/views/editor.marko"; import QuestionRender from "@/q+a/tags/question.marko"; @@ -10,19 +9,17 @@ const date = new Date(payload.date); const main = document.getElementById("edit-grid")! as HTMLDivElement; const preview = document.getElementById("preview")! as HTMLDivElement; -function updatePreview(text: string) { - preview.innerHTML = render.sync( - <QuestionRender - question={{ - id: payload.id, - qmid: payload.qmid, - text: text, - type: payload.type, - date, - }} - editor - />, - ).text; +async function updatePreview(text: string) { + preview.innerHTML = await QuestionRender.render({ + question: { + id: payload.id, + qmid: payload.qmid, + text: text, + type: payload.type, + date, + }, + editor: true, + }); } updatePreview(payload.text); diff --git a/src/q+a/simple-markdown.ts b/src/q+a/simple-markdown.ts deleted file mode 100644 index ef118405c38479b5fd393329fefc721db71a4df0..0000000000000000000000000000000000000000 --- a/src/q+a/simple-markdown.ts +++ /dev/null @@ -1,1090 +0,0 @@ -// @ts-nocheck -// # Simple-Markdown Core -// -// This is a fork of Khan-academy's Simple-Markdown[1], initially forked in 2022 -// to add Svelte support[2], and used for paper clover's q+a markdown flavor. -// -// 1: https://github.com/Khan/perseus/tree/main/packages/simple-markdown/src -// 2: https://github.com/paperclover/svelte-simple-markdown -export type Rules = Record<string, ParserRule>; -export interface ParserRule { - name: string; - match: MatchFunction; - parse: ParseFunction; - quality?: QualityFunction; -} - -export class RuleList extends Array<ParserRule> { - constructor(input?: ArrayLike<ParserRule>) { - super(); - if (input) { - this.push(...Array.from(input)); - } - } - - insertBefore(rule: string, newRule: ParserRule): void { - const index = this.findIndex((r) => r.name === rule); - if (index === -1) { - throw new Error(`Rule ${rule} not found`); - } - this.splice(index, 0, newRule); - } - - insertAfter(rule: string, newRule: ParserRule): void { - const index = this.findIndex((r) => r.name === rule); - if (index === -1) { - throw new Error(`Rule ${rule} not found`); - } - this.splice(index + 1, 0, newRule); - } - - toRuleObject(): Record<string, ParserRule> { - const result: Record<string, ParserRule> = {}; - this.forEach((rule) => { - result[rule.name] = rule; - }); - return result; - } - - add(rule: ParserRule): void { - this.push(rule); - } - - get(rule: string): ParserRule | undefined { - return this.find((r) => r.name === rule); - } - - remove(rule: string): void { - const index = this.findIndex((r) => r.name === rule); - if (index === -1) { - throw new Error(`Rule ${rule} not found`); - } - this.splice(index, 1); - } - - clone() { - return new RuleList(this); - } -} - -/** - * Creates a parser for a given set of rules, with the precedence - * specified as a list of rules. - * - * @param rules - * an object containing - * rule type -> {match, order, parse} objects - * (lower order is higher precedence) - * @param [defaultState] - * - * @returns - * The resulting parse function, with the following parameters: - * @source: the input source string to be parsed - * @state: an optional object to be threaded through parse - * calls. Allows clients to add stateful operations to - * parsing, such as keeping track of how many levels deep - * some nesting is. For an example use-case, see passage-ref - * parsing in src/widgets/passage/passage-markdown.jsx - */ -export function createParser( - ruleListInput: RuleList, - defaultState: Partial<ParserState> = {}, -) { - let rules = ruleListInput.toRuleObject(); - let ruleList = Object.keys(rules); - - let latestState: ParserState; - - let nestedParse = function (source: string, state?: ParserState) { - let result: ASTNode[] = []; - state = state || latestState; - latestState = state; - - while (source) { - // store the best match, it's rule, and quality: - let ruleType = null; - let rule = null; - let capture = null; - let quality = NaN; // loop control variables: - - let i = 0; - let currRuleType = ruleList[0]; - - let currRule = rules[currRuleType]; - - do { - let currCapture = currRule.match(source, state); - - if (currCapture) { - let currQuality = currRule.quality - ? currRule.quality(currCapture, state) - : 0; - - // This should always be true the first time because - // the initial quality is NaN (that's why there's the - // condition negation). - if (!(currQuality <= quality)) { - ruleType = currRuleType; - rule = currRule; - capture = currCapture; - quality = currQuality; - } - } - - // Move on to the next item. - // Note that this makes `currRule` be the next item - i++; - currRuleType = ruleList[i]; - currRule = rules[currRuleType]; - } while ( - // keep looping while we're still within the ruleList - currRule && - // if we don't have a match yet, continue - (!capture || - // or if we have a match, but the next rule is - // at the same order, and has a quality measurement - // functions, then this rule must have a quality - // measurement function (since they are sorted before - // those without), and we need to check if there is - // a better quality match - currRule.quality) - ); - - if (!rule || !capture || !ruleType) { - throw new Error( - "Could not find a matching rule for the below " + - "content. The rule with highest `order` should " + - "always match content provided to it. Check " + - "the definition of `match` for '" + - ruleList[ruleList.length - 1] + - "'. It seems to not match the following source:\n" + - source, - ); - } - - if (capture.index) { - // If present and non-zero, i.e. a non-^ regexp result: - throw new Error( - "`match` must return a capture starting at index 0 " + - "(the current parse index). Did you forget a ^ at the " + - "start of the RegExp?", - ); - } - - let parsed = rule.parse(capture, nestedParse, state); - - // We maintain the same object here so that rules can - // store references to the objects they return and - // modify them later. (oops sorry! but this adds a lot - // of power--see reflinks.) - - // We also let rules override the default type of - // their parsed node if they would like to, so that - // there can be a single output function for all links, - // even if there are several rules to parse them. - if (!parsed.type) { - parsed.type = ruleType; - } - - // Collapse text nodes - if ( - parsed.type === "text" && result[result.length - 1]?.type === "text" - ) { - result[result.length - 1].content += parsed.content; - } else { - result.push(parsed as ASTNode); - } - - state.prevCapture = capture; - source = source.substring(state.prevCapture[0].length); - } - - return result; - }; - - let outerParse = function ( - source: string, - state: ParserState = { inline: false }, - ) { - latestState = populateInitialState(state, defaultState); - - if (!latestState.inline && !latestState.disableAutoBlockNewlines) { - source = source + "\n\n"; - } - - // We store the previous capture so that match functions can - // use some limited amount of lookbehind. Lists use this to - // ensure they don't match arbitrary '- ' or '* ' in inline - // text (see the list rule for more information). This stores - // the full regex capture object, if there is one. - latestState.prevCapture = undefined; - return nestedParse(preprocess(source), latestState); - }; - - return outerParse; -} - -type Multiple<T> = T | T[]; -type Nullable<T> = T | null | undefined; - -export type MatchFunction = ( - source: string, - state: ParserState, -) => Nullable<RegExpMatchArray>; - -export type Parser = (source: string, state?: ParserState) => ASTNode[]; - -export type ParseFunction = ( - source: RegExpMatchArray, - nestedParse: Parser, - state: ParserState, -) => TypeOptionalASTNode; - -export type QualityFunction = ( - capture: RegExpMatchArray, - state: ParserState, -) => number; - -export interface ParserState { - inline: boolean; - prevCapture?: RegExpMatchArray; - [key: string]: any; -} - -export interface ASTNode { - type: string; - content?: ASTNode[] | string; - [key: string]: any; -} - -export type TypeOptionalASTNode = Omit<ASTNode, "type"> & { type?: string }; - -export interface RefNode { - type: string; - content?: Multiple<ASTNode>; - target?: string; - title?: string; - alt?: string; -} - -/** Creates a match function for an inline scoped element from a regex */ -export function inlineRegex(regex: RegExp): MatchFunction { - return (source, state) => { - if (state.inline) { - return regex.exec(source); - } else { - return null; - } - }; -} - -/** Creates a match function for a block scoped element from a regex */ -export function blockRegex(regex: RegExp): MatchFunction { - return (source, state) => { - if (state.inline) { - return null; - } else { - return regex.exec(source); - } - }; -} - -/** Creates a match function from a regex, ignoring block/inline scope */ -export function anyScopeRegex(regex: RegExp): MatchFunction { - return (source) => { - return regex.exec(source); - }; -} - -const UNESCAPE_URL_R = /\\([^0-9A-Za-z\s])/g; -export function unescapeUrl(rawUrlString: string) { - return rawUrlString.replace(UNESCAPE_URL_R, "$1"); -} - -/** - * Parse some content with the parser `parse`, with state.inline - * set to true. Useful for block elements; not generally necessary - * to be used by inline elements (where state.inline is already true. - */ -export function parseInline( - parse: Parser, - content: string, - state: ParserState, -) { - const isCurrentlyInline = state.inline || false; - state.inline = true; - const result = parse(content, state); - state.inline = isCurrentlyInline; - return result; -} - -export function parseBlock(parse: Parser, content: string, state: ParserState) { - const isCurrentlyInline = state.inline || false; - state.inline = false; - const result = parse(content + "\n\n", state); - state.inline = isCurrentlyInline; - return result; -} - -export function parseCaptureInline( - capture: RegExpMatchArray, - parse: Parser, - state: ParserState, -) { - return { - content: parseInline(parse, capture[1], state), - }; -} - -export function ignoreCapture() { - return {}; -} - -export function sanitizeUrl(url?: string) { - if (url == null) { - return null; - } - try { - const prot = new URL(url, "https://localhost").protocol; - if ( - prot.indexOf("javascript:") === 0 || - prot.indexOf("vbscript:") === 0 || - prot.indexOf("data:") === 0 - ) { - return null; - } - } catch (e) { - // invalid URLs should throw a TypeError - // see for instance: `new URL("");` - return null; - } - return url; -} - -const CR_NEWLINE_R = /\r\n?/g; -const TAB_R = /\t/g; -const FORMFEED_R = /\f/g; - -/** - * Turn various whitespace into easy-to-process whitespace - */ -function preprocess(source: string) { - return source.replace(CR_NEWLINE_R, "\n").replace(FORMFEED_R, "").replace( - TAB_R, - " ", - ); -} - -function populateInitialState( - givenState: Partial<ParserState>, - defaultState: Partial<ParserState>, -) { - let state = givenState || {}; - - for (let prop in defaultState) { - if (Object.prototype.hasOwnProperty.call(defaultState, prop)) { - state[prop] = defaultState[prop]; - } - } - - return state as ParserState; -} - -// recognize a `*` `-`, `+`, `1.`, `2.`... list bullet -const LIST_BULLET = "(?:[*+-]|\\d+\\.)"; - -// recognize the start of a list item: -// leading space plus a bullet plus a space (` * `) -const LIST_ITEM_PREFIX = "( *)(" + LIST_BULLET + ") +"; -const LIST_ITEM_PREFIX_R = new RegExp("^" + LIST_ITEM_PREFIX); - -// recognize an individual list item: -// * hi -// this is part of the same item -// -// as is this, which is a new paragraph in the same item -// -// * but this is not part of the same item -const LIST_ITEM_R = new RegExp( - LIST_ITEM_PREFIX + "[^\\n]*(?:\\n" + "(?!\\1" + LIST_BULLET + - " )[^\\n]*)*(\n|$)", - "gm", -); -const BLOCK_END_R = /\n{2,}$/; -const INLINE_CODE_ESCAPE_BACKTICKS_R = /^ (?= *`)|(` *) $/g; - -// recognize the end of a paragraph block inside a list item: -// two or more newlines at end end of the item -const LIST_BLOCK_END_R = BLOCK_END_R; -const LIST_ITEM_END_R = / *\n+$/; - -// check whether a list item has paragraphs: if it does, -// we leave the newlines at the end -const LIST_R = new RegExp( - "^( *)(" + - LIST_BULLET + - ") " + - "[\\s\\S]+?(?:\n{2,}(?! )" + - "(?!\\1" + - LIST_BULLET + - " )\\n*" + - // the \\s*$ here is so that we can parse the inside of nested - // lists, where our content might end before we receive two `\n`s - "|\\s*\n*$)", -); -const LIST_LOOKBEHIND_R = /(?:^|\n)( *)$/; - -const TABLES = (function () { - const TABLE_ROW_SEPARATOR_TRIM = /^ *\| *| *\| *$/g; - const TABLE_CELL_END_TRIM = / *$/; - const TABLE_RIGHT_ALIGN = /^ *-+: *$/; - const TABLE_CENTER_ALIGN = /^ *:-+: *$/; - const TABLE_LEFT_ALIGN = /^ *:-+ *$/; // TODO: This needs a real type - - const parseTableAlignCapture = (alignCapture: string) => { - if (TABLE_RIGHT_ALIGN.test(alignCapture)) { - return "right"; - } else if (TABLE_CENTER_ALIGN.test(alignCapture)) { - return "center"; - } else if (TABLE_LEFT_ALIGN.test(alignCapture)) { - return "left"; - } else { - return null; - } - }; - - const parseTableAlign = (source: string, trimEndSeparators: boolean) => { - if (trimEndSeparators) { - source = source.replace(TABLE_ROW_SEPARATOR_TRIM, ""); - } - - const alignText = source.trim().split("|"); - return alignText.map(parseTableAlignCapture); - }; - - const parseTableRow = ( - source: string, - parse: Parser, - state: ParserState, - trimEndSeparators: boolean, - ) => { - const prevInTable = state.inTable; - state.inTable = true; - const tableRow = parse(source.trim(), state); - state.inTable = prevInTable; - const cells: ASTNode[][] = [[]]; - tableRow.forEach(function (node, i) { - if (node.type === "tableSeparator") { - // Filter out empty table separators at the start/end: - if (!trimEndSeparators || (i !== 0 && i !== tableRow.length - 1)) { - // Split the current row: - cells.push([]); - } - } else { - if ( - typeof node.content === "string" && - (tableRow[i + 1] == null || tableRow[i + 1].type === "tableSeparator") - ) { - node.content = node.content.replace(TABLE_CELL_END_TRIM, ""); - } - - cells[cells.length - 1].push(node); - } - }); - return cells; - }; - - /** - * @param {string} source - * @param {SimpleMarkdown.Parser} parse - * @param {SimpleMarkdown.State} state - * @param {boolean} trimEndSeparators - * @returns {SimpleMarkdown.ASTNode[][]} - */ - const parseTableCells = function ( - source: string, - parse: Parser, - state: ParserState, - trimEndSeparators: boolean, - ) { - const rowsText = source.trim().split("\n"); - return rowsText.map(function (rowText) { - return parseTableRow(rowText, parse, state, trimEndSeparators); - }); - }; - - /** - * @param {boolean} trimEndSeparators - * @returns {SimpleMarkdown.SingleNodeParseFunction} - */ - const parseTable = function (trimEndSeparators: boolean) { - return function ( - capture: RegExpMatchArray, - parse: Parser, - state: ParserState, - ) { - state.inline = true; - const header = parseTableRow(capture[1], parse, state, trimEndSeparators); - const align = parseTableAlign(capture[2], trimEndSeparators); - const cells = parseTableCells( - capture[3], - parse, - state, - trimEndSeparators, - ); - state.inline = false; - return { - type: "table", - header: header, - align: align, - cells: cells, - }; - }; - }; - - return { - parseTable: parseTable(true), - parseNpTable: parseTable(false), - TABLE_REGEX: /^ *(\|.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/, - NPTABLE_REGEX: - /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, - }; -})(); - -const LINK_INSIDE = "(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*"; -const LINK_HREF_AND_TITLE = - "\\s*<?((?:\\([^)]*\\)|[^\\s\\\\]|\\\\.)*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*"; -const AUTOLINK_MAILTO_CHECK_R = /mailto:/i; - -function parseRef( - capture: RegExpMatchArray, - state: ParserState, - refNode: RefNode, -) { - const ref = (capture[2] || capture[1]).replace(/\s+/g, " ").toLowerCase(); - - // We store information about previously seen defs on - // state._defs (_ to deconflict with client-defined - // state). If the def for this reflink/refimage has - // already been seen, we can use its target/source - // and title here: - if (state._defs && state._defs[ref]) { - const def = state._defs[ref]; - - // `refNode` can be a link or an image. Both use - // target and title properties. - refNode.target = def.target; - refNode.title = def.title; - } - - // In case we haven't seen our def yet (or if someone - // overwrites that def later on), we add this node - // to the list of ref nodes for that def. Then, when - // we find the def, we can modify this link/image AST - // node :). - // I'm sorry. - state._refs = state._refs || {}; - state._refs[ref] = state._refs[ref] || []; - - state._refs[ref].push(refNode); - - return refNode; -} - -export const defaultRules = new RuleList(); -{ - defaultRules.add({ - name: "heading", - match: blockRegex(/^ *(#{1,6})([^\n]+?)#* *(?:\n *)+\n/), - parse: function (capture, parse, state) { - return { - level: capture[1].length, - content: parseInline(parse, capture[2].trim(), state), - }; - }, - }); - - defaultRules.add({ - name: "nptable", - match: blockRegex(TABLES.NPTABLE_REGEX), - parse: TABLES.parseNpTable, - }); - - defaultRules.add({ - name: "lheading", - match: blockRegex(/^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/), - parse(capture, parse, state) { - return { - type: "heading", - level: capture[2] === "=" ? 1 : 2, - content: parseInline(parse, capture[1], state), - }; - }, - }); - - defaultRules.add({ - name: "hr", - match: blockRegex(/^( *[-*_]){3,} *(?:\n *)+\n/), - parse: ignoreCapture, - }); - - defaultRules.add({ - name: "codeBlock", - match: blockRegex(/^(?: {4}[^\n]+\n*)+(?:\n *)+\n/), - parse(capture) { - const content = capture[0].replace(/^ {4}/gm, "").replace(/\n+$/, ""); - return { - lang: undefined, - content: content, - }; - }, - }); - - defaultRules.add({ - name: "fence", - match: blockRegex( - /^ *(`{3,}|~{3,}) *(?:(\S+) *)?\n([\s\S]+?)\n?\1 *(?:\n *)+\n/, - ), - parse(capture) { - return { - type: "codeBlock", - lang: capture[2] || undefined, - content: capture[3], - }; - }, - }); - - defaultRules.add({ - name: "blockQuote", - match: blockRegex(/^( *>[^\n]+(\n[^\n]+)*\n*)+\n{2,}/), - parse(capture, parse, state) { - const content = capture[0].replace(/^ *> ?/gm, ""); - return { - content: parse(content, state), - }; - }, - }); - - defaultRules.add({ - name: "list", - - match(source, state) { - // We only want to break into a list if we are at the start of a - // line. This is to avoid parsing "hi * there" with "* there" - // becoming a part of a list. - // You might wonder, "but that's inline, so of course it wouldn't - // start a list?". You would be correct! Except that some of our - // lists can be inline, because they might be inside another list, - // in which case we can parse with inline scope, but need to allow - // nested lists inside this inline scope. - const prevCaptureStr = state.prevCapture == null - ? "" - : state.prevCapture[0]; - const isStartOfLineCapture = LIST_LOOKBEHIND_R.exec(prevCaptureStr); - const isListBlock = state._list || !state.inline; - - if (isStartOfLineCapture && isListBlock) { - source = isStartOfLineCapture[1] + source; - return LIST_R.exec(source); - } else { - return null; - } - }, - parse(capture, parse, state) { - const bullet = capture[2]; - const ordered = bullet.length > 1; - const start = ordered ? +bullet : undefined; - // We know this will match here, because of how the regexes are defined - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const items = capture[0].replace(LIST_BLOCK_END_R, "\n").match( - LIST_ITEM_R, - )!; - - let lastItemWasAParagraph = false; - const itemContent = items.map(function (item, i) { - // We need to see how far indented this item is: - const prefixCapture = LIST_ITEM_PREFIX_R.exec(item); - const space = prefixCapture ? prefixCapture[0].length : 0; // And then we construct a regex to "unindent" the subsequent - // lines of the items by that amount: - - const spaceRegex = new RegExp("^ {1," + space + "}", "gm"); // Before processing the item, we need a couple things - - const content = item // remove indents on trailing lines: - .replace(spaceRegex, "") // remove the bullet: - .replace(LIST_ITEM_PREFIX_R, ""); // I'm not sur4 why this is necessary again? - // Handling "loose" lists, like: - // - // * this is wrapped in a paragraph - // - // * as is this - // - // * as is this - - const isLastItem = i === items.length - 1; - const containsBlocks = content.indexOf("\n\n") !== -1; // Any element in a list is a block if it contains multiple - // newlines. The last element in the list can also be a block - // if the previous item in the list was a block (this is - // because non-last items in the list can end with \n\n, but - // the last item can't, so we just "inherit" this property - // from our previous element). - - const thisItemIsAParagraph = containsBlocks || - (isLastItem && lastItemWasAParagraph); - lastItemWasAParagraph = thisItemIsAParagraph; // backup our state for restoration afterwards. We're going to - // want to set state._list to true, and state.inline depending - // on our list's looseness. - - const oldStateInline = state.inline; - const oldStateList = state._list; - state._list = true; // Parse inline if we're in a tight list, or block if we're in - // a loose list. - - let adjustedContent; - - if (thisItemIsAParagraph) { - state.inline = false; - adjustedContent = content.replace(LIST_ITEM_END_R, "\n\n"); - } else { - state.inline = true; - adjustedContent = content.replace(LIST_ITEM_END_R, ""); - } - - const result = parse(adjustedContent, state); // Restore our state before returning - - state.inline = oldStateInline; - state._list = oldStateList; - return result; - }); - - return { - ordered: ordered, - start: start, - content: itemContent, - }; - }, - }); - - defaultRules.add({ - name: "def", - // TODO: This will match without a blank line before the next - // block element, which is inconsistent with most of the rest of - // simple-markdown. - match: blockRegex( - /^ *\[([^\]]+)\]: *<?([^\s>]*)>?(?: +["(]([^\n]+)[")])? *\n(?: *\n)*/, - ), - parse(capture, parse, state) { - const def = capture[1].replace(/\s+/g, " ").toLowerCase(); - const target = capture[2]; - const title = capture[3]; - - // Look for previous links/images using this def - // If any links/images using this def have already been declared, - // they will have added themselves to the state._refs[def] list - // (_ to deconflict with client-defined state). We look through - // that list of reflinks for this def, and modify those AST nodes - // with our newly found information now. - // Sorry :(. - if (state._refs && state._refs[def]) { - // `refNode` can be a link or an image - state._refs[def].forEach((refNode: RefNode) => { - refNode.target = target; - refNode.title = title; - }); - } - - // Add this def to our map of defs for any future links/images - // In case we haven't found any or all of the refs referring to - // this def yet, we add our def to the table of known defs, so - // that future reflinks can modify themselves appropriately with - // this information. - state._defs = state._defs || {}; - state._defs[def] = { - target: target, - title: title, - }; - - // return the relevant parsed information - // for debugging only. - return { - def: def, - target: target, - title: title, - }; - }, - }); - - defaultRules.add({ - name: "table", - match: blockRegex(TABLES.TABLE_REGEX), - parse: TABLES.parseTable, - }); - - defaultRules.add({ - name: "newline", - match: blockRegex(/^(?:\n *)*\n/), - parse: ignoreCapture, - }); - - defaultRules.add({ - name: "paragraph", - match: blockRegex(/^((?:[^\n]|\n(?! *\n))+)(?:\n *)+\n/), - parse: parseCaptureInline, - }); - - defaultRules.add({ - name: "escape", - // We don't allow escaping numbers, letters, or spaces here so that - // backslashes used in plain text still get rendered. But allowing - // escaping anything else provides a very flexible escape mechanism, - // regardless of how this grammar is extended. - match: inlineRegex(/^\\([^0-9A-Za-z\s])/), - parse(capture) { - return { - type: "text", - content: capture[1], - }; - }, - }); - - defaultRules.add({ - name: "tableSeparator", - - match(source, state) { - if (!state.inTable) { - return null; - } - - return /^ *\| */.exec(source); - }, - parse() { - return { - type: "tableSeparator", - }; - }, - }); - - defaultRules.add({ - name: "autolink", - match: inlineRegex(/^<([^: >]+:\/[^ >]+)>/), - parse(capture) { - return { - type: "link", - content: [ - { - type: "text", - content: capture[1], - }, - ], - target: capture[1], - }; - }, - }); - - defaultRules.add({ - name: "mailto", - match: inlineRegex(/^<([^ >]+@[^ >]+)>/), - parse(capture) { - const address = capture[1]; - let target = capture[1]; // Check for a `mailto:` already existing in the link: - - if (!AUTOLINK_MAILTO_CHECK_R.test(target)) { - target = "mailto:" + target; - } - - return { - type: "link", - content: [ - { - type: "text", - content: address, - }, - ], - target: target, - }; - }, - }); - - defaultRules.add({ - name: "url", - match: inlineRegex(/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/), - parse(capture) { - return { - type: "link", - content: [ - { - type: "text", - content: capture[1], - }, - ], - target: capture[1], - title: undefined, - }; - }, - }); - - defaultRules.add({ - name: "link", - match: inlineRegex( - new RegExp( - "^\\[(" + LINK_INSIDE + ")\\]\\(" + LINK_HREF_AND_TITLE + "\\)", - ), - ), - parse(capture, parse, state) { - const link = { - content: parse(capture[1], state), - target: unescapeUrl(capture[2]), - title: capture[3], - }; - return link; - }, - }); - - defaultRules.add({ - name: "image", - match: inlineRegex( - new RegExp( - "^!\\[(" + LINK_INSIDE + ")\\]\\(" + LINK_HREF_AND_TITLE + "\\)", - ), - ), - parse: function (capture) { - const image = { - alt: capture[1], - target: unescapeUrl(capture[2]), - title: capture[3], - }; - return image; - }, - }); - - defaultRules.add({ - name: "reflink", - match: inlineRegex( - new RegExp( - // The first [part] of the link - "^\\[(" + - LINK_INSIDE + - ")\\]" + // The [ref] target of the link - "\\s*\\[([^\\]]*)\\]", - ), - ), - parse(capture, parse, state) { - return parseRef(capture, state, { - type: "link", - content: parse(capture[1], state), - }); - }, - }); - - defaultRules.add({ - name: "refimage", - match: inlineRegex( - new RegExp( - // The first [part] of the link - "^!\\[(" + - LINK_INSIDE + - ")\\]" + // The [ref] target of the link - "\\s*\\[([^\\]]*)\\]", - ), - ), - parse(capture, parse, state) { - return parseRef(capture, state, { - type: "image", - alt: capture[1], - }); - }, - }); - - defaultRules.add({ - name: "em", - /* same as strong/u */ - match: inlineRegex( - new RegExp( - // only match _s surrounding words. - "^\\b_" + - "((?:__|\\\\[\\s\\S]|[^\\\\_])+?)_" + - "\\b" + // Or match *s: - "|" + // Only match *s that are followed by a non-space: - "^\\*(?=\\S)(" + // Match at least one of: - "(?:" + // - `**`: so that bolds inside italics don't close the - // italics - "\\*\\*|" + // - escape sequence: so escaped *s don't close us - "\\\\[\\s\\S]|" + // - whitespace: followed by a non-* (we don't - // want ' *' to close an italics--it might - // start a list) - "\\s+(?:\\\\[\\s\\S]|[^\\s\\*\\\\]|\\*\\*)|" + // - non-whitespace, non-*, non-backslash characters - "[^\\s\\*\\\\]" + - ")+?" + // followed by a non-space, non-* then * - ")\\*(?!\\*)", - ), - ), - quality(capture) { - // precedence by length, `em` wins ties: - return capture[0].length + 0.2; - }, - parse(capture, parse, state) { - return { - content: parse(capture[2] || capture[1], state), - }; - }, - }); - - defaultRules.add({ - name: "strong", - /* same as em */ - match: inlineRegex(/^\*\*((?:\\[\s\S]|[^\\])+?)\*\*(?!\*)/), - quality(capture) { - // precedence by length, wins ties vs `u`: - return capture[0].length + 0.1; - }, - parse: parseCaptureInline, - }); - - defaultRules.add({ - name: "u", - /* same as em&strong; increment for next rule */ - match: inlineRegex(/^__((?:\\[\s\S]|[^\\])+?)__(?!_)/), - quality(capture) { - // precedence by length, loses all ties - return capture[0].length; - }, - parse: parseCaptureInline, - }); - - defaultRules.add({ - name: "del", - match: inlineRegex(/^~~(?=\S)((?:\\[\s\S]|~(?!~)|[^\s~\\]|\s(?!~~))+?)~~/), - parse: parseCaptureInline, - }); - - defaultRules.add({ - name: "inlineCode", - match: inlineRegex(/^(`+)([\s\S]*?[^`])\1(?!`)/), - parse(capture) { - return { - content: capture[2].replace(INLINE_CODE_ESCAPE_BACKTICKS_R, "$1"), - }; - }, - }); - - defaultRules.add({ - name: "br", - match: anyScopeRegex(/^ {2,}\n/), - parse: ignoreCapture, - }); - - defaultRules.add({ - name: "text", - // Here we look for anything followed by non-symbols, - // double newlines, or double-space-newlines - // We break on any symbol characters so that this grammar - // is easy to extend without needing to modify this regex - match: anyScopeRegex( - /^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]|\n\n| {2,}\n|\w+:\S|$)/, - ), - parse: function (capture) { - return { - content: capture[0], - }; - }, - }); -} diff --git a/src/q+a/header.client.ts b/src/q+a/tags/header.client.ts similarity index 100% rename from src/q+a/header.client.ts rename to src/q+a/tags/header.client.ts diff --git a/src/q+a/tags/question-layout.marko b/src/q+a/tags/question-layout.marko new file mode 100644 index 0000000000000000000000000000000000000000..d8da8933ada2811a1ed5e959dd6c21977f3e2033 --- /dev/null +++ b/src/q+a/tags/question-layout.marko @@ -0,0 +1,22 @@ +import "../questions.css"; +client import "./header.client.ts"; + +<main class="qa"> + <if=!input.minimal> + <h1> + <span class="a" style="color:var(--a);--s:#19607d">answers</span> + <span class="n" style="--s:#999;margin:0 5px">&</span> + <span class="q" style="color:var(--b);--s:#994253">questions</span> + </h1> + </> + <${input.content} /> +</main> + +export const theme = { + fg: "#f0f0f0", + bg: "#1a1b1c", + primary: "#f5a9b8", +}; + +import { addScript } from "#sitegen"; +import * as render from "lib/render.ts"; diff --git a/src/q+a/tags/question.marko b/src/q+a/tags/question.marko index 5dcd1db05b317277fb79bfbc0eedabb61f5398dc..64ba8da3eb0aa9a9c891a4198c7e205404174135 100644 --- a/src/q+a/tags/question.marko +++ b/src/q+a/tags/question.marko @@ -8,7 +8,7 @@ export interface Input { } // 2024-12-31 05:00:00 EST -export const transitionDate = 1735639200000; +export const transitionDate = 1735639200000; <const/{ question, admin = false, editor = false } = input /> <const/{ id, date } = question/> @@ -29,7 +29,7 @@ export const transitionDate = 1735639200000; >${formatQuestionTimestamp(date)}</time> </a> - <CloverMarkdown text=question.text /> + $!{markdown.renderMarkdown(question.text)} </> // this singleton script will make all the '<time>' tags clickable. @@ -39,5 +39,5 @@ export const transitionDate = 1735639200000; import type { Question } from "@/q+a/models/Question.ts"; import { formatQuestionTimestamp, formatQuestionISOTimestamp } from "@/q+a/format.ts"; -import { CloverMarkdown } from "@/q+a/clover-markdown.tsx"; +import * as markdown from "@/q+a/markdown.tsx"; import { addScript as Script } from "#sitegen" diff --git a/src/q+a/views/backend-inbox.marko b/src/q+a/views/backend-inbox.marko index cc3000f82444194783bb765e1944966abcdda030..6e15d0e0ee1c31039bc5b4d9109a2d08e1e25f2e 100644 --- a/src/q+a/views/backend-inbox.marko +++ b/src/q+a/views/backend-inbox.marko @@ -1,4 +1,4 @@ -export { minimal as layout } from "../layout.tsx"; +export { theme } from "../tags/question-layout.marko"; import { PendingQuestion } from "@/q+a/models/PendingQuestion.ts"; import { formatQuestionISOTimestamp, @@ -8,6 +8,7 @@ export const meta = { title: 'question answer inbox' }; <const/questions = PendingQuestion.getAll() /> +<question-layout minimal> <h1>inbox</h1> <for|q| of=questions> <div @@ -36,5 +37,6 @@ export const meta = { title: 'question answer inbox' }; </p> </div> </> +</question-layout> client import "./backend-inbox.client.ts"; diff --git a/src/q+a/views/editor.marko b/src/q+a/views/editor.marko index a11f73681d3f43cd05b44742490d8dac4d389473..5c3863dd3a913dfdba387d5ca2fca7b33cfa2e01 100644 --- a/src/q+a/views/editor.marko +++ b/src/q+a/views/editor.marko @@ -1,5 +1,5 @@ import "./editor.css"; -export { theme } from "@/q+a/layout.tsx"; +export { theme } from "../tags/question-layout.marko"; export const meta = { title: "question editor" }; diff --git a/src/q+a/views/fail.marko b/src/q+a/views/fail.marko index 178471f064fe689a586a37a5a23ae835b7558d5e..ec51abf405a10ee608b496f639ce7d321c157145 100644 --- a/src/q+a/views/fail.marko +++ b/src/q+a/views/fail.marko @@ -1,5 +1,4 @@ -import * as layout from "../layout.tsx"; -export { layout }; +import * as layout from "../tags/question-layout.marko"; export const theme = { ...layout.theme, primary: "#58ffee", @@ -8,6 +7,7 @@ export const meta = { title: 'oh no' }; <const/{ error, content }=input/> +<question-layout> <h2 style="color: red">:(</h2> <p style="color: red"> ${error} @@ -25,3 +25,4 @@ export const meta = { title: 'oh no' }; <p> <a href="/q+a">return to the questions list</a> </p> +</question-layout> diff --git a/src/q+a/views/permalink.marko b/src/q+a/views/permalink.marko index 64500a56967d3c20419c02f2fd63a22134673a53..81069d4861fe27a9489e0e4f75911a049c6907d8 100644 --- a/src/q+a/views/permalink.marko +++ b/src/q+a/views/permalink.marko @@ -1,4 +1,4 @@ -export * as layout from "@/q+a/layout.tsx"; +export { theme } from "../tags/question-layout.marko"; export interface Input { question: Question; } @@ -25,6 +25,8 @@ server export function meta({ context, question }) { <const/{ question }=input/> <const/{ type }=question/> + +<question-layout> <if=type==QuestionType.normal> <p>this page is a permalink to the following question:</p> <question ...{question} /> @@ -48,6 +50,7 @@ server export function meta({ context, question }) { </> <a href="/q+a">view more questions</a> +</question-layout> import { Question, QuestionType } from '@/q+a/models/Question.ts'; import { transitionDate } from "@/q+a/tags/question.marko"; diff --git a/src/q+a/views/success.marko b/src/q+a/views/success.marko index 2207d5a70b428230735ad981b531aa550ad98a39..a6fc70cedd83ff3c18b3362ab8cd00428e9c084a 100644 --- a/src/q+a/views/success.marko +++ b/src/q+a/views/success.marko @@ -5,6 +5,7 @@ export const meta = { title: 'question submitted!!!' }; <const/{ permalink }=input/> +<question-layout> <h2 style="color: #8c78ff; margin-bottom: 0">thank you</h2> <p style="color: #8c78ff"> your question has been submitted. @@ -23,11 +24,10 @@ export const meta = { title: 'question submitted!!!' }; <p> <a href="/q+a">return to the questions list</a> </p> +</question-layout> -import * as layout from "../layout.tsx"; -export { layout }; +import * as layout from "../tags/question-layout.marko"; export const theme = { ...layout.theme, primary: "#58ffee", }; - diff --git a/tsconfig.json b/tsconfig.json index 0a61c78d7bf3a730fb9c8607db9bac311a889c70..b8b9b8e4dbd72d64e607702ccd4e1de11ce84fd5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,8 @@ "verbatimModuleSyntax": true, "target": "esnext", "noUncheckedIndexedAccess": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "types": ["marko"] }, "include": ["lib/**/*", "src/**/*", "framework/**/*"] } -- 2.54.0