@brillout/docpress 0.1.19 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-BSLSFINO.js → chunk-ZYYJWJMY.js} +1 -2
- package/dist/chunk-ZYYJWJMY.js.map +1 -0
- package/dist/{devServer-4UTC76BL.js → devServer-J2XJQJGT.js} +2 -2
- package/dist/{devServer-4UTC76BL.js.map → devServer-J2XJQJGT.js.map} +0 -0
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/src/vite.config.ts +0 -1
- package/dist/chunk-BSLSFINO.js.map +0 -1
|
@@ -146,7 +146,6 @@ var config = {
|
|
|
146
146
|
react({
|
|
147
147
|
jsxRuntime: "classic"
|
|
148
148
|
}),
|
|
149
|
-
react(),
|
|
150
149
|
markdownHeadingsVitePlugin(),
|
|
151
150
|
mdx({ rehypePlugins, remarkPlugins }),
|
|
152
151
|
ssr({
|
|
@@ -172,4 +171,4 @@ var vite_config_default = config;
|
|
|
172
171
|
export {
|
|
173
172
|
vite_config_default
|
|
174
173
|
};
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-ZYYJWJMY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vite.config.ts","../src/utils/assert.ts","../src/utils/determineSectionUrlHash.ts","../src/utils/Emoji/Emoji.ts","../src/markdownHeadingsVitePlugin.ts"],"sourcesContent":["import mdx from '@mdx-js/rollup'\nimport react from '@vitejs/plugin-react'\nimport ssr from 'vite-plugin-ssr/plugin'\nimport { UserConfig } from 'vite'\nimport { markdownHeadingsVitePlugin } from './markdownHeadingsVitePlugin'\nimport rehypePrettyCode from 'rehype-pretty-code'\nimport remarkGfm from 'remark-gfm'\n\nconst root = process.cwd()\nconst prettyCode = [rehypePrettyCode, { theme: 'github-light' }]\nconst rehypePlugins: any = [prettyCode]\nconst remarkPlugins = [remarkGfm]\n\nconst config: UserConfig = {\n root,\n plugins: [\n react({\n jsxRuntime: 'classic'\n }),\n markdownHeadingsVitePlugin(),\n mdx({ rehypePlugins, remarkPlugins }),\n ssr({\n prerender: {\n noExtraDir: true\n },\n // @ts-ignore until new version is released TODO\n extensions: [{\n npmPackageName: '@brillout/docpress',\n pageFilesSrc: '/src/renderer/*',\n }],\n includeAssetsImportedByServer: true,\n disableAutoFullBuild: true\n })\n ],\n // TODO: remove `react`?\n optimizeDeps: { include: ['@mdx-js/react', 'react', 'react-dom'] },\n // @ts-ignore\n ssr: {\n noExternal: ['@brillout/docpress']\n },\n clearScreen: false\n}\n\nexport default config\n","export { assert }\nexport { assertUsage }\n\nfunction assert(condition: unknown, debugInfo?: unknown): asserts condition {\n if (condition) {\n return\n }\n const hasDebugInfo = debugInfo !== undefined\n if (hasDebugInfo) {\n console.log(debugInfo)\n if (typeof debugInfo === 'object') {\n debugInfo = JSON.stringify(debugInfo)\n }\n }\n let errMsg = '[DocPress] Bug. Contact DocPress maintainer.'\n if (hasDebugInfo) {\n errMsg += ' Debug info: ' + String(debugInfo)\n }\n const err = new Error(errMsg)\n if (isBrowserAndDev()) {\n alert(err.stack)\n }\n throw err\n}\n\nfunction assertUsage(condition: unknown, msg: string): asserts condition {\n if (condition) {\n return\n }\n const err = new Error('[DocPress][Wrong Usage] ' + msg)\n if (isBrowserAndDev()) {\n alert(err.stack)\n }\n throw err\n}\n\nfunction isBrowserAndDev() {\n return typeof window !== 'undefined' && window?.location?.port !== ''\n}\n","import { assert } from './assert'\n\nexport { determineSectionUrlHash }\nexport { determineSectionTitle }\n\nfunction determineSectionUrlHash(title: string): string {\n const urlHash = title\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n .join('-')\n return urlHash\n}\n\nfunction determineSectionTitle(urlWithHash: string, titleNormalCase: boolean): string {\n assert(urlWithHash.includes('#'), { urlWithHash })\n const urlHash = urlWithHash.split('#')[1]\n const title = urlHash\n .split('-')\n .map((word, i) => {\n if (i === 0) {\n return capitalizeFirstLetter(word)\n }\n if (!titleNormalCase && word.length >= 4) {\n return capitalizeFirstLetter(word)\n }\n return word\n })\n .join(' ')\n return title\n}\n\nfunction capitalizeFirstLetter(word: string): string {\n return word[0].toUpperCase() + word.slice(1)\n}\n","import React from 'react'\nimport { assert } from '../assert'\n\nimport { iconMechanicalArm, iconCompass, iconRoadFork, iconShield, iconTypescript, iconEngine } from './assets'\n\nexport { Emoji }\nexport type { EmojiName }\n\ntype EmojiName =\n | 'warning'\n | 'typescript'\n | 'shield'\n | 'mechanical-arm'\n | 'mountain'\n | 'rocket'\n | 'wrench'\n | 'compass'\n | 'seedling'\n | 'books'\n | 'plug'\n | 'earth'\n | 'gear'\n | 'red-heart'\n | 'high-voltage'\n | 'gem-stone'\n | 'dizzy'\n | 'sparkles'\n | 'writing-hang'\n | 'road-fork'\n | 'engine'\n | 'red-circle'\n | 'sparkling-heart'\n | 'gift'\n | 'package'\n | 'info'\n | 'lab'\n | 'trophy'\n\nfunction Emoji({ name, style }: { name: EmojiName; style?: React.CSSProperties }): JSX.Element {\n const emoji =\n // ***\n // U+26A0\n // https://emojipedia.org/warning/\n // https://www.unicompat.com/26A0 => 94.1%\n // https://www.unicompat.com/26A0-FE0F => 92.4%\n // https://www.unicompat.com/2697 => 94.1%\n (name === 'warning' && Unicode(0x26a0, { fontFamily: 'emoji' })) ||\n // ***\n // U+2697\n // https://emojipedia.org/alembic/\n // https://www.unicompat.com/2697 => 94.1%\n (name === 'lab' && Unicode(0x2697)) ||\n // ***\n // U+2139\n // https://emojipedia.org/information/\n // https://www.unicompat.com/2139 => 94.8%\n // https://www.unicompat.com/2139-FE0F => 92.4%\n (name === 'info' && Unicode(0x2139, { fontFamily: 'emoji' })) ||\n // ***\n // U+1F4E6\n // https://emojipedia.org/package/\n // https://www.unicompat.com/1F4E6 => 94.1%\n (name === 'package' && Unicode(0x1f4e6)) ||\n // ***\n // U+1F381\n // https://emojipedia.org/wrapped-gift/\n // https://www.unicompat.com/1F381 => 94.1%\n (name === 'gift' && Unicode(0x1f381)) ||\n // ***\n // U+1F496\n // https://emojipedia.org/sparkling-heart/\n // https://www.unicompat.com/1F496 => 94.1%\n (name === 'sparkling-heart' && Unicode(0x1f496)) ||\n // ***\n // U+2B55\n // https://emojipedia.org/hollow-red-circle/\n // https://www.unicompat.com/2B55 => 94.1%\n (name === 'red-circle' && Unicode(0x2b55)) ||\n // ***\n (name === 'engine' && Img(iconEngine)) ||\n // ***\n // https://www.typescriptlang.org/branding/\n (name === 'typescript' && Img(iconTypescript)) ||\n // ***\n // U+FE0F\n // https://emojipedia.org/shield/\n // https://www.unicompat.com/FE0F => 46.5%\n // https://icon-sets.iconify.design/noto/shield/\n (name === 'shield' && Img(iconShield)) ||\n // ***\n // Custom\n (name === 'road-fork' && Img(iconRoadFork, '1.4em')) ||\n // ***\n // U+270D\n // https://emojipedia.org/writing-hand/\n // https://www.unicompat.com/270D => 93.8%\n (name === 'writing-hang' && Unicode(0x270d)) ||\n // ***\n // U+1F4AB\n // https://emojipedia.org/dizzy/\n // https://www.unicompat.com/1F4AB => 94.1%\n (name === 'dizzy' && Unicode(0x1f4ab)) ||\n // ***\n // U+1F9BE\n // https://iconify.design/icon-sets/noto/mechanical-arm.html\n // https://emojipedia.org/mechanical-arm/\n // https://www.unicompat.com/1f9be => 65.5%\n (name === 'mechanical-arm' && Img(iconMechanicalArm)) ||\n // ***\n // U+1F680\n // https://www.unicompat.com/1F680 => 94.1\n (name === 'rocket' && Unicode(0x1f680)) ||\n // ***\n // U+1F527\n // https://emojipedia.org/wrench/\n // https://www.unicompat.com/1F527 => 94.1%\n (name === 'wrench' && Unicode(0x1f527)) ||\n // ***\n // U+1F9ED\n // https://iconify.design/icon-sets/noto/compass.html\n // https://www.unicompat.com/1F9ED => 67.1%\n (name === 'compass' && Img(iconCompass, '1.4em')) ||\n // ***\n // U+1F331\n // https://www.unicompat.com/1F331 => 94.1%\n (name === 'seedling' && Unicode(0x1f331)) ||\n // ***\n // U+1F4DA\n // https://www.unicompat.com/1F4DA => 94.1%\n (name === 'books' && Unicode(0x1f4da)) ||\n // ***\n // U+1F50C\n // https://www.unicompat.com/1F50C => 94.1%\n (name === 'plug' && Unicode(0x1f50c)) ||\n // ***\n // U+1F30D\n // https://www.unicompat.com/1F30D => 88.8%\n (name === 'earth' && Unicode(0x1f30d)) ||\n // ***\n // U+2699\n // https://www.unicompat.com/2699 => 94.1%\n (name === 'gear' && Unicode(0x2699)) ||\n // ***\n // U+2764\n // https://emojipedia.org/red-heart/\n // https://www.unicompat.com/2764 => 94.4%\n // https://www.unicompat.com/2764-FE0F => 92.4%\n (name === 'red-heart' && Unicode(0x2764, { fontFamily: 'emoji' })) ||\n // U+26A1\n // https://www.unicompat.com/26A1 => 94.1%\n (name === 'high-voltage' && Unicode(0x26a1)) ||\n // U+2728\n // https://emojipedia.org/sparkles/\n // https://www.unicompat.com/2728 => 94.1%\n (name === 'sparkles' && Unicode(0x2728)) ||\n // ***\n // U+1F48E\n // https://emojipedia.org/gem-stone/\n // https://www.unicompat.com/1F48E => 94.1%\n (name === 'gem-stone' && Unicode(0x1f48e)) ||\n // ***\n // 0x1F3C6\n // https://emojipedia.org/trophy/\n // https://www.unicompat.com/1F3C6 => 94.1%\n (name === 'trophy' && Unicode(0x1f3c6)) ||\n false\n /* ======= Unused ========\n // ***\n // U+1FAA8\n // https://emojipedia.org/rock/\n // https://www.unicompat.com/1faa8 => 20.7%\n //\n // ***\n // U+26F0\n // https://emojipedia.org/mountain/\n // https://iconify.design/icon-sets/noto/mountain.html\n // https://www.unicompat.com/26F0 => 89.3%\n (name === 'mountain' && Img(iconMountain)) ||\n //\n // ***\n // U+2194\n // https://emojipedia.org/left-right-arrow/\n // https://www.unicompat.com/2194 => 95.0%\n // Couldn't manage to show colored version\n (name === 'left-right-arrow' && Unicode(0x2194)) ||\n (name === 'left-right-arrow' && Unicode(0x2194, { fontFamily: 'reset' })) ||\n (name === 'left-right-arrow' && Unicode(0xFE0F)) ||\n (name === 'left-right-arrow' && Unicode(0xFE0F, { fontFamily: 'reset' })) ||\n ======================== */\n\n assert(emoji, { name })\n\n return emoji\n\n function Unicode(codePoint: number, styleAddendum?: React.CSSProperties) {\n const text = String.fromCodePoint(codePoint)\n if (style || styleAddendum) {\n return React.createElement('span', { style: { ...style, ...styleAddendum } }, text)\n } else {\n return React.createElement(React.Fragment, null, text)\n }\n }\n\n function Img(imgSrc: string, width: string = '1.15em') {\n const props = {\n src: imgSrc,\n style: {\n verticalAlign: 'text-top',\n fontSize: '1em',\n width,\n ...style\n }\n }\n return React.createElement('img', props)\n }\n}\n","import { assert, determineSectionUrlHash } from '../src/utils/server'\n\nexport { markdownHeadingsVitePlugin }\nexport type { MarkdownHeading }\n\ntype MarkdownHeading = {\n title: string\n id: string\n headingLevel: number\n titleAddendum?: string\n}\n\nfunction markdownHeadingsVitePlugin() {\n return {\n name: 'mdx-headings',\n enforce: 'pre',\n transform: async (code: string, id: string) => {\n if (!id.includes('.page.') || !id.endsWith('.mdx')) {\n return\n }\n const codeNew = transform(code)\n return codeNew\n }\n }\n}\n\nfunction transform(code: string) {\n const headings: MarkdownHeading[] = []\n let isCodeBlock = false\n let codeNew = code\n .split('\\n')\n .map((line) => {\n // Skip code blocks, e.g.\n // ~~~md\n // # Markdown Example\n // Bla\n // ~~~\n if (line.startsWith('~~~') || line.startsWith('```')) {\n isCodeBlock = !isCodeBlock\n return line\n }\n if (isCodeBlock) {\n return line\n }\n\n if (line.startsWith('#')) {\n const { id, headingLevel, title, headingHtml } = parseMarkdownHeading(line)\n headings.push({ id, headingLevel, title })\n return headingHtml\n }\n if (line.startsWith('<h')) {\n assert(false, { line })\n }\n\n return line\n })\n .join('\\n')\n const headingsExportCode = `export const headings = [${headings\n .map((heading) => JSON.stringify(heading))\n .join(', ')}];`\n codeNew += `\\n\\n${headingsExportCode}\\n`\n return codeNew\n}\n\nfunction parseMarkdownHeading(line: string): MarkdownHeading & { headingHtml: string } {\n const [lineBegin, ...lineWords] = line.split(' ')\n assert(lineBegin.split('#').join('') === '', { line, lineWords })\n const headingLevel = lineBegin.length\n\n const titleMdx = lineWords.join(' ')\n assert(!titleMdx.startsWith(' '), { line, lineWords })\n assert(titleMdx, { line, lineWords })\n\n const id = determineSectionUrlHash(titleMdx)\n const title = titleMdx\n\n const headingHtml = `<h${headingLevel} id=\"${id}\">${parseTitle(title)}</h${headingLevel}>`\n\n const heading = { headingLevel, title, id, headingHtml }\n return heading\n}\n\nfunction parseTitle(titleMarkdown: string): string {\n type Part = { nodeType: 'text' | 'code'; content: string }\n const parts: Part[] = []\n let current: Part | undefined\n titleMarkdown.split('').forEach((letter) => {\n if (letter === '`') {\n if (current?.nodeType === 'code') {\n // </code>\n parts.push(current)\n current = undefined\n } else {\n // <code>\n if (current) {\n parts.push(current)\n }\n current = { nodeType: 'code', content: '' }\n }\n } else {\n if (!current) {\n current = { nodeType: 'text', content: '' }\n }\n current.content += letter\n }\n })\n if (current) {\n parts.push(current)\n }\n\n const titleHtml = parts\n .map((part) => {\n if (part.nodeType === 'code') {\n return `<code>${serializeText(part.content)}</code>`\n } else {\n assert(part.nodeType === 'text', { parts })\n return serializeText(part.content)\n }\n })\n .join('')\n\n return titleHtml\n\n function serializeText(text: string) {\n const textEscaped = text.split(\"'\").join(\"\\\\'\")\n return `{'${textEscaped}'}`\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
vite_config_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZYYJWJMY.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/devServer.ts
|
|
6
6
|
import express from "express";
|
|
@@ -29,4 +29,4 @@ async function startServer() {
|
|
|
29
29
|
app.listen(port);
|
|
30
30
|
console.log(`Server running at http://localhost:${port}`);
|
|
31
31
|
}
|
|
32
|
-
//# sourceMappingURL=devServer-
|
|
32
|
+
//# sourceMappingURL=devServer-J2XJQJGT.js.map
|
|
File without changes
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
vite_config_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZYYJWJMY.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/index.ts
|
|
6
6
|
import { build, preview } from "vite";
|
|
@@ -13,7 +13,7 @@ Error.stackTraceLimit = Infinity;
|
|
|
13
13
|
cli();
|
|
14
14
|
async function cli() {
|
|
15
15
|
if (isDev) {
|
|
16
|
-
await import("./devServer-
|
|
16
|
+
await import("./devServer-J2XJQJGT.js");
|
|
17
17
|
} else if (isBuild) {
|
|
18
18
|
await build(vite_config_default);
|
|
19
19
|
await build({ ...vite_config_default, build: { ssr: true } });
|
package/package.json
CHANGED
package/src/vite.config.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vite.config.ts","../src/utils/assert.ts","../src/utils/determineSectionUrlHash.ts","../src/utils/Emoji/Emoji.ts","../src/markdownHeadingsVitePlugin.ts"],"sourcesContent":["import mdx from '@mdx-js/rollup'\nimport react from '@vitejs/plugin-react'\nimport ssr from 'vite-plugin-ssr/plugin'\nimport { UserConfig } from 'vite'\nimport { markdownHeadingsVitePlugin } from './markdownHeadingsVitePlugin'\nimport rehypePrettyCode from 'rehype-pretty-code'\nimport remarkGfm from 'remark-gfm'\n\nconst root = process.cwd()\nconst prettyCode = [rehypePrettyCode, { theme: 'github-light' }]\nconst rehypePlugins: any = [prettyCode]\nconst remarkPlugins = [remarkGfm]\n\nconst config: UserConfig = {\n root,\n plugins: [\n react({\n jsxRuntime: 'classic'\n }),\n react(),\n markdownHeadingsVitePlugin(),\n mdx({ rehypePlugins, remarkPlugins }),\n ssr({\n prerender: {\n noExtraDir: true\n },\n // @ts-ignore until new version is released TODO\n extensions: [{\n npmPackageName: '@brillout/docpress',\n pageFilesSrc: '/src/renderer/*',\n }],\n includeAssetsImportedByServer: true,\n disableAutoFullBuild: true\n })\n ],\n // TODO: remove `react`?\n optimizeDeps: { include: ['@mdx-js/react', 'react', 'react-dom'] },\n // @ts-ignore\n ssr: {\n noExternal: ['@brillout/docpress']\n },\n clearScreen: false\n}\n\nexport default config\n","export { assert }\nexport { assertUsage }\n\nfunction assert(condition: unknown, debugInfo?: unknown): asserts condition {\n if (condition) {\n return\n }\n const hasDebugInfo = debugInfo !== undefined\n if (hasDebugInfo) {\n console.log(debugInfo)\n if (typeof debugInfo === 'object') {\n debugInfo = JSON.stringify(debugInfo)\n }\n }\n let errMsg = '[DocPress] Bug. Contact DocPress maintainer.'\n if (hasDebugInfo) {\n errMsg += ' Debug info: ' + String(debugInfo)\n }\n const err = new Error(errMsg)\n if (isBrowserAndDev()) {\n alert(err.stack)\n }\n throw err\n}\n\nfunction assertUsage(condition: unknown, msg: string): asserts condition {\n if (condition) {\n return\n }\n const err = new Error('[DocPress][Wrong Usage] ' + msg)\n if (isBrowserAndDev()) {\n alert(err.stack)\n }\n throw err\n}\n\nfunction isBrowserAndDev() {\n return typeof window !== 'undefined' && window?.location?.port !== ''\n}\n","import { assert } from './assert'\n\nexport { determineSectionUrlHash }\nexport { determineSectionTitle }\n\nfunction determineSectionUrlHash(title: string): string {\n const urlHash = title\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n .join('-')\n return urlHash\n}\n\nfunction determineSectionTitle(urlWithHash: string, titleNormalCase: boolean): string {\n assert(urlWithHash.includes('#'), { urlWithHash })\n const urlHash = urlWithHash.split('#')[1]\n const title = urlHash\n .split('-')\n .map((word, i) => {\n if (i === 0) {\n return capitalizeFirstLetter(word)\n }\n if (!titleNormalCase && word.length >= 4) {\n return capitalizeFirstLetter(word)\n }\n return word\n })\n .join(' ')\n return title\n}\n\nfunction capitalizeFirstLetter(word: string): string {\n return word[0].toUpperCase() + word.slice(1)\n}\n","import React from 'react'\nimport { assert } from '../assert'\n\nimport { iconMechanicalArm, iconCompass, iconRoadFork, iconShield, iconTypescript, iconEngine } from './assets'\n\nexport { Emoji }\nexport type { EmojiName }\n\ntype EmojiName =\n | 'warning'\n | 'typescript'\n | 'shield'\n | 'mechanical-arm'\n | 'mountain'\n | 'rocket'\n | 'wrench'\n | 'compass'\n | 'seedling'\n | 'books'\n | 'plug'\n | 'earth'\n | 'gear'\n | 'red-heart'\n | 'high-voltage'\n | 'gem-stone'\n | 'dizzy'\n | 'sparkles'\n | 'writing-hang'\n | 'road-fork'\n | 'engine'\n | 'red-circle'\n | 'sparkling-heart'\n | 'gift'\n | 'package'\n | 'info'\n | 'lab'\n | 'trophy'\n\nfunction Emoji({ name, style }: { name: EmojiName; style?: React.CSSProperties }): JSX.Element {\n const emoji =\n // ***\n // U+26A0\n // https://emojipedia.org/warning/\n // https://www.unicompat.com/26A0 => 94.1%\n // https://www.unicompat.com/26A0-FE0F => 92.4%\n // https://www.unicompat.com/2697 => 94.1%\n (name === 'warning' && Unicode(0x26a0, { fontFamily: 'emoji' })) ||\n // ***\n // U+2697\n // https://emojipedia.org/alembic/\n // https://www.unicompat.com/2697 => 94.1%\n (name === 'lab' && Unicode(0x2697)) ||\n // ***\n // U+2139\n // https://emojipedia.org/information/\n // https://www.unicompat.com/2139 => 94.8%\n // https://www.unicompat.com/2139-FE0F => 92.4%\n (name === 'info' && Unicode(0x2139, { fontFamily: 'emoji' })) ||\n // ***\n // U+1F4E6\n // https://emojipedia.org/package/\n // https://www.unicompat.com/1F4E6 => 94.1%\n (name === 'package' && Unicode(0x1f4e6)) ||\n // ***\n // U+1F381\n // https://emojipedia.org/wrapped-gift/\n // https://www.unicompat.com/1F381 => 94.1%\n (name === 'gift' && Unicode(0x1f381)) ||\n // ***\n // U+1F496\n // https://emojipedia.org/sparkling-heart/\n // https://www.unicompat.com/1F496 => 94.1%\n (name === 'sparkling-heart' && Unicode(0x1f496)) ||\n // ***\n // U+2B55\n // https://emojipedia.org/hollow-red-circle/\n // https://www.unicompat.com/2B55 => 94.1%\n (name === 'red-circle' && Unicode(0x2b55)) ||\n // ***\n (name === 'engine' && Img(iconEngine)) ||\n // ***\n // https://www.typescriptlang.org/branding/\n (name === 'typescript' && Img(iconTypescript)) ||\n // ***\n // U+FE0F\n // https://emojipedia.org/shield/\n // https://www.unicompat.com/FE0F => 46.5%\n // https://icon-sets.iconify.design/noto/shield/\n (name === 'shield' && Img(iconShield)) ||\n // ***\n // Custom\n (name === 'road-fork' && Img(iconRoadFork, '1.4em')) ||\n // ***\n // U+270D\n // https://emojipedia.org/writing-hand/\n // https://www.unicompat.com/270D => 93.8%\n (name === 'writing-hang' && Unicode(0x270d)) ||\n // ***\n // U+1F4AB\n // https://emojipedia.org/dizzy/\n // https://www.unicompat.com/1F4AB => 94.1%\n (name === 'dizzy' && Unicode(0x1f4ab)) ||\n // ***\n // U+1F9BE\n // https://iconify.design/icon-sets/noto/mechanical-arm.html\n // https://emojipedia.org/mechanical-arm/\n // https://www.unicompat.com/1f9be => 65.5%\n (name === 'mechanical-arm' && Img(iconMechanicalArm)) ||\n // ***\n // U+1F680\n // https://www.unicompat.com/1F680 => 94.1\n (name === 'rocket' && Unicode(0x1f680)) ||\n // ***\n // U+1F527\n // https://emojipedia.org/wrench/\n // https://www.unicompat.com/1F527 => 94.1%\n (name === 'wrench' && Unicode(0x1f527)) ||\n // ***\n // U+1F9ED\n // https://iconify.design/icon-sets/noto/compass.html\n // https://www.unicompat.com/1F9ED => 67.1%\n (name === 'compass' && Img(iconCompass, '1.4em')) ||\n // ***\n // U+1F331\n // https://www.unicompat.com/1F331 => 94.1%\n (name === 'seedling' && Unicode(0x1f331)) ||\n // ***\n // U+1F4DA\n // https://www.unicompat.com/1F4DA => 94.1%\n (name === 'books' && Unicode(0x1f4da)) ||\n // ***\n // U+1F50C\n // https://www.unicompat.com/1F50C => 94.1%\n (name === 'plug' && Unicode(0x1f50c)) ||\n // ***\n // U+1F30D\n // https://www.unicompat.com/1F30D => 88.8%\n (name === 'earth' && Unicode(0x1f30d)) ||\n // ***\n // U+2699\n // https://www.unicompat.com/2699 => 94.1%\n (name === 'gear' && Unicode(0x2699)) ||\n // ***\n // U+2764\n // https://emojipedia.org/red-heart/\n // https://www.unicompat.com/2764 => 94.4%\n // https://www.unicompat.com/2764-FE0F => 92.4%\n (name === 'red-heart' && Unicode(0x2764, { fontFamily: 'emoji' })) ||\n // U+26A1\n // https://www.unicompat.com/26A1 => 94.1%\n (name === 'high-voltage' && Unicode(0x26a1)) ||\n // U+2728\n // https://emojipedia.org/sparkles/\n // https://www.unicompat.com/2728 => 94.1%\n (name === 'sparkles' && Unicode(0x2728)) ||\n // ***\n // U+1F48E\n // https://emojipedia.org/gem-stone/\n // https://www.unicompat.com/1F48E => 94.1%\n (name === 'gem-stone' && Unicode(0x1f48e)) ||\n // ***\n // 0x1F3C6\n // https://emojipedia.org/trophy/\n // https://www.unicompat.com/1F3C6 => 94.1%\n (name === 'trophy' && Unicode(0x1f3c6)) ||\n false\n /* ======= Unused ========\n // ***\n // U+1FAA8\n // https://emojipedia.org/rock/\n // https://www.unicompat.com/1faa8 => 20.7%\n //\n // ***\n // U+26F0\n // https://emojipedia.org/mountain/\n // https://iconify.design/icon-sets/noto/mountain.html\n // https://www.unicompat.com/26F0 => 89.3%\n (name === 'mountain' && Img(iconMountain)) ||\n //\n // ***\n // U+2194\n // https://emojipedia.org/left-right-arrow/\n // https://www.unicompat.com/2194 => 95.0%\n // Couldn't manage to show colored version\n (name === 'left-right-arrow' && Unicode(0x2194)) ||\n (name === 'left-right-arrow' && Unicode(0x2194, { fontFamily: 'reset' })) ||\n (name === 'left-right-arrow' && Unicode(0xFE0F)) ||\n (name === 'left-right-arrow' && Unicode(0xFE0F, { fontFamily: 'reset' })) ||\n ======================== */\n\n assert(emoji, { name })\n\n return emoji\n\n function Unicode(codePoint: number, styleAddendum?: React.CSSProperties) {\n const text = String.fromCodePoint(codePoint)\n if (style || styleAddendum) {\n return React.createElement('span', { style: { ...style, ...styleAddendum } }, text)\n } else {\n return React.createElement(React.Fragment, null, text)\n }\n }\n\n function Img(imgSrc: string, width: string = '1.15em') {\n const props = {\n src: imgSrc,\n style: {\n verticalAlign: 'text-top',\n fontSize: '1em',\n width,\n ...style\n }\n }\n return React.createElement('img', props)\n }\n}\n","import { assert, determineSectionUrlHash } from '../src/utils/server'\n\nexport { markdownHeadingsVitePlugin }\nexport type { MarkdownHeading }\n\ntype MarkdownHeading = {\n title: string\n id: string\n headingLevel: number\n titleAddendum?: string\n}\n\nfunction markdownHeadingsVitePlugin() {\n return {\n name: 'mdx-headings',\n enforce: 'pre',\n transform: async (code: string, id: string) => {\n if (!id.includes('.page.') || !id.endsWith('.mdx')) {\n return\n }\n const codeNew = transform(code)\n return codeNew\n }\n }\n}\n\nfunction transform(code: string) {\n const headings: MarkdownHeading[] = []\n let isCodeBlock = false\n let codeNew = code\n .split('\\n')\n .map((line) => {\n // Skip code blocks, e.g.\n // ~~~md\n // # Markdown Example\n // Bla\n // ~~~\n if (line.startsWith('~~~') || line.startsWith('```')) {\n isCodeBlock = !isCodeBlock\n return line\n }\n if (isCodeBlock) {\n return line\n }\n\n if (line.startsWith('#')) {\n const { id, headingLevel, title, headingHtml } = parseMarkdownHeading(line)\n headings.push({ id, headingLevel, title })\n return headingHtml\n }\n if (line.startsWith('<h')) {\n assert(false, { line })\n }\n\n return line\n })\n .join('\\n')\n const headingsExportCode = `export const headings = [${headings\n .map((heading) => JSON.stringify(heading))\n .join(', ')}];`\n codeNew += `\\n\\n${headingsExportCode}\\n`\n return codeNew\n}\n\nfunction parseMarkdownHeading(line: string): MarkdownHeading & { headingHtml: string } {\n const [lineBegin, ...lineWords] = line.split(' ')\n assert(lineBegin.split('#').join('') === '', { line, lineWords })\n const headingLevel = lineBegin.length\n\n const titleMdx = lineWords.join(' ')\n assert(!titleMdx.startsWith(' '), { line, lineWords })\n assert(titleMdx, { line, lineWords })\n\n const id = determineSectionUrlHash(titleMdx)\n const title = titleMdx\n\n const headingHtml = `<h${headingLevel} id=\"${id}\">${parseTitle(title)}</h${headingLevel}>`\n\n const heading = { headingLevel, title, id, headingHtml }\n return heading\n}\n\nfunction parseTitle(titleMarkdown: string): string {\n type Part = { nodeType: 'text' | 'code'; content: string }\n const parts: Part[] = []\n let current: Part | undefined\n titleMarkdown.split('').forEach((letter) => {\n if (letter === '`') {\n if (current?.nodeType === 'code') {\n // </code>\n parts.push(current)\n current = undefined\n } else {\n // <code>\n if (current) {\n parts.push(current)\n }\n current = { nodeType: 'code', content: '' }\n }\n } else {\n if (!current) {\n current = { nodeType: 'text', content: '' }\n }\n current.content += letter\n }\n })\n if (current) {\n parts.push(current)\n }\n\n const titleHtml = parts\n .map((part) => {\n if (part.nodeType === 'code') {\n return `<code>${serializeText(part.content)}</code>`\n } else {\n assert(part.nodeType === 'text', { parts })\n return serializeText(part.content)\n }\n })\n .join('')\n\n return titleHtml\n\n function serializeText(text: string) {\n const textEscaped = text.split(\"'\").join(\"\\\\'\")\n return `{'${textEscaped}'}`\n }\n}\n"],"mappings":"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","names":[]}
|