@uniweb/semantic-parser 1.1.12 → 1.1.14

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 CHANGED
@@ -229,6 +229,29 @@ Bracketed spans (`[text]{.class}`) are converted to `<span>` elements with their
229
229
 
230
230
  Spans can have classes, IDs, and custom attributes. They combine with other marks—a span with bold becomes `<strong><span class="...">text</span></strong>`.
231
231
 
232
+ ### Inline Insets and Cross-references
233
+
234
+ The parser handles inline `inset_placeholder` nodes — generated by
235
+ `@uniweb/build`'s content collector when it pulls
236
+ `![alt](@Component){k=v}`, `[text](@Component){k=v}`, `[@key]{k=v}`,
237
+ or `[#id]{k=v}` references out of paragraph content. Two artifacts
238
+ ship to consumers:
239
+
240
+ 1. **`children` carries an `inset` entry per placeholder** — each
241
+ carrying the `refId` and `embedKind` (`'text'` for textual sugars
242
+ like `[@key]` / `[#id]` / `[text](@Component)`; `'visual'` for
243
+ `![alt](@Component)`). Renderers that walk `paragraph.children`
244
+ pick these up alongside icons, math, and links.
245
+
246
+ 2. **`text` carries a `<uniweb-inset data-ref-id="…"></uniweb-inset>`
247
+ marker** at the placeholder position — useful for renderers that
248
+ read `paragraph.text` as a flat HTML string (kit's `<Prose>` is the
249
+ canonical example; it splits on the marker and intersperses
250
+ React-rendered insets via the framework's child-block renderer).
251
+
252
+ The two views stay in lockstep — both record every inline inset the
253
+ parser sees, in source order.
254
+
232
255
  ## Use Cases
233
256
 
234
257
  - **Component-based websites**: Extract structured data for React/Vue components
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniweb/semantic-parser",
3
- "version": "1.1.12",
3
+ "version": "1.1.14",
4
4
  "description": "Semantic parser for ProseMirror/TipTap content structures",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -572,6 +572,8 @@ function parseImgBlock(itemAttrs) {
572
572
  theme,
573
573
  role,
574
574
  credit = "",
575
+ id, // {#fig-id} cross-reference label — preserved so Press
576
+ // adapters can emit \label{id} (LaTeX) / <id> (Typst).
575
577
  } = itemAttrs;
576
578
 
577
579
  let { contentType, viewType, contentId, identifier } = imgInfo || {};
@@ -605,6 +607,7 @@ function parseImgBlock(itemAttrs) {
605
607
  theme,
606
608
  role,
607
609
  credit,
610
+ id: id || undefined,
608
611
  };
609
612
  }
610
613
 
@@ -639,16 +642,24 @@ function parseVideoBlock(itemAttrs) {
639
642
  function stripTags(htmlString) {
640
643
  if (!htmlString || typeof htmlString !== "string") return "";
641
644
 
642
- // Remove HTML tags using regular expression
645
+ // Remove HTML tags using regular expression.
643
646
  const plainString = htmlString.replace(/<[^>]*>/g, "");
644
647
 
645
- // Decode HTML entities
646
- const decodedString = new DOMParser().parseFromString(
647
- plainString,
648
- "text/html"
649
- ).body.textContent;
650
-
651
- return decodedString;
648
+ // Decode the HTML entity subset citestyle / content-reader / kit emit.
649
+ // The previous DOMParser-based path covered every entity in the spec,
650
+ // but DOMParser is browser-only and crashes Node SSR (which the
651
+ // unipress compile pipeline runs in). The regex below covers the
652
+ // entities that actually appear in this codebase's emitted HTML.
653
+ return plainString
654
+ .replace(/&amp;/g, "&")
655
+ .replace(/&lt;/g, "<")
656
+ .replace(/&gt;/g, ">")
657
+ .replace(/&quot;/g, '"')
658
+ .replace(/&#39;/g, "'")
659
+ .replace(/&apos;/g, "'")
660
+ .replace(/&nbsp;/g, " ")
661
+ .replace(/&#(\d+);/g, (_, n) => String.fromCharCode(Number(n)))
662
+ .replace(/&#x([0-9a-fA-F]+);/g, (_, n) => String.fromCharCode(parseInt(n, 16)));
652
663
  }
653
664
 
654
665
  function isLink(item) {