@slidejs/editor 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("monaco-editor");function y(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const n=y(w),c={keywords:["present","rule","start","content","end","for","in","slide","dynamic","text","name","attrs","behavior","transition"],typeKeywords:["quiz","survey","form","assessment"],operators:[":","{","}","+","."],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,tokenizer:{root:[[/[a-z_$][\w$]*/,{cases:{"@keywords":"keyword","@typeKeywords":"type","@default":"identifier"}}],[/[A-Z][\w\$]*/,"type.identifier"],{include:"@whitespace"},[/@digits/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string_double"}],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,{token:"string.quote",bracket:"@open",next:"@string_single"}],[/[{}()\[\]]/,"@brackets"],[/[;,.]/,"delimiter"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[/*]/,"comment"]]}};function u(){n.languages.register({id:"slide-dsl"}),n.languages.setMonarchTokensProvider("slide-dsl",c)}function b(e){return new Worker("/assets/editor.worker-CTc8sTc-.js",{name:e?.name})}function W(e){return new Worker("/assets/json.worker-7a93y_WU.js",{name:e?.name})}function h(e){return new Worker("/assets/css.worker-DkZpTr4B.js",{name:e?.name})}function S(e){return new Worker("/assets/html.worker-DV998UIK.js",{name:e?.name})}function j(e){return new Worker("/assets/ts.worker-CMaZf52j.js",{name:e?.name})}function v(e,t){switch(t){case"json":return new W;case"css":case"scss":case"less":return new h;case"html":case"handlebars":case"razor":return new S;case"typescript":case"javascript":return new j;default:return new b}}function l(){self.MonacoEnvironment||(self.MonacoEnvironment={getWorker:function(e,t){return v(e,t)}})}function D(e,t={}){l(),n.languages.getLanguages().find(a=>a.id==="slide-dsl")||u();const{value:r="",theme:s="vs-dark",fontSize:d=14,lineNumbers:m="on",minimap:g={enabled:!0},wordWrap:p="on",readOnly:f=!1,automaticLayout:k=!0,onChange:i}=t,o=n.editor.create(e,{value:r,language:"slide-dsl",theme:s,fontSize:d,lineNumbers:m,minimap:g,wordWrap:p,readOnly:f,automaticLayout:k,scrollBeyondLastLine:!1,renderWhitespace:"selection",formatOnPaste:!1,formatOnType:!1});return i&&o.onDidChangeModelContent(()=>{const a=o.getValue();i(a)}),o}function L(e,t){e.getValue()!==t&&e.setValue(t)}function M(e,t){n.editor.setTheme(t)}exports.configureMonacoWorkers=l;exports.createSlideDSLEditor=D;exports.registerSlideDSLLanguage=u;exports.setEditorTheme=M;exports.slideDSLMonarchDefinition=c;exports.updateEditorValue=L;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/monarch.ts","../src/workers.ts","../src/editor.ts"],"sourcesContent":["/**\n * Monaco Editor Monarch 语法定义 - Slide DSL\n *\n * 提供 Slide DSL 的语法高亮支持\n */\n\nimport * as monaco from 'monaco-editor';\n\n/**\n * Slide DSL 的 Monarch 语法定义\n */\nexport const slideDSLMonarchDefinition = {\n // 关键字\n keywords: [\n 'present',\n 'rule',\n 'start',\n 'content',\n 'end',\n 'for',\n 'in',\n 'slide',\n 'dynamic',\n 'text',\n 'name',\n 'attrs',\n 'behavior',\n 'transition',\n ],\n\n // 类型关键字\n typeKeywords: ['quiz', 'survey', 'form', 'assessment'],\n\n // 操作符\n operators: [':', '{', '}', '+', '.'],\n\n // 符号\n symbols: /[=><!~?:&|+\\-*\\/\\^%]+/,\n\n // 转义序列\n escapes: /\\\\(?:[abfnrtv\\\\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,\n\n // 数字\n digits: /\\d+(_+\\d+)*/,\n\n // 空白字符\n tokenizer: {\n root: [\n // 标识符和关键字\n [\n /[a-z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@typeKeywords': 'type',\n '@default': 'identifier',\n },\n },\n ],\n\n // 大写标识符(通常用于常量)\n [/[A-Z][\\w\\$]*/, 'type.identifier'],\n\n // 空白字符\n { include: '@whitespace' },\n\n // 数字\n [/@digits/, 'number'],\n\n // 字符串:双引号\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'], // 未闭合的字符串\n [/\"/, { token: 'string.quote', bracket: '@open', next: '@string_double' }],\n\n // 字符串:单引号\n [/'([^'\\\\]|\\\\.)*$/, 'string.invalid'], // 未闭合的字符串\n [/'/, { token: 'string.quote', bracket: '@open', next: '@string_single' }],\n\n // 分隔符和括号\n [/[{}()\\[\\]]/, '@brackets'],\n [/[;,.]/, 'delimiter'],\n\n // 操作符\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n ],\n\n // 双引号字符串\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, { token: 'string.quote', bracket: '@close', next: '@pop' }],\n ],\n\n // 单引号字符串\n string_single: [\n [/[^\\\\']+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/'/, { token: 'string.quote', bracket: '@close', next: '@pop' }],\n ],\n\n // 空白字符和注释\n whitespace: [\n [/[ \\t\\r\\n]+/, 'white'],\n [/\\/\\*/, 'comment', '@comment'],\n [/\\/\\/.*$/, 'comment'],\n ],\n\n // 多行注释\n comment: [\n [/[^/*]+/, 'comment'],\n [/\\/\\*/, 'comment', '@push'],\n [/\\*\\//, 'comment', '@pop'],\n [/[/*]/, 'comment'],\n ],\n },\n};\n\n/**\n * 注册 Slide DSL 语言到 Monaco Editor\n */\nexport function registerSlideDSLLanguage(): void {\n monaco.languages.register({ id: 'slide-dsl' });\n monaco.languages.setMonarchTokensProvider('slide-dsl', slideDSLMonarchDefinition);\n}\n","/**\n * Monaco Editor Worker 导入\n * 使用 Vite 的 ?worker 后缀来正确导入 Worker 文件\n */\n\n// 导入所有需要的 Worker\nimport EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';\nimport JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';\nimport CssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';\nimport HtmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';\nimport TsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';\n\n/**\n * 获取 Worker 实例\n */\nexport function getWorker(_workerId: string, label: string): Worker {\n switch (label) {\n case 'json':\n return new JsonWorker();\n case 'css':\n case 'scss':\n case 'less':\n return new CssWorker();\n case 'html':\n case 'handlebars':\n case 'razor':\n return new HtmlWorker();\n case 'typescript':\n case 'javascript':\n return new TsWorker();\n default:\n return new EditorWorker();\n }\n}\n","/**\n * Slide DSL Monaco Editor 组件\n */\n\nimport * as monaco from 'monaco-editor';\nimport { registerSlideDSLLanguage } from './monarch';\nimport { getWorker } from './workers';\n\n/**\n * 配置 Monaco Editor Worker\n * 必须在创建编辑器之前调用\n *\n * 使用 Vite 的 ?worker 导入方式,这是官方推荐的最佳实践\n * Vite 会自动处理 Worker 的打包和路径,无需手动配置\n */\nexport function configureMonacoWorkers(): void {\n // 如果已经配置过,直接返回\n if ((self as any).MonacoEnvironment) {\n return;\n }\n\n // 配置 MonacoEnvironment\n // 使用 getWorker 函数,直接返回 Worker 实例\n // Vite 的 ?worker 导入会自动处理路径和打包\n (self as any).MonacoEnvironment = {\n getWorker: function (_workerId: string, label: string) {\n return getWorker(_workerId, label);\n },\n };\n}\n\n/**\n * 编辑器配置选项\n */\nexport interface SlideDSLEditorOptions {\n /** 初始内容 */\n value?: string;\n /** 主题 */\n theme?: 'vs' | 'vs-dark' | 'hc-black';\n /** 字体大小 */\n fontSize?: number;\n /** 是否显示行号 */\n lineNumbers?: 'on' | 'off' | 'relative' | 'interval';\n /** 是否显示小地图 */\n minimap?: { enabled: boolean };\n /** 是否自动换行 */\n wordWrap?: 'on' | 'off' | 'wordWrapColumn' | 'bounded';\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否自动布局 */\n automaticLayout?: boolean;\n /** 内容变化回调 */\n onChange?: (value: string) => void;\n}\n\n/**\n * 创建 Slide DSL 编辑器实例\n *\n * @param container - 容器元素\n * @param options - 编辑器选项\n * @returns Monaco Editor 实例\n */\nexport function createSlideDSLEditor(\n container: HTMLElement,\n options: SlideDSLEditorOptions = {}\n): monaco.editor.IStandaloneCodeEditor {\n // 配置 Worker(必须在创建编辑器之前)\n configureMonacoWorkers();\n\n // 确保语言已注册\n if (!monaco.languages.getLanguages().find(lang => lang.id === 'slide-dsl')) {\n registerSlideDSLLanguage();\n }\n\n const {\n value = '',\n theme = 'vs-dark',\n fontSize = 14,\n lineNumbers = 'on',\n minimap = { enabled: true },\n wordWrap = 'on',\n readOnly = false,\n automaticLayout = true,\n onChange,\n } = options;\n\n // 创建编辑器实例\n const editor = monaco.editor.create(container, {\n value,\n language: 'slide-dsl',\n theme,\n fontSize,\n lineNumbers,\n minimap,\n wordWrap,\n readOnly,\n automaticLayout,\n scrollBeyondLastLine: false,\n renderWhitespace: 'selection',\n formatOnPaste: false,\n formatOnType: false,\n });\n\n // 监听内容变化\n if (onChange) {\n editor.onDidChangeModelContent(() => {\n const content = editor.getValue();\n onChange(content);\n });\n }\n\n return editor;\n}\n\n/**\n * 更新编辑器内容\n *\n * @param editor - 编辑器实例\n * @param value - 新内容\n */\nexport function updateEditorValue(\n editor: monaco.editor.IStandaloneCodeEditor,\n value: string\n): void {\n const currentValue = editor.getValue();\n if (currentValue !== value) {\n editor.setValue(value);\n }\n}\n\n/**\n * 设置编辑器主题\n *\n * @param editor - 编辑器实例\n * @param theme - 主题名称\n */\nexport function setEditorTheme(\n editor: monaco.editor.IStandaloneCodeEditor,\n theme: 'vs' | 'vs-dark' | 'hc-black'\n): void {\n monaco.editor.setTheme(theme);\n}\n"],"names":["slideDSLMonarchDefinition","registerSlideDSLLanguage","monaco","getWorker","_workerId","label","JsonWorker","CssWorker","HtmlWorker","TsWorker","EditorWorker","configureMonacoWorkers","createSlideDSLEditor","container","options","lang","value","theme","fontSize","lineNumbers","minimap","wordWrap","readOnly","automaticLayout","onChange","editor","content","updateEditorValue","setEditorTheme"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import * as monaco from 'monaco-editor';
2
+
3
+ /**
4
+ * 配置 Monaco Editor Worker
5
+ * 必须在创建编辑器之前调用
6
+ *
7
+ * 使用 Vite 的 ?worker 导入方式,这是官方推荐的最佳实践
8
+ * Vite 会自动处理 Worker 的打包和路径,无需手动配置
9
+ */
10
+ export declare function configureMonacoWorkers(): void;
11
+
12
+ /**
13
+ * 创建 Slide DSL 编辑器实例
14
+ *
15
+ * @param container - 容器元素
16
+ * @param options - 编辑器选项
17
+ * @returns Monaco Editor 实例
18
+ */
19
+ export declare function createSlideDSLEditor(container: HTMLElement, options?: SlideDSLEditorOptions): monaco.editor.IStandaloneCodeEditor;
20
+
21
+ /**
22
+ * 注册 Slide DSL 语言到 Monaco Editor
23
+ */
24
+ export declare function registerSlideDSLLanguage(): void;
25
+
26
+ /**
27
+ * 设置编辑器主题
28
+ *
29
+ * @param editor - 编辑器实例
30
+ * @param theme - 主题名称
31
+ */
32
+ export declare function setEditorTheme(editor: monaco.editor.IStandaloneCodeEditor, theme: 'vs' | 'vs-dark' | 'hc-black'): void;
33
+
34
+ /**
35
+ * 编辑器配置选项
36
+ */
37
+ export declare interface SlideDSLEditorOptions {
38
+ /** 初始内容 */
39
+ value?: string;
40
+ /** 主题 */
41
+ theme?: 'vs' | 'vs-dark' | 'hc-black';
42
+ /** 字体大小 */
43
+ fontSize?: number;
44
+ /** 是否显示行号 */
45
+ lineNumbers?: 'on' | 'off' | 'relative' | 'interval';
46
+ /** 是否显示小地图 */
47
+ minimap?: {
48
+ enabled: boolean;
49
+ };
50
+ /** 是否自动换行 */
51
+ wordWrap?: 'on' | 'off' | 'wordWrapColumn' | 'bounded';
52
+ /** 是否只读 */
53
+ readOnly?: boolean;
54
+ /** 是否自动布局 */
55
+ automaticLayout?: boolean;
56
+ /** 内容变化回调 */
57
+ onChange?: (value: string) => void;
58
+ }
59
+
60
+ /**
61
+ * Slide DSL 的 Monarch 语法定义
62
+ */
63
+ export declare const slideDSLMonarchDefinition: {
64
+ keywords: string[];
65
+ typeKeywords: string[];
66
+ operators: string[];
67
+ symbols: RegExp;
68
+ escapes: RegExp;
69
+ digits: RegExp;
70
+ tokenizer: {
71
+ root: ((string | RegExp)[] | (RegExp | {
72
+ cases: {
73
+ '@keywords': string;
74
+ '@typeKeywords': string;
75
+ '@default': string;
76
+ };
77
+ })[] | {
78
+ include: string;
79
+ } | (RegExp | {
80
+ token: string;
81
+ bracket: string;
82
+ next: string;
83
+ })[] | (RegExp | {
84
+ cases: {
85
+ '@operators': string;
86
+ '@default': string;
87
+ };
88
+ })[])[];
89
+ string_double: ((string | RegExp)[] | (RegExp | {
90
+ token: string;
91
+ bracket: string;
92
+ next: string;
93
+ })[])[];
94
+ string_single: ((string | RegExp)[] | (RegExp | {
95
+ token: string;
96
+ bracket: string;
97
+ next: string;
98
+ })[])[];
99
+ whitespace: (string | RegExp)[][];
100
+ comment: (string | RegExp)[][];
101
+ };
102
+ };
103
+
104
+ /**
105
+ * 更新编辑器内容
106
+ *
107
+ * @param editor - 编辑器实例
108
+ * @param value - 新内容
109
+ */
110
+ export declare function updateEditorValue(editor: monaco.editor.IStandaloneCodeEditor, value: string): void;
111
+
112
+ export { }
package/dist/index.mjs ADDED
@@ -0,0 +1,216 @@
1
+ import * as r from "monaco-editor";
2
+ const g = {
3
+ // 关键字
4
+ keywords: [
5
+ "present",
6
+ "rule",
7
+ "start",
8
+ "content",
9
+ "end",
10
+ "for",
11
+ "in",
12
+ "slide",
13
+ "dynamic",
14
+ "text",
15
+ "name",
16
+ "attrs",
17
+ "behavior",
18
+ "transition"
19
+ ],
20
+ // 类型关键字
21
+ typeKeywords: ["quiz", "survey", "form", "assessment"],
22
+ // 操作符
23
+ operators: [":", "{", "}", "+", "."],
24
+ // 符号
25
+ symbols: /[=><!~?:&|+\-*\/\^%]+/,
26
+ // 转义序列
27
+ escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
28
+ // 数字
29
+ digits: /\d+(_+\d+)*/,
30
+ // 空白字符
31
+ tokenizer: {
32
+ root: [
33
+ // 标识符和关键字
34
+ [
35
+ /[a-z_$][\w$]*/,
36
+ {
37
+ cases: {
38
+ "@keywords": "keyword",
39
+ "@typeKeywords": "type",
40
+ "@default": "identifier"
41
+ }
42
+ }
43
+ ],
44
+ // 大写标识符(通常用于常量)
45
+ [/[A-Z][\w\$]*/, "type.identifier"],
46
+ // 空白字符
47
+ { include: "@whitespace" },
48
+ // 数字
49
+ [/@digits/, "number"],
50
+ // 字符串:双引号
51
+ [/"([^"\\]|\\.)*$/, "string.invalid"],
52
+ // 未闭合的字符串
53
+ [/"/, { token: "string.quote", bracket: "@open", next: "@string_double" }],
54
+ // 字符串:单引号
55
+ [/'([^'\\]|\\.)*$/, "string.invalid"],
56
+ // 未闭合的字符串
57
+ [/'/, { token: "string.quote", bracket: "@open", next: "@string_single" }],
58
+ // 分隔符和括号
59
+ [/[{}()\[\]]/, "@brackets"],
60
+ [/[;,.]/, "delimiter"],
61
+ // 操作符
62
+ [
63
+ /@symbols/,
64
+ {
65
+ cases: {
66
+ "@operators": "operator",
67
+ "@default": ""
68
+ }
69
+ }
70
+ ]
71
+ ],
72
+ // 双引号字符串
73
+ string_double: [
74
+ [/[^\\"]+/, "string"],
75
+ [/@escapes/, "string.escape"],
76
+ [/\\./, "string.escape.invalid"],
77
+ [/"/, { token: "string.quote", bracket: "@close", next: "@pop" }]
78
+ ],
79
+ // 单引号字符串
80
+ string_single: [
81
+ [/[^\\']+/, "string"],
82
+ [/@escapes/, "string.escape"],
83
+ [/\\./, "string.escape.invalid"],
84
+ [/'/, { token: "string.quote", bracket: "@close", next: "@pop" }]
85
+ ],
86
+ // 空白字符和注释
87
+ whitespace: [
88
+ [/[ \t\r\n]+/, "white"],
89
+ [/\/\*/, "comment", "@comment"],
90
+ [/\/\/.*$/, "comment"]
91
+ ],
92
+ // 多行注释
93
+ comment: [
94
+ [/[^/*]+/, "comment"],
95
+ [/\/\*/, "comment", "@push"],
96
+ [/\*\//, "comment", "@pop"],
97
+ [/[/*]/, "comment"]
98
+ ]
99
+ }
100
+ };
101
+ function f() {
102
+ r.languages.register({ id: "slide-dsl" }), r.languages.setMonarchTokensProvider("slide-dsl", g);
103
+ }
104
+ function k(e) {
105
+ return new Worker(
106
+ "/assets/editor.worker-CTc8sTc-.js",
107
+ {
108
+ name: e?.name
109
+ }
110
+ );
111
+ }
112
+ function w(e) {
113
+ return new Worker(
114
+ "/assets/json.worker-7a93y_WU.js",
115
+ {
116
+ name: e?.name
117
+ }
118
+ );
119
+ }
120
+ function W(e) {
121
+ return new Worker(
122
+ "/assets/css.worker-DkZpTr4B.js",
123
+ {
124
+ name: e?.name
125
+ }
126
+ );
127
+ }
128
+ function y(e) {
129
+ return new Worker(
130
+ "/assets/html.worker-DV998UIK.js",
131
+ {
132
+ name: e?.name
133
+ }
134
+ );
135
+ }
136
+ function h(e) {
137
+ return new Worker(
138
+ "/assets/ts.worker-CMaZf52j.js",
139
+ {
140
+ name: e?.name
141
+ }
142
+ );
143
+ }
144
+ function b(e, n) {
145
+ switch (n) {
146
+ case "json":
147
+ return new w();
148
+ case "css":
149
+ case "scss":
150
+ case "less":
151
+ return new W();
152
+ case "html":
153
+ case "handlebars":
154
+ case "razor":
155
+ return new y();
156
+ case "typescript":
157
+ case "javascript":
158
+ return new h();
159
+ default:
160
+ return new k();
161
+ }
162
+ }
163
+ function v() {
164
+ self.MonacoEnvironment || (self.MonacoEnvironment = {
165
+ getWorker: function(e, n) {
166
+ return b(e, n);
167
+ }
168
+ });
169
+ }
170
+ function $(e, n = {}) {
171
+ v(), r.languages.getLanguages().find((s) => s.id === "slide-dsl") || f();
172
+ const {
173
+ value: o = "",
174
+ theme: i = "vs-dark",
175
+ fontSize: c = 14,
176
+ lineNumbers: u = "on",
177
+ minimap: d = { enabled: !0 },
178
+ wordWrap: l = "on",
179
+ readOnly: m = !1,
180
+ automaticLayout: p = !0,
181
+ onChange: a
182
+ } = n, t = r.editor.create(e, {
183
+ value: o,
184
+ language: "slide-dsl",
185
+ theme: i,
186
+ fontSize: c,
187
+ lineNumbers: u,
188
+ minimap: d,
189
+ wordWrap: l,
190
+ readOnly: m,
191
+ automaticLayout: p,
192
+ scrollBeyondLastLine: !1,
193
+ renderWhitespace: "selection",
194
+ formatOnPaste: !1,
195
+ formatOnType: !1
196
+ });
197
+ return a && t.onDidChangeModelContent(() => {
198
+ const s = t.getValue();
199
+ a(s);
200
+ }), t;
201
+ }
202
+ function j(e, n) {
203
+ e.getValue() !== n && e.setValue(n);
204
+ }
205
+ function L(e, n) {
206
+ r.editor.setTheme(n);
207
+ }
208
+ export {
209
+ v as configureMonacoWorkers,
210
+ $ as createSlideDSLEditor,
211
+ f as registerSlideDSLLanguage,
212
+ L as setEditorTheme,
213
+ g as slideDSLMonarchDefinition,
214
+ j as updateEditorValue
215
+ };
216
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/monarch.ts","../src/workers.ts","../src/editor.ts"],"sourcesContent":["/**\n * Monaco Editor Monarch 语法定义 - Slide DSL\n *\n * 提供 Slide DSL 的语法高亮支持\n */\n\nimport * as monaco from 'monaco-editor';\n\n/**\n * Slide DSL 的 Monarch 语法定义\n */\nexport const slideDSLMonarchDefinition = {\n // 关键字\n keywords: [\n 'present',\n 'rule',\n 'start',\n 'content',\n 'end',\n 'for',\n 'in',\n 'slide',\n 'dynamic',\n 'text',\n 'name',\n 'attrs',\n 'behavior',\n 'transition',\n ],\n\n // 类型关键字\n typeKeywords: ['quiz', 'survey', 'form', 'assessment'],\n\n // 操作符\n operators: [':', '{', '}', '+', '.'],\n\n // 符号\n symbols: /[=><!~?:&|+\\-*\\/\\^%]+/,\n\n // 转义序列\n escapes: /\\\\(?:[abfnrtv\\\\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,\n\n // 数字\n digits: /\\d+(_+\\d+)*/,\n\n // 空白字符\n tokenizer: {\n root: [\n // 标识符和关键字\n [\n /[a-z_$][\\w$]*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@typeKeywords': 'type',\n '@default': 'identifier',\n },\n },\n ],\n\n // 大写标识符(通常用于常量)\n [/[A-Z][\\w\\$]*/, 'type.identifier'],\n\n // 空白字符\n { include: '@whitespace' },\n\n // 数字\n [/@digits/, 'number'],\n\n // 字符串:双引号\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'], // 未闭合的字符串\n [/\"/, { token: 'string.quote', bracket: '@open', next: '@string_double' }],\n\n // 字符串:单引号\n [/'([^'\\\\]|\\\\.)*$/, 'string.invalid'], // 未闭合的字符串\n [/'/, { token: 'string.quote', bracket: '@open', next: '@string_single' }],\n\n // 分隔符和括号\n [/[{}()\\[\\]]/, '@brackets'],\n [/[;,.]/, 'delimiter'],\n\n // 操作符\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n ],\n\n // 双引号字符串\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, { token: 'string.quote', bracket: '@close', next: '@pop' }],\n ],\n\n // 单引号字符串\n string_single: [\n [/[^\\\\']+/, 'string'],\n [/@escapes/, 'string.escape'],\n [/\\\\./, 'string.escape.invalid'],\n [/'/, { token: 'string.quote', bracket: '@close', next: '@pop' }],\n ],\n\n // 空白字符和注释\n whitespace: [\n [/[ \\t\\r\\n]+/, 'white'],\n [/\\/\\*/, 'comment', '@comment'],\n [/\\/\\/.*$/, 'comment'],\n ],\n\n // 多行注释\n comment: [\n [/[^/*]+/, 'comment'],\n [/\\/\\*/, 'comment', '@push'],\n [/\\*\\//, 'comment', '@pop'],\n [/[/*]/, 'comment'],\n ],\n },\n};\n\n/**\n * 注册 Slide DSL 语言到 Monaco Editor\n */\nexport function registerSlideDSLLanguage(): void {\n monaco.languages.register({ id: 'slide-dsl' });\n monaco.languages.setMonarchTokensProvider('slide-dsl', slideDSLMonarchDefinition);\n}\n","/**\n * Monaco Editor Worker 导入\n * 使用 Vite 的 ?worker 后缀来正确导入 Worker 文件\n */\n\n// 导入所有需要的 Worker\nimport EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';\nimport JsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';\nimport CssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';\nimport HtmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';\nimport TsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';\n\n/**\n * 获取 Worker 实例\n */\nexport function getWorker(_workerId: string, label: string): Worker {\n switch (label) {\n case 'json':\n return new JsonWorker();\n case 'css':\n case 'scss':\n case 'less':\n return new CssWorker();\n case 'html':\n case 'handlebars':\n case 'razor':\n return new HtmlWorker();\n case 'typescript':\n case 'javascript':\n return new TsWorker();\n default:\n return new EditorWorker();\n }\n}\n","/**\n * Slide DSL Monaco Editor 组件\n */\n\nimport * as monaco from 'monaco-editor';\nimport { registerSlideDSLLanguage } from './monarch';\nimport { getWorker } from './workers';\n\n/**\n * 配置 Monaco Editor Worker\n * 必须在创建编辑器之前调用\n *\n * 使用 Vite 的 ?worker 导入方式,这是官方推荐的最佳实践\n * Vite 会自动处理 Worker 的打包和路径,无需手动配置\n */\nexport function configureMonacoWorkers(): void {\n // 如果已经配置过,直接返回\n if ((self as any).MonacoEnvironment) {\n return;\n }\n\n // 配置 MonacoEnvironment\n // 使用 getWorker 函数,直接返回 Worker 实例\n // Vite 的 ?worker 导入会自动处理路径和打包\n (self as any).MonacoEnvironment = {\n getWorker: function (_workerId: string, label: string) {\n return getWorker(_workerId, label);\n },\n };\n}\n\n/**\n * 编辑器配置选项\n */\nexport interface SlideDSLEditorOptions {\n /** 初始内容 */\n value?: string;\n /** 主题 */\n theme?: 'vs' | 'vs-dark' | 'hc-black';\n /** 字体大小 */\n fontSize?: number;\n /** 是否显示行号 */\n lineNumbers?: 'on' | 'off' | 'relative' | 'interval';\n /** 是否显示小地图 */\n minimap?: { enabled: boolean };\n /** 是否自动换行 */\n wordWrap?: 'on' | 'off' | 'wordWrapColumn' | 'bounded';\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否自动布局 */\n automaticLayout?: boolean;\n /** 内容变化回调 */\n onChange?: (value: string) => void;\n}\n\n/**\n * 创建 Slide DSL 编辑器实例\n *\n * @param container - 容器元素\n * @param options - 编辑器选项\n * @returns Monaco Editor 实例\n */\nexport function createSlideDSLEditor(\n container: HTMLElement,\n options: SlideDSLEditorOptions = {}\n): monaco.editor.IStandaloneCodeEditor {\n // 配置 Worker(必须在创建编辑器之前)\n configureMonacoWorkers();\n\n // 确保语言已注册\n if (!monaco.languages.getLanguages().find(lang => lang.id === 'slide-dsl')) {\n registerSlideDSLLanguage();\n }\n\n const {\n value = '',\n theme = 'vs-dark',\n fontSize = 14,\n lineNumbers = 'on',\n minimap = { enabled: true },\n wordWrap = 'on',\n readOnly = false,\n automaticLayout = true,\n onChange,\n } = options;\n\n // 创建编辑器实例\n const editor = monaco.editor.create(container, {\n value,\n language: 'slide-dsl',\n theme,\n fontSize,\n lineNumbers,\n minimap,\n wordWrap,\n readOnly,\n automaticLayout,\n scrollBeyondLastLine: false,\n renderWhitespace: 'selection',\n formatOnPaste: false,\n formatOnType: false,\n });\n\n // 监听内容变化\n if (onChange) {\n editor.onDidChangeModelContent(() => {\n const content = editor.getValue();\n onChange(content);\n });\n }\n\n return editor;\n}\n\n/**\n * 更新编辑器内容\n *\n * @param editor - 编辑器实例\n * @param value - 新内容\n */\nexport function updateEditorValue(\n editor: monaco.editor.IStandaloneCodeEditor,\n value: string\n): void {\n const currentValue = editor.getValue();\n if (currentValue !== value) {\n editor.setValue(value);\n }\n}\n\n/**\n * 设置编辑器主题\n *\n * @param editor - 编辑器实例\n * @param theme - 主题名称\n */\nexport function setEditorTheme(\n editor: monaco.editor.IStandaloneCodeEditor,\n theme: 'vs' | 'vs-dark' | 'hc-black'\n): void {\n monaco.editor.setTheme(theme);\n}\n"],"names":["slideDSLMonarchDefinition","registerSlideDSLLanguage","monaco","getWorker","_workerId","label","JsonWorker","CssWorker","HtmlWorker","TsWorker","EditorWorker","configureMonacoWorkers","createSlideDSLEditor","container","options","lang","value","theme","fontSize","lineNumbers","minimap","wordWrap","readOnly","automaticLayout","onChange","editor","content","updateEditorValue","setEditorTheme"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@slidejs/editor",
3
+ "version": "0.1.3",
4
+ "description": "Slide DSL Monaco Editor with syntax highlighting",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "monaco-editor": "^0.45.0"
21
+ },
22
+ "peerDependencies": {
23
+ "@slidejs/dsl": "0.1.3"
24
+ },
25
+ "devDependencies": {
26
+ "typescript": "^5.3.3",
27
+ "vite": "^7.3.1",
28
+ "vite-plugin-dts": "^4.5.4",
29
+ "vitest": "^1.0.0",
30
+ "@slidejs/dsl": "0.1.3"
31
+ },
32
+ "keywords": [
33
+ "slide",
34
+ "dsl",
35
+ "editor",
36
+ "monaco",
37
+ "syntax-highlighting"
38
+ ],
39
+ "author": "",
40
+ "license": "MIT",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "scripts": {
45
+ "build": "vite build",
46
+ "typecheck": "tsc --noEmit",
47
+ "test": "vitest run --passWithNoTests",
48
+ "test:watch": "vitest --passWithNoTests",
49
+ "clean": "rm -rf dist"
50
+ }
51
+ }