@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.
- package/dist/index.js +131 -79
- package/dist/index.mjs +126 -74
- 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
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
1889
|
-
if (node.childNodes.length === 1 && node.childNodes[0] instanceof
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1950
|
-
var 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2316
|
+
var import_node_html_parser26 = require("node-html-parser");
|
|
2265
2317
|
var isHtmlTableRowElement = (node) => {
|
|
2266
|
-
return node instanceof
|
|
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
|
|
2290
|
-
var TextNode2 =
|
|
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
|
|
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
|
|
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,
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1683
|
+
import { HTMLElement as HTMLElement14 } from "node-html-parser";
|
|
1612
1684
|
var LineBreakNodeHandler2 = class extends NodeHandler2 {
|
|
1613
1685
|
processNode(node) {
|
|
1614
|
-
if (!(node instanceof
|
|
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
|
|
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
|
|
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
|
|
1729
|
+
import { HTMLElement as HTMLElement16 } from "node-html-parser";
|
|
1658
1730
|
var ListItemNodeHandler2 = class extends NodeHandler2 {
|
|
1659
1731
|
processNode(node) {
|
|
1660
|
-
if (!(node instanceof
|
|
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
|
|
1753
|
+
import { HTMLElement as HTMLElement17 } from "node-html-parser";
|
|
1682
1754
|
var ListNodeHandler2 = class extends NodeHandler2 {
|
|
1683
1755
|
processNode(node) {
|
|
1684
|
-
if (!(node instanceof
|
|
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
|
|
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
|
|
1799
|
+
import { HTMLElement as HTMLElement18 } from "node-html-parser";
|
|
1728
1800
|
var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
|
|
1729
1801
|
processNode(node) {
|
|
1730
|
-
if (!(node instanceof
|
|
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
|
|
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
|
|
1838
|
+
import { HTMLElement as HTMLElement19 } from "node-html-parser";
|
|
1767
1839
|
var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
|
|
1768
1840
|
processNode(node) {
|
|
1769
|
-
if (!(node instanceof
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
1862
|
-
if (node.childNodes.length === 1 && node.childNodes[0] instanceof
|
|
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
|
|
1926
|
+
import { HTMLElement as HTMLElement21 } from "node-html-parser";
|
|
1875
1927
|
var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
|
|
1876
1928
|
processNode(node) {
|
|
1877
|
-
if (!(node instanceof
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2289
|
+
import { HTMLElement as HTMLElement26 } from "node-html-parser";
|
|
2238
2290
|
var isHtmlTableRowElement = (node) => {
|
|
2239
|
-
return node instanceof
|
|
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
|
|
2334
|
+
import { HTMLElement as HTMLElement27 } from "node-html-parser";
|
|
2283
2335
|
var VariableNodeHandler2 = class extends NodeHandler2 {
|
|
2284
2336
|
processNode(node) {
|
|
2285
|
-
if (!(node instanceof
|
|
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.
|
|
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.
|
|
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.
|
|
39
|
+
"@examind/block-types": "0.1.36"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"lodash-es": "4.17.21"
|