@haklex/rich-litexml 0.36.1 → 0.37.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/.claude/skills/litexml-authoring/SKILL.md +1 -0
- package/.claude/skills/litexml-authoring/references/nodes-extensions.md +12 -0
- package/dist/browser.mjs +1 -1
- package/dist/node.mjs +1 -1
- package/dist/readers/custom.d.ts.map +1 -1
- package/dist/{src-D8TqVnUb.js → src-h5Q0X5zw.js} +27 -0
- package/dist/writers/custom.d.ts.map +1 -1
- package/package.json +22 -30
|
@@ -55,6 +55,7 @@ Detailed `When` / `Avoid when` / params / body rules for each tag live in [`node
|
|
|
55
55
|
| Paragraph, heading, list, table, link, inline format | `<p>` / `<h*>` / `<ul>` / `<ol>` / `<table>` / `<a>` / `<b>` / `<code>` / … | structural |
|
|
56
56
|
| Quote (with optional `attribution`) | `<blockquote>` | structural |
|
|
57
57
|
| Single image / multi-image / video / embed / link card | `<img>` / `<gallery>` / `<video>` / `<embed>` / `<link-card>` | extensions |
|
|
58
|
+
| Downloadable file attachment | `<attachment>` | extensions |
|
|
58
59
|
| Code (single / multi-file) | `<codeblock>` / `<code-snippet>` | extensions |
|
|
59
60
|
| Diagram (Mermaid / opaque) | `<mermaid>` / `<excalidraw>` | extensions |
|
|
60
61
|
| Math (inline / block) | `<math>` / `<math display="block">` | extensions |
|
|
@@ -37,6 +37,18 @@ Every block-level extension may carry `id="..."` → `$.blockId`. Omit for fresh
|
|
|
37
37
|
<video src="/clip.mp4" poster="/thumb.jpg" />
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
### `<attachment>` — file attachment
|
|
41
|
+
|
|
42
|
+
- **When**: A downloadable file attachment (PDF, archive, document).
|
|
43
|
+
- **Avoid when**: Image — use `<img>`. Playable video — use `<video>`. A code file inside `<code-snippet>` — that is the unrelated `<file>` child tag.
|
|
44
|
+
- **Required**: `src`, `name` (display file name).
|
|
45
|
+
- **Optional**: `id`, `size` (bytes), `mime-type`, `ext` (lowercase extension shown on the card), `display` (`inline` for an in-text chip; omit for a block card).
|
|
46
|
+
- **Body**: self-closing.
|
|
47
|
+
|
|
48
|
+
```xml
|
|
49
|
+
<attachment src="/spec.pdf" name="design-spec.pdf" size="2457600" mime-type="application/pdf" ext="pdf" />
|
|
50
|
+
```
|
|
51
|
+
|
|
40
52
|
### `<link-card>` — rich link preview
|
|
41
53
|
|
|
42
54
|
- **When**: A standalone reference URL that deserves a visible card (title, description, favicon, hero image).
|
package/dist/browser.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as createDefaultRegistry, c as LitexmlRegistry, d as registerParseHTML, i as deserializeNodesFromXml, l as registerCustomReaders, n as serializeToXml, o as registerCustomWriters, r as deserializeFromXml, s as registerBuiltinWriters, t as serializeNodesToXml, u as registerBuiltinReaders } from "./src-
|
|
1
|
+
import { a as createDefaultRegistry, c as LitexmlRegistry, d as registerParseHTML, i as deserializeNodesFromXml, l as registerCustomReaders, n as serializeToXml, o as registerCustomWriters, r as deserializeFromXml, s as registerBuiltinWriters, t as serializeNodesToXml, u as registerBuiltinReaders } from "./src-h5Q0X5zw.js";
|
|
2
2
|
//#region src/index-browser.ts
|
|
3
3
|
registerParseHTML((html) => new DOMParser().parseFromString(html, "text/html"));
|
|
4
4
|
//#endregion
|
package/dist/node.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as createDefaultRegistry, c as LitexmlRegistry, d as registerParseHTML, i as deserializeNodesFromXml, l as registerCustomReaders, n as serializeToXml, o as registerCustomWriters, r as deserializeFromXml, s as registerBuiltinWriters, t as serializeNodesToXml, u as registerBuiltinReaders } from "./src-
|
|
1
|
+
import { a as createDefaultRegistry, c as LitexmlRegistry, d as registerParseHTML, i as deserializeNodesFromXml, l as registerCustomReaders, n as serializeToXml, o as registerCustomWriters, r as deserializeFromXml, s as registerBuiltinWriters, t as serializeNodesToXml, u as registerBuiltinReaders } from "./src-h5Q0X5zw.js";
|
|
2
2
|
import { parseHTML } from "linkedom";
|
|
3
3
|
//#region src/index-node.ts
|
|
4
4
|
registerParseHTML((html) => parseHTML(html).document);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/readers/custom.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA0FnD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/readers/custom.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA0FnD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CA6frE"}
|
|
@@ -247,6 +247,17 @@ function registerCustomReaders(registry) {
|
|
|
247
247
|
height: numAttr(el, "height"),
|
|
248
248
|
version: 1
|
|
249
249
|
}));
|
|
250
|
+
registry.registerReader("attachment", (el) => ({
|
|
251
|
+
type: "file",
|
|
252
|
+
...extractBlockId(el),
|
|
253
|
+
src: el.getAttribute("src") ?? "",
|
|
254
|
+
name: el.getAttribute("name") ?? "",
|
|
255
|
+
size: numAttr(el, "size"),
|
|
256
|
+
mimeType: el.getAttribute("mime-type") ?? void 0,
|
|
257
|
+
ext: el.getAttribute("ext") ?? void 0,
|
|
258
|
+
display: el.getAttribute("display") === "inline" ? "inline" : "block",
|
|
259
|
+
version: 1
|
|
260
|
+
}));
|
|
250
261
|
registry.registerReader("link-card", (el) => ({
|
|
251
262
|
type: "link-card",
|
|
252
263
|
...extractBlockId(el),
|
|
@@ -733,6 +744,22 @@ function registerCustomWriters(registry) {
|
|
|
733
744
|
selfClosing: true
|
|
734
745
|
};
|
|
735
746
|
});
|
|
747
|
+
registry.registerWriter("file", (node) => {
|
|
748
|
+
const n = node;
|
|
749
|
+
return {
|
|
750
|
+
tag: "attachment",
|
|
751
|
+
attrs: optAttr({
|
|
752
|
+
...blockId(n),
|
|
753
|
+
"src": n.src,
|
|
754
|
+
"name": n.name,
|
|
755
|
+
"size": n.size != null ? String(n.size) : void 0,
|
|
756
|
+
"mime-type": n.mimeType,
|
|
757
|
+
"ext": n.ext,
|
|
758
|
+
"display": n.display === "inline" ? "inline" : void 0
|
|
759
|
+
}),
|
|
760
|
+
selfClosing: true
|
|
761
|
+
};
|
|
762
|
+
});
|
|
736
763
|
registry.registerWriter("link-card", (node) => {
|
|
737
764
|
const n = node;
|
|
738
765
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/writers/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAenD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/writers/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAenD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAoXrE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haklex/rich-litexml",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "Bidirectional Lexical SerializedNode <-> XML conversion with plugin registry",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -11,20 +11,25 @@
|
|
|
11
11
|
"type": "module",
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
14
|
-
"browser":
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
"browser": {
|
|
15
|
+
"import": "./dist/browser.mjs",
|
|
16
|
+
"types": "./dist/index-browser.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"node": {
|
|
19
|
+
"import": "./dist/node.mjs",
|
|
20
|
+
"types": "./dist/index-node.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"default": {
|
|
23
|
+
"import": "./dist/node.mjs",
|
|
24
|
+
"types": "./dist/index-node.d.ts"
|
|
25
|
+
}
|
|
17
26
|
}
|
|
18
27
|
},
|
|
19
|
-
"main": "./
|
|
28
|
+
"main": "./dist/node.mjs",
|
|
20
29
|
"files": [
|
|
21
30
|
".claude/skills/litexml-authoring",
|
|
22
31
|
"dist"
|
|
23
32
|
],
|
|
24
|
-
"scripts": {
|
|
25
|
-
"build": "vite build && node -e \"const fs=require('node:fs');fs.rmSync('.claude',{recursive:true,force:true});fs.cpSync('../../.claude/skills/litexml-authoring','.claude/skills/litexml-authoring',{recursive:true})\"",
|
|
26
|
-
"dev:build": "vite build --watch"
|
|
27
|
-
},
|
|
28
33
|
"dependencies": {
|
|
29
34
|
"lexical": "^0.49.0",
|
|
30
35
|
"linkedom": "^0.18.13",
|
|
@@ -36,24 +41,11 @@
|
|
|
36
41
|
"vite": "^8.2.2"
|
|
37
42
|
},
|
|
38
43
|
"publishConfig": {
|
|
39
|
-
"access": "public"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"import": "./dist/node.mjs",
|
|
48
|
-
"types": "./dist/index-node.d.ts"
|
|
49
|
-
},
|
|
50
|
-
"default": {
|
|
51
|
-
"import": "./dist/node.mjs",
|
|
52
|
-
"types": "./dist/index-node.d.ts"
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
"main": "./dist/node.mjs",
|
|
57
|
-
"types": "./dist/index-node.d.ts"
|
|
58
|
-
}
|
|
59
|
-
}
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "vite build && node -e \"const fs=require('node:fs');fs.rmSync('.claude',{recursive:true,force:true});fs.cpSync('../../.claude/skills/litexml-authoring','.claude/skills/litexml-authoring',{recursive:true})\"",
|
|
48
|
+
"dev:build": "vite build --watch"
|
|
49
|
+
},
|
|
50
|
+
"types": "./dist/index-node.d.ts"
|
|
51
|
+
}
|