vue-syntax-highlighter 0.0.0-stage → 1.0.0
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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/README.md +182 -3
- package/dist/aliases.d.ts +9 -0
- package/dist/chunks/define-theme-Bul1KkHG.js +74 -0
- package/dist/chunks/define-theme-Bul1KkHG.js.map +1 -0
- package/dist/chunks/index-a55czNwo.js +188 -0
- package/dist/chunks/index-a55czNwo.js.map +1 -0
- package/dist/chunks/source-DxBCRqJY.js +66 -0
- package/dist/chunks/source-DxBCRqJY.js.map +1 -0
- package/dist/chunks/token-types-B8veGO5e.js +131 -0
- package/dist/chunks/token-types-B8veGO5e.js.map +1 -0
- package/dist/chunks/types-DTo8JPWw.js +25 -0
- package/dist/chunks/types-DTo8JPWw.js.map +1 -0
- package/dist/component/SyntaxHighlighter.d.ts +266 -0
- package/dist/component/SyntaxHighlighterProvider.d.ts +137 -0
- package/dist/component/use-theme.d.ts +16 -0
- package/dist/composables/useSyntaxHighlighter.d.ts +27 -0
- package/dist/core/cache.d.ts +40 -0
- package/dist/core/context.d.ts +62 -0
- package/dist/core/controller.d.ts +35 -0
- package/dist/core/define-theme.d.ts +8 -0
- package/dist/core/engine.d.ts +28 -0
- package/dist/core/props.d.ts +189 -0
- package/dist/core/source.d.ts +11 -0
- package/dist/core/theme.d.ts +32 -0
- package/dist/core/token-types.d.ts +6 -0
- package/dist/core/virtual.d.ts +31 -0
- package/dist/core/warn.d.ts +12 -0
- package/dist/engines/highlightjs/index.d.ts +20 -0
- package/dist/engines/highlightjs/languages.d.ts +56 -0
- package/dist/engines/highlightjs.d.ts +1 -0
- package/dist/engines/highlightjs.js +5 -0
- package/dist/engines/highlightjs.js.map +1 -0
- package/dist/engines/lowlight.d.ts +2 -0
- package/dist/engines/lowlight.js +6 -0
- package/dist/engines/lowlight.js.map +1 -0
- package/dist/engines/prism/index.d.ts +19 -0
- package/dist/engines/prism/languages.d.ts +62 -0
- package/dist/engines/prism.d.ts +1 -0
- package/dist/engines/prism.js +205 -0
- package/dist/engines/prism.js.map +1 -0
- package/dist/engines/shiki/index.d.ts +19 -0
- package/dist/engines/shiki/languages.d.ts +72 -0
- package/dist/engines/shiki.d.ts +1 -0
- package/dist/engines/shiki.js +264 -0
- package/dist/engines/shiki.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +1355 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +11 -0
- package/dist/styles/fallback.css +352 -0
- package/dist/styles.css +1 -0
- package/dist/themes/default.d.ts +1 -0
- package/dist/themes/default.js +6 -0
- package/dist/themes/default.js.map +1 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/vsh-dark.d.ts +5 -0
- package/dist/themes/vsh-dark.js +39 -0
- package/dist/themes/vsh-dark.js.map +1 -0
- package/dist/themes/vsh-light.d.ts +6 -0
- package/dist/themes/vsh-light.js +39 -0
- package/dist/themes/vsh-light.js.map +1 -0
- package/dist/themes/vsh-midnight.d.ts +5 -0
- package/dist/themes/vsh-midnight.js +39 -0
- package/dist/themes/vsh-midnight.js.map +1 -0
- package/dist/themes/vsh-paper.d.ts +5 -0
- package/dist/themes/vsh-paper.js +39 -0
- package/dist/themes/vsh-paper.js.map +1 -0
- package/dist/themes.d.ts +1 -0
- package/dist/themes.js +11 -0
- package/dist/themes.js.map +1 -0
- package/dist/types.d.ts +162 -0
- package/package.json +193 -6
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses semantic versioning.
|
|
4
|
+
|
|
5
|
+
## [1.0.0] - 2026-10-25
|
|
6
|
+
|
|
7
|
+
Initial stable release.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Vue 3 `SyntaxHighlighter` component with line numbers, highlighted ranges, wrapping, tag overrides, scoped slots, events, and exposed `refresh`, `highlight`, `copy`, and `getCopyPayload` operations.
|
|
12
|
+
- `SyntaxHighlighterProvider`, the `VueSyntaxHighlighter` plugin, and `useSyntaxHighlighter` composable with scoped defaults, preloaded languages, and lifecycle cleanup.
|
|
13
|
+
- Engine adapter contract and separate lazy entries for Shiki, highlight.js through lowlight, a lowlight entry, and Prism through refractor.
|
|
14
|
+
- Semantic 19-type token model, source normalization, result validation, and frozen results.
|
|
15
|
+
- Four built-in themes (`vsh-light`, `vsh-dark`, `vsh-paper`, `vsh-midnight`) as individual data entries, matched light/dark pairs, `defineTheme`, and CSS custom-property theme scopes.
|
|
16
|
+
- Provider-scoped LRU cache with character budget, in-flight request deduplication, theme-independent cache keys, microtask scheduling, and stale-result rejection.
|
|
17
|
+
- Offscreen deferral with `IntersectionObserver` and virtualized rendering for long documents with bounded DOM and full-source copying.
|
|
18
|
+
- Deterministic SSR and hydration behavior for synchronous, preloaded, and asynchronous engines without runtime style injection.
|
|
19
|
+
- Compatibility aliases `Light`, `LightAsync`, `PrismLight`, and `PrismAsync`, plus deprecated prop mapping with one-time warnings.
|
|
20
|
+
- Optional `styles/fallback.css` for browsers without `light-dark()`, wrapped in `@supports not` so it is a no-op in modern browsers.
|
|
21
|
+
- Strict ESM package exports, TypeScript declarations, size budgets, static graph assertions, publint/attw validation, packed-consumer browser and SSR fixtures.
|
|
22
|
+
- npm metadata with repository/homepage/bugs links, `publishConfig.access`, a tag-checked release workflow with provenance, and a `prepublishOnly` build/package gate.
|
|
23
|
+
- VitePress documentation with onboarding, basic and advanced usage guides, API reference, examples for every public export, live demo, and a GitHub Pages deployment workflow.
|
|
24
|
+
- Playwright and axe coverage for the demo, deferral, nested schemes, and accessibility.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CoderMiner
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,182 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# vue-syntax-highlighter
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/vue-syntax-highlighter)
|
|
4
|
+
[](https://github.com/coderminer/vue-syntax-highlighter/blob/main/LICENSE)
|
|
5
|
+
[](https://vuejs.org)
|
|
6
|
+
[](#install)
|
|
7
|
+
[](https://coderminer.github.io/vue-syntax-highlighter/)
|
|
8
|
+
|
|
9
|
+
A Vue 3 syntax highlighter with pluggable engines, semantic themes, and SSR-first performance.
|
|
10
|
+
|
|
11
|
+
[Documentation](https://coderminer.github.io/vue-syntax-highlighter/) · [API](https://coderminer.github.io/vue-syntax-highlighter/api) · [API Examples](https://coderminer.github.io/vue-syntax-highlighter/guide/api-examples)
|
|
12
|
+
|
|
13
|
+
- **Vue-idiomatic API** — component props, scoped slots, events, exposed methods, a plugin, a provider, and composables.
|
|
14
|
+
- **Pluggable engines** — Shiki by default; highlight.js through lowlight, a lowlight entry, and Prism through refractor as optional adapters.
|
|
15
|
+
- **Theme-independent tokens** — engines return text plus semantic token types only. Changing a theme never invokes the engine.
|
|
16
|
+
- **Deterministic SSR** — synchronous or preloaded engines render highlighted HTML; async engines render a plain busy shell and upgrade after hydration.
|
|
17
|
+
- **Bounded performance** — provider-scoped LRU cache, request deduplication, theme-free cache keys, offscreen deferral, and virtualization for very long files.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# npm
|
|
23
|
+
npm install vue-syntax-highlighter
|
|
24
|
+
|
|
25
|
+
# pnpm
|
|
26
|
+
pnpm add vue-syntax-highlighter
|
|
27
|
+
|
|
28
|
+
# yarn
|
|
29
|
+
yarn add vue-syntax-highlighter
|
|
30
|
+
|
|
31
|
+
# bun
|
|
32
|
+
bun add vue-syntax-highlighter
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Install the engine you plan to use:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install shiki # default
|
|
39
|
+
npm install lowlight highlight.js # highlight.js / lowlight adapters
|
|
40
|
+
npm install refractor # Prism adapter
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Vue `>=3.4` is the only required peer and is provided by your existing Vue application, so the install commands above intentionally omit it. Engine peers are optional. The package is ESM-only and targets Node `>=20.19` for SSR/build tooling. Browsers without `light-dark()` can import the optional fallback stylesheet after the base stylesheet.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import 'vue-syntax-highlighter/styles.css'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Quick start
|
|
50
|
+
|
|
51
|
+
```vue
|
|
52
|
+
<script setup lang="ts">
|
|
53
|
+
import { SyntaxHighlighter } from 'vue-syntax-highlighter'
|
|
54
|
+
|
|
55
|
+
const code = `const answer = 42
|
|
56
|
+
console.log(answer)`
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<template>
|
|
60
|
+
<SyntaxHighlighter :code="code" language="javascript" line-numbers />
|
|
61
|
+
</template>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Engines
|
|
65
|
+
|
|
66
|
+
```vue
|
|
67
|
+
<SyntaxHighlighter :code="code" language="python" engine="shiki" />
|
|
68
|
+
<SyntaxHighlighter :code="code" language="python" engine="highlightjs" />
|
|
69
|
+
<SyntaxHighlighter :code="code" language="python" engine="lowlight" />
|
|
70
|
+
<SyntaxHighlighter :code="code" language="python" engine="prism" />
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Adapters are separate subpaths and lazy chunks. The core entry contains no static engine, grammar, or non-default theme data.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { createShikiEngine } from 'vue-syntax-highlighter/engines/shiki'
|
|
77
|
+
import { createLowlightEngine } from 'vue-syntax-highlighter/engines/lowlight'
|
|
78
|
+
import { createHighlightjsEngine } from 'vue-syntax-highlighter/engines/highlightjs'
|
|
79
|
+
import { createPrismEngine } from 'vue-syntax-highlighter/engines/prism'
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Preload a language to get synchronous highlighting (including SSR):
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
const engine = await createShikiEngine({ preload: ['typescript'] })
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Themes
|
|
89
|
+
|
|
90
|
+
```vue
|
|
91
|
+
<script setup lang="ts">
|
|
92
|
+
import { vshLight } from 'vue-syntax-highlighter/themes/vsh-light'
|
|
93
|
+
import { vshDark } from 'vue-syntax-highlighter/themes/vsh-dark'
|
|
94
|
+
const themes = { light: vshLight, dark: vshDark }
|
|
95
|
+
</script>
|
|
96
|
+
|
|
97
|
+
<template>
|
|
98
|
+
<SyntaxHighlighter :code="code" language="ts" :themes="themes" color-scheme="auto" />
|
|
99
|
+
</template>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Four built-in themes ship as individual data entries: `vsh-light` (default), `vsh-dark`, `vsh-paper`, and `vsh-midnight`. They form two matched light/dark pairs. `defineTheme` creates validated, frozen custom themes.
|
|
103
|
+
|
|
104
|
+
Theme switching updates CSS custom properties and the scheme attribute only. The token output and engine invocation count do not change.
|
|
105
|
+
|
|
106
|
+
## Performance
|
|
107
|
+
|
|
108
|
+
- Provider/application-scoped LRU cache (100 entries, 8 MiB character budget by default).
|
|
109
|
+
- Cache keys cover engine, options, language, and code, but never the theme.
|
|
110
|
+
- Concurrent identical requests share one engine call.
|
|
111
|
+
- `defer` waits for `IntersectionObserver` before loading.
|
|
112
|
+
- `virtualized` with `height`, fixed `lineHeight`, and `wrap=false` keeps only the visible window plus overscan in the DOM for long documents.
|
|
113
|
+
- `copy()` returns the complete source, not the virtualized window or gutter.
|
|
114
|
+
|
|
115
|
+
Run `pnpm bench` for cold highlight and initial SSR render timings on 1k/10k-line inputs.
|
|
116
|
+
|
|
117
|
+
## Exports
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
vue-syntax-highlighter
|
|
121
|
+
vue-syntax-highlighter/engines/shiki
|
|
122
|
+
vue-syntax-highlighter/engines/highlightjs
|
|
123
|
+
vue-syntax-highlighter/engines/lowlight
|
|
124
|
+
vue-syntax-highlighter/engines/prism
|
|
125
|
+
vue-syntax-highlighter/themes
|
|
126
|
+
vue-syntax-highlighter/themes/default
|
|
127
|
+
vue-syntax-highlighter/themes/vsh-light
|
|
128
|
+
vue-syntax-highlighter/themes/vsh-dark
|
|
129
|
+
vue-syntax-highlighter/themes/vsh-paper
|
|
130
|
+
vue-syntax-highlighter/themes/vsh-midnight
|
|
131
|
+
vue-syntax-highlighter/styles.css
|
|
132
|
+
vue-syntax-highlighter/styles/fallback.css
|
|
133
|
+
vue-syntax-highlighter/package.json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Deep imports into `dist/` are blocked.
|
|
137
|
+
|
|
138
|
+
## Development
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
pnpm install
|
|
142
|
+
pnpm build
|
|
143
|
+
pnpm typecheck
|
|
144
|
+
pnpm test:run
|
|
145
|
+
pnpm lint
|
|
146
|
+
pnpm size
|
|
147
|
+
pnpm check:package
|
|
148
|
+
pnpm docs:build
|
|
149
|
+
pnpm test:e2e
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
See the full gate with `pnpm verify`.
|
|
153
|
+
|
|
154
|
+
### Publishing
|
|
155
|
+
|
|
156
|
+
Releases are published to npm by [`.github/workflows/release.yml`](https://github.com/coderminer/vue-syntax-highlighter/blob/main/.github/workflows/release.yml) when a `v*` tag is pushed. See [RELEASING.md](https://github.com/coderminer/vue-syntax-highlighter/blob/main/RELEASING.md) for the one-time npm and GitHub setup, the version/changelog checklist, provenance, and rollback steps.
|
|
157
|
+
|
|
158
|
+
### Deploying the docs
|
|
159
|
+
|
|
160
|
+
The VitePress site builds to `docs/.vitepress/dist`. A GitHub Actions workflow in `.github/workflows/docs.yml` publishes it to GitHub Pages on pushes to `main`. In the repository's **Settings → Pages**, choose **GitHub Actions** as the source. Project pages use `/<repository>/` automatically; user/organization pages use `/`.
|
|
161
|
+
|
|
162
|
+
## Documentation
|
|
163
|
+
|
|
164
|
+
- [Getting Started](https://coderminer.github.io/vue-syntax-highlighter/guide/getting-started)
|
|
165
|
+
- [Quick Start](https://coderminer.github.io/vue-syntax-highlighter/guide/quick-start)
|
|
166
|
+
- [Basic Usage](https://coderminer.github.io/vue-syntax-highlighter/guide/basic-usage)
|
|
167
|
+
- [Advanced Usage](https://coderminer.github.io/vue-syntax-highlighter/guide/advanced-usage)
|
|
168
|
+
- [Engines](https://coderminer.github.io/vue-syntax-highlighter/guide/engines)
|
|
169
|
+
- [Themes](https://coderminer.github.io/vue-syntax-highlighter/guide/themes)
|
|
170
|
+
- [Performance](https://coderminer.github.io/vue-syntax-highlighter/guide/performance)
|
|
171
|
+
- [Server Rendering](https://coderminer.github.io/vue-syntax-highlighter/guide/ssr)
|
|
172
|
+
- [API](https://coderminer.github.io/vue-syntax-highlighter/api)
|
|
173
|
+
- [API Examples](https://coderminer.github.io/vue-syntax-highlighter/guide/api-examples)
|
|
174
|
+
- [Limitations](https://coderminer.github.io/vue-syntax-highlighter/guide/limitations)
|
|
175
|
+
|
|
176
|
+
## Attribution
|
|
177
|
+
|
|
178
|
+
The semantic token vocabulary is informed by common TextMate, Prism, and highlight.js scope categories. All four built-in palettes are authored for this library, not copied from third-party theme files. Runtime highlighting is provided by the optional peer packages Shiki, highlight.js/lowlight, and refractor, each under its own license. No grammar or theme assets are redistributed by this package.
|
|
179
|
+
|
|
180
|
+
## License
|
|
181
|
+
|
|
182
|
+
MIT
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
/** Compatibility alias for react-syntax-highlighter's highlight.js light build. */
|
|
3
|
+
export declare const Light: Component;
|
|
4
|
+
/** Compatibility alias for the asynchronous highlight.js build. */
|
|
5
|
+
export declare const LightAsync: Component;
|
|
6
|
+
/** Compatibility alias for the Prism light build. */
|
|
7
|
+
export declare const PrismLight: Component;
|
|
8
|
+
/** Compatibility alias for the asynchronous Prism build. */
|
|
9
|
+
export declare const PrismAsync: Component;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { T as f } from "./types-DTo8JPWw.js";
|
|
2
|
+
const g = new Set(f), y = ["color", "fontStyle", "fontWeight", "textDecoration"];
|
|
3
|
+
function c(e, o) {
|
|
4
|
+
if (typeof e != "string" || e.trim().length === 0)
|
|
5
|
+
throw new TypeError(
|
|
6
|
+
`[vue-syntax-highlighter] Invalid theme: "${o}" must be a non-empty string.`
|
|
7
|
+
);
|
|
8
|
+
return e;
|
|
9
|
+
}
|
|
10
|
+
function l(e, o) {
|
|
11
|
+
if (e !== void 0)
|
|
12
|
+
return c(e, o);
|
|
13
|
+
}
|
|
14
|
+
function d(e) {
|
|
15
|
+
if (e === void 0) return Object.freeze({});
|
|
16
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
17
|
+
throw new TypeError('[vue-syntax-highlighter] Invalid theme: "tokens" must be an object.');
|
|
18
|
+
const o = {};
|
|
19
|
+
for (const [t, r] of Object.entries(e)) {
|
|
20
|
+
if (!g.has(t))
|
|
21
|
+
throw new TypeError(
|
|
22
|
+
`[vue-syntax-highlighter] Invalid theme: unknown token type "${t}". Expected one of ${f.join(", ")}.`
|
|
23
|
+
);
|
|
24
|
+
if (r === void 0) continue;
|
|
25
|
+
if (!r || typeof r != "object" || Array.isArray(r))
|
|
26
|
+
throw new TypeError(
|
|
27
|
+
`[vue-syntax-highlighter] Invalid theme: tokens.${t} must be an object.`
|
|
28
|
+
);
|
|
29
|
+
const s = {};
|
|
30
|
+
for (const n of y) {
|
|
31
|
+
const i = r[n];
|
|
32
|
+
i !== void 0 && (s[n] = c(i, `tokens.${t}.${n}`));
|
|
33
|
+
}
|
|
34
|
+
o[t] = Object.freeze(s);
|
|
35
|
+
}
|
|
36
|
+
return Object.freeze(o);
|
|
37
|
+
}
|
|
38
|
+
function u(e) {
|
|
39
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
40
|
+
throw new TypeError("[vue-syntax-highlighter] Invalid theme: expected an object.");
|
|
41
|
+
const o = c(e.name, "name");
|
|
42
|
+
if (e.colorScheme !== "light" && e.colorScheme !== "dark")
|
|
43
|
+
throw new TypeError(
|
|
44
|
+
'[vue-syntax-highlighter] Invalid theme: "colorScheme" must be "light" or "dark".'
|
|
45
|
+
);
|
|
46
|
+
if (!e.colors || typeof e.colors != "object" || Array.isArray(e.colors))
|
|
47
|
+
throw new TypeError(
|
|
48
|
+
'[vue-syntax-highlighter] Invalid theme: "colors" must include background and foreground.'
|
|
49
|
+
);
|
|
50
|
+
const t = c(e.colors.background, "colors.background"), r = c(e.colors.foreground, "colors.foreground"), s = l(e.colors.gutter, "colors.gutter") ?? r, n = l(e.colors.lineHighlight, "colors.lineHighlight") ?? "transparent", i = l(e.colors.selection, "colors.selection") ?? "rgba(127, 127, 127, 0.28)", h = l(e.colors.fontFamily, "colors.fontFamily"), a = Object.freeze({
|
|
51
|
+
background: t,
|
|
52
|
+
foreground: r,
|
|
53
|
+
gutter: s,
|
|
54
|
+
lineHighlight: n,
|
|
55
|
+
selection: i,
|
|
56
|
+
...h ? { fontFamily: h } : {}
|
|
57
|
+
});
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
name: o,
|
|
60
|
+
colorScheme: e.colorScheme,
|
|
61
|
+
colors: a,
|
|
62
|
+
tokens: d(e.tokens)
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function b(e) {
|
|
66
|
+
if (!e || typeof e != "object") return !1;
|
|
67
|
+
const o = e;
|
|
68
|
+
return typeof o.name == "string" && o.name.length > 0 && (o.colorScheme === "light" || o.colorScheme === "dark") && !!o.colors && typeof o.colors?.background == "string" && typeof o.colors?.foreground == "string" && typeof o.colors?.gutter == "string" && typeof o.colors?.lineHighlight == "string" && typeof o.colors?.selection == "string" && !!o.tokens && typeof o.tokens == "object";
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
u as d,
|
|
72
|
+
b as i
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=define-theme-Bul1KkHG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-theme-Bul1KkHG.js","sources":["../../src/core/define-theme.ts"],"sourcesContent":["import {\r\n TOKEN_TYPES,\r\n type ThemeDefinition,\r\n type ThemeInput,\r\n type TokenStyle,\r\n type TokenType,\r\n} from '../types.js'\r\n\r\nconst TOKEN_TYPE_SET = new Set<string>(TOKEN_TYPES)\r\nconst STYLE_KEYS = ['color', 'fontStyle', 'fontWeight', 'textDecoration'] as const\r\n\r\nfunction requiredString(value: unknown, path: string): string {\r\n if (typeof value !== 'string' || value.trim().length === 0) {\r\n throw new TypeError(\r\n `[vue-syntax-highlighter] Invalid theme: \"${path}\" must be a non-empty string.`,\r\n )\r\n }\r\n return value\r\n}\r\n\r\nfunction optionalString(value: unknown, path: string): string | undefined {\r\n if (value === undefined) return undefined\r\n return requiredString(value, path)\r\n}\r\n\r\nfunction freezeTokens(\r\n tokens: ThemeInput['tokens'],\r\n): Partial<Record<TokenType, TokenStyle>> {\r\n if (tokens === undefined) return Object.freeze({})\r\n if (!tokens || typeof tokens !== 'object' || Array.isArray(tokens)) {\r\n throw new TypeError('[vue-syntax-highlighter] Invalid theme: \"tokens\" must be an object.')\r\n }\r\n\r\n const result: Partial<Record<TokenType, TokenStyle>> = {}\r\n for (const [key, value] of Object.entries(tokens)) {\r\n if (!TOKEN_TYPE_SET.has(key)) {\r\n throw new TypeError(\r\n `[vue-syntax-highlighter] Invalid theme: unknown token type \"${key}\". ` +\r\n `Expected one of ${TOKEN_TYPES.join(', ')}.`,\r\n )\r\n }\r\n if (value === undefined) continue\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\r\n throw new TypeError(\r\n `[vue-syntax-highlighter] Invalid theme: tokens.${key} must be an object.`,\r\n )\r\n }\r\n const style: TokenStyle = {}\r\n for (const styleKey of STYLE_KEYS) {\r\n const styleValue = (value as Record<string, unknown>)[styleKey]\r\n if (styleValue === undefined) continue\r\n style[styleKey] = requiredString(styleValue, `tokens.${key}.${styleKey}`)\r\n }\r\n result[key as TokenType] = Object.freeze(style)\r\n }\r\n return Object.freeze(result)\r\n}\r\n\r\n/**\r\n * Validates and freezes a theme definition. Invalid input throws an actionable\r\n * error; callers that resolve themes during rendering catch it and keep the\r\n * previous valid theme instead.\r\n */\r\nexport function defineTheme(input: ThemeInput): ThemeDefinition {\r\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\r\n throw new TypeError('[vue-syntax-highlighter] Invalid theme: expected an object.')\r\n }\r\n\r\n const name = requiredString(input.name, 'name')\r\n if (input.colorScheme !== 'light' && input.colorScheme !== 'dark') {\r\n throw new TypeError(\r\n '[vue-syntax-highlighter] Invalid theme: \"colorScheme\" must be \"light\" or \"dark\".',\r\n )\r\n }\r\n if (!input.colors || typeof input.colors !== 'object' || Array.isArray(input.colors)) {\r\n throw new TypeError(\r\n '[vue-syntax-highlighter] Invalid theme: \"colors\" must include background and foreground.',\r\n )\r\n }\r\n\r\n const background = requiredString(input.colors.background, 'colors.background')\r\n const foreground = requiredString(input.colors.foreground, 'colors.foreground')\r\n const gutter = optionalString(input.colors.gutter, 'colors.gutter') ?? foreground\r\n const lineHighlight =\r\n optionalString(input.colors.lineHighlight, 'colors.lineHighlight') ?? 'transparent'\r\n const selection =\r\n optionalString(input.colors.selection, 'colors.selection') ?? 'rgba(127, 127, 127, 0.28)'\r\n const fontFamily = optionalString(input.colors.fontFamily, 'colors.fontFamily')\r\n\r\n const colors = Object.freeze({\r\n background,\r\n foreground,\r\n gutter,\r\n lineHighlight,\r\n selection,\r\n ...(fontFamily ? { fontFamily } : {}),\r\n })\r\n\r\n return Object.freeze({\r\n name,\r\n colorScheme: input.colorScheme,\r\n colors,\r\n tokens: freezeTokens(input.tokens),\r\n })\r\n}\r\n\r\nexport function isThemeDefinition(value: unknown): value is ThemeDefinition {\r\n if (!value || typeof value !== 'object') return false\r\n const candidate = value as Partial<ThemeDefinition>\r\n return (\r\n typeof candidate.name === 'string' &&\r\n candidate.name.length > 0 &&\r\n (candidate.colorScheme === 'light' || candidate.colorScheme === 'dark') &&\r\n Boolean(candidate.colors) &&\r\n typeof candidate.colors?.background === 'string' &&\r\n typeof candidate.colors?.foreground === 'string' &&\r\n typeof candidate.colors?.gutter === 'string' &&\r\n typeof candidate.colors?.lineHighlight === 'string' &&\r\n typeof candidate.colors?.selection === 'string' &&\r\n Boolean(candidate.tokens) &&\r\n typeof candidate.tokens === 'object'\r\n )\r\n}\r\n"],"names":["TOKEN_TYPE_SET","TOKEN_TYPES","STYLE_KEYS","requiredString","value","path","optionalString","freezeTokens","tokens","result","key","style","styleKey","styleValue","defineTheme","input","name","background","foreground","gutter","lineHighlight","selection","fontFamily","colors","isThemeDefinition","candidate"],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
var w = Object.defineProperty;
|
|
2
|
+
var x = (r, t, i) => t in r ? w(r, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : r[t] = i;
|
|
3
|
+
var o = (r, t, i) => x(r, typeof t != "symbol" ? t + "" : t, i);
|
|
4
|
+
import { createLowlight as v } from "lowlight";
|
|
5
|
+
import { c as y, n as k, r as L } from "./source-DxBCRqJY.js";
|
|
6
|
+
import { m as b } from "./token-types-B8veGO5e.js";
|
|
7
|
+
const S = {
|
|
8
|
+
apache: () => import("highlight.js/lib/languages/apache"),
|
|
9
|
+
c: () => import("highlight.js/lib/languages/c"),
|
|
10
|
+
clojure: () => import("highlight.js/lib/languages/clojure"),
|
|
11
|
+
cpp: () => import("highlight.js/lib/languages/cpp"),
|
|
12
|
+
csharp: () => import("highlight.js/lib/languages/csharp"),
|
|
13
|
+
css: () => import("highlight.js/lib/languages/css"),
|
|
14
|
+
dart: () => import("highlight.js/lib/languages/dart"),
|
|
15
|
+
diff: () => import("highlight.js/lib/languages/diff"),
|
|
16
|
+
docker: () => import("highlight.js/lib/languages/dockerfile"),
|
|
17
|
+
elixir: () => import("highlight.js/lib/languages/elixir"),
|
|
18
|
+
erlang: () => import("highlight.js/lib/languages/erlang"),
|
|
19
|
+
fortran: () => import("highlight.js/lib/languages/fortran"),
|
|
20
|
+
fsharp: () => import("highlight.js/lib/languages/fsharp"),
|
|
21
|
+
go: () => import("highlight.js/lib/languages/go"),
|
|
22
|
+
graphql: () => import("highlight.js/lib/languages/graphql"),
|
|
23
|
+
groovy: () => import("highlight.js/lib/languages/groovy"),
|
|
24
|
+
haskell: () => import("highlight.js/lib/languages/haskell"),
|
|
25
|
+
html: () => import("highlight.js/lib/languages/xml"),
|
|
26
|
+
http: () => import("highlight.js/lib/languages/http"),
|
|
27
|
+
ini: () => import("highlight.js/lib/languages/ini"),
|
|
28
|
+
java: () => import("highlight.js/lib/languages/java"),
|
|
29
|
+
javascript: () => import("highlight.js/lib/languages/javascript"),
|
|
30
|
+
json: () => import("highlight.js/lib/languages/json"),
|
|
31
|
+
julia: () => import("highlight.js/lib/languages/julia"),
|
|
32
|
+
kotlin: () => import("highlight.js/lib/languages/kotlin"),
|
|
33
|
+
latex: () => import("highlight.js/lib/languages/latex"),
|
|
34
|
+
less: () => import("highlight.js/lib/languages/less"),
|
|
35
|
+
lua: () => import("highlight.js/lib/languages/lua"),
|
|
36
|
+
make: () => import("highlight.js/lib/languages/makefile"),
|
|
37
|
+
markdown: () => import("highlight.js/lib/languages/markdown"),
|
|
38
|
+
matlab: () => import("highlight.js/lib/languages/matlab"),
|
|
39
|
+
nginx: () => import("highlight.js/lib/languages/nginx"),
|
|
40
|
+
nix: () => import("highlight.js/lib/languages/nix"),
|
|
41
|
+
"objective-c": () => import("highlight.js/lib/languages/objectivec"),
|
|
42
|
+
ocaml: () => import("highlight.js/lib/languages/ocaml"),
|
|
43
|
+
perl: () => import("highlight.js/lib/languages/perl"),
|
|
44
|
+
php: () => import("highlight.js/lib/languages/php"),
|
|
45
|
+
powershell: () => import("highlight.js/lib/languages/powershell"),
|
|
46
|
+
python: () => import("highlight.js/lib/languages/python"),
|
|
47
|
+
r: () => import("highlight.js/lib/languages/r"),
|
|
48
|
+
ruby: () => import("highlight.js/lib/languages/ruby"),
|
|
49
|
+
rust: () => import("highlight.js/lib/languages/rust"),
|
|
50
|
+
scala: () => import("highlight.js/lib/languages/scala"),
|
|
51
|
+
scss: () => import("highlight.js/lib/languages/scss"),
|
|
52
|
+
shellscript: () => import("highlight.js/lib/languages/bash"),
|
|
53
|
+
sql: () => import("highlight.js/lib/languages/sql"),
|
|
54
|
+
stylus: () => import("highlight.js/lib/languages/stylus"),
|
|
55
|
+
swift: () => import("highlight.js/lib/languages/swift"),
|
|
56
|
+
typescript: () => import("highlight.js/lib/languages/typescript"),
|
|
57
|
+
wasm: () => import("highlight.js/lib/languages/wasm"),
|
|
58
|
+
xml: () => import("highlight.js/lib/languages/xml"),
|
|
59
|
+
yaml: () => import("highlight.js/lib/languages/yaml")
|
|
60
|
+
}, P = {
|
|
61
|
+
"c#": "csharp",
|
|
62
|
+
"c++": "cpp",
|
|
63
|
+
cjs: "javascript",
|
|
64
|
+
cs: "csharp",
|
|
65
|
+
cts: "typescript",
|
|
66
|
+
cxx: "cpp",
|
|
67
|
+
dockerfile: "docker",
|
|
68
|
+
htm: "html",
|
|
69
|
+
js: "javascript",
|
|
70
|
+
makefile: "make",
|
|
71
|
+
md: "markdown",
|
|
72
|
+
mjs: "javascript",
|
|
73
|
+
mts: "typescript",
|
|
74
|
+
objc: "objective-c",
|
|
75
|
+
py: "python",
|
|
76
|
+
rb: "ruby",
|
|
77
|
+
sh: "shellscript",
|
|
78
|
+
shell: "shellscript",
|
|
79
|
+
ts: "typescript",
|
|
80
|
+
yml: "yaml",
|
|
81
|
+
zsh: "shellscript"
|
|
82
|
+
}, A = ["apache", "c", "clojure", "cpp", "csharp", "css", "dart", "diff", "docker", "elixir", "erlang", "fortran", "fsharp", "go", "graphql", "groovy", "haskell", "html", "http", "ini", "java", "javascript", "json", "julia", "kotlin", "latex", "less", "lua", "make", "markdown", "matlab", "nginx", "nix", "objective-c", "ocaml", "perl", "php", "powershell", "python", "r", "ruby", "rust", "scala", "scss", "shellscript", "sql", "stylus", "swift", "typescript", "wasm", "xml", "yaml"], u = /* @__PURE__ */ new Set(["text", "plain", "plaintext", "txt"]);
|
|
83
|
+
async function _(r = {}) {
|
|
84
|
+
const t = new E(r);
|
|
85
|
+
return r.preload?.length && await Promise.allSettled(r.preload.map((i) => t.loadLanguage(i))), t;
|
|
86
|
+
}
|
|
87
|
+
class E {
|
|
88
|
+
constructor(t) {
|
|
89
|
+
o(this, "id", "highlightjs");
|
|
90
|
+
o(this, "capabilities", { sync: !0 });
|
|
91
|
+
o(this, "supportedLanguages", A);
|
|
92
|
+
o(this, "lowlight", v());
|
|
93
|
+
o(this, "loaders", new Map(
|
|
94
|
+
Object.entries(S)
|
|
95
|
+
));
|
|
96
|
+
o(this, "loaded", /* @__PURE__ */ new Set());
|
|
97
|
+
o(this, "loading", /* @__PURE__ */ new Map());
|
|
98
|
+
o(this, "disposed", !1);
|
|
99
|
+
}
|
|
100
|
+
hasLanguage(t) {
|
|
101
|
+
const i = h(t);
|
|
102
|
+
return u.has(i) ? !0 : this.loaded.has(i);
|
|
103
|
+
}
|
|
104
|
+
registerLanguage(t, i) {
|
|
105
|
+
const e = h(t);
|
|
106
|
+
if (typeof i == "function" && i.length === 0) {
|
|
107
|
+
this.loaders.set(e, i), this.loaded.delete(e);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const n = i;
|
|
111
|
+
this.lowlight.register(e, n), this.loaders.set(e, async () => n), this.loaded.add(e);
|
|
112
|
+
}
|
|
113
|
+
loadLanguage(t) {
|
|
114
|
+
if (this.disposed)
|
|
115
|
+
return Promise.reject(
|
|
116
|
+
new Error("[vue-syntax-highlighter] The highlight.js engine was disposed.")
|
|
117
|
+
);
|
|
118
|
+
const i = h(t);
|
|
119
|
+
if (u.has(i) || this.loaded.has(i)) return Promise.resolve();
|
|
120
|
+
const e = this.loading.get(i);
|
|
121
|
+
if (e) return e;
|
|
122
|
+
const n = this.loaders.get(i);
|
|
123
|
+
if (!n)
|
|
124
|
+
return Promise.reject(
|
|
125
|
+
new Error(
|
|
126
|
+
`[vue-syntax-highlighter] Language "${t}" is not available in the highlight.js adapter. Use a supported language or call engine.registerLanguage(name, grammar) first.`
|
|
127
|
+
)
|
|
128
|
+
);
|
|
129
|
+
const l = n().then((c) => {
|
|
130
|
+
const m = typeof c == "function" ? c : c.default;
|
|
131
|
+
this.lowlight.register(i, m), this.loaded.add(i);
|
|
132
|
+
}).finally(() => {
|
|
133
|
+
this.loading.delete(i);
|
|
134
|
+
});
|
|
135
|
+
return this.loading.set(i, l), l;
|
|
136
|
+
}
|
|
137
|
+
highlight(t, i) {
|
|
138
|
+
const e = h(t.language);
|
|
139
|
+
return u.has(e) ? y(t.code, t.language) : this.loaded.has(e) ? this.highlightSync(t) : this.loadLanguage(e).then(() => this.highlightSync(t));
|
|
140
|
+
}
|
|
141
|
+
highlightSync(t) {
|
|
142
|
+
if (this.disposed)
|
|
143
|
+
throw new Error("[vue-syntax-highlighter] The highlight.js engine was disposed.");
|
|
144
|
+
const i = k(t.code), e = h(t.language), n = this.lowlight.highlight(e, i), l = [[]], c = (s, p) => {
|
|
145
|
+
if (s.length === 0) return;
|
|
146
|
+
const g = s.split(`
|
|
147
|
+
`);
|
|
148
|
+
for (let a = 0; a < g.length; a += 1) {
|
|
149
|
+
a > 0 && l.push([]);
|
|
150
|
+
const d = g[a] ?? "";
|
|
151
|
+
d.length > 0 && l[l.length - 1].push({ text: d, type: p });
|
|
152
|
+
}
|
|
153
|
+
}, m = (s, p) => {
|
|
154
|
+
if (s.type === "text") {
|
|
155
|
+
c(s.value, b(p));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const g = s;
|
|
159
|
+
for (const a of g.children ?? []) {
|
|
160
|
+
const d = a.type === "element" ? z(p, a.properties?.className) : p;
|
|
161
|
+
m(a, d);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
for (const s of n.children ?? []) {
|
|
165
|
+
const p = s.type === "element" ? s.properties?.className : void 0;
|
|
166
|
+
m(s, p);
|
|
167
|
+
}
|
|
168
|
+
const f = { lines: l.map((s) => ({ tokens: s })), language: t.language };
|
|
169
|
+
return L(f) !== i ? y(i, t.language) : f;
|
|
170
|
+
}
|
|
171
|
+
dispose() {
|
|
172
|
+
this.disposed || (this.disposed = !0, this.loaded.clear(), this.loading.clear(), this.loaders.clear());
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function z(r, t) {
|
|
176
|
+
return t === void 0 ? r : r === void 0 ? t : [...j(r), ...j(t)];
|
|
177
|
+
}
|
|
178
|
+
function j(r) {
|
|
179
|
+
return Array.isArray(r) ? r : typeof r == "string" ? r.split(/\s+/) : [];
|
|
180
|
+
}
|
|
181
|
+
function h(r) {
|
|
182
|
+
const t = r.trim().toLowerCase().replace(/^language-/, "");
|
|
183
|
+
return P[t] ?? t;
|
|
184
|
+
}
|
|
185
|
+
export {
|
|
186
|
+
_ as c
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=index-a55czNwo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-a55czNwo.js","sources":["../../src/engines/highlightjs/languages.ts","../../src/engines/highlightjs/index.ts"],"sourcesContent":["// Generated by scripts/generate-languages.mjs. Do not edit by hand.\r\n// Language registry for the lowlight/highlight.js adapter.\r\nexport const languageLoaders = {\r\n \"apache\": () => import(\"highlight.js/lib/languages/apache\"),\r\n \"c\": () => import(\"highlight.js/lib/languages/c\"),\r\n \"clojure\": () => import(\"highlight.js/lib/languages/clojure\"),\r\n \"cpp\": () => import(\"highlight.js/lib/languages/cpp\"),\r\n \"csharp\": () => import(\"highlight.js/lib/languages/csharp\"),\r\n \"css\": () => import(\"highlight.js/lib/languages/css\"),\r\n \"dart\": () => import(\"highlight.js/lib/languages/dart\"),\r\n \"diff\": () => import(\"highlight.js/lib/languages/diff\"),\r\n \"docker\": () => import(\"highlight.js/lib/languages/dockerfile\"),\r\n \"elixir\": () => import(\"highlight.js/lib/languages/elixir\"),\r\n \"erlang\": () => import(\"highlight.js/lib/languages/erlang\"),\r\n \"fortran\": () => import(\"highlight.js/lib/languages/fortran\"),\r\n \"fsharp\": () => import(\"highlight.js/lib/languages/fsharp\"),\r\n \"go\": () => import(\"highlight.js/lib/languages/go\"),\r\n \"graphql\": () => import(\"highlight.js/lib/languages/graphql\"),\r\n \"groovy\": () => import(\"highlight.js/lib/languages/groovy\"),\r\n \"haskell\": () => import(\"highlight.js/lib/languages/haskell\"),\r\n \"html\": () => import(\"highlight.js/lib/languages/xml\"),\r\n \"http\": () => import(\"highlight.js/lib/languages/http\"),\r\n \"ini\": () => import(\"highlight.js/lib/languages/ini\"),\r\n \"java\": () => import(\"highlight.js/lib/languages/java\"),\r\n \"javascript\": () => import(\"highlight.js/lib/languages/javascript\"),\r\n \"json\": () => import(\"highlight.js/lib/languages/json\"),\r\n \"julia\": () => import(\"highlight.js/lib/languages/julia\"),\r\n \"kotlin\": () => import(\"highlight.js/lib/languages/kotlin\"),\r\n \"latex\": () => import(\"highlight.js/lib/languages/latex\"),\r\n \"less\": () => import(\"highlight.js/lib/languages/less\"),\r\n \"lua\": () => import(\"highlight.js/lib/languages/lua\"),\r\n \"make\": () => import(\"highlight.js/lib/languages/makefile\"),\r\n \"markdown\": () => import(\"highlight.js/lib/languages/markdown\"),\r\n \"matlab\": () => import(\"highlight.js/lib/languages/matlab\"),\r\n \"nginx\": () => import(\"highlight.js/lib/languages/nginx\"),\r\n \"nix\": () => import(\"highlight.js/lib/languages/nix\"),\r\n \"objective-c\": () => import(\"highlight.js/lib/languages/objectivec\"),\r\n \"ocaml\": () => import(\"highlight.js/lib/languages/ocaml\"),\r\n \"perl\": () => import(\"highlight.js/lib/languages/perl\"),\r\n \"php\": () => import(\"highlight.js/lib/languages/php\"),\r\n \"powershell\": () => import(\"highlight.js/lib/languages/powershell\"),\r\n \"python\": () => import(\"highlight.js/lib/languages/python\"),\r\n \"r\": () => import(\"highlight.js/lib/languages/r\"),\r\n \"ruby\": () => import(\"highlight.js/lib/languages/ruby\"),\r\n \"rust\": () => import(\"highlight.js/lib/languages/rust\"),\r\n \"scala\": () => import(\"highlight.js/lib/languages/scala\"),\r\n \"scss\": () => import(\"highlight.js/lib/languages/scss\"),\r\n \"shellscript\": () => import(\"highlight.js/lib/languages/bash\"),\r\n \"sql\": () => import(\"highlight.js/lib/languages/sql\"),\r\n \"stylus\": () => import(\"highlight.js/lib/languages/stylus\"),\r\n \"swift\": () => import(\"highlight.js/lib/languages/swift\"),\r\n \"typescript\": () => import(\"highlight.js/lib/languages/typescript\"),\r\n \"wasm\": () => import(\"highlight.js/lib/languages/wasm\"),\r\n \"xml\": () => import(\"highlight.js/lib/languages/xml\"),\r\n \"yaml\": () => import(\"highlight.js/lib/languages/yaml\"),\r\n} satisfies Record<string, () => Promise<unknown>>\r\n\r\nexport const languageAliases: Readonly<Record<string, string>> = {\r\n \"c#\": \"csharp\",\r\n \"c++\": \"cpp\",\r\n \"cjs\": \"javascript\",\r\n \"cs\": \"csharp\",\r\n \"cts\": \"typescript\",\r\n \"cxx\": \"cpp\",\r\n \"dockerfile\": \"docker\",\r\n \"htm\": \"html\",\r\n \"js\": \"javascript\",\r\n \"makefile\": \"make\",\r\n \"md\": \"markdown\",\r\n \"mjs\": \"javascript\",\r\n \"mts\": \"typescript\",\r\n \"objc\": \"objective-c\",\r\n \"py\": \"python\",\r\n \"rb\": \"ruby\",\r\n \"sh\": \"shellscript\",\r\n \"shell\": \"shellscript\",\r\n \"ts\": \"typescript\",\r\n \"yml\": \"yaml\",\r\n \"zsh\": \"shellscript\",\r\n}\r\n\r\nexport const supportedLanguages: readonly string[] = [\"apache\",\"c\",\"clojure\",\"cpp\",\"csharp\",\"css\",\"dart\",\"diff\",\"docker\",\"elixir\",\"erlang\",\"fortran\",\"fsharp\",\"go\",\"graphql\",\"groovy\",\"haskell\",\"html\",\"http\",\"ini\",\"java\",\"javascript\",\"json\",\"julia\",\"kotlin\",\"latex\",\"less\",\"lua\",\"make\",\"markdown\",\"matlab\",\"nginx\",\"nix\",\"objective-c\",\"ocaml\",\"perl\",\"php\",\"powershell\",\"python\",\"r\",\"ruby\",\"rust\",\"scala\",\"scss\",\"shellscript\",\"sql\",\"stylus\",\"swift\",\"typescript\",\"wasm\",\"xml\",\"yaml\"]\r\n","import { createLowlight } from 'lowlight'\r\nimport type { LanguageFn } from 'highlight.js'\r\nimport type {\r\n EngineOptions,\r\n HighlightEngine,\r\n HighlightRequest,\r\n HighlightResult,\r\n HighlightToken,\r\n} from '../../types.js'\r\nimport { createPlainResult, normalizeSource, resultToSource } from '../../core/source.js'\r\nimport { mapHljsClasses } from '../../core/token-types.js'\r\nimport { languageAliases, languageLoaders, supportedLanguages } from './languages.js'\r\n\r\nconst PLAIN_LANGUAGES = new Set(['text', 'plain', 'plaintext', 'txt'])\r\n\r\ninterface HastText {\r\n type: 'text'\r\n value: string\r\n}\r\n\r\ninterface HastElement {\r\n type: 'element'\r\n properties?: { className?: unknown }\r\n children?: HastNode[]\r\n}\r\n\r\ninterface HastRoot {\r\n type: 'root'\r\n children?: HastNode[]\r\n}\r\n\r\ntype HastNode = HastText | HastElement | { type: string; children?: HastNode[] }\r\n\r\nexport type HighlightjsLanguageRegistration = LanguageFn\r\nexport type HighlightjsLanguageLoader = () => Promise<{ default: LanguageFn } | LanguageFn>\r\n\r\nexport interface HighlightjsEngine extends HighlightEngine {\r\n readonly id: 'highlightjs'\r\n readonly capabilities: { sync: true }\r\n hasLanguage(language: string): boolean\r\n loadLanguage(language: string): Promise<void>\r\n registerLanguage(\r\n name: string,\r\n language: HighlightjsLanguageRegistration | HighlightjsLanguageLoader,\r\n ): void\r\n readonly supportedLanguages: readonly string[]\r\n}\r\n\r\nexport interface HighlightjsEngineOptions {\r\n preload?: readonly string[]\r\n}\r\n\r\nexport async function createHighlightjsEngine(\r\n options: HighlightjsEngineOptions = {},\r\n): Promise<HighlightjsEngine> {\r\n const engine = new HighlightjsEngineImpl(options)\r\n if (options.preload?.length) {\r\n await Promise.allSettled(options.preload.map((language) => engine.loadLanguage(language)))\r\n }\r\n return engine\r\n}\r\n\r\nclass HighlightjsEngineImpl implements HighlightjsEngine {\r\n readonly id = 'highlightjs' as const\r\n readonly capabilities = { sync: true } as const\r\n readonly supportedLanguages = supportedLanguages\r\n\r\n private readonly lowlight = createLowlight()\r\n private readonly loaders = new Map<string, HighlightjsLanguageLoader>(\r\n Object.entries(languageLoaders) as [string, HighlightjsLanguageLoader][],\r\n )\r\n private readonly loaded = new Set<string>()\r\n private readonly loading = new Map<string, Promise<void>>()\r\n private disposed = false\r\n\r\n constructor(_options: HighlightjsEngineOptions) {}\r\n\r\n hasLanguage(language: string): boolean {\r\n const canonical = canonicalLanguage(language)\r\n if (PLAIN_LANGUAGES.has(canonical)) return true\r\n return this.loaded.has(canonical)\r\n }\r\n\r\n registerLanguage(\r\n name: string,\r\n language: HighlightjsLanguageRegistration | HighlightjsLanguageLoader,\r\n ): void {\r\n const canonical = canonicalLanguage(name)\r\n // highlight.js grammars are functions too. A zero-argument function is\r\n // treated as a loader; a grammar receives the highlight.js instance.\r\n if (typeof language === 'function' && language.length === 0) {\r\n this.loaders.set(canonical, language as HighlightjsLanguageLoader)\r\n this.loaded.delete(canonical)\r\n return\r\n }\r\n const grammar = language as HighlightjsLanguageRegistration\r\n this.lowlight.register(canonical, grammar)\r\n this.loaders.set(canonical, async () => grammar)\r\n this.loaded.add(canonical)\r\n }\r\n\r\n loadLanguage(language: string): Promise<void> {\r\n if (this.disposed) {\r\n return Promise.reject(\r\n new Error('[vue-syntax-highlighter] The highlight.js engine was disposed.'),\r\n )\r\n }\r\n const canonical = canonicalLanguage(language)\r\n if (PLAIN_LANGUAGES.has(canonical)) return Promise.resolve()\r\n if (this.loaded.has(canonical)) return Promise.resolve()\r\n const existing = this.loading.get(canonical)\r\n if (existing) return existing\r\n\r\n const loader = this.loaders.get(canonical)\r\n if (!loader) {\r\n return Promise.reject(\r\n new Error(\r\n `[vue-syntax-highlighter] Language \"${language}\" is not available in the highlight.js adapter. ` +\r\n 'Use a supported language or call engine.registerLanguage(name, grammar) first.',\r\n ),\r\n )\r\n }\r\n\r\n const promise = loader()\r\n .then((module) => {\r\n const grammar =\r\n typeof module === 'function'\r\n ? module\r\n : (module as { default: LanguageFn }).default\r\n this.lowlight.register(canonical, grammar)\r\n this.loaded.add(canonical)\r\n })\r\n .finally(() => {\r\n this.loading.delete(canonical)\r\n })\r\n this.loading.set(canonical, promise)\r\n return promise\r\n }\r\n\r\n highlight(\r\n request: HighlightRequest,\r\n _options?: EngineOptions,\r\n ): HighlightResult | Promise<HighlightResult> {\r\n const lang = canonicalLanguage(request.language)\r\n if (PLAIN_LANGUAGES.has(lang)) {\r\n return createPlainResult(request.code, request.language)\r\n }\r\n if (this.loaded.has(lang)) return this.highlightSync(request)\r\n return this.loadLanguage(lang).then(() => this.highlightSync(request))\r\n }\r\n\r\n private highlightSync(request: HighlightRequest): HighlightResult {\r\n if (this.disposed) {\r\n throw new Error('[vue-syntax-highlighter] The highlight.js engine was disposed.')\r\n }\r\n const code = normalizeSource(request.code)\r\n const lang = canonicalLanguage(request.language)\r\n const tree = this.lowlight.highlight(lang, code) as HastRoot\r\n\r\n const lines: HighlightToken[][] = [[]]\r\n const push = (text: string, type: HighlightToken['type']): void => {\r\n if (text.length === 0) return\r\n const parts = text.split('\\n')\r\n for (let index = 0; index < parts.length; index += 1) {\r\n if (index > 0) lines.push([])\r\n const part = parts[index] ?? ''\r\n if (part.length > 0) lines[lines.length - 1]!.push({ text: part, type })\r\n }\r\n }\r\n\r\n const walk = (node: HastNode, classes: unknown): void => {\r\n if (node.type === 'text') {\r\n push((node as HastText).value, mapHljsClasses(classes))\r\n return\r\n }\r\n const element = node as HastElement\r\n for (const child of element.children ?? []) {\r\n const childClasses =\r\n child.type === 'element'\r\n ? combineClasses(classes, (child as HastElement).properties?.className)\r\n : classes\r\n walk(child, childClasses)\r\n }\r\n }\r\n\r\n for (const child of tree.children ?? []) {\r\n const classes =\r\n child.type === 'element' ? (child as HastElement).properties?.className : undefined\r\n walk(child, classes)\r\n }\r\n\r\n const normalized: HighlightResult = { lines: lines.map((tokens) => ({ tokens })), language: request.language }\r\n if (resultToSource(normalized) !== code) {\r\n return createPlainResult(code, request.language)\r\n }\r\n return normalized\r\n }\r\n\r\n dispose(): void {\r\n if (this.disposed) return\r\n this.disposed = true\r\n this.loaded.clear()\r\n this.loading.clear()\r\n this.loaders.clear()\r\n }\r\n}\r\n\r\nfunction combineClasses(parent: unknown, own: unknown): unknown {\r\n if (own === undefined) return parent\r\n if (parent === undefined) return own\r\n return [...normalize(parent), ...normalize(own)]\r\n}\r\n\r\nfunction normalize(value: unknown): unknown[] {\r\n if (Array.isArray(value)) return value\r\n if (typeof value === 'string') return value.split(/\\s+/)\r\n return []\r\n}\r\n\r\nfunction canonicalLanguage(language: string): string {\r\n const normalized = language.trim().toLowerCase().replace(/^language-/, '')\r\n return languageAliases[normalized] ?? normalized\r\n}\r\n"],"names":["languageLoaders","languageAliases","supportedLanguages","PLAIN_LANGUAGES","createHighlightjsEngine","options","engine","HighlightjsEngineImpl","language","_options","__publicField","createLowlight","canonical","canonicalLanguage","name","grammar","existing","loader","promise","module","request","lang","createPlainResult","code","normalizeSource","tree","lines","push","text","type","parts","index","part","walk","node","classes","mapHljsClasses","element","child","childClasses","combineClasses","normalized","tokens","resultToSource","parent","own","normalize","value"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { T as s } from "./types-DTo8JPWw.js";
|
|
2
|
+
const i = new Set(s);
|
|
3
|
+
function f(e) {
|
|
4
|
+
return typeof e == "string" && i.has(e);
|
|
5
|
+
}
|
|
6
|
+
function a(e) {
|
|
7
|
+
return e.replace(/\r\n?/g, `
|
|
8
|
+
`);
|
|
9
|
+
}
|
|
10
|
+
function c(e) {
|
|
11
|
+
return a(e).split(`
|
|
12
|
+
`);
|
|
13
|
+
}
|
|
14
|
+
function p(e, t) {
|
|
15
|
+
return { lines: c(e).map((r) => ({
|
|
16
|
+
tokens: r.length > 0 ? [{ text: r, type: "plain" }] : []
|
|
17
|
+
})), language: t };
|
|
18
|
+
}
|
|
19
|
+
function g(e) {
|
|
20
|
+
return e.lines.map((t) => t.tokens.map((n) => n.text).join("")).join(`
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
function y(e) {
|
|
24
|
+
let t = e.language.length;
|
|
25
|
+
for (const n of e.lines)
|
|
26
|
+
for (const r of n.tokens) t += r.text.length;
|
|
27
|
+
return t;
|
|
28
|
+
}
|
|
29
|
+
function l(e) {
|
|
30
|
+
if (!e || typeof e != "object") return !1;
|
|
31
|
+
const t = e;
|
|
32
|
+
if (typeof t.language != "string" || !Array.isArray(t.lines)) return !1;
|
|
33
|
+
for (const n of t.lines) {
|
|
34
|
+
if (!n || typeof n != "object" || !Array.isArray(n.tokens)) return !1;
|
|
35
|
+
for (const r of n.tokens)
|
|
36
|
+
if (!r || typeof r != "object" || typeof r.text != "string" || !f(r.type)) return !1;
|
|
37
|
+
}
|
|
38
|
+
return !0;
|
|
39
|
+
}
|
|
40
|
+
function h(e) {
|
|
41
|
+
const t = e.lines.map((n) => {
|
|
42
|
+
const r = n.tokens.map((o) => Object.freeze({ text: o.text, type: o.type }));
|
|
43
|
+
return Object.freeze({ tokens: Object.freeze(r) });
|
|
44
|
+
});
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
lines: Object.freeze(t),
|
|
47
|
+
language: e.language,
|
|
48
|
+
...e.meta ? { meta: Object.freeze({ ...e.meta }) } : {}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function j(e) {
|
|
52
|
+
if (!l(e))
|
|
53
|
+
throw new TypeError(
|
|
54
|
+
"Highlight engine returned an invalid result. Expected ordered lines of { text, type } tokens."
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
y as a,
|
|
59
|
+
j as b,
|
|
60
|
+
p as c,
|
|
61
|
+
h as f,
|
|
62
|
+
a as n,
|
|
63
|
+
g as r,
|
|
64
|
+
c as s
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=source-DxBCRqJY.js.map
|