@podlite/editor-react 0.0.39 → 0.0.41

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.
Files changed (45) hide show
  1. package/CHANGELOG.podlite +172 -0
  2. package/esm/Editor.d.ts +7 -0
  3. package/esm/Editor.js +126 -4
  4. package/esm/Editor.js.map +1 -1
  5. package/esm/HighlightedCode.d.ts +12 -0
  6. package/esm/HighlightedCode.js +42 -0
  7. package/esm/HighlightedCode.js.map +1 -0
  8. package/esm/foldPodlite.d.ts +2 -0
  9. package/esm/foldPodlite.js +69 -0
  10. package/esm/foldPodlite.js.map +1 -0
  11. package/esm/index.d.ts +4 -0
  12. package/esm/index.js +2 -0
  13. package/esm/index.js.map +1 -1
  14. package/esm/listContinuation.d.ts +3 -0
  15. package/esm/listContinuation.js +124 -0
  16. package/esm/listContinuation.js.map +1 -0
  17. package/esm/shiki.d.ts +14 -0
  18. package/esm/shiki.js +143 -0
  19. package/esm/shiki.js.map +1 -0
  20. package/esm/types.d.ts +12 -0
  21. package/esm/types.js +2 -0
  22. package/esm/types.js.map +1 -0
  23. package/lib/Editor.d.ts +7 -0
  24. package/lib/Editor.js +126 -4
  25. package/lib/Editor.js.map +1 -1
  26. package/lib/HighlightedCode.d.ts +12 -0
  27. package/lib/HighlightedCode.js +45 -0
  28. package/lib/HighlightedCode.js.map +1 -0
  29. package/lib/foldPodlite.d.ts +2 -0
  30. package/lib/foldPodlite.js +72 -0
  31. package/lib/foldPodlite.js.map +1 -0
  32. package/lib/index.d.ts +4 -0
  33. package/lib/index.js +3 -1
  34. package/lib/index.js.map +1 -1
  35. package/lib/listContinuation.d.ts +3 -0
  36. package/lib/listContinuation.js +127 -0
  37. package/lib/listContinuation.js.map +1 -0
  38. package/lib/shiki.d.ts +14 -0
  39. package/lib/shiki.js +151 -0
  40. package/lib/shiki.js.map +1 -0
  41. package/lib/types.d.ts +12 -0
  42. package/lib/types.js +3 -0
  43. package/lib/types.js.map +1 -0
  44. package/package.json +26 -3
  45. package/CHANGELOG.md +0 -160
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = (0, tslib_1.__importStar)(require("react"));
5
+ const schema_1 = require("@podlite/schema");
6
+ const shiki_1 = require("./shiki");
7
+ /**
8
+ * This component handles async syntax highlighting
9
+ */
10
+ const HighlightedCode = react_1.default.memo(({ node, children, keyProp, ctx }) => {
11
+ const conf = (0, schema_1.makeAttrs)(node, ctx);
12
+ const caption = conf.exists('caption') ? conf.getFirstValue('caption') : null;
13
+ const lang = conf.getFirstValue('lang') || 'txt';
14
+ const [html, setHtml] = (0, react_1.useState)(null);
15
+ (0, react_1.useEffect)(() => {
16
+ let cancelled = false;
17
+ const highlight = async () => {
18
+ try {
19
+ const isDark = document.body.className.toLowerCase().includes('dark');
20
+ const result = await (0, shiki_1.codeToThemedHtml)({
21
+ code: (0, schema_1.getTextContentFromNode)(node.content),
22
+ language: lang,
23
+ theme: isDark ? 'dark' : 'light',
24
+ });
25
+ if (!cancelled)
26
+ setHtml(result);
27
+ }
28
+ catch (e) {
29
+ console.error('[podlite] shiki highlight error:', e);
30
+ }
31
+ };
32
+ highlight();
33
+ return () => {
34
+ cancelled = true;
35
+ };
36
+ }, [lang, node.content]);
37
+ return html ? (react_1.default.createElement(react_1.default.Fragment, null,
38
+ react_1.default.createElement("code", { key: keyProp, className: "shiki", dangerouslySetInnerHTML: { __html: html } }),
39
+ caption && react_1.default.createElement("div", { className: "caption" }, caption))) : (react_1.default.createElement(react_1.default.Fragment, null,
40
+ react_1.default.createElement("pre", null,
41
+ react_1.default.createElement("code", { key: keyProp }, children)),
42
+ caption && react_1.default.createElement("div", { className: "caption" }, caption)));
43
+ });
44
+ exports.default = HighlightedCode;
45
+ //# sourceMappingURL=HighlightedCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HighlightedCode.js","sourceRoot":"","sources":["../src/HighlightedCode.tsx"],"names":[],"mappings":";;;AAAA,4DAAkD;AAClD,4CAAmE;AACnE,mCAA0C;AAS1C;;GAEG;AACH,MAAM,eAAe,GAAmC,eAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;IACtG,MAAM,IAAI,GAAG,IAAA,kBAAS,EAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;IAEhD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAA;IAErD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAA;QAErB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC3B,IAAI;gBACF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBACrE,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAgB,EAAC;oBACpC,IAAI,EAAE,IAAA,+BAAsB,EAAC,IAAI,CAAC,OAAO,CAAC;oBAC1C,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;iBACjC,CAAC,CAAA;gBACF,IAAI,CAAC,SAAS;oBAAE,OAAO,CAAC,MAAM,CAAC,CAAA;aAChC;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAA;aACrD;QACH,CAAC,CAAA;QAED,SAAS,EAAE,CAAA;QACX,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAExB,OAAO,IAAI,CAAC,CAAC,CAAC,CACZ;QACE,wCAAM,GAAG,EAAE,OAAO,EAAE,SAAS,EAAC,OAAO,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAI;QAClF,OAAO,IAAI,uCAAK,SAAS,EAAC,SAAS,IAAE,OAAO,CAAO,CACnD,CACJ,CAAC,CAAC,CAAC,CACF;QACE;YACE,wCAAM,GAAG,EAAE,OAAO,IAAG,QAAQ,CAAQ,CACjC;QACL,OAAO,IAAI,uCAAK,SAAS,EAAC,SAAS,IAAE,OAAO,CAAO,CACnD,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,kBAAe,eAAe,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ export declare const podliteFoldService: Extension;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.podliteFoldService = void 0;
4
+ const language_1 = require("@codemirror/language");
5
+ // =begin Name ... =end Name
6
+ const beginRe = /^(\s*)=begin\s+(\S+)/;
7
+ const endRe = /^(\s*)=end\s+(\S+)/;
8
+ // =headN (level 1-6)
9
+ const headRe = /^(\s*)=head(\d+)\s/;
10
+ // Parse =begin line, return block name or null
11
+ function parseBeginLine(lineText) {
12
+ const m = lineText.match(beginRe);
13
+ return m ? m[2] ?? null : null;
14
+ }
15
+ // Fold =begin Name ... =end Name: fold from end of =begin line to start of =end line
16
+ function foldBeginEnd(state, lineStart) {
17
+ const line = state.doc.lineAt(lineStart);
18
+ const blockName = parseBeginLine(line.text);
19
+ if (!blockName)
20
+ return null;
21
+ // Search forward for matching =end
22
+ for (let i = line.number + 1; i <= state.doc.lines; i++) {
23
+ const candidate = state.doc.line(i);
24
+ const m = candidate.text.match(endRe);
25
+ if (m && m[2] === blockName) {
26
+ // Fold from end of =begin line to start of =end line
27
+ if (line.to >= candidate.from)
28
+ return null;
29
+ return { from: line.to, to: candidate.from };
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ // Fold =headN: from end of heading line to start of next heading of same or higher level (or EOF)
35
+ function foldHeadSection(state, lineStart) {
36
+ const line = state.doc.lineAt(lineStart);
37
+ const m = line.text.match(headRe);
38
+ if (!m)
39
+ return null;
40
+ const level = parseInt(m[2] ?? '1', 10);
41
+ // Search forward for next heading of same or higher level
42
+ let foldEnd = state.doc.length;
43
+ for (let i = line.number + 1; i <= state.doc.lines; i++) {
44
+ const candidate = state.doc.line(i);
45
+ const hm = candidate.text.match(headRe);
46
+ if (hm) {
47
+ const candidateLevel = parseInt(hm[2] ?? '1', 10);
48
+ if (candidateLevel <= level) {
49
+ foldEnd = candidate.from;
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ // Nothing to fold if heading is last line or only whitespace follows
55
+ if (line.to >= foldEnd)
56
+ return null;
57
+ // Trim trailing blank lines from fold range
58
+ let endPos = foldEnd;
59
+ while (endPos > line.to) {
60
+ const prevLine = state.doc.lineAt(endPos - 1);
61
+ if (prevLine.text.trim() !== '') {
62
+ endPos = prevLine.to;
63
+ break;
64
+ }
65
+ endPos = prevLine.from;
66
+ }
67
+ if (line.to >= endPos)
68
+ return null;
69
+ return { from: line.to, to: endPos };
70
+ }
71
+ exports.podliteFoldService = language_1.foldService.of((state, lineStart) => foldBeginEnd(state, lineStart) ?? foldHeadSection(state, lineStart));
72
+ //# sourceMappingURL=foldPodlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foldPodlite.js","sourceRoot":"","sources":["../src/foldPodlite.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  import Editor2 from './Editor';
2
2
  import WindowWrapper from './Wrapper';
3
+ import HighlightedCode from './HighlightedCode';
3
4
  export { Editor2 as Editor2 };
4
5
  export { WindowWrapper as WindowWrapper };
6
+ export { HighlightedCode as HighlightedCode };
7
+ export type { EditorSessionState } from './types';
8
+ export type { ConverterResult, IPodliteEditor, PodliteEditorRef } from './Editor';
5
9
  export default Editor2;
package/lib/index.js CHANGED
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WindowWrapper = exports.Editor2 = void 0;
3
+ exports.HighlightedCode = exports.WindowWrapper = exports.Editor2 = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const Editor_1 = (0, tslib_1.__importDefault)(require("./Editor"));
6
6
  exports.Editor2 = Editor_1.default;
7
7
  const Wrapper_1 = (0, tslib_1.__importDefault)(require("./Wrapper"));
8
8
  exports.WindowWrapper = Wrapper_1.default;
9
+ const HighlightedCode_1 = (0, tslib_1.__importDefault)(require("./HighlightedCode"));
10
+ exports.HighlightedCode = HighlightedCode_1.default;
9
11
  exports.default = Editor_1.default;
10
12
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;;;AAAA,mEAA8B;AAEV,kBAFb,gBAAO,CAEa;AAD3B,qEAAqC;AAEX,wBAFnB,iBAAa,CAEmB;AACvC,kBAAe,gBAAO,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;;;AAAA,mEAA8B;AAGV,kBAHb,gBAAO,CAGa;AAF3B,qEAAqC;AAGX,wBAHnB,iBAAa,CAGmB;AAFvC,qFAA+C;AAGnB,0BAHrB,yBAAe,CAGqB;AAG3C,kBAAe,gBAAO,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ export declare const listContinuationKeymap: Extension;
3
+ export declare const itemLevelKeymap: Extension;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.itemLevelKeymap = exports.listContinuationKeymap = void 0;
4
+ const view_1 = require("@codemirror/view");
5
+ // Regex: =item with optional level digit(s) + separator
6
+ const itemRe = /^(\s*=item)(\d*)([ \t])/;
7
+ // Detect list type prefix at start of content
8
+ const prefixRe = /^(\[ \]|\[x\]|\[X\]|#)\s*/;
9
+ // Item is "empty" if content is nothing or only a type prefix
10
+ const emptyContentRe = /^(\[ \]|\[x\]|\[X\]|#)?\s*$/;
11
+ // Parse, Don't Validate — returns typed structure or null
12
+ function parseItemLine(lineText, lineFrom) {
13
+ const m = lineText.match(itemRe);
14
+ if (!m)
15
+ return null;
16
+ const prefix = m[1] ?? ''; // "\s*=item"
17
+ const digits = m[2] ?? ''; // level digits, may be empty
18
+ const sep = m[3] ?? ' '; // separator char
19
+ const indent = prefix.slice(0, prefix.length - 5); // whitespace before "=item"
20
+ const level = digits === '' ? 1 : parseInt(digits, 10);
21
+ const marker = `${indent}=item${digits}`;
22
+ return {
23
+ indent,
24
+ marker,
25
+ level,
26
+ separator: sep,
27
+ markerEnd: lineFrom + prefix.length + digits.length + sep.length,
28
+ content: lineText.slice(prefix.length + digits.length + sep.length),
29
+ };
30
+ }
31
+ // Get the prefix to insert for the new item (checked → unchecked, # → #, none → '')
32
+ function resolveNewPrefix(content) {
33
+ const m = content.trim().match(prefixRe);
34
+ if (!m)
35
+ return '';
36
+ const prefix = m[1] ?? '';
37
+ if (prefix === '[x]' || prefix === '[X]' || prefix === '[ ]')
38
+ return '[ ] ';
39
+ if (prefix === '#')
40
+ return '# ';
41
+ return '';
42
+ }
43
+ // ─── List Continuation on Enter ────────────────────────────────────────────
44
+ exports.listContinuationKeymap = view_1.keymap.of([
45
+ {
46
+ key: 'Enter',
47
+ run: (view) => {
48
+ const { state } = view;
49
+ const { head, from, to } = state.selection.main;
50
+ // Only single cursor (no selection)
51
+ if (from !== to)
52
+ return false;
53
+ const line = state.doc.lineAt(head);
54
+ const item = parseItemLine(line.text, line.from);
55
+ if (!item)
56
+ return false;
57
+ // Cursor inside marker → default
58
+ if (head < item.markerEnd)
59
+ return false;
60
+ const trimmedContent = item.content.trim();
61
+ // Empty item (including prefix-only like "[ ]" or "#") → remove marker, exit list
62
+ if (emptyContentRe.test(trimmedContent)) {
63
+ view.dispatch({
64
+ changes: { from: line.from, to: line.to, insert: '' },
65
+ selection: { anchor: line.from },
66
+ });
67
+ return true;
68
+ }
69
+ // Determine type prefix for new item
70
+ const newPrefix = resolveNewPrefix(trimmedContent);
71
+ // Split: text before cursor stays, text after → new =itemN [prefix]
72
+ const textAfterCursor = line.text.slice(head - line.from);
73
+ const newItem = `\n${item.marker} ${newPrefix}`;
74
+ view.dispatch({
75
+ changes: {
76
+ from: head,
77
+ to: line.to,
78
+ insert: newItem + textAfterCursor.trimStart(),
79
+ },
80
+ selection: {
81
+ anchor: head + newItem.length,
82
+ },
83
+ });
84
+ return true;
85
+ },
86
+ },
87
+ ]);
88
+ // ─── Tab / Shift-Tab: change item level ────────────────────────────────────
89
+ const maxItemLevel = 6;
90
+ const minItemLevel = 1;
91
+ const indentPerLevel = ' '; // 2 spaces per level
92
+ function changeItemLevel(view, delta) {
93
+ const { state } = view;
94
+ const { from, to } = state.selection.main;
95
+ const startLine = state.doc.lineAt(from);
96
+ const endLine = state.doc.lineAt(to);
97
+ const changes = [];
98
+ for (let lineNum = startLine.number; lineNum <= endLine.number; lineNum++) {
99
+ const line = state.doc.line(lineNum);
100
+ const item = parseItemLine(line.text, line.from);
101
+ if (!item)
102
+ continue;
103
+ const newLevel = item.level + delta;
104
+ if (newLevel < minItemLevel || newLevel > maxItemLevel)
105
+ continue;
106
+ // Adjust indentation: each level = 4 spaces
107
+ const newIndent = delta === 1 ? item.indent + indentPerLevel : item.indent.slice(indentPerLevel.length);
108
+ const oldMarkerLen = item.markerEnd - line.from;
109
+ const newMarker = `${newIndent}=item${newLevel}${item.separator}`;
110
+ changes.push({ from: line.from, to: line.from + oldMarkerLen, insert: newMarker });
111
+ }
112
+ if (changes.length === 0)
113
+ return false;
114
+ view.dispatch({ changes });
115
+ return true;
116
+ }
117
+ exports.itemLevelKeymap = view_1.keymap.of([
118
+ {
119
+ key: 'Tab',
120
+ run: (view) => changeItemLevel(view, 1),
121
+ },
122
+ {
123
+ key: 'Shift-Tab',
124
+ run: (view) => changeItemLevel(view, -1),
125
+ },
126
+ ]);
127
+ //# sourceMappingURL=listContinuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listContinuation.js","sourceRoot":"","sources":["../src/listContinuation.ts"],"names":[],"mappings":"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"}
package/lib/shiki.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { type BundledLanguage, type Highlighter } from 'shiki';
2
+ export declare type ExtendedLanguage = BundledLanguage | 'txt';
3
+ export declare function normalizeLanguage(language?: string): ExtendedLanguage;
4
+ export declare function getHighlighter(language?: string): Promise<Highlighter>;
5
+ export declare function codeToHtml({ code, language }: {
6
+ code: string;
7
+ language: string;
8
+ }): Promise<string>;
9
+ export declare function codeToThemedHtml({ code, language, theme, }: {
10
+ code: string;
11
+ language: string;
12
+ theme?: 'light' | 'dark' | 'auto';
13
+ }): Promise<string>;
14
+ export declare const isLanguageLoaded: (language: string) => boolean;
package/lib/shiki.js ADDED
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isLanguageLoaded = exports.codeToThemedHtml = exports.codeToHtml = exports.getHighlighter = exports.normalizeLanguage = void 0;
4
+ const shiki_1 = require("shiki");
5
+ // Configuration
6
+ const CONFIG = {
7
+ themes: {
8
+ light: 'one-light',
9
+ dark: 'github-dark',
10
+ },
11
+ initialLanguages: ['shell', 'txt'],
12
+ };
13
+ // Language aliases mapping
14
+ const languageAliases = {
15
+ text: 'txt',
16
+ plaintext: 'txt',
17
+ plain: 'txt',
18
+ sh: 'shell',
19
+ bash: 'shell',
20
+ zsh: 'shell',
21
+ shellscript: 'shell',
22
+ 'shell-script': 'shell',
23
+ console: 'shell',
24
+ terminal: 'shell',
25
+ js: 'javascript',
26
+ node: 'javascript',
27
+ nodejs: 'javascript',
28
+ ts: 'typescript',
29
+ py: 'python',
30
+ python3: 'python',
31
+ py3: 'python',
32
+ rb: 'ruby',
33
+ md: 'markdown',
34
+ cpp: 'c++',
35
+ cc: 'c++',
36
+ cs: 'c#',
37
+ csharp: 'c#',
38
+ htm: 'html',
39
+ yml: 'yaml',
40
+ dockerfile: 'docker',
41
+ styles: 'css',
42
+ style: 'css',
43
+ jsonc: 'json',
44
+ json5: 'json',
45
+ xaml: 'xml',
46
+ xhtml: 'xml',
47
+ svg: 'xml',
48
+ mysql: 'sql',
49
+ postgresql: 'sql',
50
+ postgres: 'sql',
51
+ pgsql: 'sql',
52
+ plsql: 'sql',
53
+ oracle: 'sql',
54
+ };
55
+ // Singleton state
56
+ const state = {
57
+ instance: null,
58
+ initPromise: null,
59
+ loadedLanguages: new Set(['txt']),
60
+ pendingLoads: new Map(),
61
+ warnedLanguages: new Set(),
62
+ };
63
+ // Normalize language to valid Shiki language
64
+ function normalizeLanguage(language) {
65
+ if (!language)
66
+ return 'txt';
67
+ const normalized = language.toLowerCase();
68
+ if (normalized in shiki_1.bundledLanguages) {
69
+ return normalized;
70
+ }
71
+ if (normalized in languageAliases) {
72
+ return languageAliases[normalized];
73
+ }
74
+ if (!state.warnedLanguages.has(language)) {
75
+ console.warn(`[podlite] shiki unrecognized language '${language}', defaulting to [txt]`);
76
+ state.warnedLanguages.add(language);
77
+ }
78
+ return 'txt';
79
+ }
80
+ exports.normalizeLanguage = normalizeLanguage;
81
+ // Get or create highlighter instance
82
+ async function getHighlighterInstance() {
83
+ if (!state.initPromise) {
84
+ state.initPromise = (0, shiki_1.createHighlighter)({
85
+ // themes: Object.keys(bundledThemes) as BundledTheme[],
86
+ themes: Object.values(CONFIG.themes),
87
+ langs: CONFIG.initialLanguages,
88
+ }).then(instance => {
89
+ state.instance = instance;
90
+ CONFIG.initialLanguages.forEach(lang => state.loadedLanguages.add(lang));
91
+ return instance;
92
+ });
93
+ }
94
+ return state.initPromise;
95
+ }
96
+ // Load a language if not already loaded
97
+ async function ensureLanguageLoaded(instance, lang) {
98
+ if (state.loadedLanguages.has(lang))
99
+ return;
100
+ let pending = state.pendingLoads.get(lang);
101
+ if (!pending) {
102
+ pending = instance
103
+ .loadLanguage(lang)
104
+ .then(() => state.loadedLanguages.add(lang))
105
+ .finally(() => state.pendingLoads.delete(lang));
106
+ state.pendingLoads.set(lang, pending);
107
+ }
108
+ await pending;
109
+ }
110
+ // Main API: get highlighter with language loaded
111
+ async function getHighlighter(language) {
112
+ const lang = normalizeLanguage(language);
113
+ const instance = await getHighlighterInstance();
114
+ await ensureLanguageLoaded(instance, lang);
115
+ return instance;
116
+ }
117
+ exports.getHighlighter = getHighlighter;
118
+ // Convenience: convert code to HTML with dual themes (CSS-based switching)
119
+ async function codeToHtml({ code, language }) {
120
+ const lang = normalizeLanguage(language);
121
+ const highlighter = await getHighlighter(language);
122
+ return highlighter.codeToHtml(code, {
123
+ lang,
124
+ themes: CONFIG.themes,
125
+ });
126
+ }
127
+ exports.codeToHtml = codeToHtml;
128
+ // Convert code to HTML with explicit theme selection (for runtime theme detection)
129
+ async function codeToThemedHtml({ code, language, theme, }) {
130
+ const lang = normalizeLanguage(language);
131
+ const highlighter = await getHighlighter(language);
132
+ // Single theme mode (for runtime detection)
133
+ if (theme === 'light' || theme === 'dark') {
134
+ return highlighter.codeToHtml(code, {
135
+ lang,
136
+ theme: CONFIG.themes[theme],
137
+ });
138
+ }
139
+ // Dual theme mode (CSS-based switching)
140
+ return highlighter.codeToHtml(code, {
141
+ lang,
142
+ themes: CONFIG.themes,
143
+ });
144
+ }
145
+ exports.codeToThemedHtml = codeToThemedHtml;
146
+ // Check if a language is loaded
147
+ const isLanguageLoaded = (language) => {
148
+ return state.loadedLanguages.has(normalizeLanguage(language));
149
+ };
150
+ exports.isLanguageLoaded = isLanguageLoaded;
151
+ //# sourceMappingURL=shiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki.js","sourceRoot":"","sources":["../src/shiki.tsx"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ declare type FoldRange = {
2
+ readonly from: number;
3
+ readonly to: number;
4
+ };
5
+ export declare type EditorSessionState = {
6
+ readonly cursorOffset?: number;
7
+ readonly scrollTop?: number;
8
+ readonly foldedRanges?: ReadonlyArray<FoldRange>;
9
+ readonly isPreviewMode?: boolean;
10
+ readonly isHalfPreviewMode?: boolean;
11
+ };
12
+ export {};
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,10 +1,32 @@
1
1
  {
2
2
  "name": "@podlite/editor-react",
3
- "version": "0.0.39",
4
- "description": "Podlite React component",
3
+ "version": "0.0.41",
4
+ "description": "Rich text editor React component for Podlite — syntax highlighting, live preview, CodeMirror 6",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "typings": "./lib/index.d.ts",
8
+ "homepage": "https://podlite.org",
9
+ "bugs": {
10
+ "url": "https://github.com/podlite/podlite/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/podlite/podlite.git",
15
+ "directory": "packages/podlite-editor-react"
16
+ },
17
+ "keywords": [
18
+ "podlite",
19
+ "editor",
20
+ "react",
21
+ "react-component",
22
+ "rich-text-editor",
23
+ "markdown-editor",
24
+ "codemirror",
25
+ "codemirror-6",
26
+ "live-preview",
27
+ "syntax-highlighting",
28
+ "wysiwyg"
29
+ ],
8
30
  "license": "MIT",
9
31
  "funding": {
10
32
  "type": "opencollective",
@@ -58,7 +80,8 @@
58
80
  "@uiw/codemirror-extensions-events": "^4.23.8",
59
81
  "@uiw/codemirror-themes": "^4.23.8",
60
82
  "@uiw/react-codemirror": "^4.23.8",
61
- "react-is": "^18.0.0"
83
+ "react-is": "^18.0.0",
84
+ "shiki": "^3.21.0"
62
85
  },
63
86
  "peerDependencies": {
64
87
  "react": "^16.0.0 || ^17.0.0 || ^18",