@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.
@@ -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-D8TqVnUb.js";
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-D8TqVnUb.js";
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,CA6erE"}
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,CAmWrE"}
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.36.1",
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": "./src/index-browser.ts",
15
- "node": "./src/index-node.ts",
16
- "default": "./src/index-node.ts"
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": "./src/index-node.ts",
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
- "exports": {
41
- ".": {
42
- "browser": {
43
- "import": "./dist/browser.mjs",
44
- "types": "./dist/index-browser.d.ts"
45
- },
46
- "node": {
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
+ }