@gravity-ui/markdown-editor 15.25.0 → 15.26.1

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 (142) hide show
  1. package/build/cjs/extensions/additional/Math/const.d.ts +1 -0
  2. package/build/cjs/extensions/additional/Math/const.js +11 -1
  3. package/build/cjs/extensions/additional/Math/const.js.map +1 -1
  4. package/build/cjs/extensions/additional/Math/index.d.ts +1 -0
  5. package/build/cjs/extensions/additional/Math/index.js +6 -1
  6. package/build/cjs/extensions/additional/Math/index.js.map +1 -1
  7. package/build/cjs/extensions/additional/Math/latex-paste-plugin.d.ts +2 -0
  8. package/build/cjs/extensions/additional/Math/latex-paste-plugin.js +54 -0
  9. package/build/cjs/extensions/additional/Math/latex-paste-plugin.js.map +1 -0
  10. package/build/cjs/extensions/additional/Math/utils.d.ts +7 -0
  11. package/build/cjs/extensions/additional/Math/utils.js +45 -0
  12. package/build/cjs/extensions/additional/Math/utils.js.map +1 -0
  13. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +8 -0
  14. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  15. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +68 -7
  16. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  17. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +4 -0
  18. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +1 -1
  19. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +53 -28
  20. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  21. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +6 -0
  22. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +28 -2
  23. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  24. package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +2 -1
  25. package/build/cjs/extensions/markdown/CodeBlock/index.js +21 -6
  26. package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
  27. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.js +29 -17
  28. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.js.map +1 -1
  29. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +2 -1
  30. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  31. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.d.ts +5 -2
  32. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +59 -2
  33. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  34. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/FloatingPlusButton.d.ts +4 -2
  35. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/FloatingPlusButton.js +3 -4
  36. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/FloatingPlusButton.js.map +1 -1
  37. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.d.ts +3 -1
  38. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.js +36 -1
  39. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.js.map +1 -1
  40. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.d.ts +13 -1
  41. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js +7 -10
  42. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js.map +1 -1
  43. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-drop-cursor.d.ts +3 -0
  44. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-drop-cursor.js +39 -1
  45. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-drop-cursor.js.map +1 -1
  46. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +9 -4
  47. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -1
  48. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +1 -1
  49. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  50. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/hooks/use-raf-throttle.d.ts +1 -0
  51. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/hooks/use-raf-throttle.js +25 -0
  52. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/hooks/use-raf-throttle.js.map +1 -0
  53. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -2
  54. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  55. package/build/cjs/i18n/codeblock/en.json +2 -1
  56. package/build/cjs/i18n/codeblock/index.d.ts +2 -1
  57. package/build/cjs/i18n/codeblock/ru.json +2 -1
  58. package/build/cjs/styles/styles.css +289 -0
  59. package/build/cjs/styles/yfm-themes.css +288 -0
  60. package/build/cjs/table-utils/table-desc.d.ts +1 -0
  61. package/build/cjs/table-utils/table-desc.js +3 -0
  62. package/build/cjs/table-utils/table-desc.js.map +1 -1
  63. package/build/cjs/version.js +1 -1
  64. package/build/cjs/version.js.map +1 -1
  65. package/build/cjs/view/hocs/withYfmHtml/index.d.ts +1 -0
  66. package/build/cjs/view/hocs/withYfmHtml/index.js +3 -0
  67. package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
  68. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.d.ts +5 -1
  69. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +8 -1
  70. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  71. package/build/esm/extensions/additional/Math/const.d.ts +1 -0
  72. package/build/esm/extensions/additional/Math/const.js +10 -0
  73. package/build/esm/extensions/additional/Math/const.js.map +1 -1
  74. package/build/esm/extensions/additional/Math/index.d.ts +1 -0
  75. package/build/esm/extensions/additional/Math/index.js +3 -0
  76. package/build/esm/extensions/additional/Math/index.js.map +1 -1
  77. package/build/esm/extensions/additional/Math/latex-paste-plugin.d.ts +2 -0
  78. package/build/esm/extensions/additional/Math/latex-paste-plugin.js +50 -0
  79. package/build/esm/extensions/additional/Math/latex-paste-plugin.js.map +1 -0
  80. package/build/esm/extensions/additional/Math/utils.d.ts +7 -0
  81. package/build/esm/extensions/additional/Math/utils.js +39 -0
  82. package/build/esm/extensions/additional/Math/utils.js.map +1 -0
  83. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +8 -0
  84. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  85. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +69 -8
  86. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  87. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +4 -0
  88. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +1 -1
  89. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -29
  90. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  91. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +6 -0
  92. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +28 -2
  93. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  94. package/build/esm/extensions/markdown/CodeBlock/index.d.ts +2 -1
  95. package/build/esm/extensions/markdown/CodeBlock/index.js +21 -6
  96. package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
  97. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.js +29 -17
  98. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.js.map +1 -1
  99. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +2 -1
  100. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  101. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.d.ts +5 -2
  102. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +59 -2
  103. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  104. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/FloatingPlusButton.d.ts +4 -2
  105. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/FloatingPlusButton.js +4 -4
  106. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/FloatingPlusButton.js.map +1 -1
  107. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.d.ts +3 -1
  108. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.js +38 -3
  109. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.js.map +1 -1
  110. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.d.ts +13 -1
  111. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js +8 -10
  112. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js.map +1 -1
  113. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-drop-cursor.d.ts +3 -0
  114. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-drop-cursor.js +38 -1
  115. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-drop-cursor.js.map +1 -1
  116. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +9 -4
  117. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -1
  118. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +2 -2
  119. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  120. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/hooks/use-raf-throttle.d.ts +1 -0
  121. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/hooks/use-raf-throttle.js +22 -0
  122. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/hooks/use-raf-throttle.js.map +1 -0
  123. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -2
  124. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  125. package/build/esm/i18n/codeblock/en.json +2 -1
  126. package/build/esm/i18n/codeblock/index.d.ts +2 -1
  127. package/build/esm/i18n/codeblock/ru.json +2 -1
  128. package/build/esm/styles/styles.css +289 -0
  129. package/build/esm/styles/yfm-themes.css +288 -0
  130. package/build/esm/table-utils/table-desc.d.ts +1 -0
  131. package/build/esm/table-utils/table-desc.js +3 -0
  132. package/build/esm/table-utils/table-desc.js.map +1 -1
  133. package/build/esm/version.js +1 -1
  134. package/build/esm/version.js.map +1 -1
  135. package/build/esm/view/hocs/withYfmHtml/index.d.ts +1 -0
  136. package/build/esm/view/hocs/withYfmHtml/index.js +1 -0
  137. package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
  138. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.d.ts +5 -1
  139. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +7 -1
  140. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  141. package/build/styles.css +589 -0
  142. package/package.json +10 -9
@@ -1 +1 @@
1
- {"version":3,"file":"table-desc.js","sourceRoot":"../../../src","sources":["table-utils/table-desc.ts"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\n\nimport {isTableBodyNode, isTableNode} from './utils';\n\n// TableDesc creates a virtual table description containing info about real and virtual cells needed for correct table operations.\n// This description is cached.\n// At the same time, positions of rows and cells may change, so a separate class (TableDescBinded) has been added\n// to work with absolute (relative to the document) positions.\n// Ranges are also added for more comprehensive operations with rows and columns.\n\nexport type TableCellRealDesc = {\n type: 'real';\n offset: number;\n node: Node;\n colspan?: number;\n rowspan?: number;\n};\nexport type TableCellVirtualDesc = {\n type: 'virtual';\n /** Index of real cell, that prodeced this virtual cell */\n colspan?: [number, number];\n /** Index of real cell, that prodeced this virtual cell */\n rowspan?: [number, number];\n};\n\ntype Pos = {from: number; to: number};\nexport type CellPos = RealCellPos | VirtualCellPos;\nexport type RealCellPos = {type: 'real'} & Pos;\nexport type VirtualCellPos = {type: 'virtual'; closestPos: number};\n\nexport type TableCellDesc = TableCellRealDesc | TableCellVirtualDesc;\nexport type TableRowRange = {\n startIdx: number;\n endIdx: number;\n rowsCount: number;\n safeTopBoundary: boolean;\n safeBottomBoundary: boolean;\n};\nexport type TableColumnRange = {\n startIdx: number;\n endIdx: number;\n columnsCount: number;\n safeLeftBoundary: boolean;\n safeRightBoundary: boolean;\n};\n\ntype TableRowDesc = {\n node: Node;\n cells: TableCellDesc[];\n offset: number;\n colspan?: boolean;\n rowspan?: boolean;\n};\n\nexport class TableDesc {\n private static __cache = new WeakMap<Node, TableDesc>();\n\n static create(table: Node) {\n if (this.__cache.has(table)) return this.__cache.get(table)!;\n\n if (!isTableNode(table)) return null;\n const tbody = table.lastChild;\n if (!tbody || !isTableBodyNode(tbody)) return null;\n\n // table –> tbody -> ...\n const baseOffset = 2;\n\n const rows: TableRowDesc[] = [];\n tbody.forEach((trow, offset) => {\n rows.push({node: trow, offset, cells: []});\n });\n\n tbody.forEach((trow, _1, trowIndex) => {\n trow.forEach((tcell, offset, tcellRealIndex) => {\n const rowDesc = rows[trowIndex];\n\n let tcellIndex = tcellRealIndex;\n while (rowDesc.cells[tcellIndex]) {\n tcellIndex++;\n }\n\n const cellDesc: TableCellRealDesc = (rowDesc.cells[tcellIndex] = {\n type: 'real',\n node: tcell,\n offset,\n });\n\n const map: [number, number] = [trowIndex, tcellIndex];\n\n if (isNumber(tcell.attrs['colspan'])) {\n rowDesc.colspan = true;\n const colspan = (cellDesc.colspan = parseInt(tcell.attrs['colspan'], 10));\n for (let i = 1; i < colspan; i++) {\n rowDesc.cells[tcellIndex + i] = {\n type: 'virtual',\n colspan: map,\n };\n }\n }\n\n if (isNumber(tcell.attrs['rowspan'])) {\n rowDesc.rowspan = true;\n const rowspan = (cellDesc.rowspan = parseInt(tcell.attrs['rowspan'], 10));\n for (let i = 1; i < rowspan; i++) {\n const colspan = cellDesc.colspan ?? 1;\n for (let j = 0; j < colspan; j++) {\n const cell: TableCellVirtualDesc = (rows[trowIndex + i].cells[\n tcellIndex + j\n ] = {\n type: 'virtual',\n rowspan: map,\n });\n if (colspan > 1) {\n cell.colspan = map;\n }\n }\n }\n }\n });\n });\n\n // ---> validation\n const rowsCount = rows.length;\n const colsCount = rows[0].cells.length;\n for (let r = 0; r < rowsCount; r++) {\n if (!rows[r] || rows[r].cells.length !== colsCount) return null;\n\n for (let c = 0; c < colsCount; c++) {\n if (!rows[r].cells[c]) return null;\n }\n }\n // <--- validation\n\n const desc = new this(rows.length, rows[0].cells.length, rows, baseOffset);\n this.__cache.set(table, desc);\n return desc;\n }\n\n private _rowRanges?: readonly Readonly<TableRowRange>[];\n private _columnRanges?: readonly Readonly<TableColumnRange>[];\n\n private constructor(\n /* eslint-disable @typescript-eslint/parameter-properties */\n readonly rows: number,\n readonly cols: number,\n readonly rowsDesc: readonly TableRowDesc[],\n readonly baseOffset: number,\n /* eslint-enable @typescript-eslint/parameter-properties */\n ) {}\n\n bind(pos: number) {\n return new TableDescBinded(pos, this);\n }\n\n rowHasVirtualCells(rowIndex: number): boolean {\n return this.rowsDesc[rowIndex]?.cells.some((cell) => cell.type === 'virtual');\n }\n\n columnHasVirtualCells(columnIndex: number): boolean {\n return this.rowsDesc.some((row) => row.cells[columnIndex]?.type === 'virtual');\n }\n\n isSafeColumn(columnIndex: number): boolean {\n return this.rowsDesc.every((row) => {\n const cell = row.cells[columnIndex];\n if (cell.type === 'real' && (!cell.colspan || cell.colspan === 1)) return true;\n if (cell.type === 'virtual' && cell.rowspan?.[1] === columnIndex) return true;\n return false;\n });\n }\n\n isSafeRow(rowIndex: number): boolean {\n return this.rowsDesc[rowIndex]?.cells.every((cell) => {\n if (cell.type === 'real' && (!cell.rowspan || cell.rowspan === 1)) return true;\n if (cell.type === 'virtual' && cell.colspan?.[0] === rowIndex) return true;\n return false;\n });\n }\n\n getOffsetForRow(rowIndex: number): number {\n return this.baseOffset + this.rowsDesc[rowIndex]?.offset;\n }\n\n getRelativePosForRow(rowIndex: number): Pos {\n const from = this.getOffsetForRow(rowIndex);\n const to = from + this.rowsDesc[rowIndex].node.nodeSize;\n return {from, to};\n }\n\n getRelativePosForCell(rowIndex: number, columnIndex: number): CellPos {\n const cell = this.rowsDesc[rowIndex]?.cells[columnIndex];\n const rowOffset = this.getOffsetForRow(rowIndex);\n\n if (cell?.type === 'real') {\n // 1 – open boundary for row node\n const from = rowOffset + 1 + cell.offset;\n const to = from + cell.node.nodeSize;\n return {type: 'real', from, to};\n }\n\n if (cell?.type === 'virtual') {\n let index = columnIndex;\n while (--index >= 0) {\n const cell = this.rowsDesc[rowIndex].cells[index];\n if (cell.type === 'real') {\n const closest = rowOffset + 1 + cell.offset + cell.node.nodeSize;\n return {type: 'virtual', closestPos: closest};\n }\n }\n return {type: 'virtual', closestPos: rowOffset + 1};\n }\n\n throw new Error(\n `Impossible to calculate offset for cell with position [${rowIndex},${columnIndex}]`,\n );\n }\n\n getRelativePosForRowCells(rowIndex: number): CellPos[] {\n const cells: CellPos[] = [];\n\n for (let colIndex = 0; colIndex < this.cols; colIndex++) {\n cells.push(this.getRelativePosForCell(rowIndex, colIndex));\n }\n\n return cells;\n }\n\n getRelativePosForColumn(columnIndex: number): CellPos[] {\n const ranges: CellPos[] = [];\n\n for (let i = 0; i < this.rows; i++) {\n ranges.push(this.getRelativePosForCell(i, columnIndex));\n }\n\n return ranges;\n }\n\n getCellNodeType() {\n const isRealCell = (cell: TableCellDesc): cell is TableCellRealDesc => cell.type === 'real';\n return this.rowsDesc[0].cells.find(isRealCell)!.node.type;\n }\n\n getRowNodeType() {\n return this.rowsDesc[0].node.type;\n }\n\n getCellInfo(node: Node) {\n let desc: {node: Node; offset: number; row: number; column: number} | null = null;\n for (let i = 0; i < this.rowsDesc.length; i++) {\n const row = this.rowsDesc[i];\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (cell.type === 'real' && cell.node === node) {\n desc = {\n node: cell.node,\n offset: this.getOffsetForRow(i) + 1 + cell.offset,\n row: i,\n column: j,\n };\n }\n }\n }\n return desc;\n }\n\n getRowRanges() {\n if (this._rowRanges) return this._rowRanges;\n\n const ranges: TableRowRange[] = [];\n let last: TableRowRange | null = null;\n\n for (let i = 0; i < this.rowsDesc.length; i++) {\n const row = this.rowsDesc[i];\n const firstCell = row.cells[0];\n\n if (firstCell.type === 'real') {\n let safeTopBoundary = true;\n for (const cell of row.cells) {\n if (cell.type === 'virtual') safeTopBoundary &&= !cell.rowspan;\n }\n\n ranges.push(\n (last = {\n startIdx: i,\n endIdx: i,\n rowsCount: 1,\n safeTopBoundary,\n // calculate later\n safeBottomBoundary: true,\n }),\n );\n } else if (firstCell.rowspan) {\n last!.endIdx = i;\n last!.rowsCount++;\n } else {\n throw new Error(`First cell in row is virtual, but without rowspan [row=${i}]`);\n }\n }\n\n for (let i = 0; i < ranges.length; i++) {\n if (!ranges[i].safeTopBoundary) ranges[i - 1].safeBottomBoundary = false;\n }\n\n this._rowRanges = ranges;\n return ranges;\n }\n\n getRowRangeByRowIdx(rowIdx: number) {\n const rangeIdx = this.getRowRangeIdxByRowIdx(rowIdx);\n return this.getRowRanges()[rangeIdx];\n }\n\n getRowRangeIdxByRowIdx(rowIdx: number) {\n return this.getRowRanges().findIndex(\n (range) => range.startIdx <= rowIdx && range.endIdx >= rowIdx,\n );\n }\n\n getColumnRanges() {\n if (this._columnRanges) return this._columnRanges;\n\n const ranges: TableColumnRange[] = [];\n let last: TableColumnRange | null = null;\n\n const firstRow = this.rowsDesc[0];\n\n for (let i = 0; i < firstRow.cells.length; i++) {\n const cell = firstRow.cells[i];\n\n if (cell.type === 'real') {\n let safeLeftBoundary = true;\n for (const row of this.rowsDesc) {\n const cell = row.cells[i];\n if (cell.type === 'virtual' && cell.colspan)\n safeLeftBoundary &&= cell.colspan[1] === i;\n }\n\n ranges.push(\n (last = {\n startIdx: i,\n endIdx: i,\n columnsCount: 1,\n safeLeftBoundary,\n // calculate later\n safeRightBoundary: true,\n }),\n );\n } else if (cell.colspan) {\n last!.endIdx = i;\n last!.columnsCount++;\n } else {\n throw new Error(\n `First cell in column is virtual, but without colspan [column=${i}]`,\n );\n }\n }\n\n for (let i = 0; i < ranges.length; i++) {\n if (!ranges[i].safeLeftBoundary) ranges[i - 1].safeRightBoundary = false;\n }\n\n this._columnRanges = ranges;\n return ranges;\n }\n\n getColumnRangeByColumnIdx(columnIdx: number) {\n const rangeIdx = this.getColumnRangeIdxByColumnIdx(columnIdx);\n return this.getColumnRanges()[rangeIdx];\n }\n\n getColumnRangeIdxByColumnIdx(columnIdx: number) {\n return this.getColumnRanges().findIndex(\n (range) => range.startIdx <= columnIdx && range.endIdx >= columnIdx,\n );\n }\n}\n\nclass TableDescBinded {\n readonly pos: number;\n readonly base: TableDesc;\n\n get rows(): number {\n return this.base.rows;\n }\n\n get cols(): number {\n return this.base.cols;\n }\n\n constructor(pos: number, desc: TableDesc) {\n this.pos = pos;\n this.base = desc;\n }\n\n getRowIndexByPos(pos: number) {\n for (let rowIdx = 0; rowIdx < this.rows; rowIdx++) {\n const rowPos = this.pos + this.base.getOffsetForRow(rowIdx);\n if (pos === rowPos) return rowIdx;\n }\n return null;\n }\n\n getPosForRow(rowIndex: number): Pos {\n const pos = this.base.getRelativePosForRow(rowIndex);\n pos.from += this.pos;\n pos.to += this.pos;\n return pos;\n }\n\n getPosForCell(rowIndex: number, columnIndex: number): CellPos {\n const pos = this.base.getRelativePosForCell(rowIndex, columnIndex);\n if (pos.type === 'real') {\n pos.from += this.pos;\n pos.to += this.pos;\n } else if (pos.type === 'virtual') {\n pos.closestPos += this.pos;\n } else {\n throw new Error(\n `Impossible to calculate positions for cell with position [${rowIndex},${columnIndex}]`,\n );\n }\n return pos;\n }\n\n getPosForRowCells(rowIndex: number): CellPos[] {\n const cells: CellPos[] = [];\n\n for (let colIndex = 0; colIndex < this.base.cols; colIndex++) {\n cells.push(this.getPosForCell(rowIndex, colIndex));\n }\n\n return cells;\n }\n\n getPosForColumn(columnIndex: number): CellPos[] {\n const ranges: CellPos[] = [];\n\n for (let i = 0; i < this.base.rows; i++) {\n ranges.push(this.getPosForCell(i, columnIndex));\n }\n\n return ranges;\n }\n}\n\nexport type {TableDescBinded};\n"]}
1
+ {"version":3,"file":"table-desc.js","sourceRoot":"../../../src","sources":["table-utils/table-desc.ts"],"names":[],"mappings":"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","sourcesContent":["import isNumber from 'is-number';\nimport type {Node} from 'prosemirror-model';\n\nimport {isTableBodyNode, isTableNode} from './utils';\n\n// TableDesc creates a virtual table description containing info about real and virtual cells needed for correct table operations.\n// This description is cached.\n// At the same time, positions of rows and cells may change, so a separate class (TableDescBinded) has been added\n// to work with absolute (relative to the document) positions.\n// Ranges are also added for more comprehensive operations with rows and columns.\n\nexport type TableCellRealDesc = {\n type: 'real';\n offset: number;\n node: Node;\n colspan?: number;\n rowspan?: number;\n};\nexport type TableCellVirtualDesc = {\n type: 'virtual';\n /** Index of real cell, that prodeced this virtual cell */\n colspan?: [number, number];\n /** Index of real cell, that prodeced this virtual cell */\n rowspan?: [number, number];\n};\n\ntype Pos = {from: number; to: number};\nexport type CellPos = RealCellPos | VirtualCellPos;\nexport type RealCellPos = {type: 'real'} & Pos;\nexport type VirtualCellPos = {type: 'virtual'; closestPos: number};\n\nexport type TableCellDesc = TableCellRealDesc | TableCellVirtualDesc;\nexport type TableRowRange = {\n startIdx: number;\n endIdx: number;\n rowsCount: number;\n safeTopBoundary: boolean;\n safeBottomBoundary: boolean;\n};\nexport type TableColumnRange = {\n startIdx: number;\n endIdx: number;\n columnsCount: number;\n safeLeftBoundary: boolean;\n safeRightBoundary: boolean;\n};\n\ntype TableRowDesc = {\n node: Node;\n cells: TableCellDesc[];\n offset: number;\n colspan?: boolean;\n rowspan?: boolean;\n};\n\nexport class TableDesc {\n private static __cache = new WeakMap<Node, TableDesc>();\n\n static create(table: Node) {\n if (this.__cache.has(table)) return this.__cache.get(table)!;\n\n if (!isTableNode(table)) return null;\n const tbody = table.lastChild;\n if (!tbody || !isTableBodyNode(tbody)) return null;\n\n // table –> tbody -> ...\n const baseOffset = 2;\n\n const rows: TableRowDesc[] = [];\n tbody.forEach((trow, offset) => {\n rows.push({node: trow, offset, cells: []});\n });\n\n tbody.forEach((trow, _1, trowIndex) => {\n trow.forEach((tcell, offset, tcellRealIndex) => {\n const rowDesc = rows[trowIndex];\n\n let tcellIndex = tcellRealIndex;\n while (rowDesc.cells[tcellIndex]) {\n tcellIndex++;\n }\n\n const cellDesc: TableCellRealDesc = (rowDesc.cells[tcellIndex] = {\n type: 'real',\n node: tcell,\n offset,\n });\n\n const map: [number, number] = [trowIndex, tcellIndex];\n\n if (isNumber(tcell.attrs['colspan'])) {\n rowDesc.colspan = true;\n const colspan = (cellDesc.colspan = parseInt(tcell.attrs['colspan'], 10));\n for (let i = 1; i < colspan; i++) {\n rowDesc.cells[tcellIndex + i] = {\n type: 'virtual',\n colspan: map,\n };\n }\n }\n\n if (isNumber(tcell.attrs['rowspan'])) {\n rowDesc.rowspan = true;\n const rowspan = (cellDesc.rowspan = parseInt(tcell.attrs['rowspan'], 10));\n for (let i = 1; i < rowspan; i++) {\n const colspan = cellDesc.colspan ?? 1;\n for (let j = 0; j < colspan; j++) {\n const cell: TableCellVirtualDesc = (rows[trowIndex + i].cells[\n tcellIndex + j\n ] = {\n type: 'virtual',\n rowspan: map,\n });\n if (colspan > 1) {\n cell.colspan = map;\n }\n }\n }\n }\n });\n });\n\n // ---> validation\n const rowsCount = rows.length;\n const colsCount = rows[0].cells.length;\n for (let r = 0; r < rowsCount; r++) {\n if (!rows[r] || rows[r].cells.length !== colsCount) return null;\n\n for (let c = 0; c < colsCount; c++) {\n if (!rows[r].cells[c]) return null;\n }\n }\n // <--- validation\n\n const desc = new this(rows.length, rows[0].cells.length, rows, baseOffset);\n this.__cache.set(table, desc);\n return desc;\n }\n\n private _rowRanges?: readonly Readonly<TableRowRange>[];\n private _columnRanges?: readonly Readonly<TableColumnRange>[];\n\n private constructor(\n /* eslint-disable @typescript-eslint/parameter-properties */\n readonly rows: number,\n readonly cols: number,\n readonly rowsDesc: readonly TableRowDesc[],\n readonly baseOffset: number,\n /* eslint-enable @typescript-eslint/parameter-properties */\n ) {}\n\n bind(pos: number) {\n return new TableDescBinded(pos, this);\n }\n\n rowHasVirtualCells(rowIndex: number): boolean {\n return this.rowsDesc[rowIndex]?.cells.some((cell) => cell.type === 'virtual');\n }\n\n columnHasVirtualCells(columnIndex: number): boolean {\n return this.rowsDesc.some((row) => row.cells[columnIndex]?.type === 'virtual');\n }\n\n isSafeColumn(columnIndex: number): boolean {\n return this.rowsDesc.every((row) => {\n const cell = row.cells[columnIndex];\n if (cell.type === 'real' && (!cell.colspan || cell.colspan === 1)) return true;\n if (cell.type === 'virtual' && cell.rowspan?.[1] === columnIndex) return true;\n return false;\n });\n }\n\n isSafeRow(rowIndex: number): boolean {\n return this.rowsDesc[rowIndex]?.cells.every((cell) => {\n if (cell.type === 'real' && (!cell.rowspan || cell.rowspan === 1)) return true;\n if (cell.type === 'virtual' && cell.colspan?.[0] === rowIndex) return true;\n return false;\n });\n }\n\n getOffsetForRow(rowIndex: number): number {\n return this.baseOffset + this.rowsDesc[rowIndex]?.offset;\n }\n\n getRelativePosForRow(rowIndex: number): Pos {\n const from = this.getOffsetForRow(rowIndex);\n const to = from + this.rowsDesc[rowIndex].node.nodeSize;\n return {from, to};\n }\n\n getRelativePosForCell(rowIndex: number, columnIndex: number): CellPos {\n const cell = this.rowsDesc[rowIndex]?.cells[columnIndex];\n const rowOffset = this.getOffsetForRow(rowIndex);\n\n if (cell?.type === 'real') {\n // 1 – open boundary for row node\n const from = rowOffset + 1 + cell.offset;\n const to = from + cell.node.nodeSize;\n return {type: 'real', from, to};\n }\n\n if (cell?.type === 'virtual') {\n let index = columnIndex;\n while (--index >= 0) {\n const cell = this.rowsDesc[rowIndex].cells[index];\n if (cell.type === 'real') {\n const closest = rowOffset + 1 + cell.offset + cell.node.nodeSize;\n return {type: 'virtual', closestPos: closest};\n }\n }\n return {type: 'virtual', closestPos: rowOffset + 1};\n }\n\n throw new Error(\n `Impossible to calculate offset for cell with position [${rowIndex},${columnIndex}]`,\n );\n }\n\n getRelativePosForRowCells(rowIndex: number): CellPos[] {\n const cells: CellPos[] = [];\n\n for (let colIndex = 0; colIndex < this.cols; colIndex++) {\n cells.push(this.getRelativePosForCell(rowIndex, colIndex));\n }\n\n return cells;\n }\n\n getRelativePosForColumn(columnIndex: number): CellPos[] {\n const ranges: CellPos[] = [];\n\n for (let i = 0; i < this.rows; i++) {\n ranges.push(this.getRelativePosForCell(i, columnIndex));\n }\n\n return ranges;\n }\n\n getCellNodeType() {\n const isRealCell = (cell: TableCellDesc): cell is TableCellRealDesc => cell.type === 'real';\n return this.rowsDesc[0].cells.find(isRealCell)!.node.type;\n }\n\n getRowNodeType() {\n return this.rowsDesc[0].node.type;\n }\n\n getCellInfo(node: Node) {\n let desc: {node: Node; offset: number; row: number; column: number} | null = null;\n for (let i = 0; i < this.rowsDesc.length; i++) {\n const row = this.rowsDesc[i];\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (cell.type === 'real' && cell.node === node) {\n desc = {\n node: cell.node,\n offset: this.getOffsetForRow(i) + 1 + cell.offset,\n row: i,\n column: j,\n };\n }\n }\n }\n return desc;\n }\n\n getRowRanges() {\n if (this._rowRanges) return this._rowRanges;\n\n const ranges: TableRowRange[] = [];\n let last: TableRowRange | null = null;\n\n for (let i = 0; i < this.rowsDesc.length; i++) {\n const row = this.rowsDesc[i];\n const firstCell = row.cells[0];\n\n if (firstCell.type === 'real') {\n let safeTopBoundary = true;\n for (const cell of row.cells) {\n if (cell.type === 'virtual') safeTopBoundary &&= !cell.rowspan;\n }\n\n ranges.push(\n (last = {\n startIdx: i,\n endIdx: i,\n rowsCount: 1,\n safeTopBoundary,\n // calculate later\n safeBottomBoundary: true,\n }),\n );\n } else if (firstCell.rowspan) {\n last!.endIdx = i;\n last!.rowsCount++;\n } else {\n throw new Error(`First cell in row is virtual, but without rowspan [row=${i}]`);\n }\n }\n\n for (let i = 0; i < ranges.length; i++) {\n if (!ranges[i].safeTopBoundary) ranges[i - 1].safeBottomBoundary = false;\n }\n\n this._rowRanges = ranges;\n return ranges;\n }\n\n getRowRangeByRowIdx(rowIdx: number) {\n const rangeIdx = this.getRowRangeIdxByRowIdx(rowIdx);\n return this.getRowRanges()[rangeIdx];\n }\n\n getRowRangeIdxByRowIdx(rowIdx: number) {\n return this.getRowRanges().findIndex(\n (range) => range.startIdx <= rowIdx && range.endIdx >= rowIdx,\n );\n }\n\n getColumnRanges() {\n if (this._columnRanges) return this._columnRanges;\n\n const ranges: TableColumnRange[] = [];\n let last: TableColumnRange | null = null;\n\n const firstRow = this.rowsDesc[0];\n\n for (let i = 0; i < firstRow.cells.length; i++) {\n const cell = firstRow.cells[i];\n\n if (cell.type === 'real') {\n let safeLeftBoundary = true;\n for (const row of this.rowsDesc) {\n const cell = row.cells[i];\n if (cell.type === 'virtual' && cell.colspan)\n safeLeftBoundary &&= cell.colspan[1] === i;\n }\n\n ranges.push(\n (last = {\n startIdx: i,\n endIdx: i,\n columnsCount: 1,\n safeLeftBoundary,\n // calculate later\n safeRightBoundary: true,\n }),\n );\n } else if (cell.colspan) {\n last!.endIdx = i;\n last!.columnsCount++;\n } else {\n throw new Error(\n `First cell in column is virtual, but without colspan [column=${i}]`,\n );\n }\n }\n\n for (let i = 0; i < ranges.length; i++) {\n if (!ranges[i].safeLeftBoundary) ranges[i - 1].safeRightBoundary = false;\n }\n\n this._columnRanges = ranges;\n return ranges;\n }\n\n getColumnRangeByColumnIdx(columnIdx: number) {\n const rangeIdx = this.getColumnRangeIdxByColumnIdx(columnIdx);\n return this.getColumnRanges()[rangeIdx];\n }\n\n getColumnRangeIdxByColumnIdx(columnIdx: number) {\n return this.getColumnRanges().findIndex(\n (range) => range.startIdx <= columnIdx && range.endIdx >= columnIdx,\n );\n }\n}\n\nclass TableDescBinded {\n readonly pos: number;\n readonly base: TableDesc;\n\n get bodyPos(): number {\n return this.pos + 1;\n }\n\n get rows(): number {\n return this.base.rows;\n }\n\n get cols(): number {\n return this.base.cols;\n }\n\n constructor(pos: number, desc: TableDesc) {\n this.pos = pos;\n this.base = desc;\n }\n\n getRowIndexByPos(pos: number) {\n for (let rowIdx = 0; rowIdx < this.rows; rowIdx++) {\n const rowPos = this.pos + this.base.getOffsetForRow(rowIdx);\n if (pos === rowPos) return rowIdx;\n }\n return null;\n }\n\n getPosForRow(rowIndex: number): Pos {\n const pos = this.base.getRelativePosForRow(rowIndex);\n pos.from += this.pos;\n pos.to += this.pos;\n return pos;\n }\n\n getPosForCell(rowIndex: number, columnIndex: number): CellPos {\n const pos = this.base.getRelativePosForCell(rowIndex, columnIndex);\n if (pos.type === 'real') {\n pos.from += this.pos;\n pos.to += this.pos;\n } else if (pos.type === 'virtual') {\n pos.closestPos += this.pos;\n } else {\n throw new Error(\n `Impossible to calculate positions for cell with position [${rowIndex},${columnIndex}]`,\n );\n }\n return pos;\n }\n\n getPosForRowCells(rowIndex: number): CellPos[] {\n const cells: CellPos[] = [];\n\n for (let colIndex = 0; colIndex < this.base.cols; colIndex++) {\n cells.push(this.getPosForCell(rowIndex, colIndex));\n }\n\n return cells;\n }\n\n getPosForColumn(columnIndex: number): CellPos[] {\n const ranges: CellPos[] = [];\n\n for (let i = 0; i < this.base.rows; i++) {\n ranges.push(this.getPosForCell(i, columnIndex));\n }\n\n return ranges;\n }\n}\n\nexport type {TableDescBinded};\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.25.0' !== 'undefined' ? '15.25.0' : 'unknown';
5
+ exports.VERSION = typeof '15.26.1' !== 'undefined' ? '15.26.1' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.25.0' !== 'undefined' ? '15.25.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.26.1' !== 'undefined' ? '15.26.1' : 'unknown';\n"]}
@@ -2,6 +2,7 @@ import { type ComponentType, type RefAttributes } from 'react';
2
2
  import type { HTMLRuntimeConfig } from '@diplodoc/html-extension';
3
3
  import type { IHTMLIFrameElementConfig } from '@diplodoc/html-extension/runtime';
4
4
  import type { PluginRuntime, TransformMeta } from "../withMermaid/types.js";
5
+ export { DEFAULT_HTML_RUNTIME_CONFIG } from "./useYfmHtmlBlockRuntime.js";
5
6
  export type WithYfmHtmlBlockOptions = {
6
7
  runtime: PluginRuntime;
7
8
  };
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_HTML_RUNTIME_CONFIG = void 0;
3
4
  exports.withYfmHtmlBlock = withYfmHtmlBlock;
4
5
  const jsx_runtime_1 = require("react/jsx-runtime");
5
6
  const react_1 = require("react");
6
7
  const react_2 = require("@diplodoc/html-extension/react");
7
8
  const useYfmHtmlBlockRuntime_1 = require("./useYfmHtmlBlockRuntime.js");
9
+ var useYfmHtmlBlockRuntime_2 = require("./useYfmHtmlBlockRuntime.js");
10
+ Object.defineProperty(exports, "DEFAULT_HTML_RUNTIME_CONFIG", { enumerable: true, get: function () { return useYfmHtmlBlockRuntime_2.DEFAULT_HTML_RUNTIME_CONFIG; } });
8
11
  function withYfmHtmlBlock(opts) {
9
12
  return (Component) => (0, react_1.forwardRef)(function WithYfmHtml(props, ref) {
10
13
  const { meta, html, yfmHtmlBlockConfig, htmlRuntimeConfig } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["view/hocs/withYfmHtml/index.tsx"],"names":[],"mappings":";;AAqBA,4CAsBC;;AA3CD,iCAAoF;AAGpF,0DAAoF;AAKpF,wEAAgE;AAahE,SAAgB,gBAAgB,CAAC,IAA6B;IAC1D,OAAO,CACH,SAA2D,EAC7D,EAAE,CACA,IAAA,kBAAU,EAA4C,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG;QACjF,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,GAAG,KAAK,CAAC;QAElE,IAAA,+CAAsB,EAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,IAAA,4CAAoC,GAAE,CAAC;QAE5D,IAAA,iBAAS,EAAC,GAAG,EAAE;YACX,IAAI,YAAY,EAAE,CAAC;gBACf,IAAI,kBAAkB,EAAE,CAAC;oBACrB,YAAY,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAC/C,CAAC;gBACD,YAAY,CAAC,UAAU,EAAE,CAAC;YAC9B,CAAC;QACL,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAE7C,OAAO,uBAAC,SAAS,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC;IAC9C,CAAC,CAAC,CAAC;AACX,CAAC","sourcesContent":["import {type ComponentType, type RefAttributes, forwardRef, useEffect} from 'react';\n\nimport type {HTMLRuntimeConfig} from '@diplodoc/html-extension';\nimport {useDiplodocEmbeddedContentController} from '@diplodoc/html-extension/react';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\n\nimport type {PluginRuntime, TransformMeta} from '../withMermaid/types';\n\nimport {useYfmHtmlBlockRuntime} from './useYfmHtmlBlockRuntime';\n\nexport type WithYfmHtmlBlockOptions = {\n runtime: PluginRuntime;\n};\n\nexport type WithYfmHtmlBlockProps = {\n meta: TransformMeta;\n yfmHtmlBlockConfig?: IHTMLIFrameElementConfig;\n /** Works only with html-extension dep version 2.7.1 and higher */\n htmlRuntimeConfig?: HTMLRuntimeConfig;\n};\n\nexport function withYfmHtmlBlock(opts: WithYfmHtmlBlockOptions) {\n return <T extends {html: string}>(\n Component: ComponentType<T & RefAttributes<HTMLDivElement>>,\n ) =>\n forwardRef<HTMLDivElement, T & WithYfmHtmlBlockProps>(function WithYfmHtml(props, ref) {\n const {meta, html, yfmHtmlBlockConfig, htmlRuntimeConfig} = props;\n\n useYfmHtmlBlockRuntime(meta, opts.runtime, htmlRuntimeConfig);\n\n const yfmHtmlBlock = useDiplodocEmbeddedContentController();\n\n useEffect(() => {\n if (yfmHtmlBlock) {\n if (yfmHtmlBlockConfig) {\n yfmHtmlBlock.setConfig(yfmHtmlBlockConfig);\n }\n yfmHtmlBlock.initialize();\n }\n }, [yfmHtmlBlock, html, yfmHtmlBlockConfig]);\n\n return <Component {...props} ref={ref} />;\n });\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["view/hocs/withYfmHtml/index.tsx"],"names":[],"mappings":";;;AAuBA,4CAsBC;;AA7CD,iCAAoF;AAGpF,0DAAoF;AAKpF,wEAAgE;AAEhE,sEAAqE;AAA7D,qIAAA,2BAA2B,OAAA;AAanC,SAAgB,gBAAgB,CAAC,IAA6B;IAC1D,OAAO,CACH,SAA2D,EAC7D,EAAE,CACA,IAAA,kBAAU,EAA4C,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG;QACjF,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,GAAG,KAAK,CAAC;QAElE,IAAA,+CAAsB,EAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,IAAA,4CAAoC,GAAE,CAAC;QAE5D,IAAA,iBAAS,EAAC,GAAG,EAAE;YACX,IAAI,YAAY,EAAE,CAAC;gBACf,IAAI,kBAAkB,EAAE,CAAC;oBACrB,YAAY,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAC/C,CAAC;gBACD,YAAY,CAAC,UAAU,EAAE,CAAC;YAC9B,CAAC;QACL,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAE7C,OAAO,uBAAC,SAAS,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC;IAC9C,CAAC,CAAC,CAAC;AACX,CAAC","sourcesContent":["import {type ComponentType, type RefAttributes, forwardRef, useEffect} from 'react';\n\nimport type {HTMLRuntimeConfig} from '@diplodoc/html-extension';\nimport {useDiplodocEmbeddedContentController} from '@diplodoc/html-extension/react';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\n\nimport type {PluginRuntime, TransformMeta} from '../withMermaid/types';\n\nimport {useYfmHtmlBlockRuntime} from './useYfmHtmlBlockRuntime';\n\nexport {DEFAULT_HTML_RUNTIME_CONFIG} from './useYfmHtmlBlockRuntime';\n\nexport type WithYfmHtmlBlockOptions = {\n runtime: PluginRuntime;\n};\n\nexport type WithYfmHtmlBlockProps = {\n meta: TransformMeta;\n yfmHtmlBlockConfig?: IHTMLIFrameElementConfig;\n /** Works only with html-extension dep version 2.7.1 and higher */\n htmlRuntimeConfig?: HTMLRuntimeConfig;\n};\n\nexport function withYfmHtmlBlock(opts: WithYfmHtmlBlockOptions) {\n return <T extends {html: string}>(\n Component: ComponentType<T & RefAttributes<HTMLDivElement>>,\n ) =>\n forwardRef<HTMLDivElement, T & WithYfmHtmlBlockProps>(function WithYfmHtml(props, ref) {\n const {meta, html, yfmHtmlBlockConfig, htmlRuntimeConfig} = props;\n\n useYfmHtmlBlockRuntime(meta, opts.runtime, htmlRuntimeConfig);\n\n const yfmHtmlBlock = useDiplodocEmbeddedContentController();\n\n useEffect(() => {\n if (yfmHtmlBlock) {\n if (yfmHtmlBlockConfig) {\n yfmHtmlBlock.setConfig(yfmHtmlBlockConfig);\n }\n yfmHtmlBlock.initialize();\n }\n }, [yfmHtmlBlock, html, yfmHtmlBlockConfig]);\n\n return <Component {...props} ref={ref} />;\n });\n}\n"]}
@@ -1 +1,5 @@
1
- export {};
1
+ import type { HTMLRuntimeConfig } from '@diplodoc/html-extension';
2
+ /**
3
+ * Default runtime config with shadow mode disabled for XSS protection.
4
+ */
5
+ export declare const DEFAULT_HTML_RUNTIME_CONFIG: HTMLRuntimeConfig;
@@ -1,9 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_HTML_RUNTIME_CONFIG = void 0;
3
4
  exports.useYfmHtmlBlockRuntime = useYfmHtmlBlockRuntime;
4
5
  const utils_1 = require("@diplodoc/html-extension/utils");
6
+ /**
7
+ * Default runtime config with shadow mode disabled for XSS protection.
8
+ */
9
+ exports.DEFAULT_HTML_RUNTIME_CONFIG = {
10
+ disabledModes: ['shadow'],
11
+ };
5
12
  /** @internal */
6
- function useYfmHtmlBlockRuntime(meta, runtime = '_assets/html-extension.js', htmlRuntimeConfig = {}) {
13
+ function useYfmHtmlBlockRuntime(meta, runtime = '_assets/html-extension.js', htmlRuntimeConfig = exports.DEFAULT_HTML_RUNTIME_CONFIG) {
7
14
  if (meta?.script?.includes(runtime)) {
8
15
  // MAJOR: update html-extension peer on ^2.7.1 and remove optional chain
9
16
  (0, utils_1.setupRuntimeConfig)?.(htmlRuntimeConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"useYfmHtmlBlockRuntime.js","sourceRoot":"../../../../../src","sources":["view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.ts"],"names":[],"mappings":";;AAMA,wDAUC;AAfD,0DAAkE;AAIlE,gBAAgB;AAChB,SAAgB,sBAAsB,CAClC,IAAmB,EACnB,UAAyB,2BAA2B,EACpD,oBAAuC,EAAE;IAEzC,IAAI,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,wEAAwE;QACxE,IAAA,0BAAkB,CAAA,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACxC,MAAM,CAAC,0CAA0C,CAAC,kCAAkC,CAAC,CAAC;IAC1F,CAAC;AACL,CAAC","sourcesContent":["import type {HTMLRuntimeConfig} from '@diplodoc/html-extension';\nimport {setupRuntimeConfig} from '@diplodoc/html-extension/utils';\n\nimport type {PluginRuntime, TransformMeta} from './types';\n\n/** @internal */\nexport function useYfmHtmlBlockRuntime(\n meta: TransformMeta,\n runtime: PluginRuntime = '_assets/html-extension.js',\n htmlRuntimeConfig: HTMLRuntimeConfig = {},\n) {\n if (meta?.script?.includes(runtime)) {\n // MAJOR: update html-extension peer on ^2.7.1 and remove optional chain\n setupRuntimeConfig?.(htmlRuntimeConfig);\n import(/* webpackChunkName: \"yfm-html-runtime\" */ '@diplodoc/html-extension/runtime');\n }\n}\n"]}
1
+ {"version":3,"file":"useYfmHtmlBlockRuntime.js","sourceRoot":"../../../../../src","sources":["view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.ts"],"names":[],"mappings":";;;AAaA,wDAUC;AAtBD,0DAAkE;AAIlE;;GAEG;AACU,QAAA,2BAA2B,GAAsB;IAC1D,aAAa,EAAE,CAAC,QAAQ,CAAC;CAC5B,CAAC;AAEF,gBAAgB;AAChB,SAAgB,sBAAsB,CAClC,IAAmB,EACnB,UAAyB,2BAA2B,EACpD,oBAAuC,mCAA2B;IAElE,IAAI,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,wEAAwE;QACxE,IAAA,0BAAkB,CAAA,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACxC,MAAM,CAAC,0CAA0C,CAAC,kCAAkC,CAAC,CAAC;IAC1F,CAAC;AACL,CAAC","sourcesContent":["import type {HTMLRuntimeConfig} from '@diplodoc/html-extension';\nimport {setupRuntimeConfig} from '@diplodoc/html-extension/utils';\n\nimport type {PluginRuntime, TransformMeta} from './types';\n\n/**\n * Default runtime config with shadow mode disabled for XSS protection.\n */\nexport const DEFAULT_HTML_RUNTIME_CONFIG: HTMLRuntimeConfig = {\n disabledModes: ['shadow'],\n};\n\n/** @internal */\nexport function useYfmHtmlBlockRuntime(\n meta: TransformMeta,\n runtime: PluginRuntime = '_assets/html-extension.js',\n htmlRuntimeConfig: HTMLRuntimeConfig = DEFAULT_HTML_RUNTIME_CONFIG,\n) {\n if (meta?.script?.includes(runtime)) {\n // MAJOR: update html-extension peer on ^2.7.1 and remove optional chain\n setupRuntimeConfig?.(htmlRuntimeConfig);\n import(/* webpackChunkName: \"yfm-html-runtime\" */ '@diplodoc/html-extension/runtime');\n }\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  export * from "./MathSpecs/const.js";
2
2
  export { mathBType, mathIType } from "./MathSpecs/index.js";
3
+ export declare const LATEX_MODES: Set<string>;
@@ -1,3 +1,13 @@
1
1
  export * from "./MathSpecs/const.js";
2
2
  export { mathBType, mathIType } from "./MathSpecs/index.js";
3
+ export const LATEX_MODES = new Set([
4
+ 'tex',
5
+ 'latex',
6
+ 'bibtex',
7
+ 'doctex',
8
+ 'latex-expl3',
9
+ 'pweave',
10
+ 'jlweave',
11
+ 'rsweave',
12
+ ]);
3
13
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Math/const.ts"],"names":[],"mappings":"AAAA,qCAAkC;AAClC,OAAO,EAAC,SAAS,EAAE,SAAS,EAAC,6BAAoB","sourcesContent":["export * from './MathSpecs/const';\nexport {mathBType, mathIType} from './MathSpecs';\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Math/const.ts"],"names":[],"mappings":"AAAA,qCAAkC;AAClC,OAAO,EAAC,SAAS,EAAE,SAAS,EAAC,6BAAoB;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK;IACL,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,SAAS;IACT,SAAS;CACZ,CAAC,CAAC","sourcesContent":["export * from './MathSpecs/const';\nexport {mathBType, mathIType} from './MathSpecs';\n\nexport const LATEX_MODES = new Set([\n 'tex',\n 'latex',\n 'bibtex',\n 'doctex',\n 'latex-expl3',\n 'pweave',\n 'jlweave',\n 'rsweave',\n]);\n"]}
@@ -3,6 +3,7 @@ import { type MathNodeViewOptions } from "./view-and-edit.js";
3
3
  import "./index.css";
4
4
  export { MathNode, mathBType, mathIType } from "./MathSpecs/index.js";
5
5
  export { MathBlockNodeView, MathInlineNodeView } from "./view-and-edit.js";
6
+ export { isLatexMode, parseLatexFormulas } from "./utils.js";
6
7
  declare const mathIAction = "addMathInline";
7
8
  declare const mathBAction = "toMathBlock";
8
9
  export type MathOptions = Pick<MathNodeViewOptions, 'loadRuntimeScript' | 'sanitize' | 'katexOptions'>;
@@ -7,10 +7,12 @@ import { isTextSelection } from "../../../utils/selection.js";
7
7
  import { MathSpecs } from "./MathSpecs/index.js";
8
8
  import { ignoreIfCursorInsideMathInline, moveCursorLeftOfMathInline, removeEmptyMathInlineIfCursorIsAtBeginning, } from "./commands.js";
9
9
  import { mathBType, mathIType } from "./const.js";
10
+ import { latexPastePlugin } from "./latex-paste-plugin.js";
10
11
  import { mathViewAndEditPlugin } from "./view-and-edit.js";
11
12
  import "./index.css";
12
13
  export { MathNode, mathBType, mathIType } from "./MathSpecs/index.js";
13
14
  export { MathBlockNodeView, MathInlineNodeView } from "./view-and-edit.js";
15
+ export { isLatexMode, parseLatexFormulas } from "./utils.js";
14
16
  const mathIAction = 'addMathInline';
15
17
  const mathBAction = 'toMathBlock';
16
18
  const mathITemplate = 'f(x)=';
@@ -21,6 +23,7 @@ export const Math = (builder, opts) => {
21
23
  Backspace: chainCommands(removeEmptyMathInlineIfCursorIsAtBeginning, moveCursorLeftOfMathInline),
22
24
  }));
23
25
  builder
26
+ .addPlugin(latexPastePlugin, builder.Priority.VeryHigh)
24
27
  .addPlugin(() => mathViewAndEditPlugin({
25
28
  ...opts,
26
29
  reactRenderer: builder.context.get('reactrenderer'),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Math/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands, setBlockType} from 'prosemirror-commands';\nimport {type Command, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNodeOfType} from 'prosemirror-utils';\n\nimport type {Action, ExtensionAuto} from '../../../core';\nimport {inlineNodeInputRule, textblockTypeInputRule} from '../../../utils/inputrules';\nimport {isTextSelection} from '../../../utils/selection';\n\nimport {MathSpecs} from './MathSpecs';\nimport {\n ignoreIfCursorInsideMathInline,\n moveCursorLeftOfMathInline,\n removeEmptyMathInlineIfCursorIsAtBeginning,\n} from './commands';\nimport {mathBType, mathIType} from './const';\nimport {type MathNodeViewOptions, mathViewAndEditPlugin} from './view-and-edit';\n\nimport './index.scss';\n\nexport {MathNode, mathBType, mathIType} from './MathSpecs';\nexport {MathBlockNodeView, MathInlineNodeView} from './view-and-edit';\n\nconst mathIAction = 'addMathInline';\nconst mathBAction = 'toMathBlock';\n\nconst mathITemplate = 'f(x)=';\n\n// !!! YfmPreset/YfmSpecsPreset does not use or re-export the Math extension\n\nexport type MathOptions = Pick<\n MathNodeViewOptions,\n 'loadRuntimeScript' | 'sanitize' | 'katexOptions'\n>;\n\nexport const Math: ExtensionAuto<MathOptions> = (builder, opts) => {\n builder.use(MathSpecs);\n\n builder.addKeymap(() => ({\n Enter: ignoreIfCursorInsideMathInline, // ignore breaks in math inline\n Backspace: chainCommands(\n removeEmptyMathInlineIfCursorIsAtBeginning,\n moveCursorLeftOfMathInline,\n ),\n }));\n\n builder\n .addPlugin(() =>\n mathViewAndEditPlugin({\n ...opts,\n reactRenderer: builder.context.get('reactrenderer')!,\n }),\n )\n .addInputRules((deps) => ({\n rules: [\n textblockTypeInputRule(/^\\$\\$\\s$/, mathBType(deps.schema)),\n inlineNodeInputRule(/\\$[^$\\s]+\\$$/, (match) =>\n mathIType(deps.schema).create(null, deps.schema.text(match.replace(/\\$/g, ''))),\n ),\n ],\n }));\n builder\n .addAction(mathIAction, (deps) => {\n const type = mathIType(deps.schema);\n const cmd: Command = (state, dispatch) => {\n const {selection} = state;\n if (isTextSelection(selection) && selection.$from.sameParent(selection.$to)) {\n if (dispatch) {\n const fragment = selection.content().content;\n const selectedText =\n fragment.textBetween(0, fragment.size) || mathITemplate;\n const tr = state.tr;\n selection.replaceWith(\n tr,\n type.create(null, deps.schema.text(selectedText)),\n );\n tr.setSelection(\n TextSelection.create(tr.doc, selection.from + selectedText.length + 1),\n );\n dispatch(tr);\n }\n return true;\n }\n return false;\n };\n return {\n isActive: (state) => hasParentNodeOfType(type)(state.selection),\n isEnable: cmd,\n run: cmd,\n };\n })\n .addAction(mathBAction, (deps) => {\n const type = mathBType(deps.schema);\n const cmd = setBlockType(type);\n return {\n isActive: (state) => hasParentNodeOfType(type)(state.selection),\n isEnable: cmd,\n run: cmd,\n };\n });\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [mathIAction]: Action;\n [mathBAction]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Math/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands, setBlockType} from 'prosemirror-commands';\nimport {type Command, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNodeOfType} from 'prosemirror-utils';\n\nimport type {Action, ExtensionAuto} from '../../../core';\nimport {inlineNodeInputRule, textblockTypeInputRule} from '../../../utils/inputrules';\nimport {isTextSelection} from '../../../utils/selection';\n\nimport {MathSpecs} from './MathSpecs';\nimport {\n ignoreIfCursorInsideMathInline,\n moveCursorLeftOfMathInline,\n removeEmptyMathInlineIfCursorIsAtBeginning,\n} from './commands';\nimport {mathBType, mathIType} from './const';\nimport {latexPastePlugin} from './latex-paste-plugin';\nimport {type MathNodeViewOptions, mathViewAndEditPlugin} from './view-and-edit';\n\nimport './index.scss';\n\nexport {MathNode, mathBType, mathIType} from './MathSpecs';\nexport {MathBlockNodeView, MathInlineNodeView} from './view-and-edit';\nexport {isLatexMode, parseLatexFormulas} from './utils';\n\nconst mathIAction = 'addMathInline';\nconst mathBAction = 'toMathBlock';\n\nconst mathITemplate = 'f(x)=';\n\n// !!! YfmPreset/YfmSpecsPreset does not use or re-export the Math extension\n\nexport type MathOptions = Pick<\n MathNodeViewOptions,\n 'loadRuntimeScript' | 'sanitize' | 'katexOptions'\n>;\n\nexport const Math: ExtensionAuto<MathOptions> = (builder, opts) => {\n builder.use(MathSpecs);\n\n builder.addKeymap(() => ({\n Enter: ignoreIfCursorInsideMathInline, // ignore breaks in math inline\n Backspace: chainCommands(\n removeEmptyMathInlineIfCursorIsAtBeginning,\n moveCursorLeftOfMathInline,\n ),\n }));\n\n builder\n .addPlugin(latexPastePlugin, builder.Priority.VeryHigh)\n .addPlugin(() =>\n mathViewAndEditPlugin({\n ...opts,\n reactRenderer: builder.context.get('reactrenderer')!,\n }),\n )\n .addInputRules((deps) => ({\n rules: [\n textblockTypeInputRule(/^\\$\\$\\s$/, mathBType(deps.schema)),\n inlineNodeInputRule(/\\$[^$\\s]+\\$$/, (match) =>\n mathIType(deps.schema).create(null, deps.schema.text(match.replace(/\\$/g, ''))),\n ),\n ],\n }));\n builder\n .addAction(mathIAction, (deps) => {\n const type = mathIType(deps.schema);\n const cmd: Command = (state, dispatch) => {\n const {selection} = state;\n if (isTextSelection(selection) && selection.$from.sameParent(selection.$to)) {\n if (dispatch) {\n const fragment = selection.content().content;\n const selectedText =\n fragment.textBetween(0, fragment.size) || mathITemplate;\n const tr = state.tr;\n selection.replaceWith(\n tr,\n type.create(null, deps.schema.text(selectedText)),\n );\n tr.setSelection(\n TextSelection.create(tr.doc, selection.from + selectedText.length + 1),\n );\n dispatch(tr);\n }\n return true;\n }\n return false;\n };\n return {\n isActive: (state) => hasParentNodeOfType(type)(state.selection),\n isEnable: cmd,\n run: cmd,\n };\n })\n .addAction(mathBAction, (deps) => {\n const type = mathBType(deps.schema);\n const cmd = setBlockType(type);\n return {\n isActive: (state) => hasParentNodeOfType(type)(state.selection),\n isEnable: cmd,\n run: cmd,\n };\n });\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [mathIAction]: Action;\n [mathBAction]: Action;\n }\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ export declare const latexPastePlugin: () => Plugin<any>;
@@ -0,0 +1,50 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { getLoggerFromState } from "../../../core/index.js";
3
+ import { Fragment } from "../../../pm/model.js";
4
+ import { MathNode } from "./const.js";
5
+ import { getLatexData, parseLatexFormulas } from "./utils.js";
6
+ export const latexPastePlugin = () => new Plugin({
7
+ props: {
8
+ handleDOMEvents: {
9
+ paste(view, e) {
10
+ const event = e;
11
+ if (!event.clipboardData || view.state.selection.$from.parent.type.spec.code) {
12
+ return false;
13
+ }
14
+ const latexData = getLatexData(event.clipboardData);
15
+ if (!latexData)
16
+ return false;
17
+ getLoggerFromState(view.state).event({
18
+ domEvent: 'paste',
19
+ event: 'paste-latex-from-code-editor',
20
+ editor: latexData.editor,
21
+ editorMode: latexData.mode,
22
+ empty: !latexData.value,
23
+ dataTypes: event.clipboardData.types,
24
+ });
25
+ const { tr, schema } = view.state;
26
+ const mathBlockType = schema.nodes[MathNode.Block];
27
+ if (!mathBlockType)
28
+ return false;
29
+ if (latexData.value) {
30
+ const formulas = parseLatexFormulas(latexData.value);
31
+ if (formulas.length > 0) {
32
+ const nodes = formulas.map((formula) => mathBlockType.create(null, schema.text(formula)));
33
+ const fragment = Fragment.from(nodes);
34
+ tr.replaceWith(tr.selection.from, tr.selection.to, fragment);
35
+ }
36
+ else {
37
+ tr.replaceWith(tr.selection.from, tr.selection.to, Fragment.empty);
38
+ }
39
+ }
40
+ else {
41
+ tr.replaceWith(tr.selection.from, tr.selection.to, Fragment.empty);
42
+ }
43
+ view.dispatch(tr.scrollIntoView());
44
+ e.preventDefault();
45
+ return true;
46
+ },
47
+ },
48
+ },
49
+ });
50
+ //# sourceMappingURL=latex-paste-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latex-paste-plugin.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Math/latex-paste-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAC,kBAAkB,EAAC,+BAAc;AACzC,OAAO,EAAC,QAAQ,EAAC,6BAAkB;AAEnC,OAAO,EAAC,QAAQ,EAAC,mBAAgB;AACjC,OAAO,EAAC,YAAY,EAAE,kBAAkB,EAAC,mBAAgB;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CACjC,IAAI,MAAM,CAAC;IACP,KAAK,EAAE;QACH,eAAe,EAAE;YACb,KAAK,CAAC,IAAI,EAAE,CAAQ;gBAChB,MAAM,KAAK,GAAG,CAAmB,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC3E,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACpD,IAAI,CAAC,SAAS;oBAAE,OAAO,KAAK,CAAC;gBAE7B,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;oBACjC,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,8BAA8B;oBACrC,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,UAAU,EAAE,SAAS,CAAC,IAAI;oBAC1B,KAAK,EAAE,CAAC,SAAS,CAAC,KAAK;oBACvB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK;iBACvC,CAAC,CAAC;gBAEH,MAAM,EAAC,EAAE,EAAE,MAAM,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBAChC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAEnD,IAAI,CAAC,aAAa;oBAAE,OAAO,KAAK,CAAC;gBAEjC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAErD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACnC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CACnD,CAAC;wBACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACtC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;oBACjE,CAAC;yBAAM,CAAC;wBACJ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACvE,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACvE,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;gBACnC,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YAChB,CAAC;SACJ;KACJ;CACJ,CAAC,CAAC","sourcesContent":["import {Plugin} from 'prosemirror-state';\n\nimport {getLoggerFromState} from '#core';\nimport {Fragment} from '#pm/model';\n\nimport {MathNode} from './const';\nimport {getLatexData, parseLatexFormulas} from './utils';\n\nexport const latexPastePlugin = () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e: Event) {\n const event = e as ClipboardEvent;\n if (!event.clipboardData || view.state.selection.$from.parent.type.spec.code) {\n return false;\n }\n\n const latexData = getLatexData(event.clipboardData);\n if (!latexData) return false;\n\n getLoggerFromState(view.state).event({\n domEvent: 'paste',\n event: 'paste-latex-from-code-editor',\n editor: latexData.editor,\n editorMode: latexData.mode,\n empty: !latexData.value,\n dataTypes: event.clipboardData.types,\n });\n\n const {tr, schema} = view.state;\n const mathBlockType = schema.nodes[MathNode.Block];\n\n if (!mathBlockType) return false;\n\n if (latexData.value) {\n const formulas = parseLatexFormulas(latexData.value);\n\n if (formulas.length > 0) {\n const nodes = formulas.map((formula) =>\n mathBlockType.create(null, schema.text(formula)),\n );\n const fragment = Fragment.from(nodes);\n tr.replaceWith(tr.selection.from, tr.selection.to, fragment);\n } else {\n tr.replaceWith(tr.selection.from, tr.selection.to, Fragment.empty);\n }\n } else {\n tr.replaceWith(tr.selection.from, tr.selection.to, Fragment.empty);\n }\n\n view.dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n },\n },\n },\n });\n"]}
@@ -0,0 +1,7 @@
1
+ export declare function isLatexMode(mode: string | undefined): boolean;
2
+ export declare function parseLatexFormulas(content: string): string[];
3
+ export declare function getLatexData(data: DataTransfer): null | {
4
+ editor: string;
5
+ mode: string;
6
+ value: string;
7
+ };
@@ -0,0 +1,39 @@
1
+ import dd from 'ts-dedent';
2
+ import { DataTransferType, isVSCode, tryParseVSCodeData } from "../../../utils/clipboard.js";
3
+ import { LATEX_MODES } from "./const.js";
4
+ export function isLatexMode(mode) {
5
+ if (!mode)
6
+ return false;
7
+ return LATEX_MODES.has(mode.toLowerCase());
8
+ }
9
+ export function parseLatexFormulas(content) {
10
+ const blocks = content.split(/\n\s*\n/);
11
+ const formulas = [];
12
+ for (const block of blocks) {
13
+ const lines = block
14
+ .split('\n')
15
+ .map((line) => line.trim())
16
+ .filter((line) => line.length > 0);
17
+ if (lines.length > 0) {
18
+ formulas.push(lines.join('\n'));
19
+ }
20
+ }
21
+ return formulas;
22
+ }
23
+ export function getLatexData(data) {
24
+ if (!data.getData(DataTransferType.Text))
25
+ return null;
26
+ if (isVSCode(data)) {
27
+ const vsCodeData = tryParseVSCodeData(data);
28
+ const mode = vsCodeData?.mode;
29
+ if (mode && isLatexMode(mode)) {
30
+ return {
31
+ editor: 'vscode',
32
+ mode,
33
+ value: dd(data.getData(DataTransferType.Text)),
34
+ };
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Math/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3B,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAC,oCAA4B;AAEnF,OAAO,EAAC,WAAW,EAAC,mBAAgB;AAEpC,MAAM,UAAU,WAAW,CAAC,IAAwB;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK;aACd,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CACxB,IAAkB;IAElB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtD,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,CAAC;QAE9B,IAAI,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACH,MAAM,EAAE,QAAQ;gBAChB,IAAI;gBACJ,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;aACjD,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import dd from 'ts-dedent';\n\nimport {DataTransferType, isVSCode, tryParseVSCodeData} from 'src/utils/clipboard';\n\nimport {LATEX_MODES} from './const';\n\nexport function isLatexMode(mode: string | undefined): boolean {\n if (!mode) return false;\n return LATEX_MODES.has(mode.toLowerCase());\n}\n\nexport function parseLatexFormulas(content: string): string[] {\n const blocks = content.split(/\\n\\s*\\n/);\n const formulas: string[] = [];\n\n for (const block of blocks) {\n const lines = block\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (lines.length > 0) {\n formulas.push(lines.join('\\n'));\n }\n }\n\n return formulas;\n}\n\nexport function getLatexData(\n data: DataTransfer,\n): null | {editor: string; mode: string; value: string} {\n if (!data.getData(DataTransferType.Text)) return null;\n\n if (isVSCode(data)) {\n const vsCodeData = tryParseVSCodeData(data);\n const mode = vsCodeData?.mode;\n\n if (mode && isLatexMode(mode)) {\n return {\n editor: 'vscode',\n mode,\n value: dd(data.getData(DataTransferType.Text)),\n };\n }\n }\n\n return null;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ .yfm.ProseMirror .hljs.show-line-numbers {
2
+ display: flex;
3
+ white-space: pre;
4
+ }
5
+
6
+ .yfm.ProseMirror pre > code > .yfm-line-numbers > .yfm-line-number {
7
+ display: block;
8
+ }
@@ -1,7 +1,10 @@
1
1
  import type { Options } from '@diplodoc/transform';
2
2
  import type { ExtensionAuto } from "../../../../core/index.js";
3
+ import { type LineNumbersOptions } from "../CodeBlockSpecs/index.js";
4
+ import "./CodeBlockHighlight.css";
3
5
  export type HighlightLangMap = Options['highlightLangs'];
4
6
  export type CodeBlockHighlightOptions = {
7
+ lineNumbers?: LineNumbersOptions;
5
8
  langs?: HighlightLangMap;
6
9
  };
7
10
  export declare const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions>;
@@ -4,8 +4,9 @@ import { findChildrenByType } from 'prosemirror-utils';
4
4
  import { Decoration, DecorationSet } from 'prosemirror-view';
5
5
  import { capitalize } from "../../../../lodash.js";
6
6
  import { globalLogger } from "../../../../logger.js";
7
- import { CodeBlockNodeAttr, codeBlockNodeName, codeBlockType } from "../CodeBlockSpecs/index.js";
7
+ import { CodeBlockNodeAttr, codeBlockNodeName, codeBlockType, } from "../CodeBlockSpecs/index.js";
8
8
  import { codeLangSelectTooltipViewCreator } from "./TooltipPlugin/index.js";
9
+ import "./CodeBlockHighlight.css";
9
10
  const key = new PluginKey('code_block_highlight');
10
11
  export const CodeBlockHighlight = (builder, opts) => {
11
12
  let langs;
@@ -90,7 +91,7 @@ export const CodeBlockHighlight = (builder, opts) => {
90
91
  return decos.map(tr.mapping, tr.doc);
91
92
  },
92
93
  },
93
- view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),
94
+ view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping, Boolean(opts.lineNumbers?.enabled)),
94
95
  props: {
95
96
  decorations: (state) => {
96
97
  return key.getState(state);
@@ -100,13 +101,22 @@ export const CodeBlockHighlight = (builder, opts) => {
100
101
  let prevLang = node.attrs[CodeBlockNodeAttr.Lang];
101
102
  const dom = document.createElement('pre');
102
103
  updateDomAttribute(dom, CodeBlockNodeAttr.Line, node.attrs[CodeBlockNodeAttr.Line]);
103
- const contentDOM = document.createElement('code');
104
- contentDOM.classList.add('hljs');
104
+ const code = document.createElement('code');
105
+ code.classList.add('hljs');
105
106
  if (prevLang) {
106
107
  dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);
107
- contentDOM.classList.add(prevLang);
108
+ code.classList.add(prevLang);
108
109
  }
109
- dom.append(contentDOM);
110
+ const contentDOM = document.createElement('div');
111
+ let lineNumbersContainer;
112
+ let prevLineCount = 0;
113
+ if (opts.lineNumbers?.enabled) {
114
+ const result = manageLineNumbers(node, code);
115
+ lineNumbersContainer = result.container;
116
+ prevLineCount = result.lineCount;
117
+ }
118
+ code.append(contentDOM);
119
+ dom.append(code);
110
120
  return {
111
121
  dom,
112
122
  contentDOM,
@@ -115,14 +125,19 @@ export const CodeBlockHighlight = (builder, opts) => {
115
125
  return false;
116
126
  const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];
117
127
  if (prevLang !== newLang) {
118
- contentDOM.className = 'hljs';
128
+ code.className = 'hljs';
119
129
  updateDomAttribute(dom, CodeBlockNodeAttr.Lang, newLang);
120
130
  if (newLang) {
121
- contentDOM.classList.add(newLang);
131
+ code.classList.add(newLang);
122
132
  }
123
133
  prevLang = newLang;
124
134
  }
125
135
  updateDomAttribute(dom, CodeBlockNodeAttr.Line, newNode.attrs[CodeBlockNodeAttr.Line]);
136
+ if (opts.lineNumbers?.enabled) {
137
+ const result = manageLineNumbers(newNode, code, lineNumbersContainer, prevLineCount);
138
+ lineNumbersContainer = result.container;
139
+ prevLineCount = result.lineCount;
140
+ }
126
141
  return true;
127
142
  },
128
143
  };
@@ -186,4 +201,50 @@ function updateDomAttribute(elem, attr, value) {
186
201
  elem.removeAttribute(attr);
187
202
  }
188
203
  }
204
+ function manageLineNumbers(node, code, prevContainer, prevLineCount = 0) {
205
+ const showLineNumbers = node.attrs[CodeBlockNodeAttr.ShowLineNumbers] === 'true';
206
+ if (!showLineNumbers) {
207
+ if (prevContainer) {
208
+ code.removeChild(prevContainer);
209
+ code.classList.remove('show-line-numbers');
210
+ }
211
+ return { container: undefined, lineCount: 0 };
212
+ }
213
+ const lines = node.textContent ? node.textContent.split('\n') : [''];
214
+ const currentLineCount = lines.length;
215
+ let container = prevContainer;
216
+ if (!container) {
217
+ container = document.createElement('div');
218
+ container.className = 'yfm-line-numbers';
219
+ container.contentEditable = 'false';
220
+ code.prepend(container);
221
+ }
222
+ code.classList.add('show-line-numbers');
223
+ if (currentLineCount !== prevLineCount) {
224
+ const maxDigits = String(currentLineCount).length;
225
+ const prevMaxDigits = String(prevLineCount).length;
226
+ if (currentLineCount > prevLineCount) {
227
+ for (let i = prevLineCount + 1; i <= currentLineCount; i++) {
228
+ const lineNumberElement = document.createElement('div');
229
+ lineNumberElement.className = 'yfm-line-number';
230
+ lineNumberElement.textContent = String(i).padStart(maxDigits, ' ');
231
+ container.appendChild(lineNumberElement);
232
+ }
233
+ }
234
+ else if (currentLineCount < prevLineCount) {
235
+ for (let i = prevLineCount; i > currentLineCount; i--) {
236
+ if (container.lastChild) {
237
+ container.removeChild(container.lastChild);
238
+ }
239
+ }
240
+ }
241
+ if (maxDigits !== prevMaxDigits) {
242
+ Array.from(container.children).forEach((lineNumber, index) => {
243
+ const lineNum = index + 1;
244
+ lineNumber.textContent = String(lineNum).padStart(maxDigits, ' ');
245
+ });
246
+ }
247
+ }
248
+ return { container, lineCount: currentLineCount };
249
+ }
189
250
  //# sourceMappingURL=CodeBlockHighlight.js.map