obsidian-dev-utils 88.5.0 → 88.7.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 +13 -0
- package/dist/integration-test-plugin/main.js +2250 -1908
- package/dist/lib/cjs/__merged.cjs +6 -1
- package/dist/lib/cjs/__merged.d.cts +2 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +42 -4
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +29 -1
- package/dist/lib/cjs/obsidian/components/index.cjs +6 -3
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +244 -0
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +149 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +186 -11
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +151 -4
- package/dist/lib/cjs/obsidian/setting-ex.cjs +13 -3
- package/dist/lib/cjs/obsidian/setting-ex.d.cts +14 -0
- package/dist/lib/cjs/script-utils/cli-utils.cjs +9 -1
- package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -0
- package/dist/lib/cjs/script-utils/env-toggle.cjs +180 -0
- package/dist/lib/cjs/script-utils/env-toggle.d.cts +42 -0
- package/dist/lib/cjs/script-utils/git.cjs +156 -0
- package/dist/lib/cjs/script-utils/git.d.cts +37 -0
- package/dist/lib/cjs/script-utils/index.cjs +7 -1
- package/dist/lib/cjs/script-utils/index.d.cts +2 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +11 -2
- package/dist/lib/cjs/script-utils/linters/cspell.d.cts +7 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +7 -4
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +17 -8
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +7 -11
- package/dist/lib/cjs/script-utils/nano-staged-config.d.cts +7 -5
- package/dist/lib/esm/__merged.d.mts +2 -1
- package/dist/lib/esm/__merged.mjs +8 -2
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +29 -1
- package/dist/lib/esm/obsidian/components/component-ex.mjs +46 -5
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +4 -2
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +149 -0
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +136 -0
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +151 -4
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +191 -12
- package/dist/lib/esm/obsidian/setting-ex.d.mts +14 -0
- package/dist/lib/esm/obsidian/setting-ex.mjs +11 -2
- package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -0
- package/dist/lib/esm/script-utils/cli-utils.mjs +9 -1
- package/dist/lib/esm/script-utils/env-toggle.d.mts +42 -0
- package/dist/lib/esm/script-utils/env-toggle.mjs +60 -0
- package/dist/lib/esm/script-utils/git.d.mts +37 -0
- package/dist/lib/esm/script-utils/git.mjs +48 -0
- package/dist/lib/esm/script-utils/index.d.mts +2 -0
- package/dist/lib/esm/script-utils/index.mjs +5 -1
- package/dist/lib/esm/script-utils/linters/cspell.d.mts +7 -0
- package/dist/lib/esm/script-utils/linters/cspell.mjs +15 -3
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +7 -4
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +17 -8
- package/dist/lib/esm/script-utils/nano-staged-config.d.mts +7 -5
- package/dist/lib/esm/script-utils/nano-staged-config.mjs +10 -11
- package/dist/templates/dprint.json +2 -2
- package/obsidian/components/syntax-highlighting-component/package.json +6 -0
- package/package.json +7 -6
- package/script-utils/env-toggle/package.json +6 -0
- package/script-utils/git/package.json +6 -0
|
@@ -154,7 +154,8 @@ __export(components_exports, {
|
|
|
154
154
|
"plugin-settings-tab-component": () => plugin_settings_tab_component,
|
|
155
155
|
"pointer-position-component": () => pointer_position_component,
|
|
156
156
|
"registry-component": () => registry_component,
|
|
157
|
-
"rename-delete-handler-component": () => rename_delete_handler_component
|
|
157
|
+
"rename-delete-handler-component": () => rename_delete_handler_component,
|
|
158
|
+
"syntax-highlighting-component": () => syntax_highlighting_component
|
|
158
159
|
});
|
|
159
160
|
module.exports = __toCommonJS(components_exports);
|
|
160
161
|
var abort_signal_component = __toESM(__extractDefault(require('./abort-signal-component.cjs')), 1);
|
|
@@ -177,6 +178,7 @@ var plugin_settings_tab_component = __toESM(__extractDefault(require('./plugin-s
|
|
|
177
178
|
var pointer_position_component = __toESM(__extractDefault(require('./pointer-position-component.cjs')), 1);
|
|
178
179
|
var registry_component = __toESM(__extractDefault(require('./registry-component.cjs')), 1);
|
|
179
180
|
var rename_delete_handler_component = __toESM(__extractDefault(require('./rename-delete-handler-component.cjs')), 1);
|
|
181
|
+
var syntax_highlighting_component = __toESM(__extractDefault(require('./syntax-highlighting-component.cjs')), 1);
|
|
180
182
|
// Annotate the CommonJS export names for ESM import in node:
|
|
181
183
|
0 && (module.exports = {
|
|
182
184
|
"abort-signal-component": null,
|
|
@@ -198,6 +200,7 @@ var rename_delete_handler_component = __toESM(__extractDefault(require('./rename
|
|
|
198
200
|
"plugin-settings-tab-component": null,
|
|
199
201
|
"pointer-position-component": null,
|
|
200
202
|
"registry-component": null,
|
|
201
|
-
"rename-delete-handler-component": null
|
|
203
|
+
"rename-delete-handler-component": null,
|
|
204
|
+
"syntax-highlighting-component": null
|
|
202
205
|
});
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvbXBvbmVudC1leCcgZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NvbnNvbGUtZGVidWctY29tcG9uZW50JyBmcm9tICcuL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdkaXNwb3NhYmxlLWNvbXBvbmVudCcgZnJvbSAnLi9kaXNwb3NhYmxlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQnIGZyb20gJy4vZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2dlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50JyBmcm9tICcuL2dlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdsYXlvdXQtcmVhZHktY29tcG9uZW50JyBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCcgZnJvbSAnLi9tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21vbmtleS1hcm91bmQtY29tcG9uZW50JyBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dC1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQnIGZyb20gJy4vcG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3JlZ2lzdHJ5LWNvbXBvbmVudCcgZnJvbSAnLi9yZWdpc3RyeS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQnIGZyb20gJy4vcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnc3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQnIGZyb20gJy4vc3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLGtDQUFBQTtBQUFBLEVBQUEscUNBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsK0NBQUFDO0FBQUEsRUFBQSxzQkFBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQSxvQ0FBQUM7QUFBQSxFQUFBLHlEQUFBQztBQUFBLEVBQUEsZ0NBQUFDO0FBQUEsRUFBQSx3Q0FBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEsa0NBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLG1DQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxvQ0FBQUM7QUFBQSxFQUFBLDRCQUFBQztBQUFBLEVBQUEseUNBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQXBCLHlCQUEwQztBQUMxQyxJQUFBQyw4QkFBK0M7QUFDL0MsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyx3Q0FBeUQ7QUFDekQsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQyw2QkFBOEM7QUFDOUMsSUFBQUMsa0RBQW1FO0FBQ25FLElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyxpQ0FBa0Q7QUFDbEQsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLDJCQUE0QztBQUM1QyxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsNEJBQTZDO0FBQzdDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyw2QkFBOEM7QUFDOUMsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLGtDQUFtRDtBQUNuRCxJQUFBQyxnQ0FBaUQ7IiwKICAibmFtZXMiOiBbImFib3J0LXNpZ25hbC1jb21wb25lbnQiLCAiYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50IiwgImFzeW5jLWVycm9yLWhhbmRsZXItY29tcG9uZW50IiwgImFzeW5jLWV2ZW50cy1jb21wb25lbnQiLCAiY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudCIsICJjb21wb25lbnQtZXgiLCAiY29uc29sZS1kZWJ1Zy1jb21wb25lbnQiLCAiZGlzcG9zYWJsZS1jb21wb25lbnQiLCAiZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQiLCAiZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQiLCAibGF5b3V0LXJlYWR5LWNvbXBvbmVudCIsICJtZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQiLCAibW9ua2V5LWFyb3VuZC1jb21wb25lbnQiLCAicGx1Z2luLWNvbnRleHQtY29tcG9uZW50IiwgInBsdWdpbi1ub3RpY2UtY29tcG9uZW50IiwgInBsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQiLCAicGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQiLCAicG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQiLCAicmVnaXN0cnktY29tcG9uZW50IiwgInJlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQiLCAic3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQiXQp9Cg==
|
|
@@ -19,3 +19,4 @@ export * as 'plugin-settings-tab-component' from './plugin-settings-tab-componen
|
|
|
19
19
|
export * as 'pointer-position-component' from './pointer-position-component.cjs';
|
|
20
20
|
export * as 'registry-component' from './registry-component.cjs';
|
|
21
21
|
export * as 'rename-delete-handler-component' from './rename-delete-handler-component.cjs';
|
|
22
|
+
export * as 'syntax-highlighting-component' from './syntax-highlighting-component.cjs';
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function initCjs() {
|
|
7
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
8
|
+
const globalThisRecord = globalThis;
|
|
9
|
+
globalThisRecord['__name'] ??= name;
|
|
10
|
+
const originalRequire = require;
|
|
11
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
12
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
13
|
+
require = Object.assign(
|
|
14
|
+
(id) => requirePatched(id),
|
|
15
|
+
originalRequire,
|
|
16
|
+
{
|
|
17
|
+
__isPatched: true
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const newFuncs = {
|
|
23
|
+
__extractDefault() {
|
|
24
|
+
return extractDefault;
|
|
25
|
+
},
|
|
26
|
+
process() {
|
|
27
|
+
const browserProcess = {
|
|
28
|
+
browser: true,
|
|
29
|
+
cwd() {
|
|
30
|
+
return '/';
|
|
31
|
+
},
|
|
32
|
+
env: {},
|
|
33
|
+
platform: 'android'
|
|
34
|
+
};
|
|
35
|
+
return browserProcess;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
for (const key of Object.keys(newFuncs)) {
|
|
40
|
+
globalThisRecord[key] ??= newFuncs[key]?.();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function name(obj) {
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function extractDefault(module) {
|
|
48
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
52
|
+
'obsidian',
|
|
53
|
+
'@codemirror/autocomplete',
|
|
54
|
+
'@codemirror/collab',
|
|
55
|
+
'@codemirror/commands',
|
|
56
|
+
'@codemirror/language',
|
|
57
|
+
'@codemirror/lint',
|
|
58
|
+
'@codemirror/search',
|
|
59
|
+
'@codemirror/state',
|
|
60
|
+
'@codemirror/text',
|
|
61
|
+
'@codemirror/view',
|
|
62
|
+
'@lezer/common',
|
|
63
|
+
'@lezer/lr',
|
|
64
|
+
'@lezer/highlight'];
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
68
|
+
'@codemirror/closebrackets',
|
|
69
|
+
'@codemirror/comment',
|
|
70
|
+
'@codemirror/fold',
|
|
71
|
+
'@codemirror/gutter',
|
|
72
|
+
'@codemirror/highlight',
|
|
73
|
+
'@codemirror/history',
|
|
74
|
+
'@codemirror/matchbrackets',
|
|
75
|
+
'@codemirror/panel',
|
|
76
|
+
'@codemirror/rangeset',
|
|
77
|
+
'@codemirror/rectangular-selection',
|
|
78
|
+
'@codemirror/stream-parser',
|
|
79
|
+
'@codemirror/tooltip'];
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
function requirePatched(id) {
|
|
83
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
|
|
84
|
+
return originalRequire?.(id);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
88
|
+
if (globalThis.app.isMobile) {
|
|
89
|
+
if (id === 'process' || id === 'node:process') {
|
|
90
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
91
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
92
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
93
|
+
return globalThis.process;
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
const module = originalRequire?.(id);
|
|
97
|
+
if (module) {
|
|
98
|
+
return extractDefault(module);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
103
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
|
|
108
|
+
"use strict";
|
|
109
|
+
var __defProp = Object.defineProperty;
|
|
110
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
111
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
112
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
113
|
+
var __export = (target, all) => {
|
|
114
|
+
for (var name in all)
|
|
115
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
116
|
+
};
|
|
117
|
+
var __copyProps = (to, from, except, desc) => {
|
|
118
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
119
|
+
for (let key of __getOwnPropNames(from))
|
|
120
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
121
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
122
|
+
}
|
|
123
|
+
return to;
|
|
124
|
+
};
|
|
125
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
126
|
+
var syntax_highlighting_component_exports = {};
|
|
127
|
+
__export(syntax_highlighting_component_exports, {
|
|
128
|
+
SyntaxHighlightingComponent: () => SyntaxHighlightingComponent
|
|
129
|
+
});
|
|
130
|
+
module.exports = __toCommonJS(syntax_highlighting_component_exports);
|
|
131
|
+
var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
|
|
132
|
+
var import_error = require('../../error.cjs');
|
|
133
|
+
var import_component_ex = require('./component-ex.cjs');
|
|
134
|
+
class SyntaxHighlightingComponent extends import_component_ex.ComponentEx {
|
|
135
|
+
/**
|
|
136
|
+
* Registers a fenced code block language, highlighting it in the editor and, optionally, in reading view.
|
|
137
|
+
*
|
|
138
|
+
* @param params - The parameters for registering the language.
|
|
139
|
+
* @returns A {@link Promise} that resolves when the language is registered.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* await component.registerCodeBlockLanguageAsync({
|
|
144
|
+
* editorMode: 'text/typescript',
|
|
145
|
+
* language: 'my-language',
|
|
146
|
+
* prismGrammar: 'typescript'
|
|
147
|
+
* });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
async registerCodeBlockLanguageAsync(params) {
|
|
151
|
+
const {
|
|
152
|
+
editorMode,
|
|
153
|
+
language,
|
|
154
|
+
prismGrammar
|
|
155
|
+
} = params;
|
|
156
|
+
this.ensureLoaded();
|
|
157
|
+
if (prismGrammar !== void 0) {
|
|
158
|
+
await this.registerPrismLanguageAsync({
|
|
159
|
+
grammar: prismGrammar,
|
|
160
|
+
language
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
this.ensureLoaded();
|
|
164
|
+
const previousModeFactory = window.CodeMirror.modes[language];
|
|
165
|
+
window.CodeMirror.defineMode(language, (config) => window.CodeMirror.getMode(config, editorMode));
|
|
166
|
+
this.register(() => {
|
|
167
|
+
if (previousModeFactory !== void 0) {
|
|
168
|
+
window.CodeMirror.modes[language] = previousModeFactory;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
delete window.CodeMirror.modes[language];
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Registers a Prism language, highlighting it everywhere Prism renders code — reading view and the
|
|
176
|
+
* {@link CodeHighlighterComponent} settings field.
|
|
177
|
+
*
|
|
178
|
+
* @param params - The parameters for registering the language.
|
|
179
|
+
* @returns A {@link Promise} that resolves when the language is registered.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```ts
|
|
183
|
+
* await component.registerPrismLanguageAsync({
|
|
184
|
+
* grammar: {
|
|
185
|
+
* keyword: /\bfoo\b/
|
|
186
|
+
* },
|
|
187
|
+
* language: 'my-language'
|
|
188
|
+
* });
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
async registerPrismLanguageAsync(params) {
|
|
192
|
+
const {
|
|
193
|
+
grammar,
|
|
194
|
+
language
|
|
195
|
+
} = params;
|
|
196
|
+
this.ensureLoaded();
|
|
197
|
+
const prism = await (0, import_implementations.loadPrism)();
|
|
198
|
+
this.ensureLoaded();
|
|
199
|
+
const previousGrammar = prism.languages[language];
|
|
200
|
+
prism.languages[language] = this.resolveGrammar(prism, grammar);
|
|
201
|
+
this.register(() => {
|
|
202
|
+
if (previousGrammar !== void 0) {
|
|
203
|
+
prism.languages[language] = previousGrammar;
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
delete prism.languages[language];
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Returns the grammar of an already registered Prism language.
|
|
211
|
+
*
|
|
212
|
+
* @param prism - The loaded Prism module.
|
|
213
|
+
* @param language - The language to look up.
|
|
214
|
+
* @returns The grammar of the language.
|
|
215
|
+
* @throws An {@link Error} if the language is not registered.
|
|
216
|
+
*/
|
|
217
|
+
requirePrismLanguage(prism, language) {
|
|
218
|
+
return prism.languages[language] ?? (0, import_error.throwExpression)(new Error(`Prism language "${language}" is not registered.`));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Resolves a grammar source into the grammar to register.
|
|
222
|
+
*
|
|
223
|
+
* @param prism - The loaded Prism module.
|
|
224
|
+
* @param grammarSource - The grammar source to resolve.
|
|
225
|
+
* @returns The resolved grammar.
|
|
226
|
+
*/
|
|
227
|
+
resolveGrammar(prism, grammarSource) {
|
|
228
|
+
if (typeof grammarSource === "string") {
|
|
229
|
+
return this.requirePrismLanguage(prism, grammarSource);
|
|
230
|
+
}
|
|
231
|
+
if (typeof grammarSource === "function") {
|
|
232
|
+
return grammarSource({
|
|
233
|
+
prism,
|
|
234
|
+
requirePrismLanguage: (language) => this.requirePrismLanguage(prism, language)
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return grammarSource;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
241
|
+
0 && (module.exports = {
|
|
242
|
+
SyntaxHighlightingComponent
|
|
243
|
+
});
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvc3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyBjbGFzcyB7QGxpbmsgU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50fSB0aGF0IHJlZ2lzdGVycyBzeW50YXggaGlnaGxpZ2h0aW5nIGxhbmd1YWdlcy5cbiAqXG4gKiBPYnNpZGlhbiBoaWdobGlnaHRzIGNvZGUgaW4gdHdvIGluZGVwZW5kZW50IHBsYWNlcywgdGhyb3VnaCB0d28gc2VwYXJhdGUgcmVnaXN0cmllcywgYW5kIGEgcGx1Z2luIGFkZGluZ1xuICogaXRzIG93biBsYW5ndWFnZSB1c3VhbGx5IGhhcyB0byB0b3VjaCBib3RoOlxuICpcbiAqIC0gKipQcmlzbSoqIChgcHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXWApIGhpZ2hsaWdodHMgY29kZSBpbiByZWFkaW5nIHZpZXcgYW5kIGluIGV2ZXJ5IGA8cHJlPjxjb2RlPmAgdGhlXG4gKiAgIGxpYnJhcnkgcmVuZGVycyBcdTIwMTQgaW5jbHVkaW5nIHRoZSB7QGxpbmsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50fSBzZXR0aW5ncyBmaWVsZC5cbiAqIC0gKipUaGUgQ29kZU1pcnJvciA1IG1vZGUgcmVnaXN0cnkqKiAoYHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXWApIGhpZ2hsaWdodHMgYSBmZW5jZWQgY29kZSBibG9ja1xuICogICBpbnNpZGUgdGhlIGVkaXRvci5cbiAqXG4gKiBUaGUgQ29kZU1pcnJvciA1IGhhbGYgbG9va3MgbGlrZSBsZWdhY3kgdGhhdCBzaG91bGQgYmUgbWlncmF0ZWQgdG8gQ29kZU1pcnJvciA2LiAqKkl0IGlzIG5vdCoqIFx1MjAxNCB2ZXJpZmllZFxuICogYWdhaW5zdCB0aGUgT2JzaWRpYW4gMS4xMy40IHJ1bnRpbWU6XG4gKlxuICogLSBPYnNpZGlhbidzIG93biBDb2RlTWlycm9yIDYgZWRpdG9yIGxhbmd1YWdlIGlzIGEgYnJpZGdlZCBDb2RlTWlycm9yIDUgbW9kZTpcbiAqICAgYFN0cmVhbUxhbmd1YWdlLmRlZmluZShDb2RlTWlycm9yLmdldE1vZGUoe30sIHsgbmFtZTogJ2h5cGVybWQnIH0pKWAuXG4gKiAtIE9ic2lkaWFuIHJlZ2lzdGVycyB0aGF0IGBoeXBlcm1kYCBtb2RlIHRocm91Z2ggYHdpbmRvdy5Db2RlTWlycm9yLmRlZmluZU1vZGVgIHdpdGhcbiAqICAgYGZlbmNlZENvZGVCbG9ja0hpZ2hsaWdodGluZzogdHJ1ZWAsIGFuZCB0aGF0IG9wdGlvbiByZXNvbHZlcyBlYWNoIGZlbmNlJ3MgbGFuZ3VhZ2UgdGhyb3VnaCB0aGVcbiAqICAgKipDb2RlTWlycm9yIDUgbW9kZSByZWdpc3RyeSoqLlxuICogLSBUaGVyZSBpcyBubyBwdWJsaWMgb3IgaW50ZXJuYWwgQ29kZU1pcnJvciA2IGxhbmd1YWdlLXJlZ2lzdHJhdGlvbiBBUEkgZm9yIGZlbmNlcy5cbiAqXG4gKiBTbyBgd2luZG93LkNvZGVNaXJyb3IuZGVmaW5lTW9kZWAgaXMgdGhlIHNhbmN0aW9uZWQgZXh0ZW5zaW9uIHBvaW50LCBub3QgbGVnYWN5IGRlYnQuIERvIG5vdCByZW9wZW4gdGhpc1xuICogYXMgYSBtaWdyYXRpb24uXG4gKlxuICogVGVhcmRvd24gUkVNT1ZFUyB0aGUgbW9kZSByYXRoZXIgdGhhbiByZWRlZmluaW5nIGl0IHRvIGBudWxsYC4gUGx1Z2lucyBwcmVkYXRpbmcgdGhpcyBjb21wb25lbnQgcmVkZWZpbmVkXG4gKiB0aGUgbW9kZSB0byBgbnVsbGAgb24gdW5sb2FkLCBiZWNhdXNlIGl0IHdhcyB1bmNsZWFyIHdoZXRoZXIgQ29kZU1pcnJvcidzIGBnZXRNb2RlYCBuZWVkcyB0aGUgZW50cnkgdG9cbiAqIHN0YXkgcHJlc2VudC4gSXQgZG9lcyBub3QgXHUyMDE0IHZlcmlmaWVkIGFnYWluc3QgYSBsaXZlIE9ic2lkaWFuIDEuMTMuNCBieVxuICogYHN5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50Lm9ic2lkaWFuLmludGVncmF0aW9uLnRlc3QudHNgOiBhZnRlciB0aGUgZW50cnkgaXMgZGVsZXRlZCwgdGhlIGZlbmNlXG4gKiByZW5kZXJzIGl0cyB0ZXh0IHdpdGggbm8gZXJyb3IgYW5kIGRyb3BzIGJhY2sgdG8gdGhlIGV4YWN0IHRva2VuIGNvdW50IGl0IGhhZCBiZWZvcmUgdGhlIGxhbmd1YWdlIHdhc1xuICogZXZlciByZWdpc3RlcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgR3JhbW1hcixcbiAgUHJpc21Nb2R1bGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5cbmltcG9ydCB7IGxvYWRQcmlzbSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50YCB0byB1c2UgaXQgaW4gdGhlIHRzZG9jcy5cbmltcG9ydCB0eXBlIHsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL2NvZGUtaGlnaGxpZ2h0ZXItY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgdGhyb3dFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogVGhlIGxvYWRlZCBQcmlzbSBtb2R1bGUsIGhhbmRlZCB0byBhIGdyYW1tYXIgZmFjdG9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRHcmFtbWFyRmFjdG9yeVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9hZGVkIFByaXNtIG1vZHVsZS5cbiAgICovXG4gIHJlYWRvbmx5IHByaXNtOiBQcmlzbU1vZHVsZTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZ3JhbW1hciBvZiBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgUHJpc20gbGFuZ3VhZ2UsIGZvciBuZXN0aW5nIGludG8gdGhlIGJ1aWx0IGdyYW1tYXIuXG4gICAqXG4gICAqIEBwYXJhbSBsYW5ndWFnZSAtIFRoZSBsYW5ndWFnZSB0byBsb29rIHVwLlxuICAgKiBAcmV0dXJucyBUaGUgZ3JhbW1hciBvZiB0aGUgbGFuZ3VhZ2UuXG4gICAqIEB0aHJvd3MgQW4ge0BsaW5rIEVycm9yfSBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAqL1xuICByZXF1aXJlUHJpc21MYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKTogR3JhbW1hcjtcbn1cblxuLyoqXG4gKiBBIGdyYW1tYXIsIHRoZSBuYW1lIG9mIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCBsYW5ndWFnZSB0byBhbGlhcywgb3IgYSBmYWN0b3J5IHRoYXQgYnVpbGRzIHRoZSBncmFtbWFyIGZyb21cbiAqIHRoZSBsb2FkZWQgUHJpc20gbW9kdWxlLlxuICovXG5leHBvcnQgdHlwZSBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRHcmFtbWFyU291cmNlID0gKChwYXJhbXM6IFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudEdyYW1tYXJGYWN0b3J5UGFyYW1zKSA9PiBHcmFtbWFyKSB8IEdyYW1tYXIgfCBzdHJpbmc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudC5yZWdpc3RlckNvZGVCbG9ja0xhbmd1YWdlQXN5bmN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudFJlZ2lzdGVyQ29kZUJsb2NrTGFuZ3VhZ2VBc3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgQ29kZU1pcnJvciA1IG1vZGUgbmFtZSBvciBNSU1FIHR5cGUgdGhlIGVkaXRvciBoaWdobGlnaHRzIHRoZSBmZW5jZSBhcywgZS5nLiBgdGV4dC90eXBlc2NyaXB0YC5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvck1vZGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZlbmNlIGxhbmd1YWdlLCBlLmcuIHRoZSBgZm9vYCBpbiBhIGAgYGBgZm9vIGAgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBncmFtbWFyIGhpZ2hsaWdodGluZyB0aGUgZmVuY2UgaW4gcmVhZGluZyB2aWV3LiBPbWl0IHdoZW4gdGhlIGZlbmNlIGlzIHJlcGxhY2VkIGluIHJlYWRpbmcgdmlldyBcdTIwMTRcbiAgICogZS5nLiBhIGZlbmNlIHJlbmRlcmVkIGFzIGEgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpc21HcmFtbWFyPzogU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50R3JhbW1hclNvdXJjZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50LnJlZ2lzdGVyUHJpc21MYW5ndWFnZUFzeW5jfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRSZWdpc3RlclByaXNtTGFuZ3VhZ2VBc3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ3JhbW1hciB0byByZWdpc3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGdyYW1tYXI6IFN5bnRheEhpZ2hsaWdodGluZ0NvbXBvbmVudEdyYW1tYXJTb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSB0byByZWdpc3RlciB0aGUgZ3JhbW1hciBhcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCByZWdpc3RlcnMgYW5kIHVucmVnaXN0ZXJzIHN5bnRheCBoaWdobGlnaHRpbmcgbGFuZ3VhZ2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBFdmVyeSByZWdpc3RyYXRpb24gaXMgdW5kb25lIHdoZW4gdGhlIGNvbXBvbmVudCBpcyB1bmxvYWRlZDogdGhlIHByZXZpb3VzIGVudHJ5IGlzIHJlc3RvcmVkIGlmIHRoZVxuICogbGFuZ3VhZ2Ugd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCwgb3RoZXJ3aXNlIHRoZSBlbnRyeSBpcyByZW1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZmVuY2VkIGNvZGUgYmxvY2sgbGFuZ3VhZ2UsIGhpZ2hsaWdodGluZyBpdCBpbiB0aGUgZWRpdG9yIGFuZCwgb3B0aW9uYWxseSwgaW4gcmVhZGluZyB2aWV3LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIHRoZSBsYW5ndWFnZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsYW5ndWFnZSBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBhd2FpdCBjb21wb25lbnQucmVnaXN0ZXJDb2RlQmxvY2tMYW5ndWFnZUFzeW5jKHtcbiAgICogICBlZGl0b3JNb2RlOiAndGV4dC90eXBlc2NyaXB0JyxcbiAgICogICBsYW5ndWFnZTogJ215LWxhbmd1YWdlJyxcbiAgICogICBwcmlzbUdyYW1tYXI6ICd0eXBlc2NyaXB0J1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJDb2RlQmxvY2tMYW5ndWFnZUFzeW5jKHBhcmFtczogU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50UmVnaXN0ZXJDb2RlQmxvY2tMYW5ndWFnZUFzeW5jUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgZWRpdG9yTW9kZSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgcHJpc21HcmFtbWFyXG4gICAgfSA9IHBhcmFtcztcblxuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICBpZiAocHJpc21HcmFtbWFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJQcmlzbUxhbmd1YWdlQXN5bmMoe1xuICAgICAgICBncmFtbWFyOiBwcmlzbUdyYW1tYXIsXG4gICAgICAgIGxhbmd1YWdlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgY29uc3QgcHJldmlvdXNNb2RlRmFjdG9yeSA9IHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXTtcbiAgICB3aW5kb3cuQ29kZU1pcnJvci5kZWZpbmVNb2RlKGxhbmd1YWdlLCAoY29uZmlnKSA9PiB3aW5kb3cuQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgZWRpdG9yTW9kZSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICBpZiAocHJldmlvdXNNb2RlRmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXSA9IHByZXZpb3VzTW9kZUZhY3Rvcnk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBUaGUgbGFuZ3VhZ2UgaXMgb25seSBrbm93biBhdCBydW50aW1lLlxuICAgICAgZGVsZXRlIHdpbmRvdy5Db2RlTWlycm9yLm1vZGVzW2xhbmd1YWdlXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBQcmlzbSBsYW5ndWFnZSwgaGlnaGxpZ2h0aW5nIGl0IGV2ZXJ5d2hlcmUgUHJpc20gcmVuZGVycyBjb2RlIFx1MjAxNCByZWFkaW5nIHZpZXcgYW5kIHRoZVxuICAgKiB7QGxpbmsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50fSBzZXR0aW5ncyBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgbGFuZ3VhZ2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGFuZ3VhZ2UgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogYXdhaXQgY29tcG9uZW50LnJlZ2lzdGVyUHJpc21MYW5ndWFnZUFzeW5jKHtcbiAgICogICBncmFtbWFyOiB7XG4gICAqICAgICBrZXl3b3JkOiAvXFxiZm9vXFxiL1xuICAgKiAgIH0sXG4gICAqICAgbGFuZ3VhZ2U6ICdteS1sYW5ndWFnZSdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyUHJpc21MYW5ndWFnZUFzeW5jKHBhcmFtczogU3ludGF4SGlnaGxpZ2h0aW5nQ29tcG9uZW50UmVnaXN0ZXJQcmlzbUxhbmd1YWdlQXN5bmNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBncmFtbWFyLFxuICAgICAgbGFuZ3VhZ2VcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcblxuICAgIGNvbnN0IHByaXNtID0gYXdhaXQgbG9hZFByaXNtKCk7XG5cbiAgICAvLyBUaGUgY29tcG9uZW50IG1pZ2h0IGhhdmUgYmVlbiB1bmxvYWRlZCB3aGlsZSBQcmlzbSB3YXMgbG9hZGluZy5cbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgY29uc3QgcHJldmlvdXNHcmFtbWFyID0gcHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXTtcbiAgICBwcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdID0gdGhpcy5yZXNvbHZlR3JhbW1hcihwcmlzbSwgZ3JhbW1hcik7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGlmIChwcmV2aW91c0dyYW1tYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdID0gcHJldmlvdXNHcmFtbWFyO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gVGhlIGxhbmd1YWdlIGlzIG9ubHkga25vd24gYXQgcnVudGltZS5cbiAgICAgIGRlbGV0ZSBwcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdyYW1tYXIgb2YgYW4gYWxyZWFkeSByZWdpc3RlcmVkIFByaXNtIGxhbmd1YWdlLlxuICAgKlxuICAgKiBAcGFyYW0gcHJpc20gLSBUaGUgbG9hZGVkIFByaXNtIG1vZHVsZS5cbiAgICogQHBhcmFtIGxhbmd1YWdlIC0gVGhlIGxhbmd1YWdlIHRvIGxvb2sgdXAuXG4gICAqIEByZXR1cm5zIFRoZSBncmFtbWFyIG9mIHRoZSBsYW5ndWFnZS5cbiAgICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoZSBsYW5ndWFnZSBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgcmVxdWlyZVByaXNtTGFuZ3VhZ2UocHJpc206IFByaXNtTW9kdWxlLCBsYW5ndWFnZTogc3RyaW5nKTogR3JhbW1hciB7XG4gICAgcmV0dXJuIHByaXNtLmxhbmd1YWdlc1tsYW5ndWFnZV0gPz8gdGhyb3dFeHByZXNzaW9uKG5ldyBFcnJvcihgUHJpc20gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiIGlzIG5vdCByZWdpc3RlcmVkLmApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGdyYW1tYXIgc291cmNlIGludG8gdGhlIGdyYW1tYXIgdG8gcmVnaXN0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwcmlzbSAtIFRoZSBsb2FkZWQgUHJpc20gbW9kdWxlLlxuICAgKiBAcGFyYW0gZ3JhbW1hclNvdXJjZSAtIFRoZSBncmFtbWFyIHNvdXJjZSB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgZ3JhbW1hci5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUdyYW1tYXIocHJpc206IFByaXNtTW9kdWxlLCBncmFtbWFyU291cmNlOiBTeW50YXhIaWdobGlnaHRpbmdDb21wb25lbnRHcmFtbWFyU291cmNlKTogR3JhbW1hciB7XG4gICAgaWYgKHR5cGVvZiBncmFtbWFyU291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWlyZVByaXNtTGFuZ3VhZ2UocHJpc20sIGdyYW1tYXJTb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZ3JhbW1hclNvdXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGdyYW1tYXJTb3VyY2Uoe1xuICAgICAgICBwcmlzbSxcbiAgICAgICAgcmVxdWlyZVByaXNtTGFuZ3VhZ2U6IChsYW5ndWFnZSkgPT4gdGhpcy5yZXF1aXJlUHJpc21MYW5ndWFnZShwcmlzbSwgbGFuZ3VhZ2UpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhbW1hclNvdXJjZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFB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
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/// <reference path="../../library.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Contains class {@link SyntaxHighlightingComponent} that registers syntax highlighting languages.
|
|
6
|
+
*
|
|
7
|
+
* Obsidian highlights code in two independent places, through two separate registries, and a plugin adding
|
|
8
|
+
* its own language usually has to touch both:
|
|
9
|
+
*
|
|
10
|
+
* - **Prism** (`prism.languages[language]`) highlights code in reading view and in every `<pre><code>` the
|
|
11
|
+
* library renders — including the {@link CodeHighlighterComponent} settings field.
|
|
12
|
+
* - **The CodeMirror 5 mode registry** (`window.CodeMirror.modes[language]`) highlights a fenced code block
|
|
13
|
+
* inside the editor.
|
|
14
|
+
*
|
|
15
|
+
* The CodeMirror 5 half looks like legacy that should be migrated to CodeMirror 6. **It is not** — verified
|
|
16
|
+
* against the Obsidian 1.13.4 runtime:
|
|
17
|
+
*
|
|
18
|
+
* - Obsidian's own CodeMirror 6 editor language is a bridged CodeMirror 5 mode:
|
|
19
|
+
* `StreamLanguage.define(CodeMirror.getMode({}, { name: 'hypermd' }))`.
|
|
20
|
+
* - Obsidian registers that `hypermd` mode through `window.CodeMirror.defineMode` with
|
|
21
|
+
* `fencedCodeBlockHighlighting: true`, and that option resolves each fence's language through the
|
|
22
|
+
* **CodeMirror 5 mode registry**.
|
|
23
|
+
* - There is no public or internal CodeMirror 6 language-registration API for fences.
|
|
24
|
+
*
|
|
25
|
+
* So `window.CodeMirror.defineMode` is the sanctioned extension point, not legacy debt. Do not reopen this
|
|
26
|
+
* as a migration.
|
|
27
|
+
*
|
|
28
|
+
* Teardown REMOVES the mode rather than redefining it to `null`. Plugins predating this component redefined
|
|
29
|
+
* the mode to `null` on unload, because it was unclear whether CodeMirror's `getMode` needs the entry to
|
|
30
|
+
* stay present. It does not — verified against a live Obsidian 1.13.4 by
|
|
31
|
+
* `syntax-highlighting-component.obsidian.integration.test.ts`: after the entry is deleted, the fence
|
|
32
|
+
* renders its text with no error and drops back to the exact token count it had before the language was
|
|
33
|
+
* ever registered.
|
|
34
|
+
*/
|
|
35
|
+
import type { Grammar, PrismModule } from '@obsidian-typings/obsidian-public-latest' with { 'resolution-mode': 'import' };
|
|
36
|
+
import { ComponentEx } from './component-ex.cjs';
|
|
37
|
+
/**
|
|
38
|
+
* The loaded Prism module, handed to a grammar factory.
|
|
39
|
+
*/
|
|
40
|
+
export interface SyntaxHighlightingComponentGrammarFactoryParams {
|
|
41
|
+
/**
|
|
42
|
+
* The loaded Prism module.
|
|
43
|
+
*/
|
|
44
|
+
readonly prism: PrismModule;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the grammar of an already registered Prism language, for nesting into the built grammar.
|
|
47
|
+
*
|
|
48
|
+
* @param language - The language to look up.
|
|
49
|
+
* @returns The grammar of the language.
|
|
50
|
+
* @throws An {@link Error} if the language is not registered.
|
|
51
|
+
*/
|
|
52
|
+
requirePrismLanguage(language: string): Grammar;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A grammar, the name of an already registered language to alias, or a factory that builds the grammar from
|
|
56
|
+
* the loaded Prism module.
|
|
57
|
+
*/
|
|
58
|
+
export type SyntaxHighlightingComponentGrammarSource = ((params: SyntaxHighlightingComponentGrammarFactoryParams) => Grammar) | Grammar | string;
|
|
59
|
+
/**
|
|
60
|
+
* Parameters for {@link SyntaxHighlightingComponent.registerCodeBlockLanguageAsync}.
|
|
61
|
+
*/
|
|
62
|
+
export interface SyntaxHighlightingComponentRegisterCodeBlockLanguageAsyncParams {
|
|
63
|
+
/**
|
|
64
|
+
* The CodeMirror 5 mode name or MIME type the editor highlights the fence as, e.g. `text/typescript`.
|
|
65
|
+
*/
|
|
66
|
+
readonly editorMode: string;
|
|
67
|
+
/**
|
|
68
|
+
* The fence language, e.g. the `foo` in a ` ```foo ` code block.
|
|
69
|
+
*/
|
|
70
|
+
readonly language: string;
|
|
71
|
+
/**
|
|
72
|
+
* The grammar highlighting the fence in reading view. Omit when the fence is replaced in reading view —
|
|
73
|
+
* e.g. a fence rendered as a button.
|
|
74
|
+
*/
|
|
75
|
+
readonly prismGrammar?: SyntaxHighlightingComponentGrammarSource | undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parameters for {@link SyntaxHighlightingComponent.registerPrismLanguageAsync}.
|
|
79
|
+
*/
|
|
80
|
+
export interface SyntaxHighlightingComponentRegisterPrismLanguageAsyncParams {
|
|
81
|
+
/**
|
|
82
|
+
* The grammar to register.
|
|
83
|
+
*/
|
|
84
|
+
readonly grammar: SyntaxHighlightingComponentGrammarSource;
|
|
85
|
+
/**
|
|
86
|
+
* The language to register the grammar as.
|
|
87
|
+
*/
|
|
88
|
+
readonly language: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* A component that registers and unregisters syntax highlighting languages.
|
|
92
|
+
*
|
|
93
|
+
* @remarks
|
|
94
|
+
* Every registration is undone when the component is unloaded: the previous entry is restored if the
|
|
95
|
+
* language was already registered, otherwise the entry is removed.
|
|
96
|
+
*/
|
|
97
|
+
export declare class SyntaxHighlightingComponent extends ComponentEx {
|
|
98
|
+
/**
|
|
99
|
+
* Registers a fenced code block language, highlighting it in the editor and, optionally, in reading view.
|
|
100
|
+
*
|
|
101
|
+
* @param params - The parameters for registering the language.
|
|
102
|
+
* @returns A {@link Promise} that resolves when the language is registered.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* await component.registerCodeBlockLanguageAsync({
|
|
107
|
+
* editorMode: 'text/typescript',
|
|
108
|
+
* language: 'my-language',
|
|
109
|
+
* prismGrammar: 'typescript'
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
registerCodeBlockLanguageAsync(params: SyntaxHighlightingComponentRegisterCodeBlockLanguageAsyncParams): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Registers a Prism language, highlighting it everywhere Prism renders code — reading view and the
|
|
116
|
+
* {@link CodeHighlighterComponent} settings field.
|
|
117
|
+
*
|
|
118
|
+
* @param params - The parameters for registering the language.
|
|
119
|
+
* @returns A {@link Promise} that resolves when the language is registered.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* await component.registerPrismLanguageAsync({
|
|
124
|
+
* grammar: {
|
|
125
|
+
* keyword: /\bfoo\b/
|
|
126
|
+
* },
|
|
127
|
+
* language: 'my-language'
|
|
128
|
+
* });
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
registerPrismLanguageAsync(params: SyntaxHighlightingComponentRegisterPrismLanguageAsyncParams): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* Returns the grammar of an already registered Prism language.
|
|
134
|
+
*
|
|
135
|
+
* @param prism - The loaded Prism module.
|
|
136
|
+
* @param language - The language to look up.
|
|
137
|
+
* @returns The grammar of the language.
|
|
138
|
+
* @throws An {@link Error} if the language is not registered.
|
|
139
|
+
*/
|
|
140
|
+
private requirePrismLanguage;
|
|
141
|
+
/**
|
|
142
|
+
* Resolves a grammar source into the grammar to register.
|
|
143
|
+
*
|
|
144
|
+
* @param prism - The loaded Prism module.
|
|
145
|
+
* @param grammarSource - The grammar source to resolve.
|
|
146
|
+
* @returns The resolved grammar.
|
|
147
|
+
*/
|
|
148
|
+
private resolveGrammar;
|
|
149
|
+
}
|