@examind/block-sdk 0.1.27 → 0.1.29

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 +165 -123
  2. package/dist/index.mjs +160 -118
  3. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -346,9 +346,9 @@ var NodeHandlerChainBuilder = class {
346
346
  }
347
347
  };
348
348
 
349
- // src/typeGuards/isSerializedEssayQuestionNode.ts
350
- function isSerializedEssayQuestionNode(node) {
351
- return node?.type === "essay-question" && "id" in node && typeof node.id === "string" && "points" in node && typeof node.points === "number" && "maxWords" in node && typeof node.maxWords === "number" && "hideChat" in node && typeof node.hideChat === "boolean";
349
+ // src/typeGuards/isSerializedCustomQuestionNode.ts
350
+ function isSerializedCustomQuestionNode(node) {
351
+ return node?.type === "custom-question" && "id" in node && typeof node.id === "string" && "points" in node && typeof node.points === "number" && "name" in node && typeof node.name === "string" && "data" in node && typeof node.data === "string";
352
352
  }
353
353
 
354
354
  // src/exportToHtml/types.ts
@@ -371,6 +371,19 @@ var NodeHandler = class {
371
371
  }
372
372
  };
373
373
 
374
+ // src/exportToHtml/CustomQuestionNodeHandler.ts
375
+ var CustomQuestionNodeHandler = class extends NodeHandler {
376
+ processNode(node) {
377
+ if (!isSerializedCustomQuestionNode(node)) return null;
378
+ return `<x-custom id="${node.id}" data-x-prompt data-x-points="${node.points}" data-x-name="${node.name}"></x-custom>`;
379
+ }
380
+ };
381
+
382
+ // src/typeGuards/isSerializedEssayQuestionNode.ts
383
+ function isSerializedEssayQuestionNode(node) {
384
+ return node?.type === "essay-question" && "id" in node && typeof node.id === "string" && "points" in node && typeof node.points === "number" && "maxWords" in node && typeof node.maxWords === "number" && "hideChat" in node && typeof node.hideChat === "boolean";
385
+ }
386
+
374
387
  // src/exportToHtml/EssayQuestionNodeHandler.ts
375
388
  var EssayQuestionNodeHandler = class extends NodeHandler {
376
389
  processNode(node) {
@@ -434,6 +447,11 @@ function isSerializedFillInTheBlankSpaceNode(node) {
434
447
  return node?.type === "space" && "id" in node && typeof node.id === "string" && "spaceName" in node && typeof node.spaceName === "string" && "matches" in node && typeof node.matches === "string" && "spaceType" in node;
435
448
  }
436
449
 
450
+ // src/exportToHtml/serializeErrorToleranceAttribute.ts
451
+ function serializeErrorToleranceAttribute(errorTolerance) {
452
+ return (errorTolerance ?? 0) / 100;
453
+ }
454
+
437
455
  // src/exportToHtml/FillInTheBlankSpaceNodeHandler.ts
438
456
  var FillInTheBlankSpaceNodeHandler = class extends NodeHandler {
439
457
  processNode(node) {
@@ -451,7 +469,7 @@ var FillInTheBlankSpaceNodeHandler = class extends NodeHandler {
451
469
  `data-x-case-sensitive="${!!node.caseSensitive}"`,
452
470
  `data-x-errors-allowed="${node.errorsAllowed ?? 0}"`,
453
471
  `data-x-min-decimals="${node.minDecimals ?? ""}"`,
454
- `data-x-error-tolerance="${(node.errorTolerance ?? 0) / 100}"`,
472
+ `data-x-error-tolerance="${serializeErrorToleranceAttribute(node.errorTolerance)}"`,
455
473
  // Divide by 100 to convert percentage to rate
456
474
  `data-x-distractors="${node.distractors ?? ""}"`
457
475
  ];
@@ -660,7 +678,7 @@ var JournalEntryQuestionNodeHandler = class extends NodeHandler {
660
678
  ];
661
679
  if (journalNode.errorTolerance !== void 0) {
662
680
  attributes.push(
663
- `data-x-error-tolerance="${journalNode.errorTolerance}"`
681
+ `data-x-error-tolerance="${serializeErrorToleranceAttribute(journalNode.errorTolerance)}"`
664
682
  );
665
683
  }
666
684
  attributes.push(
@@ -1208,7 +1226,7 @@ var VariableNodeHandler = class extends NodeHandler {
1208
1226
 
1209
1227
  // src/exportToHtml/traverse.ts
1210
1228
  var builder = new NodeHandlerChainBuilder();
1211
- var nodeHandlerChain = builder.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();
1229
+ 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();
1212
1230
  var traverse = (node, metadata) => {
1213
1231
  return nodeHandlerChain.handle(node, metadata);
1214
1232
  };
@@ -1227,7 +1245,7 @@ function exportToHtml(editorState) {
1227
1245
  }
1228
1246
 
1229
1247
  // src/importFromHtml/index.ts
1230
- var import_node_html_parser27 = require("node-html-parser");
1248
+ var import_node_html_parser28 = require("node-html-parser");
1231
1249
 
1232
1250
  // src/importFromHtml/createEmptyParagraphNode.ts
1233
1251
  function createEmptyParagraphNode(format = "") {
@@ -1243,11 +1261,59 @@ function createEmptyParagraphNode(format = "") {
1243
1261
  };
1244
1262
  }
1245
1263
 
1264
+ // src/importFromHtml/CustomQuestionNodeHandler.ts
1265
+ var import_node_html_parser = require("node-html-parser");
1266
+
1267
+ // src/importFromHtml/types.ts
1268
+ var NodeHandler2 = class {
1269
+ constructor() {
1270
+ this.nextHandler = null;
1271
+ }
1272
+ getChildNodesTextContent(childNodes) {
1273
+ return childNodes.reduce((acc, item) => {
1274
+ const text = item.textContent || "";
1275
+ return acc + text.trim() + " ";
1276
+ }, "").trimEnd();
1277
+ }
1278
+ setNext(handler) {
1279
+ this.nextHandler = handler;
1280
+ return handler;
1281
+ }
1282
+ handle(node) {
1283
+ const result = this.processNode(node);
1284
+ if (result) {
1285
+ return result;
1286
+ } else if (this.nextHandler) {
1287
+ return this.nextHandler.handle(node);
1288
+ }
1289
+ return null;
1290
+ }
1291
+ };
1292
+
1293
+ // src/importFromHtml/CustomQuestionNodeHandler.ts
1294
+ var TAG_X_CUSTOM = "x-custom";
1295
+ var CustomQuestionNodeHandler2 = class extends NodeHandler2 {
1296
+ processNode(node) {
1297
+ if (!(node instanceof import_node_html_parser.HTMLElement) || node.tagName !== TAG_X_CUSTOM.toUpperCase()) {
1298
+ return null;
1299
+ }
1300
+ const jsonNode = {
1301
+ id: node.getAttribute("id") || "",
1302
+ points: Number(node.getAttribute("data-x-points") || 1),
1303
+ name: node.getAttribute("data-x-name") || "",
1304
+ data: "",
1305
+ type: "custom-question",
1306
+ version: 1
1307
+ };
1308
+ return jsonNode;
1309
+ }
1310
+ };
1311
+
1246
1312
  // src/importFromHtml/DivNodeHandler.ts
1247
- var import_node_html_parser2 = require("node-html-parser");
1313
+ var import_node_html_parser3 = require("node-html-parser");
1248
1314
 
1249
1315
  // src/importFromHtml/createNestedNodesFromHtml.ts
1250
- var import_node_html_parser = require("node-html-parser");
1316
+ var import_node_html_parser2 = require("node-html-parser");
1251
1317
  var wrapInlinesInParagraph = (inlineNodes, format = "") => {
1252
1318
  const paragraph = createEmptyParagraphNode(format);
1253
1319
  paragraph.children = inlineNodes;
@@ -1273,9 +1339,9 @@ var extractFormatFromStyle = (styleAttribute) => {
1273
1339
  return "";
1274
1340
  };
1275
1341
  var createNestedNodesFromHtml = (node) => {
1276
- const parentStyleAttribute = node instanceof import_node_html_parser.HTMLElement ? node.getAttribute("style") : null;
1342
+ const parentStyleAttribute = node instanceof import_node_html_parser2.HTMLElement ? node.getAttribute("style") : null;
1277
1343
  const format = extractFormatFromStyle(parentStyleAttribute);
1278
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser.HTMLElement && node.childNodes[0].tagName === "BR") {
1344
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser2.HTMLElement && node.childNodes[0].tagName === "BR") {
1279
1345
  return [createEmptyParagraphNode(format)];
1280
1346
  }
1281
1347
  const results = [];
@@ -1411,36 +1477,10 @@ function processImageNodeContainer(node) {
1411
1477
  ];
1412
1478
  }
1413
1479
 
1414
- // src/importFromHtml/types.ts
1415
- var NodeHandler2 = class {
1416
- constructor() {
1417
- this.nextHandler = null;
1418
- }
1419
- getChildNodesTextContent(childNodes) {
1420
- return childNodes.reduce((acc, item) => {
1421
- const text = item.textContent || "";
1422
- return acc + text.trim() + " ";
1423
- }, "").trimEnd();
1424
- }
1425
- setNext(handler) {
1426
- this.nextHandler = handler;
1427
- return handler;
1428
- }
1429
- handle(node) {
1430
- const result = this.processNode(node);
1431
- if (result) {
1432
- return result;
1433
- } else if (this.nextHandler) {
1434
- return this.nextHandler.handle(node);
1435
- }
1436
- return null;
1437
- }
1438
- };
1439
-
1440
1480
  // src/importFromHtml/DivNodeHandler.ts
1441
1481
  var DivNodeHandler = class extends NodeHandler2 {
1442
1482
  isHtmlDivElement(node) {
1443
- return node instanceof import_node_html_parser2.HTMLElement && node.tagName === "DIV";
1483
+ return node instanceof import_node_html_parser3.HTMLElement && node.tagName === "DIV";
1444
1484
  }
1445
1485
  processNode(node) {
1446
1486
  if (!this.isHtmlDivElement(node)) {
@@ -1455,12 +1495,12 @@ var DivNodeHandler = class extends NodeHandler2 {
1455
1495
 
1456
1496
  // src/importFromHtml/EssayQuestionNodeHandler.ts
1457
1497
  var import_nanoid = require("nanoid");
1458
- var import_node_html_parser3 = require("node-html-parser");
1498
+ var import_node_html_parser4 = require("node-html-parser");
1459
1499
  var TAG_X_ESSAY = "x-essay";
1460
1500
  var TAG_X_SYSTEM_MESSAGE = "x-ai-system-message";
1461
1501
  var EssayQuestionNodeHandler2 = class extends NodeHandler2 {
1462
1502
  processNode(node) {
1463
- if (!(node instanceof import_node_html_parser3.HTMLElement) || node.tagName !== TAG_X_ESSAY.toUpperCase()) {
1503
+ if (!(node instanceof import_node_html_parser4.HTMLElement) || node.tagName !== TAG_X_ESSAY.toUpperCase()) {
1464
1504
  return null;
1465
1505
  }
1466
1506
  const jsonNode = {
@@ -1486,7 +1526,7 @@ var EssayQuestionNodeHandler2 = class extends NodeHandler2 {
1486
1526
 
1487
1527
  // src/importFromHtml/FillInTheBlankQuestionNodeHandler.ts
1488
1528
  var import_nanoid2 = require("nanoid");
1489
- var import_node_html_parser4 = require("node-html-parser");
1529
+ var import_node_html_parser5 = require("node-html-parser");
1490
1530
 
1491
1531
  // src/importFromHtml/createNestedEditorFromHtml.ts
1492
1532
  function createNestedEditorFromHtml(node) {
@@ -1507,7 +1547,7 @@ function createNestedEditorFromHtml(node) {
1507
1547
  // src/importFromHtml/FillInTheBlankQuestionNodeHandler.ts
1508
1548
  var FillInTheBlankQuestionNodeHandler2 = class extends NodeHandler2 {
1509
1549
  processNode(node) {
1510
- if (!(node instanceof import_node_html_parser4.HTMLElement) || node.tagName !== "x-fill-in-the-blank".toUpperCase())
1550
+ if (!(node instanceof import_node_html_parser5.HTMLElement) || node.tagName !== "x-fill-in-the-blank".toUpperCase())
1511
1551
  return null;
1512
1552
  const jsonNode = {
1513
1553
  id: node.getAttribute("id") ?? (0, import_nanoid2.nanoid)(),
@@ -1524,10 +1564,19 @@ var FillInTheBlankQuestionNodeHandler2 = class extends NodeHandler2 {
1524
1564
 
1525
1565
  // src/importFromHtml/FillInTheBlankSpaceNodeHandler.ts
1526
1566
  var import_nanoid3 = require("nanoid");
1527
- var import_node_html_parser5 = require("node-html-parser");
1567
+ var import_node_html_parser6 = require("node-html-parser");
1568
+
1569
+ // src/importFromHtml/parseErrorToleranceAttribute.ts
1570
+ function parseErrorToleranceAttribute(attr) {
1571
+ const value = Number(attr);
1572
+ if (isNaN(value)) return 0;
1573
+ else return value * 100;
1574
+ }
1575
+
1576
+ // src/importFromHtml/FillInTheBlankSpaceNodeHandler.ts
1528
1577
  var FillInTheBlankSpaceNodeHandler2 = class extends NodeHandler2 {
1529
1578
  processNode(node) {
1530
- if (!(node instanceof import_node_html_parser5.HTMLElement) || node.tagName !== "x-space".toUpperCase())
1579
+ if (!(node instanceof import_node_html_parser6.HTMLElement) || node.tagName !== "x-space".toUpperCase())
1531
1580
  return null;
1532
1581
  const spaceTypeAttr = node.getAttribute("data-x-type");
1533
1582
  const spaceType = spaceTypeAttr === "Text" || spaceTypeAttr === "Number" || spaceTypeAttr === "Dropdown" ? spaceTypeAttr : "Text";
@@ -1558,16 +1607,11 @@ var FillInTheBlankSpaceNodeHandler2 = class extends NodeHandler2 {
1558
1607
  errorsAllowed: node.getAttribute("data-x-errors-allowed") ? Number(node.getAttribute("data-x-errors-allowed")) : void 0
1559
1608
  };
1560
1609
  }
1561
- parseErrorToleranceAttr(attr) {
1562
- const value = Number(attr);
1563
- if (isNaN(value)) return 0;
1564
- else return value * 100;
1565
- }
1566
1610
  processNumberSpace(node, baseNode) {
1567
1611
  return {
1568
1612
  ...baseNode,
1569
1613
  minDecimals: node.getAttribute("data-x-min-decimals") ? Number(node.getAttribute("data-x-min-decimals")) : void 0,
1570
- errorTolerance: this.parseErrorToleranceAttr(
1614
+ errorTolerance: parseErrorToleranceAttribute(
1571
1615
  node.getAttribute("data-x-error-tolerance")
1572
1616
  )
1573
1617
  };
@@ -1582,7 +1626,7 @@ var FillInTheBlankSpaceNodeHandler2 = class extends NodeHandler2 {
1582
1626
 
1583
1627
  // src/importFromHtml/FinancialStatementQuestionNodeHandler.ts
1584
1628
  var import_nanoid4 = require("nanoid");
1585
- var import_node_html_parser6 = require("node-html-parser");
1629
+ var import_node_html_parser7 = require("node-html-parser");
1586
1630
  var TAG_X_FINANCIAL_STATEMENT = "x-financial-statement";
1587
1631
  var TAG_X_HEADER = "x-header";
1588
1632
  var TAG_X_ROWS = "x-rows";
@@ -1594,7 +1638,7 @@ var TAG_X_ENTRY = "x-entry";
1594
1638
  var TAG_X_AMOUNT = "x-amount";
1595
1639
  var FinancialStatementQuestionNodeHandler2 = class extends NodeHandler2 {
1596
1640
  processNode(node) {
1597
- if (!(node instanceof import_node_html_parser6.HTMLElement) || node.tagName !== TAG_X_FINANCIAL_STATEMENT.toUpperCase()) {
1641
+ if (!(node instanceof import_node_html_parser7.HTMLElement) || node.tagName !== TAG_X_FINANCIAL_STATEMENT.toUpperCase()) {
1598
1642
  return null;
1599
1643
  }
1600
1644
  const headerElement = node.querySelector(TAG_X_HEADER);
@@ -1609,7 +1653,7 @@ var FinancialStatementQuestionNodeHandler2 = class extends NodeHandler2 {
1609
1653
  version: 1
1610
1654
  };
1611
1655
  node.childNodes.forEach((child) => {
1612
- if (!(child instanceof import_node_html_parser6.HTMLElement)) return;
1656
+ if (!(child instanceof import_node_html_parser7.HTMLElement)) return;
1613
1657
  if (child.tagName === TAG_X_DISTRACTORS.toUpperCase()) {
1614
1658
  this.processDistractorsNode(child, jsonNode);
1615
1659
  } else if (child.tagName === TAG_X_ROWS.toUpperCase()) {
@@ -1620,7 +1664,7 @@ var FinancialStatementQuestionNodeHandler2 = class extends NodeHandler2 {
1620
1664
  }
1621
1665
  processDistractorsNode(distractorsNode, jsonNode) {
1622
1666
  for (const distractorsChild of distractorsNode.childNodes) {
1623
- if (!(distractorsChild instanceof import_node_html_parser6.HTMLElement)) continue;
1667
+ if (!(distractorsChild instanceof import_node_html_parser7.HTMLElement)) continue;
1624
1668
  if (distractorsChild.tagName !== TAG_X_DISTRACTOR.toUpperCase())
1625
1669
  continue;
1626
1670
  jsonNode.distractors.push({
@@ -1641,7 +1685,7 @@ var FinancialStatementQuestionNodeHandler2 = class extends NodeHandler2 {
1641
1685
  const contentDiv = headerElement.querySelector(
1642
1686
  'div > div:not([style*="display:flex"])'
1643
1687
  );
1644
- if (contentDiv && contentDiv instanceof import_node_html_parser6.HTMLElement) {
1688
+ if (contentDiv && contentDiv instanceof import_node_html_parser7.HTMLElement) {
1645
1689
  const contentDivClone = contentDiv.clone();
1646
1690
  contentDivClone.setAttribute("style", "text-align: left;");
1647
1691
  return createNestedEditorFromHtml(contentDivClone);
@@ -1661,7 +1705,7 @@ var FinancialStatementQuestionNodeHandler2 = class extends NodeHandler2 {
1661
1705
  }
1662
1706
  processRowsNode(rowsNode, jsonNode) {
1663
1707
  for (const rowsChild of rowsNode.childNodes) {
1664
- if (!(rowsChild instanceof import_node_html_parser6.HTMLElement)) continue;
1708
+ if (!(rowsChild instanceof import_node_html_parser7.HTMLElement)) continue;
1665
1709
  if (rowsChild.tagName === TAG_X_HEADING.toUpperCase()) {
1666
1710
  this.processHeadingRow(rowsChild, jsonNode);
1667
1711
  } else if (rowsChild.tagName === TAG_X_LINE.toUpperCase()) {
@@ -1695,7 +1739,7 @@ var FinancialStatementQuestionNodeHandler2 = class extends NodeHandler2 {
1695
1739
  };
1696
1740
 
1697
1741
  // src/importFromHtml/FormattedNodeHandler.ts
1698
- var import_node_html_parser7 = require("node-html-parser");
1742
+ var import_node_html_parser8 = require("node-html-parser");
1699
1743
  var IS_BOLD2 = 1;
1700
1744
  var IS_ITALIC2 = 1 << 1;
1701
1745
  var IS_STRIKETHROUGH2 = 1 << 2;
@@ -1735,7 +1779,7 @@ function formatToProps(format) {
1735
1779
  }
1736
1780
  var FormattedNodeHandler = class extends NodeHandler2 {
1737
1781
  processNode(node) {
1738
- if (!(node instanceof import_node_html_parser7.HTMLElement)) return null;
1782
+ if (!(node instanceof import_node_html_parser8.HTMLElement)) return null;
1739
1783
  const tagName = node.tagName;
1740
1784
  if (!tagName || !(tagName in TAG_TO_FORMAT)) return null;
1741
1785
  const formatFlag = TAG_TO_FORMAT[tagName];
@@ -1770,11 +1814,11 @@ var FormattedNodeHandler = class extends NodeHandler2 {
1770
1814
  };
1771
1815
 
1772
1816
  // src/importFromHtml/HorizontalRuleNodeHandler.ts
1773
- var import_node_html_parser8 = require("node-html-parser");
1817
+ var import_node_html_parser9 = require("node-html-parser");
1774
1818
  var TAG_HR = "hr";
1775
1819
  var HorizontalRuleNodeHandler2 = class extends NodeHandler2 {
1776
1820
  processNode(node) {
1777
- if (!(node instanceof import_node_html_parser8.HTMLElement) || node.tagName !== TAG_HR.toUpperCase()) {
1821
+ if (!(node instanceof import_node_html_parser9.HTMLElement) || node.tagName !== TAG_HR.toUpperCase()) {
1778
1822
  return null;
1779
1823
  }
1780
1824
  const horizontalRuleNode = {
@@ -1786,11 +1830,11 @@ var HorizontalRuleNodeHandler2 = class extends NodeHandler2 {
1786
1830
  };
1787
1831
 
1788
1832
  // src/importFromHtml/ImageNodeHandler.ts
1789
- var import_node_html_parser9 = require("node-html-parser");
1833
+ var import_node_html_parser10 = require("node-html-parser");
1790
1834
  var TAG_IMG = "img";
1791
1835
  var ImageNodeHandler2 = class extends NodeHandler2 {
1792
1836
  processNode(node) {
1793
- if (!(node instanceof import_node_html_parser9.HTMLElement) || node.tagName !== TAG_IMG.toUpperCase()) {
1837
+ if (!(node instanceof import_node_html_parser10.HTMLElement) || node.tagName !== TAG_IMG.toUpperCase()) {
1794
1838
  return null;
1795
1839
  }
1796
1840
  return createImageNode(
@@ -1806,11 +1850,11 @@ var ImageNodeHandler2 = class extends NodeHandler2 {
1806
1850
 
1807
1851
  // src/importFromHtml/JournalEntryQuestionNodeHandler.ts
1808
1852
  var import_nanoid6 = require("nanoid");
1809
- var import_node_html_parser11 = require("node-html-parser");
1853
+ var import_node_html_parser12 = require("node-html-parser");
1810
1854
 
1811
1855
  // src/importFromHtml/createOnePerLineDistractorNode.ts
1812
1856
  var import_nanoid5 = require("nanoid");
1813
- var import_node_html_parser10 = require("node-html-parser");
1857
+ var import_node_html_parser11 = require("node-html-parser");
1814
1858
  function extractDistractorId(id) {
1815
1859
  if (!id) return null;
1816
1860
  const parts = id.split("|");
@@ -1823,7 +1867,7 @@ var createOnePerLineDistractorNode = (node) => {
1823
1867
  distractorEditor.editorState.root.children = [];
1824
1868
  let distractorId = null;
1825
1869
  distractors.forEach((distractor) => {
1826
- if (!(distractor instanceof import_node_html_parser10.HTMLElement)) return;
1870
+ if (!(distractor instanceof import_node_html_parser11.HTMLElement)) return;
1827
1871
  distractorId = distractorId ?? extractDistractorId(distractor.getAttribute("id"));
1828
1872
  distractorEditor.editorState.root.children.push(
1829
1873
  ...createNestedNodesFromHtml(distractor)
@@ -1841,20 +1885,22 @@ var createOnePerLineDistractorNode = (node) => {
1841
1885
  // src/importFromHtml/JournalEntryQuestionNodeHandler.ts
1842
1886
  var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1843
1887
  processNode(node) {
1844
- if (!(node instanceof import_node_html_parser11.HTMLElement) || node.tagName !== "x-journal-entry".toUpperCase())
1888
+ if (!(node instanceof import_node_html_parser12.HTMLElement) || node.tagName !== "x-journal-entry".toUpperCase())
1845
1889
  return null;
1846
1890
  const jsonNode = {
1847
1891
  id: node.getAttribute("id") ?? (0, import_nanoid6.nanoid)(),
1848
1892
  points: Number(node.getAttribute("data-x-points") ?? 1),
1849
1893
  noEntryRequired: node.getAttribute("data-x-no-entry-required-correct") === "true",
1850
- errorTolerance: node.getAttribute("data-x-error-tolerance") ? Number(node.getAttribute("data-x-error-tolerance")) : void 0,
1894
+ errorTolerance: parseErrorToleranceAttribute(
1895
+ node.getAttribute("data-x-error-tolerance")
1896
+ ),
1851
1897
  lineItems: [],
1852
1898
  type: "journal-entry-question",
1853
1899
  version: 1
1854
1900
  };
1855
1901
  const lineItems = node.querySelectorAll("x-line-item");
1856
1902
  lineItems.forEach((lineItem) => {
1857
- if (!(lineItem instanceof import_node_html_parser11.HTMLElement)) return;
1903
+ if (!(lineItem instanceof import_node_html_parser12.HTMLElement)) return;
1858
1904
  const accountElement = lineItem.querySelector("x-account");
1859
1905
  const debitElement = lineItem.querySelector("x-debit");
1860
1906
  const creditElement = lineItem.querySelector("x-credit");
@@ -1883,10 +1929,10 @@ var JournalEntryQuestionNodeHandler2 = class extends NodeHandler2 {
1883
1929
  };
1884
1930
 
1885
1931
  // src/importFromHtml/LineBreakNodeHandler.ts
1886
- var import_node_html_parser12 = require("node-html-parser");
1932
+ var import_node_html_parser13 = require("node-html-parser");
1887
1933
  var LineBreakNodeHandler2 = class extends NodeHandler2 {
1888
1934
  processNode(node) {
1889
- if (!(node instanceof import_node_html_parser12.HTMLElement)) return null;
1935
+ if (!(node instanceof import_node_html_parser13.HTMLElement)) return null;
1890
1936
  if (node.tagName !== "BR") return null;
1891
1937
  return {
1892
1938
  type: "linebreak",
@@ -1896,11 +1942,11 @@ var LineBreakNodeHandler2 = class extends NodeHandler2 {
1896
1942
  };
1897
1943
 
1898
1944
  // src/importFromHtml/LinkNodeHandler.ts
1899
- var import_node_html_parser13 = require("node-html-parser");
1945
+ var import_node_html_parser14 = require("node-html-parser");
1900
1946
  var TAG_A = "a";
1901
1947
  var LinkNodeHandler2 = class extends NodeHandler2 {
1902
1948
  processNode(node) {
1903
- if (!(node instanceof import_node_html_parser13.HTMLElement) || node.tagName !== TAG_A.toUpperCase()) {
1949
+ if (!(node instanceof import_node_html_parser14.HTMLElement) || node.tagName !== TAG_A.toUpperCase()) {
1904
1950
  return null;
1905
1951
  }
1906
1952
  const url = node.getAttribute("href") || "";
@@ -1929,10 +1975,10 @@ var LinkNodeHandler2 = class extends NodeHandler2 {
1929
1975
  };
1930
1976
 
1931
1977
  // src/importFromHtml/ListItemNodeHandler.ts
1932
- var import_node_html_parser14 = require("node-html-parser");
1978
+ var import_node_html_parser15 = require("node-html-parser");
1933
1979
  var ListItemNodeHandler2 = class extends NodeHandler2 {
1934
1980
  processNode(node) {
1935
- if (!(node instanceof import_node_html_parser14.HTMLElement)) return null;
1981
+ if (!(node instanceof import_node_html_parser15.HTMLElement)) return null;
1936
1982
  if (node.tagName !== "LI") return null;
1937
1983
  const jsonNode = {
1938
1984
  type: "listitem",
@@ -1953,10 +1999,10 @@ var ListItemNodeHandler2 = class extends NodeHandler2 {
1953
1999
  };
1954
2000
 
1955
2001
  // src/importFromHtml/ListNodeHandler.ts
1956
- var import_node_html_parser15 = require("node-html-parser");
2002
+ var import_node_html_parser16 = require("node-html-parser");
1957
2003
  var ListNodeHandler2 = class extends NodeHandler2 {
1958
2004
  processNode(node) {
1959
- if (!(node instanceof import_node_html_parser15.HTMLElement)) return null;
2005
+ if (!(node instanceof import_node_html_parser16.HTMLElement)) return null;
1960
2006
  if (node.tagName !== "UL" && node.tagName !== "OL") return null;
1961
2007
  const tag = node.tagName.toLowerCase();
1962
2008
  const listType = tag === "ol" ? "number" : "bullet";
@@ -1974,7 +2020,7 @@ var ListNodeHandler2 = class extends NodeHandler2 {
1974
2020
  };
1975
2021
  let itemIndex = 1;
1976
2022
  node.childNodes.forEach((child) => {
1977
- if (child instanceof import_node_html_parser15.HTMLElement && child.tagName === "LI") {
2023
+ if (child instanceof import_node_html_parser16.HTMLElement && child.tagName === "LI") {
1978
2024
  const listItemNode = {
1979
2025
  type: "listitem",
1980
2026
  version: 1,
@@ -1999,10 +2045,10 @@ var ListNodeHandler2 = class extends NodeHandler2 {
1999
2045
 
2000
2046
  // src/importFromHtml/MatchingQuestionNodeHandler.ts
2001
2047
  var import_nanoid7 = require("nanoid");
2002
- var import_node_html_parser16 = require("node-html-parser");
2048
+ var import_node_html_parser17 = require("node-html-parser");
2003
2049
  var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
2004
2050
  processNode(node) {
2005
- if (!(node instanceof import_node_html_parser16.HTMLElement) || node.tagName !== "x-matching".toUpperCase())
2051
+ if (!(node instanceof import_node_html_parser17.HTMLElement) || node.tagName !== "x-matching".toUpperCase())
2006
2052
  return null;
2007
2053
  const jsonNode = {
2008
2054
  id: node.getAttribute("id") ?? (0, import_nanoid7.nanoid)(),
@@ -2015,7 +2061,7 @@ var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
2015
2061
  };
2016
2062
  const matches = node.querySelectorAll("x-match");
2017
2063
  matches.forEach((match) => {
2018
- if (!(match instanceof import_node_html_parser16.HTMLElement)) return;
2064
+ if (!(match instanceof import_node_html_parser17.HTMLElement)) return;
2019
2065
  const premise = match.querySelector("x-premise");
2020
2066
  const option = match.querySelector("x-option");
2021
2067
  if (!premise || !option) return;
@@ -2038,10 +2084,10 @@ var MatchingQuestionNodeHandler2 = class extends NodeHandler2 {
2038
2084
 
2039
2085
  // src/importFromHtml/MultipleOptionQuestionNodeHandler.ts
2040
2086
  var import_nanoid8 = require("nanoid");
2041
- var import_node_html_parser17 = require("node-html-parser");
2087
+ var import_node_html_parser18 = require("node-html-parser");
2042
2088
  var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
2043
2089
  processNode(node) {
2044
- if (!(node instanceof import_node_html_parser17.HTMLElement)) return null;
2090
+ if (!(node instanceof import_node_html_parser18.HTMLElement)) return null;
2045
2091
  if (node.tagName === "x-multiple-choice".toUpperCase())
2046
2092
  return this.processMultipleChoiceNode(node);
2047
2093
  else if (node.tagName === "x-multiple-answers".toUpperCase())
@@ -2081,7 +2127,7 @@ var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
2081
2127
  processOptions(node, jsonNode) {
2082
2128
  const childNodes = node.childNodes;
2083
2129
  childNodes.forEach((child) => {
2084
- if (!(child instanceof import_node_html_parser17.HTMLElement)) return;
2130
+ if (!(child instanceof import_node_html_parser18.HTMLElement)) return;
2085
2131
  if (child.tagName !== "x-option".toUpperCase()) return;
2086
2132
  jsonNode.options.push({
2087
2133
  id: child.getAttribute("id") ?? (0, import_nanoid8.nanoid)(),
@@ -2093,7 +2139,7 @@ var MultipleOptionQuestionNodeHandler2 = class extends NodeHandler2 {
2093
2139
  };
2094
2140
 
2095
2141
  // src/importFromHtml/ParagraphNodeHandler.ts
2096
- var import_node_html_parser18 = require("node-html-parser");
2142
+ var import_node_html_parser19 = require("node-html-parser");
2097
2143
  var TEXT_ALIGN_TO_FORMAT = {
2098
2144
  center: "center",
2099
2145
  end: "end",
@@ -2116,25 +2162,25 @@ var ParagraphNodeHandler2 = class extends NodeHandler2 {
2116
2162
  return "";
2117
2163
  }
2118
2164
  processImageNode(node) {
2119
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser18.HTMLElement && node.childNodes[0].tagName === "IMG") {
2165
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser19.HTMLElement && node.childNodes[0].tagName === "IMG") {
2120
2166
  return traverse2(node.childNodes[0]);
2121
2167
  }
2122
2168
  return null;
2123
2169
  }
2124
2170
  processSpanImageNode(node) {
2125
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser18.HTMLElement && node.childNodes[0].tagName === "SPAN" && node.childNodes[0].childNodes.length === 1 && node.childNodes[0].childNodes[0] instanceof import_node_html_parser18.HTMLElement && node.childNodes[0].childNodes[0].tagName === "IMG") {
2171
+ 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") {
2126
2172
  return traverse2(node.childNodes[0].childNodes[0]);
2127
2173
  }
2128
2174
  return null;
2129
2175
  }
2130
2176
  processNode(node) {
2131
- if (!(node instanceof import_node_html_parser18.HTMLElement)) return null;
2177
+ if (!(node instanceof import_node_html_parser19.HTMLElement)) return null;
2132
2178
  if (node.tagName !== "P") return null;
2133
2179
  const imageNode = this.processImageNode(node) ?? this.processSpanImageNode(node);
2134
2180
  if (imageNode) return imageNode;
2135
2181
  const jsonNode = createEmptyParagraphNode();
2136
2182
  jsonNode.format = this.extractTextAlignment(node);
2137
- if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser18.HTMLElement && node.childNodes[0].tagName === "BR")
2183
+ if (node.childNodes.length === 1 && node.childNodes[0] instanceof import_node_html_parser19.HTMLElement && node.childNodes[0].tagName === "BR")
2138
2184
  return jsonNode;
2139
2185
  node.childNodes.forEach((child) => {
2140
2186
  const processedChildren = traverse2(child);
@@ -2146,10 +2192,10 @@ var ParagraphNodeHandler2 = class extends NodeHandler2 {
2146
2192
 
2147
2193
  // src/importFromHtml/ShortAnswerQuestionNodeHandler.ts
2148
2194
  var import_nanoid9 = require("nanoid");
2149
- var import_node_html_parser19 = require("node-html-parser");
2195
+ var import_node_html_parser20 = require("node-html-parser");
2150
2196
  var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
2151
2197
  processNode(node) {
2152
- if (!(node instanceof import_node_html_parser19.HTMLElement) || node.tagName !== "x-short-answer".toUpperCase())
2198
+ if (!(node instanceof import_node_html_parser20.HTMLElement) || node.tagName !== "x-short-answer".toUpperCase())
2153
2199
  return null;
2154
2200
  return {
2155
2201
  id: node.getAttribute("id") ?? (0, import_nanoid9.nanoid)(),
@@ -2165,13 +2211,13 @@ var ShortAnswerQuestionNodeHandler2 = class extends NodeHandler2 {
2165
2211
  };
2166
2212
 
2167
2213
  // src/importFromHtml/SimulationQuestionNodeHandler.ts
2168
- var import_node_html_parser20 = require("node-html-parser");
2214
+ var import_node_html_parser21 = require("node-html-parser");
2169
2215
  var TAG_X_SIMULATION = "x-simulation";
2170
2216
  var TAG_X_SYSTEM_MESSAGE2 = "x-ai-system-message";
2171
2217
  var TAG_X_STEP2_INSTRUCTIONS = "x-step2-instructions";
2172
2218
  var SimulationQuestionNodeHandler2 = class extends NodeHandler2 {
2173
2219
  processNode(node) {
2174
- if (!(node instanceof import_node_html_parser20.HTMLElement) || node.tagName !== TAG_X_SIMULATION.toUpperCase()) {
2220
+ if (!(node instanceof import_node_html_parser21.HTMLElement) || node.tagName !== TAG_X_SIMULATION.toUpperCase()) {
2175
2221
  return null;
2176
2222
  }
2177
2223
  const jsonNode = {
@@ -2198,11 +2244,11 @@ var SimulationQuestionNodeHandler2 = class extends NodeHandler2 {
2198
2244
  };
2199
2245
 
2200
2246
  // src/importFromHtml/SpanNodeHandler.ts
2201
- var import_node_html_parser21 = require("node-html-parser");
2202
- var TextNode = import_node_html_parser21.parse.TextNode;
2247
+ var import_node_html_parser22 = require("node-html-parser");
2248
+ var TextNode = import_node_html_parser22.parse.TextNode;
2203
2249
  var SpanNodeHandler = class extends NodeHandler2 {
2204
2250
  processNode(node) {
2205
- if (!(node instanceof import_node_html_parser21.HTMLElement) || node.tagName !== "SPAN")
2251
+ if (!(node instanceof import_node_html_parser22.HTMLElement) || node.tagName !== "SPAN")
2206
2252
  return null;
2207
2253
  const styleAttr = node.getAttribute("style") || "";
2208
2254
  if (node.childNodes.length === 1 && node.childNodes[0] instanceof TextNode) {
@@ -2264,7 +2310,7 @@ var SpanNodeHandler = class extends NodeHandler2 {
2264
2310
  };
2265
2311
 
2266
2312
  // src/importFromHtml/TableCellNodeHandler.ts
2267
- var import_node_html_parser22 = require("node-html-parser");
2313
+ var import_node_html_parser23 = require("node-html-parser");
2268
2314
 
2269
2315
  // src/utils/styleUtils.ts
2270
2316
  var extractStyleValue = (styleAttr, property, isNumeric = false, unit = "") => {
@@ -2313,7 +2359,7 @@ function createEmptyTableCellNode(isHeader = false) {
2313
2359
 
2314
2360
  // src/importFromHtml/TableCellNodeHandler.ts
2315
2361
  var isHtmlTableCellElement = (node) => {
2316
- return node instanceof import_node_html_parser22.HTMLElement && (node.tagName === "TD" || node.tagName === "TH");
2362
+ return node instanceof import_node_html_parser23.HTMLElement && (node.tagName === "TD" || node.tagName === "TH");
2317
2363
  };
2318
2364
  var TableCellNodeHandler2 = class extends NodeHandler2 {
2319
2365
  processNode(node) {
@@ -2355,10 +2401,10 @@ var TableCellNodeHandler2 = class extends NodeHandler2 {
2355
2401
  };
2356
2402
 
2357
2403
  // src/importFromHtml/TableNodeHandler.ts
2358
- var import_node_html_parser23 = require("node-html-parser");
2404
+ var import_node_html_parser24 = require("node-html-parser");
2359
2405
  var REFERENCE_TABLE_WIDTH = 720;
2360
2406
  var MINIMUM_REFERENCE_TABLE_WIDTH = 500;
2361
- var isHtmlTableElement = (node) => node instanceof import_node_html_parser23.HTMLElement && node.tagName === "TABLE";
2407
+ var isHtmlTableElement = (node) => node instanceof import_node_html_parser24.HTMLElement && node.tagName === "TABLE";
2362
2408
  var TableNodeHandler2 = class extends NodeHandler2 {
2363
2409
  processNode(node) {
2364
2410
  if (!isHtmlTableElement(node)) return null;
@@ -2513,9 +2559,9 @@ var TableNodeHandler2 = class extends NodeHandler2 {
2513
2559
  };
2514
2560
 
2515
2561
  // src/importFromHtml/TableRowNodeHandler.ts
2516
- var import_node_html_parser24 = require("node-html-parser");
2562
+ var import_node_html_parser25 = require("node-html-parser");
2517
2563
  var isHtmlTableRowElement = (node) => {
2518
- return node instanceof import_node_html_parser24.HTMLElement && node.tagName === "TR";
2564
+ return node instanceof import_node_html_parser25.HTMLElement && node.tagName === "TR";
2519
2565
  };
2520
2566
  var TableRowNodeHandler2 = class extends NodeHandler2 {
2521
2567
  processNode(node) {
@@ -2538,34 +2584,30 @@ var TableRowNodeHandler2 = class extends NodeHandler2 {
2538
2584
  };
2539
2585
 
2540
2586
  // src/importFromHtml/TextNodeHandler.ts
2541
- var import_node_html_parser25 = require("node-html-parser");
2542
- var TextNode2 = import_node_html_parser25.parse.TextNode;
2587
+ var import_node_html_parser26 = require("node-html-parser");
2588
+ var TextNode2 = import_node_html_parser26.parse.TextNode;
2543
2589
  var TextNodeHandler2 = class extends NodeHandler2 {
2544
2590
  processNode(node) {
2545
- if (node instanceof TextNode2 && !!node.parentNode.tagName) {
2546
- if (node.isWhitespace) {
2547
- return null;
2548
- }
2549
- const jsonNode = {
2550
- detail: 0,
2551
- format: 0,
2552
- mode: "normal",
2553
- style: "",
2554
- text: node.text,
2555
- type: "text",
2556
- version: 1
2557
- };
2558
- return jsonNode;
2559
- }
2560
- return null;
2591
+ if (!(node instanceof TextNode2)) return null;
2592
+ if (!node.parentNode.tagName) return null;
2593
+ const jsonNode = {
2594
+ detail: 0,
2595
+ format: 0,
2596
+ mode: "normal",
2597
+ style: "",
2598
+ text: node.text,
2599
+ type: "text",
2600
+ version: 1
2601
+ };
2602
+ return jsonNode;
2561
2603
  }
2562
2604
  };
2563
2605
 
2564
2606
  // src/importFromHtml/VariableNodeHandler.ts
2565
- var import_node_html_parser26 = require("node-html-parser");
2607
+ var import_node_html_parser27 = require("node-html-parser");
2566
2608
  var VariableNodeHandler2 = class extends NodeHandler2 {
2567
2609
  processNode(node) {
2568
- if (!(node instanceof import_node_html_parser26.HTMLElement) || !node.tagName) return null;
2610
+ if (!(node instanceof import_node_html_parser27.HTMLElement) || !node.tagName) return null;
2569
2611
  if (node.tagName !== "x-param".toUpperCase()) return null;
2570
2612
  return {
2571
2613
  variableName: node.getAttribute("data-x-name") || "undefined",
@@ -2578,7 +2620,7 @@ var VariableNodeHandler2 = class extends NodeHandler2 {
2578
2620
 
2579
2621
  // src/importFromHtml/traverse.ts
2580
2622
  var builder2 = new NodeHandlerChainBuilder();
2581
- var nodeHandlerChain2 = builder2.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();
2623
+ 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();
2582
2624
  function traverse2(node) {
2583
2625
  const result = nodeHandlerChain2.handle(node);
2584
2626
  if (result === null) return [];
@@ -2596,7 +2638,7 @@ function processChildren(node) {
2596
2638
  return result;
2597
2639
  }
2598
2640
  function processHtml(html) {
2599
- const root = (0, import_node_html_parser27.parse)(html);
2641
+ const root = (0, import_node_html_parser28.parse)(html);
2600
2642
  return processChildren(root);
2601
2643
  }
2602
2644
  function importFromHtml(html) {