@openstage/glyph-renderer 0.2.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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Token stylesheet for highlighted code (the `hljs-*` classes lowlight emits).
3
+ * Every colour is a CSS custom property with a light-theme fallback, so a host
4
+ * can re-theme highlighting the same token-driven way as the editor — e.g.
5
+ * `:root { --glyph-hl-keyword: #c678dd; }` — without touching this file.
6
+ */
7
+ export declare const highlightThemeCss = "\n.hljs { color: var(--glyph-hl-text, #24292e); }\n.hljs-comment, .hljs-quote { color: var(--glyph-hl-comment, #6a737d); font-style: italic; }\n.hljs-keyword, .hljs-selector-tag, .hljs-built_in, .hljs-name, .hljs-tag {\n color: var(--glyph-hl-keyword, #d73a49);\n}\n.hljs-string, .hljs-attr, .hljs-template-tag, .hljs-template-variable,\n.hljs-addition, .hljs-regexp {\n color: var(--glyph-hl-string, #032f62);\n}\n.hljs-number, .hljs-literal, .hljs-boolean {\n color: var(--glyph-hl-number, #005cc5);\n}\n.hljs-title, .hljs-title.function_, .hljs-section, .hljs-selector-id {\n color: var(--glyph-hl-title, #6f42c1);\n}\n.hljs-type, .hljs-class .hljs-title, .hljs-title.class_ {\n color: var(--glyph-hl-type, #e36209);\n}\n.hljs-variable, .hljs-params, .hljs-property {\n color: var(--glyph-hl-variable, #24292e);\n}\n.hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-attribute {\n color: var(--glyph-hl-meta, #005cc5);\n}\n.hljs-deletion { color: var(--glyph-hl-deletion, #b31d28); }\n.hljs-emphasis { font-style: italic; }\n.hljs-strong { font-weight: 600; }\n";
8
+ //# sourceMappingURL=highlight-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight-theme.d.ts","sourceRoot":"","sources":["../src/highlight-theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,2jCA4B7B,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Token stylesheet for highlighted code (the `hljs-*` classes lowlight emits).
3
+ * Every colour is a CSS custom property with a light-theme fallback, so a host
4
+ * can re-theme highlighting the same token-driven way as the editor — e.g.
5
+ * `:root { --glyph-hl-keyword: #c678dd; }` — without touching this file.
6
+ */
7
+ export const highlightThemeCss = /* css */ `
8
+ .hljs { color: var(--glyph-hl-text, #24292e); }
9
+ .hljs-comment, .hljs-quote { color: var(--glyph-hl-comment, #6a737d); font-style: italic; }
10
+ .hljs-keyword, .hljs-selector-tag, .hljs-built_in, .hljs-name, .hljs-tag {
11
+ color: var(--glyph-hl-keyword, #d73a49);
12
+ }
13
+ .hljs-string, .hljs-attr, .hljs-template-tag, .hljs-template-variable,
14
+ .hljs-addition, .hljs-regexp {
15
+ color: var(--glyph-hl-string, #032f62);
16
+ }
17
+ .hljs-number, .hljs-literal, .hljs-boolean {
18
+ color: var(--glyph-hl-number, #005cc5);
19
+ }
20
+ .hljs-title, .hljs-title.function_, .hljs-section, .hljs-selector-id {
21
+ color: var(--glyph-hl-title, #6f42c1);
22
+ }
23
+ .hljs-type, .hljs-class .hljs-title, .hljs-title.class_ {
24
+ color: var(--glyph-hl-type, #e36209);
25
+ }
26
+ .hljs-variable, .hljs-params, .hljs-property {
27
+ color: var(--glyph-hl-variable, #24292e);
28
+ }
29
+ .hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-attribute {
30
+ color: var(--glyph-hl-meta, #005cc5);
31
+ }
32
+ .hljs-deletion { color: var(--glyph-hl-deletion, #b31d28); }
33
+ .hljs-emphasis { font-style: italic; }
34
+ .hljs-strong { font-weight: 600; }
35
+ `;
36
+ //# sourceMappingURL=highlight-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight-theme.js","sourceRoot":"","sources":["../src/highlight-theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B1C,CAAC"}
@@ -0,0 +1,35 @@
1
+ declare const lowlight: {
2
+ highlight: (language: string, value: string, options?: Readonly<import("lowlight").Options> | null | undefined) => import("hast").Root;
3
+ highlightAuto: (value: string, options?: Readonly<import("lowlight").AutoOptions> | null | undefined) => import("hast").Root;
4
+ listLanguages: () => Array<string>;
5
+ register: {
6
+ (grammars: Readonly<Record<string, import("highlight.js").LanguageFn>>): undefined;
7
+ (name: string, grammar: import("highlight.js").LanguageFn): undefined;
8
+ };
9
+ registerAlias: {
10
+ (aliases: Readonly<Record<string, ReadonlyArray<string> | string>>): undefined;
11
+ (language: string, alias: ReadonlyArray<string> | string): undefined;
12
+ };
13
+ registered: (aliasOrName: string) => boolean;
14
+ };
15
+ /**
16
+ * Whether a language *can* be highlighted (a loader exists). It may not be
17
+ * loaded yet — see {@link ensureLanguage}.
18
+ */
19
+ export declare const isLanguageSupported: (language: string) => boolean;
20
+ /**
21
+ * Loads and registers a grammar on demand (idempotent, de-duplicated).
22
+ * Resolves `true` once the language is highlightable, `false` if there is no
23
+ * grammar for it.
24
+ */
25
+ export declare const ensureLanguage: (language: string) => Promise<boolean>;
26
+ /** Eagerly load grammars (e.g. before a synchronous {@link renderToHTML}). */
27
+ export declare const preloadLanguages: (languages: readonly string[]) => Promise<void>;
28
+ /**
29
+ * Synchronously highlight `code` into detached DOM, or `null` if the grammar
30
+ * is unknown or not yet loaded. Callers wanting lazy upgrade should fall back
31
+ * to plain text and re-render after {@link ensureLanguage} resolves.
32
+ */
33
+ export declare const highlightToDom: (doc: Document, language: string, code: string) => DocumentFragment | null;
34
+ export { lowlight };
35
+ //# sourceMappingURL=highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"AAoDA,QAAA,MAAM,QAAQ;wDA9CoD,CAAA;0CAGzD,CAAC;;;;;;;;;;;CA2CuB,CAAC;AAOlC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,KAAG,OAAyC,CAAC;AAIjG;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,OAAO,CAAC,OAAO,CAiBhE,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,GAAI,WAAW,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CACV,CAAC;AAgCnE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,UAAU,MAAM,EAChB,MAAM,MAAM,KACX,gBAAgB,GAAG,IAKrB,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { createLowlight } from 'lowlight';
2
+ /**
3
+ * Lazy-loaded syntax highlighting. Grammars are NOT bundled — each is a
4
+ * `import()` that the consumer's bundler code-splits into its own chunk and
5
+ * fetches only when a code block actually uses that language. The `lowlight`
6
+ * instance is shared with the editor so edit and read-only views match.
7
+ */
8
+ const loaders = {
9
+ bash: () => import('highlight.js/lib/languages/bash'),
10
+ csharp: () => import('highlight.js/lib/languages/csharp'),
11
+ css: () => import('highlight.js/lib/languages/css'),
12
+ fsharp: () => import('highlight.js/lib/languages/fsharp'),
13
+ go: () => import('highlight.js/lib/languages/go'),
14
+ haskell: () => import('highlight.js/lib/languages/haskell'),
15
+ java: () => import('highlight.js/lib/languages/java'),
16
+ javascript: () => import('highlight.js/lib/languages/javascript'),
17
+ json: () => import('highlight.js/lib/languages/json'),
18
+ kotlin: () => import('highlight.js/lib/languages/kotlin'),
19
+ markdown: () => import('highlight.js/lib/languages/markdown'),
20
+ ocaml: () => import('highlight.js/lib/languages/ocaml'),
21
+ python: () => import('highlight.js/lib/languages/python'),
22
+ rust: () => import('highlight.js/lib/languages/rust'),
23
+ scala: () => import('highlight.js/lib/languages/scala'),
24
+ sql: () => import('highlight.js/lib/languages/sql'),
25
+ typescript: () => import('highlight.js/lib/languages/typescript'),
26
+ xml: () => import('highlight.js/lib/languages/xml'),
27
+ };
28
+ // Aliases we advertise → canonical loader id (grammars register their own
29
+ // highlight.js aliases too, but only after they are loaded).
30
+ const aliases = {
31
+ ts: 'typescript',
32
+ js: 'javascript',
33
+ jsx: 'javascript',
34
+ sh: 'bash',
35
+ shell: 'bash',
36
+ zsh: 'bash',
37
+ html: 'xml',
38
+ htm: 'xml',
39
+ xhtml: 'xml',
40
+ svg: 'xml',
41
+ cs: 'csharp',
42
+ 'c#': 'csharp',
43
+ fs: 'fsharp',
44
+ 'f#': 'fsharp',
45
+ kt: 'kotlin',
46
+ py: 'python',
47
+ rs: 'rust',
48
+ md: 'markdown',
49
+ };
50
+ const lowlight = createLowlight();
51
+ const normalize = (name) => {
52
+ const n = name.trim().toLowerCase();
53
+ return aliases[n] ?? n;
54
+ };
55
+ /**
56
+ * Whether a language *can* be highlighted (a loader exists). It may not be
57
+ * loaded yet — see {@link ensureLanguage}.
58
+ */
59
+ export const isLanguageSupported = (language) => normalize(language) in loaders;
60
+ const pending = new Map();
61
+ /**
62
+ * Loads and registers a grammar on demand (idempotent, de-duplicated).
63
+ * Resolves `true` once the language is highlightable, `false` if there is no
64
+ * grammar for it.
65
+ */
66
+ export const ensureLanguage = (language) => {
67
+ const id = normalize(language);
68
+ const loader = loaders[id];
69
+ if (!loader)
70
+ return Promise.resolve(false);
71
+ if (lowlight.registered(id))
72
+ return Promise.resolve(true);
73
+ const inflight = pending.get(id);
74
+ if (inflight)
75
+ return inflight;
76
+ const p = loader()
77
+ .then((mod) => {
78
+ if (!lowlight.registered(id)) {
79
+ lowlight.register({ [id]: mod.default });
80
+ }
81
+ return true;
82
+ })
83
+ .catch(() => false);
84
+ pending.set(id, p);
85
+ return p;
86
+ };
87
+ /** Eagerly load grammars (e.g. before a synchronous {@link renderToHTML}). */
88
+ export const preloadLanguages = (languages) => Promise.all(languages.map(ensureLanguage)).then(() => undefined);
89
+ const toClassList = (className) => className == null ? [] : Array.isArray(className) ? className : [className];
90
+ const hastToDom = (doc) => (node) => {
91
+ if (node.type === 'text')
92
+ return doc.createTextNode(node.value);
93
+ const parent = node.type === 'root' ? doc.createDocumentFragment() : doc.createElement(node.tagName);
94
+ if (node.type === 'element') {
95
+ const classes = toClassList(node.properties?.className);
96
+ if (classes.length > 0)
97
+ parent.className = classes.join(' ');
98
+ }
99
+ node.children.forEach((child) => parent.appendChild(hastToDom(doc)(child)));
100
+ return parent;
101
+ };
102
+ /**
103
+ * Synchronously highlight `code` into detached DOM, or `null` if the grammar
104
+ * is unknown or not yet loaded. Callers wanting lazy upgrade should fall back
105
+ * to plain text and re-render after {@link ensureLanguage} resolves.
106
+ */
107
+ export const highlightToDom = (doc, language, code) => {
108
+ const id = normalize(language);
109
+ if (!lowlight.registered(id))
110
+ return null;
111
+ const tree = lowlight.highlight(id, code);
112
+ return hastToDom(doc)(tree);
113
+ };
114
+ export { lowlight };
115
+ //# sourceMappingURL=highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { EditorContent, EditorDocument } from '@openstage/glyph-core';
2
+ export { isLanguageSupported, ensureLanguage, preloadLanguages } from './highlight.js';
3
+ export { highlightThemeCss } from './highlight-theme.js';
4
+ /** Options for {@link renderToElement} / {@link renderToHTML}. */
5
+ export type RenderOptions = {
6
+ /**
7
+ * Document used to create nodes. Defaults to the ambient `document`. Provide
8
+ * one when rendering outside a browser (e.g. SSR with a DOM shim).
9
+ */
10
+ document?: Document;
11
+ };
12
+ /**
13
+ * Renders a document to a detached `<div class="glyph-rendered">` you can
14
+ * insert anywhere. The input is migrated to the current schema first, so
15
+ * documents saved by older versions render correctly. Style the result with
16
+ * your own CSS (and {@link highlightThemeCss} for code blocks).
17
+ *
18
+ * @param input - A full {@link EditorDocument} or a bare doc root.
19
+ * @param options - See {@link RenderOptions}.
20
+ * @returns A detached element containing the rendered content.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * container.replaceChildren(renderToElement(doc));
25
+ * ```
26
+ */
27
+ export declare const renderToElement: (input: EditorDocument | EditorContent, options?: RenderOptions) => HTMLElement;
28
+ /**
29
+ * Like {@link renderToElement} but returns the inner HTML string (built from
30
+ * the safe DOM tree, not string concatenation). Useful for SSR or caching a
31
+ * rendered snapshot.
32
+ */
33
+ export declare const renderToHTML: (input: EditorDocument | EditorContent, options?: RenderOptions) => string;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAOf,MAAM,uBAAuB,CAAC;AAsB/B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAmJF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,cAAc,GAAG,aAAa,EACrC,UAAS,aAAkB,KAC1B,WASF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,cAAc,GAAG,aAAa,EACrC,UAAS,aAAkB,KAC1B,MAAmD,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,168 @@
1
+ import { None, Option } from 'monadyssey';
2
+ import { Href as HrefT, migrate } from '@openstage/glyph-core';
3
+ /**
4
+ * `@openstage/glyph-renderer` — turns an {@link EditorDocument} into read-only DOM (or an
5
+ * HTML string) for displaying saved content without loading the editor.
6
+ *
7
+ * Security: output is built with `createElement`/`textContent` only (never
8
+ * `innerHTML`), link `href`s are scheme-allowlisted, and highlighted code is
9
+ * assembled from a parsed token tree — so untrusted documents render safely.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { renderToElement } from '@openstage/glyph-renderer';
14
+ * articleEl.replaceChildren(renderToElement(savedDocument));
15
+ * ```
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+ import { ensureLanguage, highlightToDom, isLanguageSupported } from './highlight.js';
20
+ export { isLanguageSupported, ensureLanguage, preloadLanguages } from './highlight.js';
21
+ export { highlightThemeCss } from './highlight-theme.js';
22
+ // Control/space chars the browser strips when resolving URLs (tab, newline,
23
+ // leading C0). Matching them is the point here, hence the disable.
24
+ // eslint-disable-next-line no-control-regex
25
+ const CONTROL_OR_SPACE = /[\u0000-\u0020]+/g;
26
+ const sanitizeHref = (href) => {
27
+ // Browsers strip embedded tabs/newlines and ignore leading C0 control
28
+ // chars when resolving a URL, so "java\nscript:" or "javascript:"
29
+ // would otherwise slip through as a "relative" URL and then execute.
30
+ // Strip all control/space chars BEFORE deciding, and store the cleaned
31
+ // value so the browser cannot re-derive a dangerous scheme.
32
+ const cleaned = href.replace(CONTROL_OR_SPACE, '');
33
+ if (cleaned === '')
34
+ return None.Instance;
35
+ // Relative URLs (no scheme) are safe; reject javascript:/data: and friends.
36
+ const allowed = /^(https?:|mailto:|tel:)/i.test(cleaned) ||
37
+ /^[/#.]/.test(cleaned) ||
38
+ !/^[a-z][a-z0-9+.-]*:/i.test(cleaned);
39
+ return Option.ofNullable(allowed ? HrefT.of(cleaned) : null);
40
+ };
41
+ const el = (doc) => (tag) => doc.createElement(tag);
42
+ const wrapMark = (doc) => (child, mark) => {
43
+ if (mark.type === 'bold') {
44
+ const strong = el(doc)('strong');
45
+ strong.appendChild(child);
46
+ return strong;
47
+ }
48
+ if (mark.type === 'italic') {
49
+ const em = el(doc)('em');
50
+ em.appendChild(child);
51
+ return em;
52
+ }
53
+ return sanitizeHref(mark.attrs.href).fold(() => child, (safe) => {
54
+ const a = el(doc)('a');
55
+ a.setAttribute('href', safe);
56
+ // Open in a new tab so readers don't navigate away from the host page.
57
+ a.setAttribute('target', '_blank');
58
+ a.setAttribute('rel', 'noopener noreferrer');
59
+ a.appendChild(child);
60
+ return a;
61
+ });
62
+ };
63
+ const renderText = (doc) => (node) => (node.marks ?? []).reduce(wrapMark(doc), doc.createTextNode(node.text));
64
+ const renderInline = (doc) => (parent, content) => {
65
+ (content ?? []).forEach((n) => parent.appendChild(renderText(doc)(n)));
66
+ return parent;
67
+ };
68
+ const renderParagraph = (doc) => (node) => renderInline(doc)(el(doc)('p'), node.content);
69
+ const renderListItem = (doc) => (item) => {
70
+ const li = el(doc)('li');
71
+ item.content.forEach((p) => li.appendChild(renderParagraph(doc)(p)));
72
+ return li;
73
+ };
74
+ // Returns null for unknown/invalid node types so an untrusted document with
75
+ // an injected node degrades gracefully instead of throwing (DoS-safe).
76
+ const renderNode = (doc) => (node) => {
77
+ switch (node.type) {
78
+ case 'paragraph':
79
+ return renderParagraph(doc)(node);
80
+ case 'heading': {
81
+ // Clamp to the supported heading levels; never interpolate untrusted
82
+ // input straight into a tag name.
83
+ const level = node.attrs?.level === 2 ? 2 : node.attrs?.level === 3 ? 3 : 1;
84
+ return renderInline(doc)(el(doc)(`h${level}`), node.content);
85
+ }
86
+ case 'bulletList':
87
+ case 'orderedList': {
88
+ const list = el(doc)(node.type === 'bulletList' ? 'ul' : 'ol');
89
+ node.content.forEach((item) => list.appendChild(renderListItem(doc)(item)));
90
+ return list;
91
+ }
92
+ case 'blockquote': {
93
+ const bq = el(doc)('blockquote');
94
+ node.content.forEach((p) => bq.appendChild(renderParagraph(doc)(p)));
95
+ return bq;
96
+ }
97
+ case 'codeBlock': {
98
+ const pre = el(doc)('pre');
99
+ const code = el(doc)('code');
100
+ const source = (node.content ?? []).map((t) => t.text).join('');
101
+ const language = node.attrs?.language;
102
+ const highlighted = language ? highlightToDom(doc, language, source) : null;
103
+ if (language) {
104
+ code.setAttribute('data-language', language);
105
+ code.classList.add(`language-${language}`);
106
+ }
107
+ if (highlighted) {
108
+ code.classList.add('hljs');
109
+ code.appendChild(highlighted);
110
+ }
111
+ else {
112
+ code.textContent = source;
113
+ // Grammar not loaded yet: render plain now, upgrade in place once
114
+ // its lazily-loaded chunk arrives (progressive enhancement).
115
+ if (language && isLanguageSupported(language)) {
116
+ void ensureLanguage(language).then((ok) => {
117
+ if (!ok)
118
+ return;
119
+ const frag = highlightToDom(doc, language, source);
120
+ if (!frag)
121
+ return;
122
+ code.textContent = '';
123
+ code.classList.add('hljs');
124
+ code.appendChild(frag);
125
+ });
126
+ }
127
+ }
128
+ pre.appendChild(code);
129
+ return pre;
130
+ }
131
+ default:
132
+ return null;
133
+ }
134
+ };
135
+ const resolveContent = (input) => 'schemaVersion' in input ? migrate(input).content : input;
136
+ /**
137
+ * Renders a document to a detached `<div class="glyph-rendered">` you can
138
+ * insert anywhere. The input is migrated to the current schema first, so
139
+ * documents saved by older versions render correctly. Style the result with
140
+ * your own CSS (and {@link highlightThemeCss} for code blocks).
141
+ *
142
+ * @param input - A full {@link EditorDocument} or a bare doc root.
143
+ * @param options - See {@link RenderOptions}.
144
+ * @returns A detached element containing the rendered content.
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * container.replaceChildren(renderToElement(doc));
149
+ * ```
150
+ */
151
+ export const renderToElement = (input, options = {}) => {
152
+ const doc = Option.ofNullable(options.document).getOrElse(() => globalThis.document);
153
+ const root = el(doc)('div');
154
+ root.className = 'glyph-rendered';
155
+ resolveContent(input).content.forEach((node) => {
156
+ const rendered = renderNode(doc)(node);
157
+ if (rendered)
158
+ root.appendChild(rendered);
159
+ });
160
+ return root;
161
+ };
162
+ /**
163
+ * Like {@link renderToElement} but returns the inner HTML string (built from
164
+ * the safe DOM tree, not string concatenation). Useful for SSR or caching a
165
+ * rendered snapshot.
166
+ */
167
+ export const renderToHTML = (input, options = {}) => renderToElement(input, options).innerHTML;
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Internal subpath — NOT part of the public API. Exposes the shared lowlight
3
+ * instance so the sibling `@openstage/glyph-element` package can highlight while
4
+ * editing using the exact same grammar registry as the renderer. Consumers of
5
+ * the library should never import this.
6
+ */
7
+ export { lowlight } from './highlight.js';
8
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Internal subpath — NOT part of the public API. Exposes the shared lowlight
3
+ * instance so the sibling `@openstage/glyph-element` package can highlight while
4
+ * editing using the exact same grammar registry as the renderer. Consumers of
5
+ * the library should never import this.
6
+ */
7
+ export { lowlight } from './highlight.js';
8
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@openstage/glyph-renderer",
3
+ "version": "0.2.0",
4
+ "license": "MIT",
5
+ "author": "Gabriel Bornea",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://codeberg.org/open-stage/glyph.git",
9
+ "directory": "packages/renderer"
10
+ },
11
+ "homepage": "https://codeberg.org/open-stage/glyph#readme",
12
+ "bugs": {
13
+ "url": "https://codeberg.org/open-stage/glyph/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "./internal": {
24
+ "types": "./dist/internal.d.ts",
25
+ "default": "./dist/internal.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "scripts": {
35
+ "build": "rm -rf dist && tsc -p tsconfig.json",
36
+ "typecheck": "tsc -p tsconfig.json --noEmit"
37
+ },
38
+ "dependencies": {
39
+ "@openstage/glyph-core": "0.2.0",
40
+ "highlight.js": "^11.11.1",
41
+ "lowlight": "^3.3.0",
42
+ "monadyssey": "^2.0.1"
43
+ }
44
+ }