@examind/block-sdk 0.1.35 → 0.1.36

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.
Files changed (3) hide show
  1. package/dist/index.js +131 -79
  2. package/dist/index.mjs +126 -74
  3. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -260,6 +260,37 @@ var FinancialStatementQuestionNodeHandler = class extends NodeHandler {
260
260
  }
261
261
  };
262
262
 
263
+ // src/typeGuards/isSerializedHeadingNode.ts
264
+ var isSerializedHeadingNode = (node) => {
265
+ return node?.type === "heading";
266
+ };
267
+
268
+ // src/exportToHtml/elementTypeToFormat.ts
269
+ var ELEMENT_TYPE_TO_FORMAT = {
270
+ center: "center",
271
+ end: "end",
272
+ justify: "justify",
273
+ left: "left",
274
+ right: "right",
275
+ start: "start"
276
+ };
277
+
278
+ // src/exportToHtml/HeadingNodeHandler.ts
279
+ var HeadingNodeHandler = class extends NodeHandler {
280
+ processNode(node) {
281
+ if (!isSerializedHeadingNode(node)) return null;
282
+ const children = [];
283
+ node.children.forEach((child) => {
284
+ const childString = traverse(child);
285
+ if (childString) {
286
+ children.push(childString);
287
+ }
288
+ });
289
+ const attribute = node.format ? ` style="text-align: ${ELEMENT_TYPE_TO_FORMAT[node.format]};"` : "";
290
+ return `<${node.tag}${attribute}>${children.join("")}</${node.tag}>`;
291
+ }
292
+ };
293
+
263
294
  // src/typeGuards/isSerializedHorizontalRuleNode.ts
264
295
  var isSerializedHorizontalRuleNode = (node) => {
265
296
  return node?.type === "horizontalrule";
@@ -613,14 +644,6 @@ function isSerializedTableCellNode(node) {
613
644
  }
614
645
 
615
646
  // src/exportToHtml/ParagraphNodeHandler.ts
616
- var ELEMENT_TYPE_TO_FORMAT = {
617
- center: "center",
618
- end: "end",
619
- justify: "justify",
620
- left: "left",
621
- right: "right",
622
- start: "start"
623
- };
624
647
  var ParagraphNodeHandler = class extends NodeHandler {
625
648
  shouldAvoidParagraphWrap(node) {
626
649
  if (node === void 0) return false;
@@ -932,7 +955,7 @@ var VariableNodeHandler = class extends NodeHandler {
932
955
 
933
956
  // src/exportToHtml/traverse.ts
934
957
  var builder = new NodeHandlerChainBuilder();
935
- var nodeHandlerChain = builder.addHandler(CustomQuestionNodeHandler).addHandler(EssayQuestionNodeHandler).addHandler(FillInTheBlankQuestionNodeHandler).addHandler(FillInTheBlankSpaceNodeHandler).addHandler(FinancialStatementQuestionNodeHandler).addHandler(HorizontalRuleNodeHandler).addHandler(ImageNodeHandler).addHandler(JournalEntryQuestionNodeHandler).addHandler(LineBreakNodeHandler).addHandler(LinkNodeHandler).addHandler(ListNodeHandler).addHandler(ListItemNodeHandler).addHandler(MatchingQuestionNodeHandler).addHandler(MultipleOptionQuestionNodeHandler).addHandler(ParagraphNodeHandler).addHandler(ShortAnswerQuestionNodeHandler).addHandler(SimulationQuestionNodeHandler).addHandler(TableCellNodeHandler).addHandler(TableNodeHandler).addHandler(TableRowNodeHandler).addHandler(TextNodeHandler).addHandler(VariableNodeHandler).build();
958
+ var nodeHandlerChain = builder.addHandler(CustomQuestionNodeHandler).addHandler(EssayQuestionNodeHandler).addHandler(FillInTheBlankQuestionNodeHandler).addHandler(FillInTheBlankSpaceNodeHandler).addHandler(FinancialStatementQuestionNodeHandler).addHandler(HeadingNodeHandler).addHandler(HorizontalRuleNodeHandler).addHandler(ImageNodeHandler).addHandler(JournalEntryQuestionNodeHandler).addHandler(LineBreakNodeHandler).addHandler(LinkNodeHandler).addHandler(ListNodeHandler).addHandler(ListItemNodeHandler).addHandler(MatchingQuestionNodeHandler).addHandler(MultipleOptionQuestionNodeHandler).addHandler(ParagraphNodeHandler).addHandler(ShortAnswerQuestionNodeHandler).addHandler(SimulationQuestionNodeHandler).addHandler(TableCellNodeHandler).addHandler(TableNodeHandler).addHandler(TableRowNodeHandler).addHandler(TextNodeHandler).addHandler(VariableNodeHandler).build();
936
959
  var traverse = (node, metadata) => {
937
960
  return nodeHandlerChain.handle(node, metadata);
938
961
  };
@@ -951,7 +974,7 @@ function exportToHtml(editorState) {
951
974
  }
952
975
 
953
976
  // src/importFromHtml/index.ts
954
- var import_node_html_parser28 = require("node-html-parser");
977
+ var import_node_html_parser29 = require("node-html-parser");
955
978
 
956
979
  // src/importFromHtml/createEmptyParagraphNode.ts
957
980
  function createEmptyParagraphNode(format = "") {
@@ -1519,12 +1542,61 @@ var FormattedNodeHandler = class extends NodeHandler2 {
1519
1542
  }
1520
1543
  };
1521
1544
 
1522
- // src/importFromHtml/HorizontalRuleNodeHandler.ts
1545
+ // src/importFromHtml/HeadingNodeHandler.ts
1523
1546
  var import_node_html_parser9 = require("node-html-parser");
1547
+
1548
+ // src/importFromHtml/extractTextAlignment.ts
1549
+ var TEXT_ALIGN_TO_FORMAT = {
1550
+ center: "center",
1551
+ end: "end",
1552
+ justify: "justify",
1553
+ left: "left",
1554
+ right: "right",
1555
+ start: "start"
1556
+ };
1557
+ function extractTextAlignment(element) {
1558
+ if (!element.hasAttribute("style")) return "";
1559
+ const styleAttr = element.getAttribute("style");
1560
+ const textAlignMatch = styleAttr?.match(/text-align:\s*([^;]+)/i);
1561
+ if (textAlignMatch && textAlignMatch[1]) {
1562
+ const textAlign = textAlignMatch[1].trim();
1563
+ if (textAlign in TEXT_ALIGN_TO_FORMAT) {
1564
+ return TEXT_ALIGN_TO_FORMAT[textAlign];
1565
+ }
1566
+ }
1567
+ return "";
1568
+ }
1569
+
1570
+ // src/importFromHtml/HeadingNodeHandler.ts
1571
+ var TAG_HEADINGS = ["h1", "h2", "h3", "h4", "h5", "h6"];
1572
+ var HeadingNodeHandler2 = class extends NodeHandler2 {
1573
+ processNode(node) {
1574
+ if (!(node instanceof import_node_html_parser9.HTMLElement) || !TAG_HEADINGS.includes(node.tagName.toLowerCase())) {
1575
+ return null;
1576
+ }
1577
+ const headingNode = {
1578
+ type: "heading",
1579
+ version: 1,
1580
+ format: extractTextAlignment(node),
1581
+ tag: node.tagName.toLowerCase(),
1582
+ children: [],
1583
+ direction: "ltr",
1584
+ indent: 0
1585
+ };
1586
+ node.childNodes.forEach((child) => {
1587
+ const processedChildren = traverse2(child);
1588
+ headingNode.children.push(...processedChildren);
1589
+ });
1590
+ return headingNode;
1591
+ }
1592
+ };
1593
+
1594
+ // src/importFromHtml/HorizontalRuleNodeHandler.ts
1595
+ var import_node_html_parser10 = require("node-html-parser");
1524
1596
  var TAG_HR = "hr";
1525
1597
  var HorizontalRuleNodeHandler2 = class extends NodeHandler2 {
1526
1598
  processNode(node) {
1527
- if (!(node instanceof import_node_html_parser9.HTMLElement) || node.tagName !== TAG_HR.toUpperCase()) {
1599
+ if (!(node instanceof import_node_html_parser10.HTMLElement) || node.tagName !== TAG_HR.toUpperCase()) {
1528
1600
  return null;
1529
1601
  }
1530
1602
  const horizontalRuleNode = {
@@ -1536,11 +1608,11 @@ var HorizontalRuleNodeHandler2 = class extends NodeHandler2 {
1536
1608
  };
1537
1609
 
1538
1610
  // src/importFromHtml/ImageNodeHandler.ts
1539
- var import_node_html_parser10 = require("node-html-parser");
1611
+ var import_node_html_parser11 = require("node-html-parser");
1540
1612
  var TAG_IMG = "img";
1541
1613
  var ImageNodeHandler2 = class extends NodeHandler2 {
1542
1614
  processNode(node) {
1543
- if (!(node instanceof import_node_html_parser10.HTMLElement) || node.tagName !== TAG_IMG.toUpperCase()) {
1615
+ if (!(node instanceof import_node_html_parser11.HTMLElement) || node.tagName !== TAG_IMG.toUpperCase()) {
1544
1616
  return null;
1545
1617
  }
1546
1618
  return createImageNode(
@@ -1556,11 +1628,11 @@ var ImageNodeHandler2 = class extends NodeHandler2 {
1556
1628
 
1557
1629
  // src/importFromHtml/JournalEntryQuestionNodeHandler.ts
1558
1630
  var import_nanoid6 = require("nanoid");
1559
- var import_node_html_parser12 = require("node-html-parser");
1631
+ var import_node_html_parser13 = require("node-html-parser");
1560
1632
 
1561
1633
  // src/importFromHtml/createOnePerLineDistractorNode.ts
1562
1634
  var import_nanoid5 = require("nanoid");
1563
- var import_node_html_parser11 = require("node-html-parser");
1635
+ var import_node_html_parser12 = require("node-html-parser");
1564
1636
  function extractDistractorId(id) {
1565
1637
  if (!id) return null;
1566
1638
  const parts = id.split("|");
@@ -1573,7 +1645,7 @@ var createOnePerLineDistractorNode = (node) => {
1573
1645
  distractorEditor.editorState.root.children = [];
1574
1646
  let distractorId = null;
1575
1647
  distractors.forEach((distractor) => {
1576
- if (!(distractor instanceof import_node_html_parser11.HTMLElement)) return;
1648
+ if (!(distractor instanceof import_node_html_parser12.HTMLElement)) return;
1577
1649
  distractorId = distractorId ?? extractDistractorId(distractor.getAttribute("id"));
1578
1650
  distractorEditor.editorState.root.children.push(
1579
1651
  ...createNestedNodesFromHtml(distractor)
@@ -1591,7 +1663,7 @@ var createOnePerLineDistractorNode = (node) => {
1591
1663
  // src/importFromHtml/JournalEntryQuestionNodeHandler.ts
1592
1664
  var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1593
1665
  processNode(node) {
1594
- if (!(node instanceof import_node_html_parser12.HTMLElement) || node.tagName !== "x-journal-entry".toUpperCase())
1666
+ if (!(node instanceof import_node_html_parser13.HTMLElement) || node.tagName !== "x-journal-entry".toUpperCase())
1595
1667
  return null;
1596
1668
  const jsonNode = {
1597
1669
  id: node.getAttribute("id") ?? (0, import_nanoid6.nanoid)(),
@@ -1606,7 +1678,7 @@ var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1606
1678
  };
1607
1679
  const lineItems = node.querySelectorAll("x-line-item");
1608
1680
  lineItems.forEach((lineItem) => {
1609
- if (!(lineItem instanceof import_node_html_parser12.HTMLElement)) return;
1681
+ if (!(lineItem instanceof import_node_html_parser13.HTMLElement)) return;
1610
1682
  const accountElement = lineItem.querySelector("x-account");
1611
1683
  const debitElement = lineItem.querySelector("x-debit");
1612
1684
  const creditElement = lineItem.querySelector("x-credit");
@@ -1635,10 +1707,10 @@ var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1635
1707
  };
1636
1708
 
1637
1709
  // src/importFromHtml/LineBreakNodeHandler.ts
1638
- var import_node_html_parser13 = require("node-html-parser");
1710
+ var import_node_html_parser14 = require("node-html-parser");
1639
1711
  var LineBreakNodeHandler2 = class extends NodeHandler2 {
1640
1712
  processNode(node) {
1641
- if (!(node instanceof import_node_html_parser13.HTMLElement)) return null;
1713
+ if (!(node instanceof import_node_html_parser14.HTMLElement)) return null;
1642
1714
  if (node.tagName !== "BR") return null;
1643
1715
  return {
1644
1716
  type: "linebreak",
@@ -1648,11 +1720,11 @@ var LineBreakNodeHandler2 = class extends NodeHandler2 {
1648
1720
  };
1649
1721
 
1650
1722
  // src/importFromHtml/LinkNodeHandler.ts
1651
- var import_node_html_parser14 = require("node-html-parser");
1723
+ var import_node_html_parser15 = require("node-html-parser");
1652
1724
  var TAG_A = "a";
1653
1725
  var LinkNodeHandler2 = class extends NodeHandler2 {
1654
1726
  processNode(node) {
1655
- if (!(node instanceof import_node_html_parser14.HTMLElement) || node.tagName !== TAG_A.toUpperCase()) {
1727
+ if (!(node instanceof import_node_html_parser15.HTMLElement) || node.tagName !== TAG_A.toUpperCase()) {
1656
1728
  return null;
1657
1729
  }
1658
1730
  const url = node.getAttribute("href") || "";
@@ -1681,10 +1753,10 @@ var LinkNodeHandler2 = class extends NodeHandler2 {
1681
1753
  };
1682
1754
 
1683
1755
  // src/importFromHtml/ListItemNodeHandler.ts
1684
- var import_node_html_parser15 = require("node-html-parser");
1756
+ var import_node_html_parser16 = require("node-html-parser");
1685
1757
  var ListItemNodeHandler2 = class extends NodeHandler2 {
1686
1758
  processNode(node) {
1687
- if (!(node instanceof import_node_html_parser15.HTMLElement)) return null;
1759
+ if (!(node instanceof import_node_html_parser16.HTMLElement)) return null;
1688
1760
  if (node.tagName !== "LI") return null;
1689
1761
  const jsonNode = {
1690
1762
  type: "listitem",
@@ -1705,10 +1777,10 @@ var ListItemNodeHandler2 = class extends NodeHandler2 {
1705
1777
  };
1706
1778
 
1707
1779
  // src/importFromHtml/ListNodeHandler.ts
1708
- var import_node_html_parser16 = require("node-html-parser");
1780
+ var import_node_html_parser17 = require("node-html-parser");
1709
1781
  var ListNodeHandler2 = class extends NodeHandler2 {
1710
1782
  processNode(node) {
1711
- if (!(node instanceof import_node_html_parser16.HTMLElement)) return null;
1783
+ if (!(node instanceof import_node_html_parser17.HTMLElement)) return null;
1712
1784
  if (node.tagName !== "UL" && node.tagName !== "OL") return null;
1713
1785
  const tag = node.tagName.toLowerCase();
1714
1786
  const listType = tag === "ol" ? "number" : "bullet";
@@ -1726,7 +1798,7 @@ var ListNodeHandler2 = class extends NodeHandler2 {
1726
1798
  };
1727
1799
  let itemIndex = 1;
1728
1800
  node.childNodes.forEach((child) => {
1729
- if (child instanceof import_node_html_parser16.HTMLElement && child.tagName === "LI") {
1801
+ if (child instanceof import_node_html_parser17.HTMLElement && child.tagName === "LI") {
1730
1802
  const listItemNode = {
1731
1803
  type: "listitem",
1732
1804
  version: 1,
@@ -1751,10 +1823,10 @@ var ListNodeHandler2 = class extends NodeHandler2 {
1751
1823
 
1752
1824
  // src/importFromHtml/MatchingQuestionNodeHandler.ts
1753
1825
  var import_nanoid7 = require("nanoid");
1754
- var import_node_html_parser17 = require("node-html-parser");
1826
+ var import_node_html_parser18 = require("node-html-parser");
1755
1827
  var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
1756
1828
  processNode(node) {
1757
- if (!(node instanceof import_node_html_parser17.HTMLElement) || node.tagName !== "x-matching".toUpperCase())
1829
+ if (!(node instanceof import_node_html_parser18.HTMLElement) || node.tagName !== "x-matching".toUpperCase())
1758
1830
  return null;
1759
1831
  const jsonNode = {
1760
1832
  id: node.getAttribute("id") ?? (0, import_nanoid7.nanoid)(),
@@ -1767,7 +1839,7 @@ var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
1767
1839
  };
1768
1840
  const matches = node.querySelectorAll("x-match");
1769
1841
  matches.forEach((match) => {
1770
- if (!(match instanceof import_node_html_parser17.HTMLElement)) return;
1842
+ if (!(match instanceof import_node_html_parser18.HTMLElement)) return;
1771
1843
  const premise = match.querySelector("x-premise");
1772
1844
  const option = match.querySelector("x-option");
1773
1845
  if (!premise || !option) return;
@@ -1790,10 +1862,10 @@ var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
1790
1862
 
1791
1863
  // src/importFromHtml/MultipleOptionQuestionNodeHandler.ts
1792
1864
  var import_nanoid8 = require("nanoid");
1793
- var import_node_html_parser18 = require("node-html-parser");
1865
+ var import_node_html_parser19 = require("node-html-parser");
1794
1866
  var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
1795
1867
  processNode(node) {
1796
- if (!(node instanceof import_node_html_parser18.HTMLElement)) return null;
1868
+ if (!(node instanceof import_node_html_parser19.HTMLElement)) return null;
1797
1869
  if (node.tagName === "x-multiple-choice".toUpperCase())
1798
1870
  return this.processMultipleChoiceNode(node);
1799
1871
  else if (node.tagName === "x-multiple-answers".toUpperCase())
@@ -1833,7 +1905,7 @@ var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
1833
1905
  processOptions(node, jsonNode) {
1834
1906
  const childNodes = node.childNodes;
1835
1907
  childNodes.forEach((child) => {
1836
- if (!(child instanceof import_node_html_parser18.HTMLElement)) return;
1908
+ if (!(child instanceof import_node_html_parser19.HTMLElement)) return;
1837
1909
  if (child.tagName !== "x-option".toUpperCase()) return;
1838
1910
  jsonNode.options.push({
1839
1911
  id: child.getAttribute("id") ?? (0, import_nanoid8.nanoid)(),
@@ -1845,48 +1917,28 @@ var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
1845
1917
  };
1846
1918
 
1847
1919
  // src/importFromHtml/ParagraphNodeHandler.ts
1848
- var import_node_html_parser19 = require("node-html-parser");
1849
- var TEXT_ALIGN_TO_FORMAT = {
1850
- center: "center",
1851
- end: "end",
1852
- justify: "justify",
1853
- left: "left",
1854
- right: "right",
1855
- start: "start"
1856
- };
1920
+ var import_node_html_parser20 = require("node-html-parser");
1857
1921
  var ParagraphNodeHandler2 = class extends NodeHandler2 {
1858
- extractTextAlignment(element) {
1859
- if (!element.hasAttribute("style")) return "";
1860
- const styleAttr = element.getAttribute("style");
1861
- const textAlignMatch = styleAttr?.match(/text-align:\s*([^;]+)/i);
1862
- if (textAlignMatch && textAlignMatch[1]) {
1863
- const textAlign = textAlignMatch[1].trim();
1864
- if (textAlign in TEXT_ALIGN_TO_FORMAT) {
1865
- return TEXT_ALIGN_TO_FORMAT[textAlign];
1866
- }
1867
- }
1868
- return "";
1869
- }
1870
1922
  processImageNode(node) {
1871
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser19.HTMLElement && node.childNodes[0].tagName === "IMG") {
1923
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser20.HTMLElement && node.childNodes[0].tagName === "IMG") {
1872
1924
  return traverse2(node.childNodes[0]);
1873
1925
  }
1874
1926
  return null;
1875
1927
  }
1876
1928
  processSpanImageNode(node) {
1877
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser19.HTMLElement && node.childNodes[0].tagName === "SPAN" && node.childNodes[0].childNodes.length === 1 && node.childNodes[0].childNodes[0] instanceof import_node_html_parser19.HTMLElement && node.childNodes[0].childNodes[0].tagName === "IMG") {
1929
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser20.HTMLElement && node.childNodes[0].tagName === "SPAN" && node.childNodes[0].childNodes.length === 1 && node.childNodes[0].childNodes[0] instanceof import_node_html_parser20.HTMLElement && node.childNodes[0].childNodes[0].tagName === "IMG") {
1878
1930
  return traverse2(node.childNodes[0].childNodes[0]);
1879
1931
  }
1880
1932
  return null;
1881
1933
  }
1882
1934
  processNode(node) {
1883
- if (!(node instanceof import_node_html_parser19.HTMLElement)) return null;
1935
+ if (!(node instanceof import_node_html_parser20.HTMLElement)) return null;
1884
1936
  if (node.tagName !== "P") return null;
1885
1937
  const imageNode = this.processImageNode(node) ?? this.processSpanImageNode(node);
1886
1938
  if (imageNode) return imageNode;
1887
1939
  const jsonNode = createEmptyParagraphNode();
1888
- jsonNode.format = this.extractTextAlignment(node);
1889
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser19.HTMLElement && node.childNodes[0].tagName === "BR")
1940
+ jsonNode.format = extractTextAlignment(node);
1941
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser20.HTMLElement && node.childNodes[0].tagName === "BR")
1890
1942
  return jsonNode;
1891
1943
  node.childNodes.forEach((child) => {
1892
1944
  const processedChildren = traverse2(child);
@@ -1898,10 +1950,10 @@ var ParagraphNodeHandler2 = class extends NodeHandler2 {
1898
1950
 
1899
1951
  // src/importFromHtml/ShortAnswerQuestionNodeHandler.ts
1900
1952
  var import_nanoid9 = require("nanoid");
1901
- var import_node_html_parser20 = require("node-html-parser");
1953
+ var import_node_html_parser21 = require("node-html-parser");
1902
1954
  var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
1903
1955
  processNode(node) {
1904
- if (!(node instanceof import_node_html_parser20.HTMLElement) || node.tagName !== "x-short-answer".toUpperCase())
1956
+ if (!(node instanceof import_node_html_parser21.HTMLElement) || node.tagName !== "x-short-answer".toUpperCase())
1905
1957
  return null;
1906
1958
  return {
1907
1959
  id: node.getAttribute("id") ?? (0, import_nanoid9.nanoid)(),
@@ -1917,7 +1969,7 @@ var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
1917
1969
  };
1918
1970
 
1919
1971
  // src/importFromHtml/SimulationQuestionNodeHandler.ts
1920
- var import_node_html_parser21 = require("node-html-parser");
1972
+ var import_node_html_parser22 = require("node-html-parser");
1921
1973
  var TAG_X_SIMULATION = "x-simulation";
1922
1974
  var TAG_X_SYSTEM_MESSAGE2 = "x-ai-system-message";
1923
1975
  var TAG_X_COMMENT_INSTRUCTIONS = "x-comment-instructions";
@@ -1925,7 +1977,7 @@ var TAG_X_STEP2_INSTRUCTIONS = "x-step2-instructions";
1925
1977
  var findFirstNonEmptyInnerHtml = (root, elementNames) => elementNames.map((name) => root.querySelector(name)).find((el) => el?.innerHTML.trim().length)?.innerHTML.trim() ?? null;
1926
1978
  var SimulationQuestionNodeHandler2 = class extends NodeHandler2 {
1927
1979
  processNode(node) {
1928
- if (!(node instanceof import_node_html_parser21.HTMLElement) || node.tagName !== TAG_X_SIMULATION.toUpperCase()) {
1980
+ if (!(node instanceof import_node_html_parser22.HTMLElement) || node.tagName !== TAG_X_SIMULATION.toUpperCase()) {
1929
1981
  return null;
1930
1982
  }
1931
1983
  const jsonNode = {
@@ -1946,11 +1998,11 @@ var SimulationQuestionNodeHandler2 = class extends NodeHandler2 {
1946
1998
  };
1947
1999
 
1948
2000
  // src/importFromHtml/SpanNodeHandler.ts
1949
- var import_node_html_parser22 = require("node-html-parser");
1950
- var TextNode = import_node_html_parser22.parse.TextNode;
2001
+ var import_node_html_parser23 = require("node-html-parser");
2002
+ var TextNode = import_node_html_parser23.parse.TextNode;
1951
2003
  var SpanNodeHandler = class extends NodeHandler2 {
1952
2004
  processNode(node) {
1953
- if (!(node instanceof import_node_html_parser22.HTMLElement) || node.tagName !== "SPAN")
2005
+ if (!(node instanceof import_node_html_parser23.HTMLElement) || node.tagName !== "SPAN")
1954
2006
  return null;
1955
2007
  const styleAttr = node.getAttribute("style") || "";
1956
2008
  if (node.childNodes.length === 1 && node.childNodes[0] instanceof TextNode) {
@@ -2012,7 +2064,7 @@ var SpanNodeHandler = class extends NodeHandler2 {
2012
2064
  };
2013
2065
 
2014
2066
  // src/importFromHtml/TableCellNodeHandler.ts
2015
- var import_node_html_parser23 = require("node-html-parser");
2067
+ var import_node_html_parser24 = require("node-html-parser");
2016
2068
 
2017
2069
  // src/utils/styleUtils.ts
2018
2070
  var extractStyleValue = (styleAttr, property, isNumeric = false, unit = "") => {
@@ -2061,7 +2113,7 @@ function createEmptyTableCellNode(isHeader = false) {
2061
2113
 
2062
2114
  // src/importFromHtml/TableCellNodeHandler.ts
2063
2115
  var isHtmlTableCellElement = (node) => {
2064
- return node instanceof import_node_html_parser23.HTMLElement && (node.tagName === "TD" || node.tagName === "TH");
2116
+ return node instanceof import_node_html_parser24.HTMLElement && (node.tagName === "TD" || node.tagName === "TH");
2065
2117
  };
2066
2118
  var TableCellNodeHandler2 = class extends NodeHandler2 {
2067
2119
  processNode(node) {
@@ -2103,10 +2155,10 @@ var TableCellNodeHandler2 = class extends NodeHandler2 {
2103
2155
  };
2104
2156
 
2105
2157
  // src/importFromHtml/TableNodeHandler.ts
2106
- var import_node_html_parser24 = require("node-html-parser");
2158
+ var import_node_html_parser25 = require("node-html-parser");
2107
2159
  var REFERENCE_TABLE_WIDTH = 720;
2108
2160
  var MINIMUM_REFERENCE_TABLE_WIDTH = 500;
2109
- var isHtmlTableElement = (node) => node instanceof import_node_html_parser24.HTMLElement && node.tagName === "TABLE";
2161
+ var isHtmlTableElement = (node) => node instanceof import_node_html_parser25.HTMLElement && node.tagName === "TABLE";
2110
2162
  var TableNodeHandler2 = class extends NodeHandler2 {
2111
2163
  processNode(node) {
2112
2164
  if (!isHtmlTableElement(node)) return null;
@@ -2261,9 +2313,9 @@ var TableNodeHandler2 = class extends NodeHandler2 {
2261
2313
  };
2262
2314
 
2263
2315
  // src/importFromHtml/TableRowNodeHandler.ts
2264
- var import_node_html_parser25 = require("node-html-parser");
2316
+ var import_node_html_parser26 = require("node-html-parser");
2265
2317
  var isHtmlTableRowElement = (node) => {
2266
- return node instanceof import_node_html_parser25.HTMLElement && node.tagName === "TR";
2318
+ return node instanceof import_node_html_parser26.HTMLElement && node.tagName === "TR";
2267
2319
  };
2268
2320
  var TableRowNodeHandler2 = class extends NodeHandler2 {
2269
2321
  processNode(node) {
@@ -2286,8 +2338,8 @@ var TableRowNodeHandler2 = class extends NodeHandler2 {
2286
2338
  };
2287
2339
 
2288
2340
  // src/importFromHtml/TextNodeHandler.ts
2289
- var import_node_html_parser26 = require("node-html-parser");
2290
- var TextNode2 = import_node_html_parser26.parse.TextNode;
2341
+ var import_node_html_parser27 = require("node-html-parser");
2342
+ var TextNode2 = import_node_html_parser27.parse.TextNode;
2291
2343
  var TextNodeHandler2 = class extends NodeHandler2 {
2292
2344
  processNode(node) {
2293
2345
  if (!(node instanceof TextNode2)) return null;
@@ -2306,10 +2358,10 @@ var TextNodeHandler2 = class extends NodeHandler2 {
2306
2358
  };
2307
2359
 
2308
2360
  // src/importFromHtml/VariableNodeHandler.ts
2309
- var import_node_html_parser27 = require("node-html-parser");
2361
+ var import_node_html_parser28 = require("node-html-parser");
2310
2362
  var VariableNodeHandler2 = class extends NodeHandler2 {
2311
2363
  processNode(node) {
2312
- if (!(node instanceof import_node_html_parser27.HTMLElement) || !node.tagName) return null;
2364
+ if (!(node instanceof import_node_html_parser28.HTMLElement) || !node.tagName) return null;
2313
2365
  if (node.tagName !== "x-param".toUpperCase()) return null;
2314
2366
  return {
2315
2367
  variableName: node.getAttribute("data-x-name") || "undefined",
@@ -2322,7 +2374,7 @@ var VariableNodeHandler2 = class extends NodeHandler2 {
2322
2374
 
2323
2375
  // src/importFromHtml/traverse.ts
2324
2376
  var builder2 = new NodeHandlerChainBuilder();
2325
- var nodeHandlerChain2 = builder2.addHandler(CustomQuestionNodeHandler2).addHandler(DivNodeHandler).addHandler(EssayQuestionNodeHandler2).addHandler(FillInTheBlankQuestionNodeHandler2).addHandler(FillInTheBlankSpaceNodeHandler2).addHandler(FinancialStatementQuestionNodeHandler2).addHandler(FormattedNodeHandler).addHandler(ImageNodeHandler2).addHandler(HorizontalRuleNodeHandler2).addHandler(JournalEntryQuestionNodeHandler2).addHandler(LineBreakNodeHandler2).addHandler(LinkNodeHandler2).addHandler(ListNodeHandler2).addHandler(ListItemNodeHandler2).addHandler(MatchingQuestionNodeHandler2).addHandler(MultipleOptionQuestionNodeHandler2).addHandler(ParagraphNodeHandler2).addHandler(ShortAnswerQuestionNodeHandler2).addHandler(SimulationQuestionNodeHandler2).addHandler(SpanNodeHandler).addHandler(TableCellNodeHandler2).addHandler(TableNodeHandler2).addHandler(TableRowNodeHandler2).addHandler(TextNodeHandler2).addHandler(VariableNodeHandler2).build();
2377
+ var nodeHandlerChain2 = builder2.addHandler(CustomQuestionNodeHandler2).addHandler(DivNodeHandler).addHandler(EssayQuestionNodeHandler2).addHandler(FillInTheBlankQuestionNodeHandler2).addHandler(FillInTheBlankSpaceNodeHandler2).addHandler(FinancialStatementQuestionNodeHandler2).addHandler(FormattedNodeHandler).addHandler(ImageNodeHandler2).addHandler(HeadingNodeHandler2).addHandler(HorizontalRuleNodeHandler2).addHandler(JournalEntryQuestionNodeHandler2).addHandler(LineBreakNodeHandler2).addHandler(LinkNodeHandler2).addHandler(ListNodeHandler2).addHandler(ListItemNodeHandler2).addHandler(MatchingQuestionNodeHandler2).addHandler(MultipleOptionQuestionNodeHandler2).addHandler(ParagraphNodeHandler2).addHandler(ShortAnswerQuestionNodeHandler2).addHandler(SimulationQuestionNodeHandler2).addHandler(SpanNodeHandler).addHandler(TableCellNodeHandler2).addHandler(TableNodeHandler2).addHandler(TableRowNodeHandler2).addHandler(TextNodeHandler2).addHandler(VariableNodeHandler2).build();
2326
2378
  function traverse2(node) {
2327
2379
  const result = nodeHandlerChain2.handle(node);
2328
2380
  if (result === null) return [];
@@ -2340,7 +2392,7 @@ function processChildren(node) {
2340
2392
  return result;
2341
2393
  }
2342
2394
  function processHtml(html) {
2343
- const root = (0, import_node_html_parser28.parse)(html);
2395
+ const root = (0, import_node_html_parser29.parse)(html);
2344
2396
  return processChildren(root);
2345
2397
  }
2346
2398
  function importFromHtml(html) {
package/dist/index.mjs CHANGED
@@ -233,6 +233,37 @@ var FinancialStatementQuestionNodeHandler = class extends NodeHandler {
233
233
  }
234
234
  };
235
235
 
236
+ // src/typeGuards/isSerializedHeadingNode.ts
237
+ var isSerializedHeadingNode = (node) => {
238
+ return node?.type === "heading";
239
+ };
240
+
241
+ // src/exportToHtml/elementTypeToFormat.ts
242
+ var ELEMENT_TYPE_TO_FORMAT = {
243
+ center: "center",
244
+ end: "end",
245
+ justify: "justify",
246
+ left: "left",
247
+ right: "right",
248
+ start: "start"
249
+ };
250
+
251
+ // src/exportToHtml/HeadingNodeHandler.ts
252
+ var HeadingNodeHandler = class extends NodeHandler {
253
+ processNode(node) {
254
+ if (!isSerializedHeadingNode(node)) return null;
255
+ const children = [];
256
+ node.children.forEach((child) => {
257
+ const childString = traverse(child);
258
+ if (childString) {
259
+ children.push(childString);
260
+ }
261
+ });
262
+ const attribute = node.format ? ` style="text-align: ${ELEMENT_TYPE_TO_FORMAT[node.format]};"` : "";
263
+ return `<${node.tag}${attribute}>${children.join("")}</${node.tag}>`;
264
+ }
265
+ };
266
+
236
267
  // src/typeGuards/isSerializedHorizontalRuleNode.ts
237
268
  var isSerializedHorizontalRuleNode = (node) => {
238
269
  return node?.type === "horizontalrule";
@@ -586,14 +617,6 @@ function isSerializedTableCellNode(node) {
586
617
  }
587
618
 
588
619
  // src/exportToHtml/ParagraphNodeHandler.ts
589
- var ELEMENT_TYPE_TO_FORMAT = {
590
- center: "center",
591
- end: "end",
592
- justify: "justify",
593
- left: "left",
594
- right: "right",
595
- start: "start"
596
- };
597
620
  var ParagraphNodeHandler = class extends NodeHandler {
598
621
  shouldAvoidParagraphWrap(node) {
599
622
  if (node === void 0) return false;
@@ -905,7 +928,7 @@ var VariableNodeHandler = class extends NodeHandler {
905
928
 
906
929
  // src/exportToHtml/traverse.ts
907
930
  var builder = new NodeHandlerChainBuilder();
908
- var nodeHandlerChain = builder.addHandler(CustomQuestionNodeHandler).addHandler(EssayQuestionNodeHandler).addHandler(FillInTheBlankQuestionNodeHandler).addHandler(FillInTheBlankSpaceNodeHandler).addHandler(FinancialStatementQuestionNodeHandler).addHandler(HorizontalRuleNodeHandler).addHandler(ImageNodeHandler).addHandler(JournalEntryQuestionNodeHandler).addHandler(LineBreakNodeHandler).addHandler(LinkNodeHandler).addHandler(ListNodeHandler).addHandler(ListItemNodeHandler).addHandler(MatchingQuestionNodeHandler).addHandler(MultipleOptionQuestionNodeHandler).addHandler(ParagraphNodeHandler).addHandler(ShortAnswerQuestionNodeHandler).addHandler(SimulationQuestionNodeHandler).addHandler(TableCellNodeHandler).addHandler(TableNodeHandler).addHandler(TableRowNodeHandler).addHandler(TextNodeHandler).addHandler(VariableNodeHandler).build();
931
+ var nodeHandlerChain = builder.addHandler(CustomQuestionNodeHandler).addHandler(EssayQuestionNodeHandler).addHandler(FillInTheBlankQuestionNodeHandler).addHandler(FillInTheBlankSpaceNodeHandler).addHandler(FinancialStatementQuestionNodeHandler).addHandler(HeadingNodeHandler).addHandler(HorizontalRuleNodeHandler).addHandler(ImageNodeHandler).addHandler(JournalEntryQuestionNodeHandler).addHandler(LineBreakNodeHandler).addHandler(LinkNodeHandler).addHandler(ListNodeHandler).addHandler(ListItemNodeHandler).addHandler(MatchingQuestionNodeHandler).addHandler(MultipleOptionQuestionNodeHandler).addHandler(ParagraphNodeHandler).addHandler(ShortAnswerQuestionNodeHandler).addHandler(SimulationQuestionNodeHandler).addHandler(TableCellNodeHandler).addHandler(TableNodeHandler).addHandler(TableRowNodeHandler).addHandler(TextNodeHandler).addHandler(VariableNodeHandler).build();
909
932
  var traverse = (node, metadata) => {
910
933
  return nodeHandlerChain.handle(node, metadata);
911
934
  };
@@ -1492,12 +1515,61 @@ var FormattedNodeHandler = class extends NodeHandler2 {
1492
1515
  }
1493
1516
  };
1494
1517
 
1495
- // src/importFromHtml/HorizontalRuleNodeHandler.ts
1518
+ // src/importFromHtml/HeadingNodeHandler.ts
1496
1519
  import { HTMLElement as HTMLElement9 } from "node-html-parser";
1520
+
1521
+ // src/importFromHtml/extractTextAlignment.ts
1522
+ var TEXT_ALIGN_TO_FORMAT = {
1523
+ center: "center",
1524
+ end: "end",
1525
+ justify: "justify",
1526
+ left: "left",
1527
+ right: "right",
1528
+ start: "start"
1529
+ };
1530
+ function extractTextAlignment(element) {
1531
+ if (!element.hasAttribute("style")) return "";
1532
+ const styleAttr = element.getAttribute("style");
1533
+ const textAlignMatch = styleAttr?.match(/text-align:\s*([^;]+)/i);
1534
+ if (textAlignMatch && textAlignMatch[1]) {
1535
+ const textAlign = textAlignMatch[1].trim();
1536
+ if (textAlign in TEXT_ALIGN_TO_FORMAT) {
1537
+ return TEXT_ALIGN_TO_FORMAT[textAlign];
1538
+ }
1539
+ }
1540
+ return "";
1541
+ }
1542
+
1543
+ // src/importFromHtml/HeadingNodeHandler.ts
1544
+ var TAG_HEADINGS = ["h1", "h2", "h3", "h4", "h5", "h6"];
1545
+ var HeadingNodeHandler2 = class extends NodeHandler2 {
1546
+ processNode(node) {
1547
+ if (!(node instanceof HTMLElement9) || !TAG_HEADINGS.includes(node.tagName.toLowerCase())) {
1548
+ return null;
1549
+ }
1550
+ const headingNode = {
1551
+ type: "heading",
1552
+ version: 1,
1553
+ format: extractTextAlignment(node),
1554
+ tag: node.tagName.toLowerCase(),
1555
+ children: [],
1556
+ direction: "ltr",
1557
+ indent: 0
1558
+ };
1559
+ node.childNodes.forEach((child) => {
1560
+ const processedChildren = traverse2(child);
1561
+ headingNode.children.push(...processedChildren);
1562
+ });
1563
+ return headingNode;
1564
+ }
1565
+ };
1566
+
1567
+ // src/importFromHtml/HorizontalRuleNodeHandler.ts
1568
+ import { HTMLElement as HTMLElement10 } from "node-html-parser";
1497
1569
  var TAG_HR = "hr";
1498
1570
  var HorizontalRuleNodeHandler2 = class extends NodeHandler2 {
1499
1571
  processNode(node) {
1500
- if (!(node instanceof HTMLElement9) || node.tagName !== TAG_HR.toUpperCase()) {
1572
+ if (!(node instanceof HTMLElement10) || node.tagName !== TAG_HR.toUpperCase()) {
1501
1573
  return null;
1502
1574
  }
1503
1575
  const horizontalRuleNode = {
@@ -1509,11 +1581,11 @@ var HorizontalRuleNodeHandler2 = class extends NodeHandler2 {
1509
1581
  };
1510
1582
 
1511
1583
  // src/importFromHtml/ImageNodeHandler.ts
1512
- import { HTMLElement as HTMLElement10 } from "node-html-parser";
1584
+ import { HTMLElement as HTMLElement11 } from "node-html-parser";
1513
1585
  var TAG_IMG = "img";
1514
1586
  var ImageNodeHandler2 = class extends NodeHandler2 {
1515
1587
  processNode(node) {
1516
- if (!(node instanceof HTMLElement10) || node.tagName !== TAG_IMG.toUpperCase()) {
1588
+ if (!(node instanceof HTMLElement11) || node.tagName !== TAG_IMG.toUpperCase()) {
1517
1589
  return null;
1518
1590
  }
1519
1591
  return createImageNode(
@@ -1529,11 +1601,11 @@ var ImageNodeHandler2 = class extends NodeHandler2 {
1529
1601
 
1530
1602
  // src/importFromHtml/JournalEntryQuestionNodeHandler.ts
1531
1603
  import { nanoid as nanoid6 } from "nanoid";
1532
- import { HTMLElement as HTMLElement12 } from "node-html-parser";
1604
+ import { HTMLElement as HTMLElement13 } from "node-html-parser";
1533
1605
 
1534
1606
  // src/importFromHtml/createOnePerLineDistractorNode.ts
1535
1607
  import { nanoid as nanoid5 } from "nanoid";
1536
- import { HTMLElement as HTMLElement11 } from "node-html-parser";
1608
+ import { HTMLElement as HTMLElement12 } from "node-html-parser";
1537
1609
  function extractDistractorId(id) {
1538
1610
  if (!id) return null;
1539
1611
  const parts = id.split("|");
@@ -1546,7 +1618,7 @@ var createOnePerLineDistractorNode = (node) => {
1546
1618
  distractorEditor.editorState.root.children = [];
1547
1619
  let distractorId = null;
1548
1620
  distractors.forEach((distractor) => {
1549
- if (!(distractor instanceof HTMLElement11)) return;
1621
+ if (!(distractor instanceof HTMLElement12)) return;
1550
1622
  distractorId = distractorId ?? extractDistractorId(distractor.getAttribute("id"));
1551
1623
  distractorEditor.editorState.root.children.push(
1552
1624
  ...createNestedNodesFromHtml(distractor)
@@ -1564,7 +1636,7 @@ var createOnePerLineDistractorNode = (node) => {
1564
1636
  // src/importFromHtml/JournalEntryQuestionNodeHandler.ts
1565
1637
  var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1566
1638
  processNode(node) {
1567
- if (!(node instanceof HTMLElement12) || node.tagName !== "x-journal-entry".toUpperCase())
1639
+ if (!(node instanceof HTMLElement13) || node.tagName !== "x-journal-entry".toUpperCase())
1568
1640
  return null;
1569
1641
  const jsonNode = {
1570
1642
  id: node.getAttribute("id") ?? nanoid6(),
@@ -1579,7 +1651,7 @@ var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1579
1651
  };
1580
1652
  const lineItems = node.querySelectorAll("x-line-item");
1581
1653
  lineItems.forEach((lineItem) => {
1582
- if (!(lineItem instanceof HTMLElement12)) return;
1654
+ if (!(lineItem instanceof HTMLElement13)) return;
1583
1655
  const accountElement = lineItem.querySelector("x-account");
1584
1656
  const debitElement = lineItem.querySelector("x-debit");
1585
1657
  const creditElement = lineItem.querySelector("x-credit");
@@ -1608,10 +1680,10 @@ var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1608
1680
  };
1609
1681
 
1610
1682
  // src/importFromHtml/LineBreakNodeHandler.ts
1611
- import { HTMLElement as HTMLElement13 } from "node-html-parser";
1683
+ import { HTMLElement as HTMLElement14 } from "node-html-parser";
1612
1684
  var LineBreakNodeHandler2 = class extends NodeHandler2 {
1613
1685
  processNode(node) {
1614
- if (!(node instanceof HTMLElement13)) return null;
1686
+ if (!(node instanceof HTMLElement14)) return null;
1615
1687
  if (node.tagName !== "BR") return null;
1616
1688
  return {
1617
1689
  type: "linebreak",
@@ -1621,11 +1693,11 @@ var LineBreakNodeHandler2 = class extends NodeHandler2 {
1621
1693
  };
1622
1694
 
1623
1695
  // src/importFromHtml/LinkNodeHandler.ts
1624
- import { HTMLElement as HTMLElement14 } from "node-html-parser";
1696
+ import { HTMLElement as HTMLElement15 } from "node-html-parser";
1625
1697
  var TAG_A = "a";
1626
1698
  var LinkNodeHandler2 = class extends NodeHandler2 {
1627
1699
  processNode(node) {
1628
- if (!(node instanceof HTMLElement14) || node.tagName !== TAG_A.toUpperCase()) {
1700
+ if (!(node instanceof HTMLElement15) || node.tagName !== TAG_A.toUpperCase()) {
1629
1701
  return null;
1630
1702
  }
1631
1703
  const url = node.getAttribute("href") || "";
@@ -1654,10 +1726,10 @@ var LinkNodeHandler2 = class extends NodeHandler2 {
1654
1726
  };
1655
1727
 
1656
1728
  // src/importFromHtml/ListItemNodeHandler.ts
1657
- import { HTMLElement as HTMLElement15 } from "node-html-parser";
1729
+ import { HTMLElement as HTMLElement16 } from "node-html-parser";
1658
1730
  var ListItemNodeHandler2 = class extends NodeHandler2 {
1659
1731
  processNode(node) {
1660
- if (!(node instanceof HTMLElement15)) return null;
1732
+ if (!(node instanceof HTMLElement16)) return null;
1661
1733
  if (node.tagName !== "LI") return null;
1662
1734
  const jsonNode = {
1663
1735
  type: "listitem",
@@ -1678,10 +1750,10 @@ var ListItemNodeHandler2 = class extends NodeHandler2 {
1678
1750
  };
1679
1751
 
1680
1752
  // src/importFromHtml/ListNodeHandler.ts
1681
- import { HTMLElement as HTMLElement16 } from "node-html-parser";
1753
+ import { HTMLElement as HTMLElement17 } from "node-html-parser";
1682
1754
  var ListNodeHandler2 = class extends NodeHandler2 {
1683
1755
  processNode(node) {
1684
- if (!(node instanceof HTMLElement16)) return null;
1756
+ if (!(node instanceof HTMLElement17)) return null;
1685
1757
  if (node.tagName !== "UL" && node.tagName !== "OL") return null;
1686
1758
  const tag = node.tagName.toLowerCase();
1687
1759
  const listType = tag === "ol" ? "number" : "bullet";
@@ -1699,7 +1771,7 @@ var ListNodeHandler2 = class extends NodeHandler2 {
1699
1771
  };
1700
1772
  let itemIndex = 1;
1701
1773
  node.childNodes.forEach((child) => {
1702
- if (child instanceof HTMLElement16 && child.tagName === "LI") {
1774
+ if (child instanceof HTMLElement17 && child.tagName === "LI") {
1703
1775
  const listItemNode = {
1704
1776
  type: "listitem",
1705
1777
  version: 1,
@@ -1724,10 +1796,10 @@ var ListNodeHandler2 = class extends NodeHandler2 {
1724
1796
 
1725
1797
  // src/importFromHtml/MatchingQuestionNodeHandler.ts
1726
1798
  import { nanoid as nanoid7 } from "nanoid";
1727
- import { HTMLElement as HTMLElement17 } from "node-html-parser";
1799
+ import { HTMLElement as HTMLElement18 } from "node-html-parser";
1728
1800
  var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
1729
1801
  processNode(node) {
1730
- if (!(node instanceof HTMLElement17) || node.tagName !== "x-matching".toUpperCase())
1802
+ if (!(node instanceof HTMLElement18) || node.tagName !== "x-matching".toUpperCase())
1731
1803
  return null;
1732
1804
  const jsonNode = {
1733
1805
  id: node.getAttribute("id") ?? nanoid7(),
@@ -1740,7 +1812,7 @@ var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
1740
1812
  };
1741
1813
  const matches = node.querySelectorAll("x-match");
1742
1814
  matches.forEach((match) => {
1743
- if (!(match instanceof HTMLElement17)) return;
1815
+ if (!(match instanceof HTMLElement18)) return;
1744
1816
  const premise = match.querySelector("x-premise");
1745
1817
  const option = match.querySelector("x-option");
1746
1818
  if (!premise || !option) return;
@@ -1763,10 +1835,10 @@ var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
1763
1835
 
1764
1836
  // src/importFromHtml/MultipleOptionQuestionNodeHandler.ts
1765
1837
  import { nanoid as nanoid8 } from "nanoid";
1766
- import { HTMLElement as HTMLElement18 } from "node-html-parser";
1838
+ import { HTMLElement as HTMLElement19 } from "node-html-parser";
1767
1839
  var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
1768
1840
  processNode(node) {
1769
- if (!(node instanceof HTMLElement18)) return null;
1841
+ if (!(node instanceof HTMLElement19)) return null;
1770
1842
  if (node.tagName === "x-multiple-choice".toUpperCase())
1771
1843
  return this.processMultipleChoiceNode(node);
1772
1844
  else if (node.tagName === "x-multiple-answers".toUpperCase())
@@ -1806,7 +1878,7 @@ var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
1806
1878
  processOptions(node, jsonNode) {
1807
1879
  const childNodes = node.childNodes;
1808
1880
  childNodes.forEach((child) => {
1809
- if (!(child instanceof HTMLElement18)) return;
1881
+ if (!(child instanceof HTMLElement19)) return;
1810
1882
  if (child.tagName !== "x-option".toUpperCase()) return;
1811
1883
  jsonNode.options.push({
1812
1884
  id: child.getAttribute("id") ?? nanoid8(),
@@ -1818,48 +1890,28 @@ var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
1818
1890
  };
1819
1891
 
1820
1892
  // src/importFromHtml/ParagraphNodeHandler.ts
1821
- import { HTMLElement as HTMLElement19 } from "node-html-parser";
1822
- var TEXT_ALIGN_TO_FORMAT = {
1823
- center: "center",
1824
- end: "end",
1825
- justify: "justify",
1826
- left: "left",
1827
- right: "right",
1828
- start: "start"
1829
- };
1893
+ import { HTMLElement as HTMLElement20 } from "node-html-parser";
1830
1894
  var ParagraphNodeHandler2 = class extends NodeHandler2 {
1831
- extractTextAlignment(element) {
1832
- if (!element.hasAttribute("style")) return "";
1833
- const styleAttr = element.getAttribute("style");
1834
- const textAlignMatch = styleAttr?.match(/text-align:\s*([^;]+)/i);
1835
- if (textAlignMatch && textAlignMatch[1]) {
1836
- const textAlign = textAlignMatch[1].trim();
1837
- if (textAlign in TEXT_ALIGN_TO_FORMAT) {
1838
- return TEXT_ALIGN_TO_FORMAT[textAlign];
1839
- }
1840
- }
1841
- return "";
1842
- }
1843
1895
  processImageNode(node) {
1844
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof HTMLElement19 && node.childNodes[0].tagName === "IMG") {
1896
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof HTMLElement20 && node.childNodes[0].tagName === "IMG") {
1845
1897
  return traverse2(node.childNodes[0]);
1846
1898
  }
1847
1899
  return null;
1848
1900
  }
1849
1901
  processSpanImageNode(node) {
1850
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof HTMLElement19 && node.childNodes[0].tagName === "SPAN" && node.childNodes[0].childNodes.length === 1 && node.childNodes[0].childNodes[0] instanceof HTMLElement19 && node.childNodes[0].childNodes[0].tagName === "IMG") {
1902
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof HTMLElement20 && node.childNodes[0].tagName === "SPAN" && node.childNodes[0].childNodes.length === 1 && node.childNodes[0].childNodes[0] instanceof HTMLElement20 && node.childNodes[0].childNodes[0].tagName === "IMG") {
1851
1903
  return traverse2(node.childNodes[0].childNodes[0]);
1852
1904
  }
1853
1905
  return null;
1854
1906
  }
1855
1907
  processNode(node) {
1856
- if (!(node instanceof HTMLElement19)) return null;
1908
+ if (!(node instanceof HTMLElement20)) return null;
1857
1909
  if (node.tagName !== "P") return null;
1858
1910
  const imageNode = this.processImageNode(node) ?? this.processSpanImageNode(node);
1859
1911
  if (imageNode) return imageNode;
1860
1912
  const jsonNode = createEmptyParagraphNode();
1861
- jsonNode.format = this.extractTextAlignment(node);
1862
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof HTMLElement19 && node.childNodes[0].tagName === "BR")
1913
+ jsonNode.format = extractTextAlignment(node);
1914
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof HTMLElement20 && node.childNodes[0].tagName === "BR")
1863
1915
  return jsonNode;
1864
1916
  node.childNodes.forEach((child) => {
1865
1917
  const processedChildren = traverse2(child);
@@ -1871,10 +1923,10 @@ var ParagraphNodeHandler2 = class extends NodeHandler2 {
1871
1923
 
1872
1924
  // src/importFromHtml/ShortAnswerQuestionNodeHandler.ts
1873
1925
  import { nanoid as nanoid9 } from "nanoid";
1874
- import { HTMLElement as HTMLElement20 } from "node-html-parser";
1926
+ import { HTMLElement as HTMLElement21 } from "node-html-parser";
1875
1927
  var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
1876
1928
  processNode(node) {
1877
- if (!(node instanceof HTMLElement20) || node.tagName !== "x-short-answer".toUpperCase())
1929
+ if (!(node instanceof HTMLElement21) || node.tagName !== "x-short-answer".toUpperCase())
1878
1930
  return null;
1879
1931
  return {
1880
1932
  id: node.getAttribute("id") ?? nanoid9(),
@@ -1890,7 +1942,7 @@ var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
1890
1942
  };
1891
1943
 
1892
1944
  // src/importFromHtml/SimulationQuestionNodeHandler.ts
1893
- import { HTMLElement as HTMLElement21 } from "node-html-parser";
1945
+ import { HTMLElement as HTMLElement22 } from "node-html-parser";
1894
1946
  var TAG_X_SIMULATION = "x-simulation";
1895
1947
  var TAG_X_SYSTEM_MESSAGE2 = "x-ai-system-message";
1896
1948
  var TAG_X_COMMENT_INSTRUCTIONS = "x-comment-instructions";
@@ -1898,7 +1950,7 @@ var TAG_X_STEP2_INSTRUCTIONS = "x-step2-instructions";
1898
1950
  var findFirstNonEmptyInnerHtml = (root, elementNames) => elementNames.map((name) => root.querySelector(name)).find((el) => el?.innerHTML.trim().length)?.innerHTML.trim() ?? null;
1899
1951
  var SimulationQuestionNodeHandler2 = class extends NodeHandler2 {
1900
1952
  processNode(node) {
1901
- if (!(node instanceof HTMLElement21) || node.tagName !== TAG_X_SIMULATION.toUpperCase()) {
1953
+ if (!(node instanceof HTMLElement22) || node.tagName !== TAG_X_SIMULATION.toUpperCase()) {
1902
1954
  return null;
1903
1955
  }
1904
1956
  const jsonNode = {
@@ -1919,11 +1971,11 @@ var SimulationQuestionNodeHandler2 = class extends NodeHandler2 {
1919
1971
  };
1920
1972
 
1921
1973
  // src/importFromHtml/SpanNodeHandler.ts
1922
- import { HTMLElement as HTMLElement22, parse } from "node-html-parser";
1974
+ import { HTMLElement as HTMLElement23, parse } from "node-html-parser";
1923
1975
  var TextNode = parse.TextNode;
1924
1976
  var SpanNodeHandler = class extends NodeHandler2 {
1925
1977
  processNode(node) {
1926
- if (!(node instanceof HTMLElement22) || node.tagName !== "SPAN")
1978
+ if (!(node instanceof HTMLElement23) || node.tagName !== "SPAN")
1927
1979
  return null;
1928
1980
  const styleAttr = node.getAttribute("style") || "";
1929
1981
  if (node.childNodes.length === 1 && node.childNodes[0] instanceof TextNode) {
@@ -1985,7 +2037,7 @@ var SpanNodeHandler = class extends NodeHandler2 {
1985
2037
  };
1986
2038
 
1987
2039
  // src/importFromHtml/TableCellNodeHandler.ts
1988
- import { HTMLElement as HTMLElement23 } from "node-html-parser";
2040
+ import { HTMLElement as HTMLElement24 } from "node-html-parser";
1989
2041
 
1990
2042
  // src/utils/styleUtils.ts
1991
2043
  var extractStyleValue = (styleAttr, property, isNumeric = false, unit = "") => {
@@ -2034,7 +2086,7 @@ function createEmptyTableCellNode(isHeader = false) {
2034
2086
 
2035
2087
  // src/importFromHtml/TableCellNodeHandler.ts
2036
2088
  var isHtmlTableCellElement = (node) => {
2037
- return node instanceof HTMLElement23 && (node.tagName === "TD" || node.tagName === "TH");
2089
+ return node instanceof HTMLElement24 && (node.tagName === "TD" || node.tagName === "TH");
2038
2090
  };
2039
2091
  var TableCellNodeHandler2 = class extends NodeHandler2 {
2040
2092
  processNode(node) {
@@ -2076,10 +2128,10 @@ var TableCellNodeHandler2 = class extends NodeHandler2 {
2076
2128
  };
2077
2129
 
2078
2130
  // src/importFromHtml/TableNodeHandler.ts
2079
- import { HTMLElement as HTMLElement24 } from "node-html-parser";
2131
+ import { HTMLElement as HTMLElement25 } from "node-html-parser";
2080
2132
  var REFERENCE_TABLE_WIDTH = 720;
2081
2133
  var MINIMUM_REFERENCE_TABLE_WIDTH = 500;
2082
- var isHtmlTableElement = (node) => node instanceof HTMLElement24 && node.tagName === "TABLE";
2134
+ var isHtmlTableElement = (node) => node instanceof HTMLElement25 && node.tagName === "TABLE";
2083
2135
  var TableNodeHandler2 = class extends NodeHandler2 {
2084
2136
  processNode(node) {
2085
2137
  if (!isHtmlTableElement(node)) return null;
@@ -2234,9 +2286,9 @@ var TableNodeHandler2 = class extends NodeHandler2 {
2234
2286
  };
2235
2287
 
2236
2288
  // src/importFromHtml/TableRowNodeHandler.ts
2237
- import { HTMLElement as HTMLElement25 } from "node-html-parser";
2289
+ import { HTMLElement as HTMLElement26 } from "node-html-parser";
2238
2290
  var isHtmlTableRowElement = (node) => {
2239
- return node instanceof HTMLElement25 && node.tagName === "TR";
2291
+ return node instanceof HTMLElement26 && node.tagName === "TR";
2240
2292
  };
2241
2293
  var TableRowNodeHandler2 = class extends NodeHandler2 {
2242
2294
  processNode(node) {
@@ -2279,10 +2331,10 @@ var TextNodeHandler2 = class extends NodeHandler2 {
2279
2331
  };
2280
2332
 
2281
2333
  // src/importFromHtml/VariableNodeHandler.ts
2282
- import { HTMLElement as HTMLElement26 } from "node-html-parser";
2334
+ import { HTMLElement as HTMLElement27 } from "node-html-parser";
2283
2335
  var VariableNodeHandler2 = class extends NodeHandler2 {
2284
2336
  processNode(node) {
2285
- if (!(node instanceof HTMLElement26) || !node.tagName) return null;
2337
+ if (!(node instanceof HTMLElement27) || !node.tagName) return null;
2286
2338
  if (node.tagName !== "x-param".toUpperCase()) return null;
2287
2339
  return {
2288
2340
  variableName: node.getAttribute("data-x-name") || "undefined",
@@ -2295,7 +2347,7 @@ var VariableNodeHandler2 = class extends NodeHandler2 {
2295
2347
 
2296
2348
  // src/importFromHtml/traverse.ts
2297
2349
  var builder2 = new NodeHandlerChainBuilder();
2298
- var nodeHandlerChain2 = builder2.addHandler(CustomQuestionNodeHandler2).addHandler(DivNodeHandler).addHandler(EssayQuestionNodeHandler2).addHandler(FillInTheBlankQuestionNodeHandler2).addHandler(FillInTheBlankSpaceNodeHandler2).addHandler(FinancialStatementQuestionNodeHandler2).addHandler(FormattedNodeHandler).addHandler(ImageNodeHandler2).addHandler(HorizontalRuleNodeHandler2).addHandler(JournalEntryQuestionNodeHandler2).addHandler(LineBreakNodeHandler2).addHandler(LinkNodeHandler2).addHandler(ListNodeHandler2).addHandler(ListItemNodeHandler2).addHandler(MatchingQuestionNodeHandler2).addHandler(MultipleOptionQuestionNodeHandler2).addHandler(ParagraphNodeHandler2).addHandler(ShortAnswerQuestionNodeHandler2).addHandler(SimulationQuestionNodeHandler2).addHandler(SpanNodeHandler).addHandler(TableCellNodeHandler2).addHandler(TableNodeHandler2).addHandler(TableRowNodeHandler2).addHandler(TextNodeHandler2).addHandler(VariableNodeHandler2).build();
2350
+ var nodeHandlerChain2 = builder2.addHandler(CustomQuestionNodeHandler2).addHandler(DivNodeHandler).addHandler(EssayQuestionNodeHandler2).addHandler(FillInTheBlankQuestionNodeHandler2).addHandler(FillInTheBlankSpaceNodeHandler2).addHandler(FinancialStatementQuestionNodeHandler2).addHandler(FormattedNodeHandler).addHandler(ImageNodeHandler2).addHandler(HeadingNodeHandler2).addHandler(HorizontalRuleNodeHandler2).addHandler(JournalEntryQuestionNodeHandler2).addHandler(LineBreakNodeHandler2).addHandler(LinkNodeHandler2).addHandler(ListNodeHandler2).addHandler(ListItemNodeHandler2).addHandler(MatchingQuestionNodeHandler2).addHandler(MultipleOptionQuestionNodeHandler2).addHandler(ParagraphNodeHandler2).addHandler(ShortAnswerQuestionNodeHandler2).addHandler(SimulationQuestionNodeHandler2).addHandler(SpanNodeHandler).addHandler(TableCellNodeHandler2).addHandler(TableNodeHandler2).addHandler(TableRowNodeHandler2).addHandler(TextNodeHandler2).addHandler(VariableNodeHandler2).build();
2299
2351
  function traverse2(node) {
2300
2352
  const result = nodeHandlerChain2.handle(node);
2301
2353
  if (result === null) return [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@examind/block-sdk",
3
- "version": "0.1.35",
3
+ "version": "0.1.36",
4
4
  "@comment version": [
5
5
  "Don't specify package version here. It will be injected by publish workflow."
6
6
  ],
@@ -21,7 +21,7 @@
21
21
  "peerDependencies": {
22
22
  "nanoid": ">=3.0.0",
23
23
  "node-html-parser": ">=6.0.0",
24
- "@examind/block-types": "^0.1.35"
24
+ "@examind/block-types": "^0.1.36"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@eslint/js": "^9.17.0",
@@ -36,7 +36,7 @@
36
36
  "tsup": "^8.3.5",
37
37
  "typescript": "^5.7.2",
38
38
  "typescript-eslint": "^8.18.2",
39
- "@examind/block-types": "0.1.35"
39
+ "@examind/block-types": "0.1.36"
40
40
  },
41
41
  "dependencies": {
42
42
  "lodash-es": "4.17.21"