orz-markdown 1.0.0 → 1.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.
- package/README.md +28 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/plugins/attrs.d.ts.map +1 -1
- package/dist/plugins/attrs.js +10 -0
- package/dist/plugins/attrs.js.map +1 -1
- package/dist/plugins/mermaid.js +14 -1
- package/dist/plugins/mermaid.js.map +1 -1
- package/dist/plugins/qrcode.js +11 -1
- package/dist/plugins/qrcode.js.map +1 -1
- package/dist/plugins/smiles.js +4 -1
- package/dist/plugins/smiles.js.map +1 -1
- package/dist/plugins/youtube.js +9 -1
- package/dist/plugins/youtube.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +283 -0
- package/dist/runtime.js.map +1 -1
- package/orz-markdown-skills/SKILL.md +179 -0
- package/orz-markdown-skills/assets/minimal.css +658 -0
- package/orz-markdown-skills/assets/template.html +505 -0
- package/orz-markdown-skills/references/block-ids.md +51 -0
- package/orz-markdown-skills/references/css-classes.md +218 -0
- package/orz-markdown-skills/references/syntax.md +439 -0
- package/orz-markdown-skills/references/themes.md +302 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ document.body.innerHTML = `<article class="markdown-body">${html}</article>`;
|
|
|
37
37
|
|
|
38
38
|
## Browser Runtime
|
|
39
39
|
|
|
40
|
-
Some rendered features expect a small browser runtime layer after the HTML is mounted. This
|
|
40
|
+
Some rendered features expect a small browser runtime layer after the HTML is mounted. This includes QR-code expand/collapse behavior and **copy-as-Markdown**, and is designed so more client-side enhancements can share the same entry point.
|
|
41
41
|
|
|
42
42
|
```javascript
|
|
43
43
|
import { getBrowserRuntimeScript } from 'orz-markdown/runtime';
|
|
@@ -49,6 +49,20 @@ document.body.appendChild(runtimeScript);
|
|
|
49
49
|
|
|
50
50
|
If your app controls initialization directly, the runtime also exposes `window.OrzMarkdownRuntime.init(root)` and `window.OrzMarkdownRuntime.initQrCodes(root)`.
|
|
51
51
|
|
|
52
|
+
### Copy as Markdown
|
|
53
|
+
|
|
54
|
+
Once the runtime is loaded, selecting rendered content and copying it (Cmd/Ctrl-C) places **Markdown source** on the clipboard instead of HTML. A built-in DOM→Markdown walker reconstructs headings, emphasis, inline code, links, `==mark==`/`++ins++`/`~~del~~`/`~sub~`/`^sup^`, bullet/ordered/nested lists, task lists, tables (with alignment), blockquotes, fenced code (with language), images, and inline/display math.
|
|
55
|
+
|
|
56
|
+
It only transforms selections inside an element with class `markdown-body` (wrap your rendered output in one, e.g. `<article class="markdown-body">…</article>`, or mark a container with `data-orz-copy`), and never touches selections inside `<input>`, `<textarea>`, or `contenteditable` regions.
|
|
57
|
+
|
|
58
|
+
Generated constructs that lose their source after client-side rendering — `mermaid`, `smiles`, `qrcode`, `youtube` — carry a `data-md` attribute that the walker emits verbatim. As a result a copied table of contents yields its heading links (not `{{toc 2,3}}`) and a copied QR code yields `{{qr ...}}` (not its SVG). **Do not strip `data-md` attributes** if you post-process the HTML.
|
|
59
|
+
|
|
60
|
+
You can also convert a node programmatically:
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
const markdown = window.OrzMarkdownRuntime.elementToMarkdown(someElement);
|
|
64
|
+
```
|
|
65
|
+
|
|
52
66
|
## Themes
|
|
53
67
|
|
|
54
68
|
We provide multiple ready-to-use CSS themes for rendering the output! You do not need to style the custom plugins from scratch.
|
|
@@ -83,7 +97,19 @@ npm test
|
|
|
83
97
|
npm pack
|
|
84
98
|
```
|
|
85
99
|
|
|
86
|
-
The generated tarball is written to the repository root and includes `dist
|
|
100
|
+
The generated tarball is written to the repository root and includes `dist/`, `themes/`, and `orz-markdown-skills/`.
|
|
101
|
+
|
|
102
|
+
## Agent Skill
|
|
103
|
+
|
|
104
|
+
The package ships an Agent Skill that teaches AI coding agents how to render with orz-markdown, write `{{...}}` plugin and `:::` container syntax, set up display pages, and work with the bundled themes. It also documents the block-ID preservation rules agents must follow when editing documents that use stable `{{attrs[#blk-...]}}` heading ids.
|
|
105
|
+
|
|
106
|
+
In the installed package, the skill lives at a stable path:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
node_modules/orz-markdown/orz-markdown-skills/SKILL.md
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
with supporting files under `orz-markdown-skills/references/` and `orz-markdown-skills/assets/`. Point your agent tooling at that directory (e.g. copy or symlink it into your agent's skills folder).
|
|
87
113
|
|
|
88
114
|
## Official Plugins Bundled
|
|
89
115
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAC9B,OAAO,UAAU,MAAM,aAAa,CAAC;AAkBrC,OAAO,mBAAmB,CAAC;AAC3B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,QAAA,MAAM,EAAE,YAMN,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAC9B,OAAO,UAAU,MAAM,aAAa,CAAC;AAkBrC,OAAO,mBAAmB,CAAC;AAC3B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,oBAAoB,CAAC;AAC5B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,QAAA,MAAM,EAAE,YAMN,CAAC;AAsIH,eAAe,EAAE,CAAC;AAClB,OAAO,EAAE,EAAE,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -132,10 +132,14 @@ md.use(markdown_it_katex_1.default, { enableMhchem: true });
|
|
|
132
132
|
// Custom dispatchers
|
|
133
133
|
md.block.ruler.after('blockquote', 'plugin_block_dispatcher', block_dispatcher_js_1.blockDispatcher, { alt: ['paragraph', 'reference', 'blockquote', 'list'] });
|
|
134
134
|
md.inline.ruler.after('escape', 'plugin_inline_dispatcher', inline_dispatcher_js_1.inlineDispatcher);
|
|
135
|
-
// Register plugins that need access to the md instance
|
|
135
|
+
// Register plugins that need access to the md instance.
|
|
136
|
+
// Order matters: attrs must register before toc so the `attrs_resolve` core
|
|
137
|
+
// rule runs before `toc_resolve` — TOC links must use the final heading ids,
|
|
138
|
+
// including custom ids set via {{attrs[#...]}} (which override the
|
|
139
|
+
// markdown-it-anchor slug).
|
|
136
140
|
(0, span_js_1.registerSpan)(md);
|
|
137
|
-
(0, toc_js_1.registerToc)(md);
|
|
138
141
|
(0, attrs_js_1.registerAttrs)(md);
|
|
142
|
+
(0, toc_js_1.registerToc)(md);
|
|
139
143
|
(0, markdown_include_js_1.registerMarkdownInclude)(md);
|
|
140
144
|
// Renderer for plugin_block tokens
|
|
141
145
|
md.renderer.rules['plugin_block'] = (tokens, idx, _options, env) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,gCAA8B;AAC9B,8DAAqC;AACrC,4EAAwC;AACxC,kFAA8C;AAC9C,gFAA4C;AAC5C,4EAAwC;AACxC,wEAAoC;AACpC,sEAAkC;AAClC,sEAAkC;AAClC,sEAAkC;AAClC,oFAA+C;AAC/C,sFAAwD;AACxD,qEAA8D;AAC9D,uEAAgE;AAChE,+CAA8C;AAC9C,+CAAiD;AACjD,6CAA+C;AAC/C,iDAAmD;AACnD,uEAAwE;AACxE,6BAA2B;AAC3B,8BAA4B;AAC5B,8BAA4B;AAC5B,gCAA8B;AAC9B,gCAA8B;AAC9B,+BAA6B;AAC7B,+BAA6B;AAC7B,6BAA2B;AAC3B,6BAA2B;AAE3B,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AAEjB,2DAAsD;AAA7C,oHAAA,cAAc,OAAA;AAEvB,MAAM,EAAE,GAAG,IAAI,qBAAU,CAAC;IACxB,0EAA0E;IAC1E,+DAA+D;IAC/D,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attrs.d.ts","sourceRoot":"","sources":["../../src/plugins/attrs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAoB1C,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"attrs.d.ts","sourceRoot":"","sources":["../../src/plugins/attrs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAoB1C,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAiDlD"}
|
package/dist/plugins/attrs.js
CHANGED
|
@@ -51,7 +51,17 @@ function registerAttrs(md) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
// Remove the marker token from inline children
|
|
54
|
+
const markerWasLast = j === children.length - 1;
|
|
54
55
|
children.splice(j, 1);
|
|
56
|
+
// `## Title {{attrs[#x]}}` would otherwise leave a trailing space in
|
|
57
|
+
// the heading text (and in TOC entries). Trim it when the marker was
|
|
58
|
+
// the last child, so removal leaves no whitespace artifact.
|
|
59
|
+
if (markerWasLast) {
|
|
60
|
+
const prevChild = children[j - 1];
|
|
61
|
+
if (prevChild && prevChild.type === 'text') {
|
|
62
|
+
prevChild.content = prevChild.content.replace(/\s+$/, '');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
55
65
|
j--;
|
|
56
66
|
}
|
|
57
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attrs.js","sourceRoot":"","sources":["../../src/plugins/attrs.ts"],"names":[],"mappings":";;AAoBA,
|
|
1
|
+
{"version":3,"file":"attrs.js","sourceRoot":"","sources":["../../src/plugins/attrs.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins/mermaid.js
CHANGED
|
@@ -7,12 +7,25 @@ function escapeHtml(str) {
|
|
|
7
7
|
.replace(/</g, '<')
|
|
8
8
|
.replace(/>/g, '>');
|
|
9
9
|
}
|
|
10
|
+
// Encode a value for a double-quoted HTML attribute, preserving newlines (as
|
|
11
|
+
// ) so multi-line source survives in `data-md`.
|
|
12
|
+
function escapeAttr(str) {
|
|
13
|
+
return str
|
|
14
|
+
.replace(/&/g, '&')
|
|
15
|
+
.replace(/"/g, '"')
|
|
16
|
+
.replace(/</g, '<')
|
|
17
|
+
.replace(/>/g, '>')
|
|
18
|
+
.replace(/\n/g, ' ');
|
|
19
|
+
}
|
|
10
20
|
(0, registry_js_1.register)({
|
|
11
21
|
type: 'block',
|
|
12
22
|
aliases: ['mermaid', 'mm'],
|
|
13
23
|
render(_args, body, _env) {
|
|
14
24
|
const content = body?.trim() ?? '';
|
|
15
|
-
|
|
25
|
+
// `data-md` lets copy-as-markdown recover the source after client-side
|
|
26
|
+
// mermaid rendering replaces the div contents with an <svg>.
|
|
27
|
+
const directive = `{{mermaid\n${content}\n}}`;
|
|
28
|
+
return `<div class="mermaid" data-md="${escapeAttr(directive)}">${escapeHtml(content)}</div>\n`;
|
|
16
29
|
},
|
|
17
30
|
});
|
|
18
31
|
//# sourceMappingURL=mermaid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/plugins/mermaid.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/plugins/mermaid.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,6EAA6E;AAC7E,qDAAqD;AACrD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,uEAAuE;QACvE,6DAA6D;QAC7D,MAAM,SAAS,GAAG,cAAc,OAAO,MAAM,CAAC;QAC9C,OAAO,iCAAiC,UAAU,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;IAClG,CAAC;CACF,CAAC,CAAC"}
|
package/dist/plugins/qrcode.js
CHANGED
|
@@ -5,6 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const qrcode_svg_1 = __importDefault(require("qrcode-svg"));
|
|
7
7
|
const registry_js_1 = require("../registry.js");
|
|
8
|
+
function escapeAttr(str) {
|
|
9
|
+
return str
|
|
10
|
+
.replace(/&/g, '&')
|
|
11
|
+
.replace(/"/g, '"')
|
|
12
|
+
.replace(/</g, '<')
|
|
13
|
+
.replace(/>/g, '>');
|
|
14
|
+
}
|
|
8
15
|
(0, registry_js_1.register)({
|
|
9
16
|
type: 'inline',
|
|
10
17
|
aliases: ['qr', 'qrcode'],
|
|
@@ -15,7 +22,10 @@ const registry_js_1 = require("../registry.js");
|
|
|
15
22
|
const size = 96;
|
|
16
23
|
const rawSvg = new qrcode_svg_1.default({ content, width: size, height: size, padding: 0, color: '#000000', background: '#ffffff' }).svg();
|
|
17
24
|
const svg = rawSvg.replace('<svg ', `<svg viewBox="0 0 ${size} ${size}" preserveAspectRatio="xMidYMid meet" `);
|
|
18
|
-
|
|
25
|
+
// `data-md` carries the source: the QR content is otherwise encoded only in
|
|
26
|
+
// the SVG modules and cannot be recovered for copy-as-markdown.
|
|
27
|
+
const directive = escapeAttr(`{{qr ${content}}}`);
|
|
28
|
+
return `<span class="qrcode" data-md="${directive}" role="button" tabindex="0" aria-label="Expand QR code" aria-expanded="false"><span class="qrcode__icon" aria-hidden="true">⤢</span>${svg}</span>`;
|
|
19
29
|
},
|
|
20
30
|
});
|
|
21
31
|
//# sourceMappingURL=qrcode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../src/plugins/qrcode.ts"],"names":[],"mappings":";;;;;AAAA,4DAAgC;AAChC,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7H,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CACxB,OAAO,EACP,qBAAqB,IAAI,IAAI,IAAI,wCAAwC,CAC1E,CAAC;QACF,OAAO,
|
|
1
|
+
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../src/plugins/qrcode.ts"],"names":[],"mappings":";;;;;AAAA,4DAAgC;AAChC,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7H,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CACxB,OAAO,EACP,qBAAqB,IAAI,IAAI,IAAI,wCAAwC,CAC1E,CAAC;QACF,4EAA4E;QAC5E,gEAAgE;QAChE,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,OAAO,IAAI,CAAC,CAAC;QAClD,OAAO,iCAAiC,SAAS,wIAAwI,GAAG,SAAS,CAAC;IACxM,CAAC;CACF,CAAC,CAAC"}
|
package/dist/plugins/smiles.js
CHANGED
|
@@ -13,7 +13,10 @@ function escapeAttr(str) {
|
|
|
13
13
|
aliases: ['smiles', 'sm'],
|
|
14
14
|
render(_args, body, _env) {
|
|
15
15
|
const smiles = body?.trim() ?? '';
|
|
16
|
-
|
|
16
|
+
// `data-md` lets copy-as-markdown recover the source after smiles-drawer
|
|
17
|
+
// paints the <canvas> (which has no recoverable text content).
|
|
18
|
+
const directive = escapeAttr(`{{smiles ${smiles}}}`);
|
|
19
|
+
return `<div class="smiles-render" data-md="${directive}">\n <canvas data-smiles="${escapeAttr(smiles)}" width="250" height="180"></canvas>\n</div>\n`;
|
|
17
20
|
},
|
|
18
21
|
});
|
|
19
22
|
//# sourceMappingURL=smiles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smiles.js","sourceRoot":"","sources":["../../src/plugins/smiles.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"smiles.js","sourceRoot":"","sources":["../../src/plugins/smiles.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAClC,yEAAyE;QACzE,+DAA+D;QAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,MAAM,IAAI,CAAC,CAAC;QACrD,OAAO,uCAAuC,SAAS,8BAA8B,UAAU,CAAC,MAAM,CAAC,gDAAgD,CAAC;IAC1J,CAAC;CACF,CAAC,CAAC"}
|
package/dist/plugins/youtube.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const registry_js_1 = require("../registry.js");
|
|
4
|
+
function escapeAttr(str) {
|
|
5
|
+
return str
|
|
6
|
+
.replace(/&/g, '&')
|
|
7
|
+
.replace(/"/g, '"')
|
|
8
|
+
.replace(/</g, '<')
|
|
9
|
+
.replace(/>/g, '>');
|
|
10
|
+
}
|
|
4
11
|
(0, registry_js_1.register)({
|
|
5
12
|
type: 'block',
|
|
6
13
|
aliases: ['youtube', 'yt'],
|
|
@@ -8,7 +15,8 @@ const registry_js_1 = require("../registry.js");
|
|
|
8
15
|
const id = body?.trim();
|
|
9
16
|
if (!id)
|
|
10
17
|
return '';
|
|
11
|
-
|
|
18
|
+
const directive = escapeAttr(`{{youtube ${id}}}`);
|
|
19
|
+
return (`<div class="youtube-embed" data-md="${directive}">\n` +
|
|
12
20
|
` <iframe src="https://www.youtube.com/embed/${id}"\n` +
|
|
13
21
|
` allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"\n` +
|
|
14
22
|
` referrerpolicy="strict-origin-when-cross-origin"\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/plugins/youtube.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,OAAO,CACL
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/plugins/youtube.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,CACL,uCAAuC,SAAS,MAAM;YACtD,gDAAgD,EAAE,KAAK;YACvD,mHAAmH;YACnH,wDAAwD;YACxD,iCAAiC;YACjC,UAAU,CACX,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,QAkZhC,CAAC;AAEF,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
|
package/dist/runtime.js
CHANGED
|
@@ -86,6 +86,285 @@ exports.browserRuntimeScript = String.raw `
|
|
|
86
86
|
initQrCodes(root || global.document);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
// ---- copy-as-markdown: DOM -> Markdown walker ---------------------------
|
|
90
|
+
// Converts a selected DOM fragment back to Markdown so that copying rendered
|
|
91
|
+
// content yields source, not HTML. Standard constructs are reconstructed from
|
|
92
|
+
// their tags; generated constructs (math, mermaid, smiles, qr, youtube) carry
|
|
93
|
+
// a [data-md] breadcrumb that is emitted verbatim. Written without template
|
|
94
|
+
// literals/backticks because this whole file is a String.raw template.
|
|
95
|
+
var BT = String.fromCharCode(96);
|
|
96
|
+
var FENCE = BT + BT + BT;
|
|
97
|
+
|
|
98
|
+
function rt_repeat(s, n) {
|
|
99
|
+
var out = '';
|
|
100
|
+
for (var i = 0; i < n; i++) out += s;
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function rt_attr(node, name) {
|
|
105
|
+
return node && node.getAttribute ? node.getAttribute(name) : null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function rt_isBlockElement(node) {
|
|
109
|
+
if (!node || node.nodeType !== 1) return false;
|
|
110
|
+
if (rt_attr(node, 'data-md') != null) return true;
|
|
111
|
+
var tag = node.tagName.toLowerCase();
|
|
112
|
+
if (/^(p|div|section|article|figure|h[1-6]|ul|ol|li|blockquote|pre|table|thead|tbody|tr|hr|details)$/.test(tag)) return true;
|
|
113
|
+
if (node.classList && (node.classList.contains('katex-display') || node.classList.contains('mermaid'))) return true;
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function rt_katex(node, display) {
|
|
118
|
+
var ann = node.querySelector ? node.querySelector('annotation[encoding="application/x-tex"]') : null;
|
|
119
|
+
var tex = (ann ? ann.textContent : node.textContent) || '';
|
|
120
|
+
tex = tex.replace(/^\s+|\s+$/g, '');
|
|
121
|
+
if (display) return '$$\n' + tex + '\n$$';
|
|
122
|
+
return '$' + tex + '$';
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function rt_img(node) {
|
|
126
|
+
var alt = rt_attr(node, 'alt') || '';
|
|
127
|
+
var src = rt_attr(node, 'src') || '';
|
|
128
|
+
var title = rt_attr(node, 'title');
|
|
129
|
+
return ' + ')';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function rt_inlineChildren(node) {
|
|
133
|
+
var out = '';
|
|
134
|
+
var kids = node.childNodes;
|
|
135
|
+
for (var i = 0; i < kids.length; i++) out += rt_inlineNode(kids[i]);
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function rt_inlineNode(node) {
|
|
140
|
+
if (node.nodeType === 3) return node.nodeValue.replace(/\s+/g, ' ');
|
|
141
|
+
if (node.nodeType !== 1) return '';
|
|
142
|
+
var dm = rt_attr(node, 'data-md');
|
|
143
|
+
if (dm != null) return dm;
|
|
144
|
+
if (node.classList && node.classList.contains('katex')) return rt_katex(node, false);
|
|
145
|
+
var tag = node.tagName.toLowerCase();
|
|
146
|
+
switch (tag) {
|
|
147
|
+
case 'strong': case 'b': return '**' + rt_inlineChildren(node) + '**';
|
|
148
|
+
case 'em': case 'i': return '*' + rt_inlineChildren(node) + '*';
|
|
149
|
+
case 'code': return BT + (node.textContent || '') + BT;
|
|
150
|
+
case 'a':
|
|
151
|
+
var href = rt_attr(node, 'href') || '';
|
|
152
|
+
var title = rt_attr(node, 'title');
|
|
153
|
+
return '[' + rt_inlineChildren(node) + '](' + href + (title ? ' "' + title + '"' : '') + ')';
|
|
154
|
+
case 'del': case 's': return '~~' + rt_inlineChildren(node) + '~~';
|
|
155
|
+
case 'ins': return '++' + rt_inlineChildren(node) + '++';
|
|
156
|
+
case 'mark': return '==' + rt_inlineChildren(node) + '==';
|
|
157
|
+
case 'sub': return '~' + rt_inlineChildren(node) + '~';
|
|
158
|
+
case 'sup': return '^' + rt_inlineChildren(node) + '^';
|
|
159
|
+
case 'br': return ' \n';
|
|
160
|
+
case 'img': return rt_img(node);
|
|
161
|
+
case 'input': return '';
|
|
162
|
+
default: return rt_inlineChildren(node);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function rt_align(cell) {
|
|
167
|
+
var style = (rt_attr(cell, 'style') || '').toLowerCase();
|
|
168
|
+
if (style.indexOf('center') !== -1) return 'center';
|
|
169
|
+
if (style.indexOf('right') !== -1) return 'right';
|
|
170
|
+
if (style.indexOf('left') !== -1) return 'left';
|
|
171
|
+
return '';
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function rt_sep(align) {
|
|
175
|
+
if (align === 'center') return ':---:';
|
|
176
|
+
if (align === 'right') return '---:';
|
|
177
|
+
if (align === 'left') return ':---';
|
|
178
|
+
return '---';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function rt_table(tbl) {
|
|
182
|
+
var rows = [];
|
|
183
|
+
var aligns = [];
|
|
184
|
+
var header = [];
|
|
185
|
+
var headRow = tbl.querySelector ? tbl.querySelector('thead tr') : null;
|
|
186
|
+
if (headRow) {
|
|
187
|
+
var hc = headRow.children;
|
|
188
|
+
for (var i = 0; i < hc.length; i++) { header.push(rt_inlineChildren(hc[i]).trim()); aligns.push(rt_align(hc[i])); }
|
|
189
|
+
}
|
|
190
|
+
rows.push('| ' + header.join(' | ') + ' |');
|
|
191
|
+
var seps = [];
|
|
192
|
+
for (var s = 0; s < header.length; s++) seps.push(rt_sep(aligns[s]));
|
|
193
|
+
rows.push('| ' + seps.join(' | ') + ' |');
|
|
194
|
+
var bodyRows = tbl.querySelectorAll ? tbl.querySelectorAll('tbody tr') : [];
|
|
195
|
+
for (var r = 0; r < bodyRows.length; r++) {
|
|
196
|
+
var cells = [];
|
|
197
|
+
var tds = bodyRows[r].children;
|
|
198
|
+
for (var c = 0; c < tds.length; c++) cells.push(rt_inlineChildren(tds[c]).trim());
|
|
199
|
+
rows.push('| ' + cells.join(' | ') + ' |');
|
|
200
|
+
}
|
|
201
|
+
return rows.join('\n');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function rt_codeBlock(pre) {
|
|
205
|
+
var code = pre.querySelector ? (pre.querySelector('code') || pre) : pre;
|
|
206
|
+
var lang = '';
|
|
207
|
+
var cls = rt_attr(code, 'class') || '';
|
|
208
|
+
var m = cls.match(/language-([A-Za-z0-9_+#-]+)/);
|
|
209
|
+
if (m) lang = m[1];
|
|
210
|
+
var text = (code.textContent || '').replace(/\n$/, '');
|
|
211
|
+
return FENCE + lang + '\n' + text + '\n' + FENCE;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function rt_list(node, ordered, depth) {
|
|
215
|
+
var items = [];
|
|
216
|
+
var idx = 1;
|
|
217
|
+
var kids = node.childNodes;
|
|
218
|
+
for (var i = 0; i < kids.length; i++) {
|
|
219
|
+
var li = kids[i];
|
|
220
|
+
if (li.nodeType !== 1 || li.tagName.toLowerCase() !== 'li') continue;
|
|
221
|
+
items.push(rt_listItem(li, ordered, idx, depth));
|
|
222
|
+
idx++;
|
|
223
|
+
}
|
|
224
|
+
return items.join('\n');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function rt_listItem(li, ordered, idx, depth) {
|
|
228
|
+
var indent = rt_repeat(' ', depth);
|
|
229
|
+
var marker = ordered ? (idx + '. ') : '- ';
|
|
230
|
+
var task = '';
|
|
231
|
+
var cb = li.querySelector ? li.querySelector('input[type="checkbox"]') : null;
|
|
232
|
+
if (cb) task = (cb.checked || rt_attr(cb, 'checked') != null) ? '[x] ' : '[ ] ';
|
|
233
|
+
var inlineParts = '';
|
|
234
|
+
var nested = '';
|
|
235
|
+
var kids = li.childNodes;
|
|
236
|
+
for (var i = 0; i < kids.length; i++) {
|
|
237
|
+
var c = kids[i];
|
|
238
|
+
if (c.nodeType === 1 && /^(ul|ol)$/.test(c.tagName.toLowerCase())) {
|
|
239
|
+
nested += '\n' + rt_list(c, c.tagName.toLowerCase() === 'ol', depth + 1);
|
|
240
|
+
} else {
|
|
241
|
+
inlineParts += rt_inlineNode(c);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
inlineParts = inlineParts.replace(/\s+/g, ' ').trim();
|
|
245
|
+
return indent + marker + task + inlineParts + nested;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function rt_blockquote(node) {
|
|
249
|
+
var inner = rt_blockChildren(node);
|
|
250
|
+
var lines = inner.split('\n');
|
|
251
|
+
var out = [];
|
|
252
|
+
for (var i = 0; i < lines.length; i++) out.push(lines[i] ? '> ' + lines[i] : '>');
|
|
253
|
+
return out.join('\n');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function rt_blockChildren(node) {
|
|
257
|
+
var parts = [];
|
|
258
|
+
var kids = node.childNodes;
|
|
259
|
+
var i = 0;
|
|
260
|
+
while (i < kids.length) {
|
|
261
|
+
var k = kids[i];
|
|
262
|
+
// A selection can contain bare <li> elements (when the user selects a
|
|
263
|
+
// list's contents rather than the <ul>/<ol> wrapper). Group a run of them
|
|
264
|
+
// into a bullet list instead of emitting each as a separate block.
|
|
265
|
+
if (k.nodeType === 1 && k.tagName.toLowerCase() === 'li') {
|
|
266
|
+
var lis = [];
|
|
267
|
+
while (i < kids.length) {
|
|
268
|
+
var kk = kids[i];
|
|
269
|
+
if (kk.nodeType === 1 && kk.tagName.toLowerCase() === 'li') { lis.push(kk); i++; }
|
|
270
|
+
else if (kk.nodeType === 3 && !(kk.nodeValue || '').trim()) { i++; }
|
|
271
|
+
else break;
|
|
272
|
+
}
|
|
273
|
+
var items = [];
|
|
274
|
+
for (var j = 0; j < lis.length; j++) items.push(rt_listItem(lis[j], false, j + 1, 0));
|
|
275
|
+
parts.push(items.join('\n'));
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
var s = rt_blockNode(k);
|
|
279
|
+
if (s && s.replace(/\s/g, '') !== '') parts.push(s.replace(/\s+$/, ''));
|
|
280
|
+
i++;
|
|
281
|
+
}
|
|
282
|
+
return parts.join('\n\n');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function rt_blockNode(node) {
|
|
286
|
+
if (node.nodeType === 3) {
|
|
287
|
+
var t = node.nodeValue;
|
|
288
|
+
return (t && t.trim()) ? t.replace(/\s+/g, ' ').trim() : '';
|
|
289
|
+
}
|
|
290
|
+
if (node.nodeType !== 1) return '';
|
|
291
|
+
var dm = rt_attr(node, 'data-md');
|
|
292
|
+
if (dm != null) return dm;
|
|
293
|
+
if (node.classList) {
|
|
294
|
+
if (node.classList.contains('katex-display')) {
|
|
295
|
+
var k = node.querySelector ? node.querySelector('.katex') : null;
|
|
296
|
+
return rt_katex(k || node, true);
|
|
297
|
+
}
|
|
298
|
+
if (node.classList.contains('mermaid')) return '{{mermaid\n' + (node.textContent || '').trim() + '\n}}';
|
|
299
|
+
}
|
|
300
|
+
var tag = node.tagName.toLowerCase();
|
|
301
|
+
var hm = tag.match(/^h([1-6])$/);
|
|
302
|
+
if (hm) return rt_repeat('#', parseInt(hm[1], 10)) + ' ' + rt_inlineChildren(node).trim();
|
|
303
|
+
switch (tag) {
|
|
304
|
+
case 'p': return rt_inlineChildren(node).trim();
|
|
305
|
+
case 'ul': return rt_list(node, false, 0);
|
|
306
|
+
case 'ol': return rt_list(node, true, 0);
|
|
307
|
+
case 'pre': return rt_codeBlock(node);
|
|
308
|
+
case 'blockquote': return rt_blockquote(node);
|
|
309
|
+
case 'table': return rt_table(node);
|
|
310
|
+
case 'hr': return '---';
|
|
311
|
+
case 'li': return rt_inlineChildren(node).trim();
|
|
312
|
+
case 'figure': case 'div': case 'section': case 'article': case 'details': case 'summary':
|
|
313
|
+
return rt_blockChildren(node);
|
|
314
|
+
default: return rt_inlineNode(node).trim();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function elementToMarkdown(root) {
|
|
319
|
+
if (!root) return '';
|
|
320
|
+
var hasBlock = false;
|
|
321
|
+
var kids = root.childNodes || [];
|
|
322
|
+
for (var i = 0; i < kids.length; i++) {
|
|
323
|
+
if (rt_isBlockElement(kids[i])) { hasBlock = true; break; }
|
|
324
|
+
}
|
|
325
|
+
var out = hasBlock ? rt_blockChildren(root) : rt_inlineChildren(root);
|
|
326
|
+
return out.replace(/[ \t]+\n/g, '\n').replace(/\n{3,}/g, '\n\n').replace(/^\s+|\s+$/g, '');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function rt_isEditable(node) {
|
|
330
|
+
while (node) {
|
|
331
|
+
if (node.nodeType === 1) {
|
|
332
|
+
var tag = node.tagName.toLowerCase();
|
|
333
|
+
if (tag === 'input' || tag === 'textarea') return true;
|
|
334
|
+
if (node.isContentEditable) return true;
|
|
335
|
+
}
|
|
336
|
+
node = node.parentNode;
|
|
337
|
+
}
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function rt_withinCopyRoot(node) {
|
|
342
|
+
while (node) {
|
|
343
|
+
if (node.nodeType === 1 && node.classList &&
|
|
344
|
+
(node.classList.contains('markdown-body') || rt_attr(node, 'data-orz-copy') != null)) return true;
|
|
345
|
+
node = node.parentNode;
|
|
346
|
+
}
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function onCopy(event) {
|
|
351
|
+
if (!global.document) return;
|
|
352
|
+
var sel = global.getSelection ? global.getSelection()
|
|
353
|
+
: (global.document.getSelection ? global.document.getSelection() : null);
|
|
354
|
+
if (!sel || sel.rangeCount === 0 || sel.isCollapsed) return;
|
|
355
|
+
if (rt_isEditable(sel.anchorNode) || rt_isEditable(sel.focusNode)) return;
|
|
356
|
+
if (!rt_withinCopyRoot(sel.anchorNode) && !rt_withinCopyRoot(sel.focusNode)) return;
|
|
357
|
+
var container = global.document.createElement('div');
|
|
358
|
+
for (var i = 0; i < sel.rangeCount; i++) container.appendChild(sel.getRangeAt(i).cloneContents());
|
|
359
|
+
var md = elementToMarkdown(container);
|
|
360
|
+
if (!md) return;
|
|
361
|
+
var cd = event.clipboardData || global.clipboardData;
|
|
362
|
+
if (cd && cd.setData) {
|
|
363
|
+
cd.setData('text/plain', md);
|
|
364
|
+
if (event.preventDefault) event.preventDefault();
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
89
368
|
function bindGlobalHandlers() {
|
|
90
369
|
if (!global.document || global.__orzMarkdownRuntimeBound) return;
|
|
91
370
|
global.__orzMarkdownRuntimeBound = true;
|
|
@@ -101,12 +380,16 @@ exports.browserRuntimeScript = String.raw `
|
|
|
101
380
|
collapseQr();
|
|
102
381
|
}
|
|
103
382
|
});
|
|
383
|
+
|
|
384
|
+
// Copy rendered selections as Markdown source.
|
|
385
|
+
global.document.addEventListener('copy', onCopy);
|
|
104
386
|
}
|
|
105
387
|
|
|
106
388
|
global.OrzMarkdownRuntime = Object.assign({}, global.OrzMarkdownRuntime, {
|
|
107
389
|
init: init,
|
|
108
390
|
initQrCodes: initQrCodes,
|
|
109
391
|
collapseQr: collapseQr,
|
|
392
|
+
elementToMarkdown: elementToMarkdown,
|
|
110
393
|
});
|
|
111
394
|
|
|
112
395
|
bindGlobalHandlers();
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";;;AAoZA,0DAEC;AAtZY,QAAA,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkZ7C,CAAC;AAEF,SAAgB,uBAAuB;IACrC,OAAO,4BAAoB,CAAC;AAC9B,CAAC"}
|