@harbour-enterprises/superdoc 0.18.0-next.1 → 0.18.0-next.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{PdfViewer-CNZTqGHw.cjs → PdfViewer-DKOAmiXw.cjs} +1 -1
- package/dist/chunks/{PdfViewer-D5cujgSt.es.js → PdfViewer-OIo9wAyq.es.js} +1 -1
- package/dist/chunks/{index-BDwD6Uex.es.js → index-DEONStGL.es.js} +3 -3
- package/dist/chunks/{index-BDysJRQU.cjs → index-cCWdcGrV.cjs} +3 -3
- package/dist/chunks/{super-editor.es-BoCmoEkp.es.js → super-editor.es-Cx5l8JEt.es.js} +4016 -3258
- package/dist/chunks/{super-editor.es-aOm7eWFU.cjs → super-editor.es-DyAWPYYh.cjs} +4016 -3258
- package/dist/core/SuperDoc.d.ts.map +1 -1
- package/dist/super-editor/ai-writer.es.js +2 -2
- package/dist/super-editor/chunks/{converter-DvdFP4MZ.js → converter-5WOzOHZb.js} +4093 -3717
- package/dist/super-editor/chunks/{docx-zipper-CxFpxZUz.js → docx-zipper-CP-vEy49.js} +1 -1
- package/dist/super-editor/chunks/{editor-CeWNMKjc.js → editor-CCOqTxyv.js} +425 -41
- package/dist/super-editor/chunks/{toolbar-Di2oAvyr.js → toolbar-DjjHAttK.js} +2 -2
- package/dist/super-editor/converter.es.js +3 -2
- package/dist/super-editor/docx-zipper.es.js +2 -2
- package/dist/super-editor/editor.es.js +3 -3
- package/dist/super-editor/file-zipper.es.js +1 -1
- package/dist/super-editor/src/core/commands/insertContent.d.ts +4 -4
- package/dist/super-editor/src/core/helpers/contentProcessor.d.ts +13 -0
- package/dist/super-editor/src/core/helpers/htmlSanitizer.d.ts +8 -0
- package/dist/super-editor/src/core/helpers/importHtml.d.ts +3 -2
- package/dist/super-editor/src/core/helpers/importMarkdown.d.ts +2 -1
- package/dist/super-editor/src/core/helpers/index.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/docx-helpers/get-default-style-definition.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/docx-helpers/index.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/exporter.d.ts +2 -2
- package/dist/super-editor/src/core/super-converter/v2/importer/docxImporter.d.ts +17 -1
- package/dist/super-editor/src/core/super-converter/v2/importer/index.d.ts +2 -0
- package/dist/super-editor/src/core/super-converter/v2/importer/paragraphNodeImporter.d.ts +3 -63
- package/dist/super-editor/src/core/super-converter/v2/importer/tableImporter.d.ts +17 -6
- package/dist/super-editor/src/core/super-converter/v2/importer/types/index.d.ts +4 -6
- package/dist/super-editor/src/core/super-converter/v3/handlers/index.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/br/attributes/index.d.ts +2 -2
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/br/attributes/w-clear.d.ts +4 -2
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/br/attributes/w-line-break-type.d.ts +4 -2
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/index.d.ts +2 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w-rsid-del.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w-rsid-p.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w-rsid-r-default.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w-rsid-r-pr.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w-rsid-r.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w14-para-id.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/attributes/w14-text-id.d.ts +4 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/helpers/index.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/helpers/legacy-handle-paragraph-node.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/helpers/w-p-helpers.d.ts +6 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/index.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/p/p-translator.d.ts +7 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tab/attributes/index.d.ts +2 -3
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tab/attributes/w-tab-leader.d.ts +4 -2
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tab/attributes/w-tab-pos.d.ts +4 -2
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tab/attributes/w-tab-size.d.ts +4 -2
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tc/helpers/legacy-handle-table-cell-node.d.ts +9 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tc/helpers/translate-table-cell.d.ts +17 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tc/index.d.ts +1 -0
- package/dist/super-editor/src/core/super-converter/v3/handlers/w/tc/tc-translator.d.ts +6 -0
- package/dist/super-editor/src/core/super-converter/v3/node-translator/node-translator.d.ts +31 -31
- package/dist/super-editor/src/extensions/block-node/block-node.d.ts +27 -3
- package/dist/super-editor/src/extensions/color/color.d.ts +1 -1
- package/dist/super-editor/src/extensions/dropcursor/dropcursor.d.ts +5 -0
- package/dist/super-editor/src/extensions/gapcursor/gapcursor.d.ts +5 -0
- package/dist/super-editor/src/extensions/image/image.d.ts +5 -0
- package/dist/super-editor/src/extensions/image/imageHelpers/getFileOpener.d.ts +1 -1
- package/dist/super-editor/src/extensions/image/imageHelpers/handleImageUpload.d.ts +1 -1
- package/dist/super-editor/src/extensions/image/imageHelpers/imagePlaceholderPlugin.d.ts +2 -3
- package/dist/super-editor/src/extensions/image/imageHelpers/imagePositionPlugin.d.ts +1 -2
- package/dist/super-editor/src/extensions/image/imageHelpers/processUploadedImage.d.ts +2 -5
- package/dist/super-editor/src/extensions/image/imageHelpers/startImageUpload.d.ts +18 -3
- package/dist/super-editor/src/extensions/linked-styles/helpers.d.ts +4 -6
- package/dist/super-editor/src/extensions/linked-styles/linked-styles.d.ts +29 -0
- package/dist/super-editor/src/extensions/linked-styles/plugin.d.ts +4 -2
- package/dist/super-editor/src/extensions/paragraph/paragraph.d.ts +2 -2
- package/dist/super-editor/src/extensions/text-align/text-align.d.ts +9 -0
- package/dist/super-editor/src/extensions/text-indent/text-indent.d.ts +19 -0
- package/dist/super-editor/src/extensions/text-transform/text-transform.d.ts +5 -0
- package/dist/super-editor/src/tests/export/export-helpers/export-helpers.d.ts +1 -0
- package/dist/super-editor/super-editor.es.js +21 -20
- package/dist/super-editor/toolbar.es.js +2 -2
- package/dist/super-editor.cjs +1 -1
- package/dist/super-editor.es.js +1 -1
- package/dist/superdoc.cjs +2 -2
- package/dist/superdoc.es.js +2 -2
- package/dist/superdoc.umd.js +2603 -1845
- package/dist/superdoc.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,9 +12,9 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
12
12
|
var _Attribute_static, getGlobalAttributes_fn, getNodeAndMarksAttributes_fn, _Schema_static, createNodesSchema_fn, createMarksSchema_fn, _events, _ExtensionService_instances, setupExtensions_fn, attachEditorEvents_fn, _editor, _stateValidators, _xmlValidators, _requiredNodeTypes, _requiredMarkTypes, _SuperValidator_instances, initializeValidators_fn, collectValidatorRequirements_fn, analyzeDocument_fn, _commandService, _Editor_instances, initContainerElement_fn, init_fn, initRichText_fn, onFocus_fn, checkHeadless_fn, insertNewFileData_fn, registerPluginByNameIfNotExists_fn, createExtensionService_fn, createCommandService_fn, createConverter_fn, initMedia_fn, initFonts_fn, createSchema_fn, generatePmData_fn, createView_fn, onCollaborationReady_fn, initComments_fn, initPagination_fn, dispatchTransaction_fn, handleNodeSelection_fn, prepareDocumentForImport_fn, prepareDocumentForExport_fn, endCollaboration_fn, validateDocumentInit_fn, validateDocumentExport_fn, initDevTools_fn, _ListItemNodeView_instances, init_fn2, _FieldAnnotationView_instances, createAnnotation_fn, _AutoPageNumberNodeView_instances, renderDom_fn, scheduleUpdateNodeStyle_fn, _DocumentSectionView_instances, init_fn3, addToolTip_fn;
|
|
13
13
|
import * as Y from "yjs";
|
|
14
14
|
import { UndoManager, Item as Item$1, ContentType, Text as Text$1, XmlElement, encodeStateAsUpdate } from "yjs";
|
|
15
|
-
import { P as PluginKey, a as Plugin, M as Mapping, c as callOrGet, g as getExtensionConfigField, b as getMarkType, d as getMarksFromSelection, e as getNodeType, f as getSchemaTypeNameByName, S as Schema$1, h as cleanSchemaItem, T as TextSelection, N as NodeSelection, i as canSplit, j as defaultBlockAt$1, l as liftTarget, A as AllSelection, k as canJoin, m as joinPoint, n as Selection, r as replaceStep$1, o as Slice, F as Fragment, R as ReplaceAroundStep$1, p as isTextSelection, q as getMarkRange, s as isMarkActive, t as isNodeActive, u as deleteProps, D as DOMParser$1,
|
|
15
|
+
import { P as PluginKey, a as Plugin, M as Mapping, c as callOrGet, g as getExtensionConfigField, b as getMarkType, d as getMarksFromSelection, e as getNodeType, f as getSchemaTypeNameByName, S as Schema$1, h as cleanSchemaItem, T as TextSelection, N as NodeSelection, i as canSplit, j as defaultBlockAt$1, l as liftTarget, A as AllSelection, k as canJoin, m as joinPoint, n as Selection, r as replaceStep$1, o as Slice, F as Fragment, R as ReplaceAroundStep$1, p as isTextSelection, q as getMarkRange, s as isMarkActive, t as isNodeActive, u as deleteProps, v as processContent, D as DOMParser$1, w as ReplaceStep, x as NodeRange, y as findWrapping, L as ListHelpers, z as findParentNode, B as isMacOS, C as isIOS, E as DOMSerializer, G as Mark$1, H as dropPoint, I as process$1, J as Buffer2, K as getSchemaTypeByName, O as inputRulesPlugin, Q as TrackDeleteMarkName, U as TrackInsertMarkName, V as v4, W as TrackFormatMarkName, X as comments_module_events, Y as findMark, Z as objectIncludes, _ as AddMarkStep, $ as RemoveMarkStep, a0 as twipsToLines, a1 as pixelsToTwips, a2 as helpers, a3 as posToDOMRect, a4 as CommandService, a5 as SuperConverter, a6 as createDocument, a7 as createDocFromMarkdown, a8 as createDocFromHTML, a9 as EditorState, aa as hasSomeParentWithClass, ab as isActive, ac as unflattenListsInHtml, ad as parseSizeUnit, ae as minMax, af as getLineHeightValueString, ag as InputRule, ah as kebabCase, ai as findParentNodeClosestToPos, aj as getListItemStyleDefinitions, ak as docxNumberigHelpers, al as parseIndentElement, am as combineIndents, an as StepMap, ao as getColStyleDeclaration, ap as SelectionRange, aq as Transform, ar as isInTable$1, as as createColGroup, at as generateDocxRandomId, au as insertNewRelationship, av as htmlHandler } from "./converter-5WOzOHZb.js";
|
|
16
16
|
import { ref, computed, createElementBlock, openBlock, withModifiers, Fragment as Fragment$1, renderList, normalizeClass, createCommentVNode, toDisplayString, createElementVNode, createApp } from "vue";
|
|
17
|
-
import { D as DocxZipper } from "./docx-zipper-
|
|
17
|
+
import { D as DocxZipper } from "./docx-zipper-CP-vEy49.js";
|
|
18
18
|
var GOOD_LEAF_SIZE = 200;
|
|
19
19
|
var RopeSequence = function RopeSequence2() {
|
|
20
20
|
};
|
|
@@ -1091,6 +1091,26 @@ createMarksSchema_fn = function(markExtensions, attributes, editor) {
|
|
|
1091
1091
|
};
|
|
1092
1092
|
__privateAdd(_Schema, _Schema_static);
|
|
1093
1093
|
let Schema = _Schema;
|
|
1094
|
+
class OxmlNode extends Node$1 {
|
|
1095
|
+
/**
|
|
1096
|
+
* @param {import('./types/index.js').OxmlNodeConfig} config
|
|
1097
|
+
*/
|
|
1098
|
+
constructor(config) {
|
|
1099
|
+
super(config);
|
|
1100
|
+
/** @type {string} */
|
|
1101
|
+
__publicField(this, "oXmlName");
|
|
1102
|
+
this.oXmlName = config.oXmlName;
|
|
1103
|
+
}
|
|
1104
|
+
/**
|
|
1105
|
+
* Factory method to construct a new OxmlNode instance.
|
|
1106
|
+
*
|
|
1107
|
+
* @param {import('./types/index.js').OxmlNodeConfig} config
|
|
1108
|
+
* @returns {OxmlNode} A new OxmlNode instance.
|
|
1109
|
+
*/
|
|
1110
|
+
static create(config) {
|
|
1111
|
+
return new OxmlNode(config);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1094
1114
|
const first = (commands2) => (props) => {
|
|
1095
1115
|
const items = typeof commands2 === "function" ? commands2(props) : commands2;
|
|
1096
1116
|
for (let i = 0; i < items.length; i += 1) {
|
|
@@ -1900,7 +1920,30 @@ const selectNodeBackward = () => ({ state, dispatch }) => {
|
|
|
1900
1920
|
const selectNodeForward = () => ({ state, dispatch }) => selectNodeForward$1(state, dispatch);
|
|
1901
1921
|
const selectTextblockStart = () => ({ state, dispatch }) => selectTextblockStart$1(state, dispatch);
|
|
1902
1922
|
const selectTextblockEnd = () => ({ state, dispatch }) => selectTextblockEnd$1(state, dispatch);
|
|
1903
|
-
const insertContent = (value, options) => ({ tr, commands: commands2 }) => {
|
|
1923
|
+
const insertContent = (value, options = {}) => ({ tr, state, commands: commands2, editor }) => {
|
|
1924
|
+
if (options.contentType) {
|
|
1925
|
+
const validTypes = ["html", "markdown", "text", "schema"];
|
|
1926
|
+
if (!validTypes.includes(options.contentType)) {
|
|
1927
|
+
console.error(`[insertContent] Invalid contentType: "${options.contentType}". Use: ${validTypes.join(", ")}`);
|
|
1928
|
+
return false;
|
|
1929
|
+
}
|
|
1930
|
+
try {
|
|
1931
|
+
const processedDoc = processContent({
|
|
1932
|
+
content: value,
|
|
1933
|
+
type: options.contentType,
|
|
1934
|
+
schema: state.schema
|
|
1935
|
+
});
|
|
1936
|
+
const jsonContent = processedDoc.toJSON();
|
|
1937
|
+
const ok = commands2.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, jsonContent, options);
|
|
1938
|
+
if (ok && (options.contentType === "html" || options.contentType === "markdown")) {
|
|
1939
|
+
Promise.resolve().then(() => editor.migrateListsToV2?.());
|
|
1940
|
+
}
|
|
1941
|
+
return ok;
|
|
1942
|
+
} catch (error) {
|
|
1943
|
+
console.error(`[insertContent] Failed to process ${options.contentType}:`, error);
|
|
1944
|
+
return false;
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1904
1947
|
return commands2.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options);
|
|
1905
1948
|
};
|
|
1906
1949
|
const removeWhitespaces = (node) => {
|
|
@@ -14353,7 +14396,7 @@ const _Editor = class _Editor extends EventEmitter {
|
|
|
14353
14396
|
* @returns {Object | void} Migration results
|
|
14354
14397
|
*/
|
|
14355
14398
|
processCollaborationMigrations() {
|
|
14356
|
-
console.debug("[checkVersionMigrations] Current editor version", "0.17.
|
|
14399
|
+
console.debug("[checkVersionMigrations] Current editor version", "0.17.1");
|
|
14357
14400
|
if (!this.options.ydoc) return;
|
|
14358
14401
|
const metaMap = this.options.ydoc.getMap("meta");
|
|
14359
14402
|
let docVersion = metaMap.get("version");
|
|
@@ -14780,8 +14823,8 @@ generatePmData_fn = function() {
|
|
|
14780
14823
|
doc2 = createDocument(this.converter, this.schema, this);
|
|
14781
14824
|
doc2 = __privateMethod(this, _Editor_instances, prepareDocumentForImport_fn).call(this, doc2);
|
|
14782
14825
|
if (this.options.markdown) {
|
|
14783
|
-
doc2 = createDocFromMarkdown(this.options.markdown, this.schema);
|
|
14784
|
-
} else if (this.options.html) doc2 = createDocFromHTML(this.options.html, this.schema);
|
|
14826
|
+
doc2 = createDocFromMarkdown(this.options.markdown, this.schema, { isImport: true });
|
|
14827
|
+
} else if (this.options.html) doc2 = createDocFromHTML(this.options.html, this.schema, { isImport: true });
|
|
14785
14828
|
else if (this.options.jsonOverride) doc2 = this.schema.nodeFromJSON(this.options.jsonOverride);
|
|
14786
14829
|
if (fragment) doc2 = yXmlFragmentToProseMirrorRootNode(fragment, this.schema);
|
|
14787
14830
|
}
|
|
@@ -15279,6 +15322,10 @@ const TextAlign = Extension.create({
|
|
|
15279
15322
|
{
|
|
15280
15323
|
types: this.options.types,
|
|
15281
15324
|
attributes: {
|
|
15325
|
+
/**
|
|
15326
|
+
* @category Attribute
|
|
15327
|
+
* @param {string} [textAlign='left'] - Text alignment value (left, center, right, justify)
|
|
15328
|
+
*/
|
|
15282
15329
|
textAlign: {
|
|
15283
15330
|
default: this.options.defaultAlignment,
|
|
15284
15331
|
parseDOM: (el) => {
|
|
@@ -15299,11 +15346,32 @@ const TextAlign = Extension.create({
|
|
|
15299
15346
|
},
|
|
15300
15347
|
addCommands() {
|
|
15301
15348
|
return {
|
|
15349
|
+
/**
|
|
15350
|
+
* Set text alignment
|
|
15351
|
+
* @category Command
|
|
15352
|
+
* @param {string} alignment - Alignment value (left, center, right, justify)
|
|
15353
|
+
* @returns {Function} Command function
|
|
15354
|
+
* @example
|
|
15355
|
+
* // Set to center
|
|
15356
|
+
* setTextAlign('center')
|
|
15357
|
+
*
|
|
15358
|
+
* // Set to justify
|
|
15359
|
+
* setTextAlign('justify')
|
|
15360
|
+
* @note Applies to all configured node types (heading, paragraph by default)
|
|
15361
|
+
*/
|
|
15302
15362
|
setTextAlign: (alignment) => ({ commands: commands2 }) => {
|
|
15303
15363
|
const containsAlignment = this.options.alignments.includes(alignment);
|
|
15304
15364
|
if (!containsAlignment) return false;
|
|
15305
15365
|
return this.options.types.map((type) => commands2.updateAttributes(type, { textAlign: alignment })).every((result) => result);
|
|
15306
15366
|
},
|
|
15367
|
+
/**
|
|
15368
|
+
* Remove text alignment (reset to default)
|
|
15369
|
+
* @category Command
|
|
15370
|
+
* @returns {Function} Command function
|
|
15371
|
+
* @example
|
|
15372
|
+
* unsetTextAlign()
|
|
15373
|
+
* @note Resets alignment to the default value
|
|
15374
|
+
*/
|
|
15307
15375
|
unsetTextAlign: () => ({ commands: commands2 }) => {
|
|
15308
15376
|
return this.options.types.map((type) => commands2.resetAttributes(type, "textAlign")).every((result) => result);
|
|
15309
15377
|
}
|
|
@@ -15334,6 +15402,10 @@ const TextIndent = Extension.create({
|
|
|
15334
15402
|
{
|
|
15335
15403
|
types: this.options.types,
|
|
15336
15404
|
attributes: {
|
|
15405
|
+
/**
|
|
15406
|
+
* @category Attribute
|
|
15407
|
+
* @param {string} [textIndent] - Text indentation value with unit (e.g., '0.5in')
|
|
15408
|
+
*/
|
|
15337
15409
|
textIndent: {
|
|
15338
15410
|
default: null,
|
|
15339
15411
|
parseDOM: (el) => el.style.textIndent,
|
|
@@ -15351,13 +15423,43 @@ const TextIndent = Extension.create({
|
|
|
15351
15423
|
},
|
|
15352
15424
|
addCommands() {
|
|
15353
15425
|
return {
|
|
15426
|
+
/**
|
|
15427
|
+
* Set text indentation
|
|
15428
|
+
* @category Command
|
|
15429
|
+
* @param {string} indent - Indentation value with unit (e.g., '0.5in', '2cm')
|
|
15430
|
+
* @returns {Function} Command function
|
|
15431
|
+
* @example
|
|
15432
|
+
* // Set to 0.5 inches
|
|
15433
|
+
* setTextIndent('0.5in')
|
|
15434
|
+
*
|
|
15435
|
+
* // Set to 2 centimeters
|
|
15436
|
+
* setTextIndent('2cm')
|
|
15437
|
+
* @note Accepts any valid CSS unit (in, cm, px, em, etc.)
|
|
15438
|
+
*/
|
|
15354
15439
|
setTextIndent: (indent) => ({ commands: commands2 }) => {
|
|
15355
15440
|
if (!indent) return false;
|
|
15356
15441
|
return this.options.types.map((type) => commands2.updateAttributes(type, { textIndent: indent })).every((result) => result);
|
|
15357
15442
|
},
|
|
15443
|
+
/**
|
|
15444
|
+
* Remove text indentation
|
|
15445
|
+
* @category Command
|
|
15446
|
+
* @returns {Function} Command function
|
|
15447
|
+
* @example
|
|
15448
|
+
* unsetTextIndent()
|
|
15449
|
+
* @note Removes all indentation from the selected nodes
|
|
15450
|
+
*/
|
|
15358
15451
|
unsetTextIndent: () => ({ commands: commands2 }) => {
|
|
15359
15452
|
return this.options.types.map((type) => commands2.resetAttributes(type, "textIndent")).every((result) => result);
|
|
15360
15453
|
},
|
|
15454
|
+
/**
|
|
15455
|
+
* Increase text indentation
|
|
15456
|
+
* @category Command
|
|
15457
|
+
* @returns {Function} Command function
|
|
15458
|
+
* @example
|
|
15459
|
+
* increaseTextIndent()
|
|
15460
|
+
* @note Increments by the default value (0.125in by default)
|
|
15461
|
+
* @note Creates initial indent if none exists
|
|
15462
|
+
*/
|
|
15361
15463
|
increaseTextIndent: () => ({ commands: commands2 }) => {
|
|
15362
15464
|
return this.options.types.map((type) => {
|
|
15363
15465
|
let { textIndent } = this.editor.getAttributes(type);
|
|
@@ -15368,7 +15470,7 @@ const TextIndent = Extension.create({
|
|
|
15368
15470
|
});
|
|
15369
15471
|
}
|
|
15370
15472
|
let [value, unit] = parseSizeUnit(textIndent);
|
|
15371
|
-
value = value + this.options.defaults.increment;
|
|
15473
|
+
value = Number(value) + this.options.defaults.increment;
|
|
15372
15474
|
unit = unit ? unit : this.options.defaults.unit;
|
|
15373
15475
|
if (Number.isNaN(value)) return false;
|
|
15374
15476
|
return commands2.updateAttributes(type, {
|
|
@@ -15376,12 +15478,21 @@ const TextIndent = Extension.create({
|
|
|
15376
15478
|
});
|
|
15377
15479
|
}).every((result) => result);
|
|
15378
15480
|
},
|
|
15481
|
+
/**
|
|
15482
|
+
* Decrease text indentation
|
|
15483
|
+
* @category Command
|
|
15484
|
+
* @returns {Function} Command function
|
|
15485
|
+
* @example
|
|
15486
|
+
* decreaseTextIndent()
|
|
15487
|
+
* @note Decrements by the default value (0.125in by default)
|
|
15488
|
+
* @note Removes indentation completely if it reaches 0 or below
|
|
15489
|
+
*/
|
|
15379
15490
|
decreaseTextIndent: () => ({ commands: commands2 }) => {
|
|
15380
15491
|
return this.options.types.map((type) => {
|
|
15381
15492
|
let { textIndent } = this.editor.getAttributes(type);
|
|
15382
15493
|
if (!textIndent) return false;
|
|
15383
15494
|
let [value, unit] = parseSizeUnit(textIndent);
|
|
15384
|
-
value = value - this.options.defaults.increment;
|
|
15495
|
+
value = Number(value) - this.options.defaults.increment;
|
|
15385
15496
|
unit = unit ? unit : this.options.defaults.unit;
|
|
15386
15497
|
if (Number.isNaN(value)) return false;
|
|
15387
15498
|
if (value <= 0) {
|
|
@@ -15950,8 +16061,17 @@ const Gapcursor = Extension.create({
|
|
|
15950
16061
|
addPmPlugins() {
|
|
15951
16062
|
return [gapCursor()];
|
|
15952
16063
|
},
|
|
16064
|
+
/**
|
|
16065
|
+
* Extend node schema to allow gap cursor positioning
|
|
16066
|
+
* @returns {Object} Schema extension with allowGapCursor property
|
|
16067
|
+
*/
|
|
15953
16068
|
extendNodeSchema(extension) {
|
|
15954
16069
|
return {
|
|
16070
|
+
/**
|
|
16071
|
+
* Whether to allow gap cursor before/after this node
|
|
16072
|
+
* Set to false on nodes where gap cursor shouldn't appear
|
|
16073
|
+
* @type {boolean|null}
|
|
16074
|
+
*/
|
|
15955
16075
|
allowGapCursor: callOrGet(
|
|
15956
16076
|
getExtensionConfigField(extension, "allowGapCursor", {
|
|
15957
16077
|
name: extension.name,
|
|
@@ -17013,10 +17133,12 @@ const getLinkedStyle = (styleId, styles = []) => {
|
|
|
17013
17133
|
};
|
|
17014
17134
|
const getSpacingStyle = (spacing) => {
|
|
17015
17135
|
const { lineSpaceBefore, lineSpaceAfter, line, lineRule } = spacing;
|
|
17136
|
+
const lineHeightResult = getLineHeightValueString(line, "", lineRule, true);
|
|
17137
|
+
const lineHeightStyles = typeof lineHeightResult === "object" && lineHeightResult !== null ? lineHeightResult : {};
|
|
17016
17138
|
return {
|
|
17017
17139
|
"margin-top": lineSpaceBefore + "px",
|
|
17018
17140
|
"margin-bottom": lineSpaceAfter + "px",
|
|
17019
|
-
...
|
|
17141
|
+
...lineHeightStyles
|
|
17020
17142
|
};
|
|
17021
17143
|
};
|
|
17022
17144
|
const getSpacingStyleString = (spacing) => {
|
|
@@ -17201,6 +17323,11 @@ const createLinkedStylesPlugin = (editor) => {
|
|
|
17201
17323
|
return new Plugin({
|
|
17202
17324
|
key: LinkedStylesPluginKey,
|
|
17203
17325
|
state: {
|
|
17326
|
+
/**
|
|
17327
|
+
* Initialize plugin state with styles and decorations
|
|
17328
|
+
* @returns {Object} Initial state with styles and decorations
|
|
17329
|
+
* @private
|
|
17330
|
+
*/
|
|
17204
17331
|
init() {
|
|
17205
17332
|
if (!editor.converter || editor.options.mode !== "docx") return {};
|
|
17206
17333
|
const styles = editor.converter?.linkedStyles || [];
|
|
@@ -17209,6 +17336,15 @@ const createLinkedStylesPlugin = (editor) => {
|
|
|
17209
17336
|
decorations: generateDecorations(editor.state, styles)
|
|
17210
17337
|
};
|
|
17211
17338
|
},
|
|
17339
|
+
/**
|
|
17340
|
+
* Update decorations when document changes
|
|
17341
|
+
* @param {Object} tr - The transaction
|
|
17342
|
+
* @param {Object} prev - Previous plugin state
|
|
17343
|
+
* @param {Object} oldEditorState - Old editor state
|
|
17344
|
+
* @param {Object} newEditorState - New editor state
|
|
17345
|
+
* @returns {Object} Updated state with styles and decorations
|
|
17346
|
+
* @private
|
|
17347
|
+
*/
|
|
17212
17348
|
apply(tr, prev, oldEditorState, newEditorState) {
|
|
17213
17349
|
if (!editor.converter || editor.options.mode !== "docx") return { ...prev };
|
|
17214
17350
|
let decorations = prev.decorations || DecorationSet.empty;
|
|
@@ -17220,6 +17356,12 @@ const createLinkedStylesPlugin = (editor) => {
|
|
|
17220
17356
|
}
|
|
17221
17357
|
},
|
|
17222
17358
|
props: {
|
|
17359
|
+
/**
|
|
17360
|
+
* Provide decorations to the editor view
|
|
17361
|
+
* @param {Object} state - Current editor state
|
|
17362
|
+
* @returns {Object} The decoration set
|
|
17363
|
+
* @private
|
|
17364
|
+
*/
|
|
17223
17365
|
decorations(state) {
|
|
17224
17366
|
return LinkedStylesPluginKey.getState(state)?.decorations;
|
|
17225
17367
|
}
|
|
@@ -17261,24 +17403,35 @@ const LinkedStyles = Extension.create({
|
|
|
17261
17403
|
addCommands() {
|
|
17262
17404
|
return {
|
|
17263
17405
|
/**
|
|
17264
|
-
* Apply a linked style to the
|
|
17265
|
-
*
|
|
17266
|
-
* @param {
|
|
17267
|
-
* @
|
|
17268
|
-
* @
|
|
17406
|
+
* Apply a linked style to the selected paragraphs
|
|
17407
|
+
* @category Command
|
|
17408
|
+
* @param {Object} style - The style object to apply
|
|
17409
|
+
* @returns {Function} Command function
|
|
17410
|
+
* @example
|
|
17411
|
+
* const style = editor.helpers.linkedStyles.getStyleById('Heading1');
|
|
17412
|
+
* setLinkedStyle(style);
|
|
17413
|
+
* @note Clears existing formatting when applying a style
|
|
17414
|
+
* @note Works with custom selection preservation
|
|
17269
17415
|
*/
|
|
17270
17416
|
setLinkedStyle: (style) => (params2) => {
|
|
17271
17417
|
const { tr } = params2;
|
|
17272
17418
|
return applyLinkedStyleToTransaction(tr, this.editor, style);
|
|
17273
17419
|
},
|
|
17274
17420
|
/**
|
|
17275
|
-
* Toggle a linked style on the current selection
|
|
17421
|
+
* Toggle a linked style on the current selection
|
|
17422
|
+
* @category Command
|
|
17423
|
+
* @param {Object} style - The linked style to apply (with id property)
|
|
17424
|
+
* @param {string|null} [nodeType=null] - Node type to restrict toggle to (e.g., 'paragraph')
|
|
17425
|
+
* @returns {Function} Command function
|
|
17426
|
+
* @example
|
|
17427
|
+
* // Toggle a heading style
|
|
17428
|
+
* const style = editor.helpers.linkedStyles.getStyleById('Heading1');
|
|
17429
|
+
* toggleLinkedStyle(style)
|
|
17276
17430
|
*
|
|
17277
|
-
*
|
|
17278
|
-
*
|
|
17279
|
-
* @
|
|
17280
|
-
*
|
|
17281
|
-
* @returns {boolean} Whether the style was correctly applied/removed
|
|
17431
|
+
* // Toggle only on paragraph nodes
|
|
17432
|
+
* toggleLinkedStyle(style, 'paragraph')
|
|
17433
|
+
* @note If selection is empty, returns false
|
|
17434
|
+
* @note Removes style if already applied, applies it if not
|
|
17282
17435
|
*/
|
|
17283
17436
|
toggleLinkedStyle: (style, nodeType = null) => (params2) => {
|
|
17284
17437
|
const { tr } = params2;
|
|
@@ -17301,9 +17454,17 @@ const LinkedStyles = Extension.create({
|
|
|
17301
17454
|
return applyLinkedStyleToTransaction(tr, this.editor, style);
|
|
17302
17455
|
},
|
|
17303
17456
|
/**
|
|
17304
|
-
* Apply a linked style by its ID
|
|
17305
|
-
* @
|
|
17306
|
-
* @
|
|
17457
|
+
* Apply a linked style by its ID
|
|
17458
|
+
* @category Command
|
|
17459
|
+
* @param {string} styleId - The style ID to apply (e.g., 'Heading1')
|
|
17460
|
+
* @returns {Function} Command function
|
|
17461
|
+
* @example
|
|
17462
|
+
* // Apply a heading style
|
|
17463
|
+
* setStyleById('Heading1')
|
|
17464
|
+
*
|
|
17465
|
+
* // Apply a normal style
|
|
17466
|
+
* setStyleById('Normal')
|
|
17467
|
+
* @note Looks up the style from loaded Word styles
|
|
17307
17468
|
*/
|
|
17308
17469
|
setStyleById: (styleId) => (params2) => {
|
|
17309
17470
|
const { state, tr } = params2;
|
|
@@ -17318,22 +17479,39 @@ const LinkedStyles = Extension.create({
|
|
|
17318
17479
|
addHelpers() {
|
|
17319
17480
|
return {
|
|
17320
17481
|
/**
|
|
17321
|
-
* Get all linked styles
|
|
17482
|
+
* Get all available linked styles
|
|
17483
|
+
* @category Helper
|
|
17322
17484
|
* @returns {Array} Array of linked style objects
|
|
17485
|
+
* @example
|
|
17486
|
+
* const styles = editor.helpers.linkedStyles.getStyles();
|
|
17487
|
+
* // Returns all styles from the Word document
|
|
17323
17488
|
*/
|
|
17324
17489
|
getStyles: () => {
|
|
17325
17490
|
const styles = LinkedStylesPluginKey.getState(this.editor.state)?.styles || [];
|
|
17326
17491
|
return styles;
|
|
17327
17492
|
},
|
|
17328
17493
|
/**
|
|
17329
|
-
* Get a
|
|
17330
|
-
* @
|
|
17331
|
-
* @
|
|
17494
|
+
* Get a specific style by ID
|
|
17495
|
+
* @category Helper
|
|
17496
|
+
* @param {string} styleId - The style ID to find
|
|
17497
|
+
* @returns {Object} The style object or undefined
|
|
17498
|
+
* @example
|
|
17499
|
+
* const headingStyle = editor.helpers.linkedStyles.getStyleById('Heading1');
|
|
17332
17500
|
*/
|
|
17333
17501
|
getStyleById: (styleId) => {
|
|
17334
17502
|
const styles = this.editor.helpers[this.name].getStyles();
|
|
17335
17503
|
return styles.find((s) => s.id === styleId);
|
|
17336
17504
|
},
|
|
17505
|
+
/**
|
|
17506
|
+
* Get the CSS string for a style
|
|
17507
|
+
* @category Helper
|
|
17508
|
+
* @param {string} styleId - The style ID
|
|
17509
|
+
* @returns {string} CSS style string
|
|
17510
|
+
* @example
|
|
17511
|
+
* const css = editor.helpers.linkedStyles.getLinkedStyleString('Heading1');
|
|
17512
|
+
* // Returns: "font-size: 16pt; font-weight: bold; color: #2E74B5"
|
|
17513
|
+
* @private
|
|
17514
|
+
*/
|
|
17337
17515
|
getLinkedStyleString: (styleId) => {
|
|
17338
17516
|
const styles = this.editor.helpers.linkedStyles.getStyles();
|
|
17339
17517
|
const style = styles.find((s) => s.id === styleId);
|
|
@@ -17983,8 +18161,9 @@ const getDefaultSpacing = () => ({
|
|
|
17983
18161
|
line: 0,
|
|
17984
18162
|
lineRule: null
|
|
17985
18163
|
});
|
|
17986
|
-
const Paragraph =
|
|
18164
|
+
const Paragraph = OxmlNode.create({
|
|
17987
18165
|
name: "paragraph",
|
|
18166
|
+
oXmlName: "w:p",
|
|
17988
18167
|
priority: 1e3,
|
|
17989
18168
|
group: "block",
|
|
17990
18169
|
content: "inline*",
|
|
@@ -18003,8 +18182,26 @@ const Paragraph = Node$1.create({
|
|
|
18003
18182
|
},
|
|
18004
18183
|
addAttributes() {
|
|
18005
18184
|
return {
|
|
18185
|
+
paraId: { rendered: false },
|
|
18186
|
+
textId: { rendered: false },
|
|
18187
|
+
rsidR: { rendered: false },
|
|
18188
|
+
rsidRDefault: { rendered: false },
|
|
18189
|
+
rsidP: { rendered: false },
|
|
18190
|
+
rsidRPr: { rendered: false },
|
|
18191
|
+
rsidDel: { rendered: false },
|
|
18006
18192
|
spacing: {
|
|
18007
18193
|
default: getDefaultSpacing(),
|
|
18194
|
+
parseDOM: (element) => {
|
|
18195
|
+
if (element && element.closest("[data-superdoc-import]")) {
|
|
18196
|
+
return {
|
|
18197
|
+
lineSpaceAfter: 11,
|
|
18198
|
+
lineSpaceBefore: 0,
|
|
18199
|
+
line: 1.15,
|
|
18200
|
+
lineRule: "auto"
|
|
18201
|
+
};
|
|
18202
|
+
}
|
|
18203
|
+
return void 0;
|
|
18204
|
+
},
|
|
18008
18205
|
renderDOM: (attrs) => {
|
|
18009
18206
|
const { spacing } = attrs;
|
|
18010
18207
|
if (!spacing) return {};
|
|
@@ -18101,7 +18298,6 @@ const Paragraph = Node$1.create({
|
|
|
18101
18298
|
rendered: false
|
|
18102
18299
|
},
|
|
18103
18300
|
filename: { rendered: false },
|
|
18104
|
-
rsidRDefault: { rendered: false },
|
|
18105
18301
|
keepLines: { rendered: false },
|
|
18106
18302
|
keepNext: { rendered: false },
|
|
18107
18303
|
paragraphProperties: { rendered: false },
|
|
@@ -23712,6 +23908,10 @@ const Image = Node$1.create({
|
|
|
23712
23908
|
},
|
|
23713
23909
|
addAttributes() {
|
|
23714
23910
|
return {
|
|
23911
|
+
/**
|
|
23912
|
+
* @category Attribute
|
|
23913
|
+
* @param {string} [src] - Image source URL or path
|
|
23914
|
+
*/
|
|
23715
23915
|
src: {
|
|
23716
23916
|
default: null,
|
|
23717
23917
|
renderDOM: ({ src }) => {
|
|
@@ -23720,40 +23920,110 @@ const Image = Node$1.create({
|
|
|
23720
23920
|
};
|
|
23721
23921
|
}
|
|
23722
23922
|
},
|
|
23923
|
+
/**
|
|
23924
|
+
* @category Attribute
|
|
23925
|
+
* @param {string} [alt='Uploaded picture'] - Alternative text for accessibility
|
|
23926
|
+
*/
|
|
23723
23927
|
alt: {
|
|
23724
23928
|
default: "Uploaded picture"
|
|
23725
23929
|
},
|
|
23930
|
+
/**
|
|
23931
|
+
* @category Attribute
|
|
23932
|
+
* @param {string} [id] - Image element ID
|
|
23933
|
+
* @private
|
|
23934
|
+
*/
|
|
23726
23935
|
id: { rendered: false },
|
|
23936
|
+
/**
|
|
23937
|
+
* @category Attribute
|
|
23938
|
+
* @param {string} [title] - Image title/tooltip text
|
|
23939
|
+
*/
|
|
23727
23940
|
title: {
|
|
23728
23941
|
default: null
|
|
23729
23942
|
},
|
|
23943
|
+
/**
|
|
23944
|
+
* @category Attribute
|
|
23945
|
+
* @param {string} [rId] - Relationship ID for Word export
|
|
23946
|
+
* @private
|
|
23947
|
+
*/
|
|
23730
23948
|
rId: {
|
|
23731
23949
|
default: null,
|
|
23732
23950
|
rendered: false
|
|
23733
23951
|
},
|
|
23952
|
+
/**
|
|
23953
|
+
* @category Attribute
|
|
23954
|
+
* @param {Object} [originalPadding] - Original padding values from Word import
|
|
23955
|
+
* @private
|
|
23956
|
+
*/
|
|
23734
23957
|
originalPadding: {
|
|
23735
23958
|
default: null,
|
|
23736
23959
|
rendered: false
|
|
23737
23960
|
},
|
|
23961
|
+
/**
|
|
23962
|
+
* @category Attribute
|
|
23963
|
+
* @param {Object} [originalAttributes] - Original attributes from Word import
|
|
23964
|
+
* @private
|
|
23965
|
+
*/
|
|
23738
23966
|
originalAttributes: { rendered: false },
|
|
23967
|
+
/**
|
|
23968
|
+
* @category Attribute
|
|
23969
|
+
* @param {boolean} [wrapTopAndBottom] - Wrap text above and below image
|
|
23970
|
+
* @private
|
|
23971
|
+
*/
|
|
23739
23972
|
wrapTopAndBottom: { rendered: false },
|
|
23973
|
+
/**
|
|
23974
|
+
* @category Attribute
|
|
23975
|
+
* @param {Object} [anchorData] - Anchor positioning data for Word
|
|
23976
|
+
* @private
|
|
23977
|
+
*/
|
|
23740
23978
|
anchorData: {
|
|
23741
23979
|
default: null,
|
|
23742
23980
|
rendered: false
|
|
23743
23981
|
},
|
|
23982
|
+
/**
|
|
23983
|
+
* @category Attribute
|
|
23984
|
+
* @param {boolean} [isAnchor] - Whether image is anchored
|
|
23985
|
+
* @private
|
|
23986
|
+
*/
|
|
23744
23987
|
isAnchor: { rendered: false },
|
|
23988
|
+
/**
|
|
23989
|
+
* @category Attribute
|
|
23990
|
+
* @param {boolean} [simplePos] - Simple positioning flag
|
|
23991
|
+
* @private
|
|
23992
|
+
*/
|
|
23745
23993
|
simplePos: { rendered: false },
|
|
23994
|
+
/**
|
|
23995
|
+
* @category Attribute
|
|
23996
|
+
* @param {string} [wrapText] - Text wrapping style
|
|
23997
|
+
* @private
|
|
23998
|
+
*/
|
|
23746
23999
|
wrapText: { rendered: false },
|
|
24000
|
+
extension: { rendered: false },
|
|
24001
|
+
/**
|
|
24002
|
+
* @category Attribute
|
|
24003
|
+
* @param {Object} [size] - Image dimensions
|
|
24004
|
+
* @param {number} [size.width] - Width in pixels
|
|
24005
|
+
* @param {number} [size.height] - Height in pixels
|
|
24006
|
+
*/
|
|
23747
24007
|
size: {
|
|
23748
24008
|
default: {},
|
|
23749
|
-
renderDOM: ({ size }) => {
|
|
24009
|
+
renderDOM: ({ size, extension }) => {
|
|
23750
24010
|
let style = "";
|
|
23751
24011
|
const { width, height } = size ?? {};
|
|
23752
24012
|
if (width) style += `width: ${width}px;`;
|
|
23753
|
-
if (height
|
|
24013
|
+
if (height && ["emf", "wmf"].includes(extension))
|
|
24014
|
+
style += `height: ${height}px; border: 1px solid black; position: absolute;`;
|
|
24015
|
+
else if (height) style += "height: auto;";
|
|
23754
24016
|
return { style };
|
|
23755
24017
|
}
|
|
23756
24018
|
},
|
|
24019
|
+
/**
|
|
24020
|
+
* @category Attribute
|
|
24021
|
+
* @param {Object} [padding] - Image padding/margins
|
|
24022
|
+
* @param {number} [padding.left] - Left padding in pixels
|
|
24023
|
+
* @param {number} [padding.top] - Top padding in pixels
|
|
24024
|
+
* @param {number} [padding.bottom] - Bottom padding in pixels
|
|
24025
|
+
* @param {number} [padding.right] - Right padding in pixels
|
|
24026
|
+
*/
|
|
23757
24027
|
padding: {
|
|
23758
24028
|
default: {},
|
|
23759
24029
|
renderDOM: ({ padding, marginOffset }) => {
|
|
@@ -23766,6 +24036,12 @@ const Image = Node$1.create({
|
|
|
23766
24036
|
return { style };
|
|
23767
24037
|
}
|
|
23768
24038
|
},
|
|
24039
|
+
/**
|
|
24040
|
+
* @category Attribute
|
|
24041
|
+
* @param {Object} [marginOffset] - Margin offset for anchored images
|
|
24042
|
+
* @param {number} [marginOffset.left] - Left margin offset
|
|
24043
|
+
* @param {number} [marginOffset.top] - Top margin offset
|
|
24044
|
+
*/
|
|
23769
24045
|
marginOffset: {
|
|
23770
24046
|
default: {},
|
|
23771
24047
|
renderDOM: ({ marginOffset, anchorData }) => {
|
|
@@ -23781,6 +24057,10 @@ const Image = Node$1.create({
|
|
|
23781
24057
|
return { style };
|
|
23782
24058
|
}
|
|
23783
24059
|
},
|
|
24060
|
+
/**
|
|
24061
|
+
* @category Attribute
|
|
24062
|
+
* @param {string} [style] - Custom inline CSS styles
|
|
24063
|
+
*/
|
|
23784
24064
|
style: {
|
|
23785
24065
|
default: null,
|
|
23786
24066
|
rendered: true,
|
|
@@ -23803,6 +24083,27 @@ const Image = Node$1.create({
|
|
|
23803
24083
|
},
|
|
23804
24084
|
addCommands() {
|
|
23805
24085
|
return {
|
|
24086
|
+
/**
|
|
24087
|
+
* Insert an image at the current position
|
|
24088
|
+
* @category Command
|
|
24089
|
+
* @param {Object} options - Image attributes
|
|
24090
|
+
* @param {string} options.src - Image source URL or data URI
|
|
24091
|
+
* @param {string} [options.alt] - Alternative text
|
|
24092
|
+
* @param {string} [options.title] - Image title
|
|
24093
|
+
* @param {Object} [options.size] - Image dimensions
|
|
24094
|
+
* @returns {Function} Command function
|
|
24095
|
+
* @example
|
|
24096
|
+
* // Insert an image from a URL
|
|
24097
|
+
* setImage({ src: 'https://example.com/image.jpg' })
|
|
24098
|
+
*
|
|
24099
|
+
* // Insert a base64 encoded image
|
|
24100
|
+
* setImage({
|
|
24101
|
+
* src: 'data:image/png;base64,...',
|
|
24102
|
+
* alt: 'Company logo',
|
|
24103
|
+
* size: { width: 200 }
|
|
24104
|
+
* })
|
|
24105
|
+
* @note Supports URLs, relative paths, and base64 data URIs
|
|
24106
|
+
*/
|
|
23806
24107
|
setImage: (options) => ({ commands: commands2 }) => {
|
|
23807
24108
|
return commands2.insertContent({
|
|
23808
24109
|
type: this.name,
|
|
@@ -23840,7 +24141,9 @@ const getFileOpener = () => {
|
|
|
23840
24141
|
const handleImageUpload = (file) => {
|
|
23841
24142
|
return new Promise((resolve, reject) => {
|
|
23842
24143
|
let reader = new FileReader();
|
|
23843
|
-
reader.onload = (event) =>
|
|
24144
|
+
reader.onload = (event) => {
|
|
24145
|
+
resolve(event.target.result);
|
|
24146
|
+
};
|
|
23844
24147
|
reader.onerror = reject;
|
|
23845
24148
|
setTimeout(() => reader.readAsDataURL(file), 250);
|
|
23846
24149
|
});
|
|
@@ -24044,8 +24347,8 @@ async function uploadImage({ editor, view, file, size, uploadHandler }) {
|
|
|
24044
24347
|
let rId = null;
|
|
24045
24348
|
if (editor.options.mode === "docx") {
|
|
24046
24349
|
const [, path] = mediaPath.split("word/");
|
|
24047
|
-
const
|
|
24048
|
-
if (
|
|
24350
|
+
const imageid = addImageRelationship({ editor, path });
|
|
24351
|
+
if (imageid) rId = imageid;
|
|
24049
24352
|
}
|
|
24050
24353
|
let imageNode = schema.nodes.image.create({
|
|
24051
24354
|
src: mediaPath,
|
|
@@ -24068,8 +24371,8 @@ function addImageRelationship({ editor, path }) {
|
|
|
24068
24371
|
const target = path;
|
|
24069
24372
|
const type = "image";
|
|
24070
24373
|
try {
|
|
24071
|
-
const
|
|
24072
|
-
return
|
|
24374
|
+
const relationshipId = insertNewRelationship(target, type, editor);
|
|
24375
|
+
return relationshipId;
|
|
24073
24376
|
} catch {
|
|
24074
24377
|
return null;
|
|
24075
24378
|
}
|
|
@@ -25182,6 +25485,17 @@ const BlockNode = Extension.create({
|
|
|
25182
25485
|
name: "blockNode",
|
|
25183
25486
|
addCommands() {
|
|
25184
25487
|
return {
|
|
25488
|
+
/**
|
|
25489
|
+
* Replace a block node by its ID with new content
|
|
25490
|
+
* @category Command
|
|
25491
|
+
* @param {string} id - The sdBlockId of the node to replace
|
|
25492
|
+
* @param {Object} contentNode - The replacement ProseMirror node
|
|
25493
|
+
* @returns {Function} Command function
|
|
25494
|
+
* @example
|
|
25495
|
+
* const newParagraph = editor.schema.nodes.paragraph.create({}, editor.schema.text('New content'))
|
|
25496
|
+
* replaceBlockNodeById('block-123', newParagraph)
|
|
25497
|
+
* @note The replacement node should have the same type as the original
|
|
25498
|
+
*/
|
|
25185
25499
|
replaceBlockNodeById: (id, contentNode) => ({ dispatch, tr }) => {
|
|
25186
25500
|
const blockNode = this.editor.helpers.blockNode.getBlockNodeById(id);
|
|
25187
25501
|
if (!blockNode || blockNode.length > 1) {
|
|
@@ -25198,6 +25512,15 @@ const BlockNode = Extension.create({
|
|
|
25198
25512
|
}
|
|
25199
25513
|
return true;
|
|
25200
25514
|
},
|
|
25515
|
+
/**
|
|
25516
|
+
* Delete a block node by its ID
|
|
25517
|
+
* @category Command
|
|
25518
|
+
* @param {string} id - The sdBlockId of the node to delete
|
|
25519
|
+
* @returns {Function} Command function
|
|
25520
|
+
* @example
|
|
25521
|
+
* deleteBlockNodeById('block-123')
|
|
25522
|
+
* @note Completely removes the node from the document
|
|
25523
|
+
*/
|
|
25201
25524
|
deleteBlockNodeById: (id) => ({ dispatch, tr }) => {
|
|
25202
25525
|
const blockNode = this.editor.helpers.blockNode.getBlockNodeById(id);
|
|
25203
25526
|
if (!blockNode || blockNode.length > 1) {
|
|
@@ -25214,6 +25537,18 @@ const BlockNode = Extension.create({
|
|
|
25214
25537
|
}
|
|
25215
25538
|
return true;
|
|
25216
25539
|
},
|
|
25540
|
+
/**
|
|
25541
|
+
* Update attributes of a block node by its ID
|
|
25542
|
+
* @category Command
|
|
25543
|
+
* @param {string} id - The sdBlockId of the node to update
|
|
25544
|
+
* @param {Object} attrs - Attributes to update
|
|
25545
|
+
* @returns {Function} Command function
|
|
25546
|
+
* @example
|
|
25547
|
+
* updateBlockNodeAttributes('block-123', { textAlign: 'center' })
|
|
25548
|
+
* @example
|
|
25549
|
+
* updateBlockNodeAttributes('block-123', { indent: { left: 20 } })
|
|
25550
|
+
* @note Merges new attributes with existing ones
|
|
25551
|
+
*/
|
|
25217
25552
|
updateBlockNodeAttributes: (id, attrs = {}) => ({ dispatch, tr }) => {
|
|
25218
25553
|
const blockNode = this.editor.helpers.blockNode.getBlockNodeById(id);
|
|
25219
25554
|
if (!blockNode || blockNode.length > 1) {
|
|
@@ -25236,15 +25571,54 @@ const BlockNode = Extension.create({
|
|
|
25236
25571
|
},
|
|
25237
25572
|
addHelpers() {
|
|
25238
25573
|
return {
|
|
25574
|
+
/**
|
|
25575
|
+
* Get all block nodes in the document
|
|
25576
|
+
* @category Helper
|
|
25577
|
+
* @returns {Array<BlockNodeInfo>} Array of block node info objects
|
|
25578
|
+
* @example
|
|
25579
|
+
* const blocks = editor.helpers.blockNode.getBlockNodes()
|
|
25580
|
+
* console.log(`Found ${blocks.length} block nodes`)
|
|
25581
|
+
*/
|
|
25239
25582
|
getBlockNodes: () => {
|
|
25240
25583
|
return findChildren(this.editor.state.doc, (node) => nodeAllowsSdBlockIdAttr(node));
|
|
25241
25584
|
},
|
|
25585
|
+
/**
|
|
25586
|
+
* Get a specific block node by its ID
|
|
25587
|
+
* @category Helper
|
|
25588
|
+
* @param {string} id - The sdBlockId to search for
|
|
25589
|
+
* @returns {Array<BlockNodeInfo>} Array containing the matching node (or empty)
|
|
25590
|
+
* @example
|
|
25591
|
+
* const block = editor.helpers.blockNode.getBlockNodeById('block-123')
|
|
25592
|
+
* if (block.length) console.log('Found:', block[0].node.type.name)
|
|
25593
|
+
*/
|
|
25242
25594
|
getBlockNodeById: (id) => {
|
|
25243
25595
|
return findChildren(this.editor.state.doc, (node) => node.attrs.sdBlockId === id);
|
|
25244
25596
|
},
|
|
25597
|
+
/**
|
|
25598
|
+
* Get all block nodes of a specific type
|
|
25599
|
+
* @category Helper
|
|
25600
|
+
* @param {string} type - The node type name (e.g., 'paragraph', 'heading')
|
|
25601
|
+
* @returns {Array<BlockNodeInfo>} Array of matching block nodes
|
|
25602
|
+
* @example
|
|
25603
|
+
* const paragraphs = editor.helpers.blockNode.getBlockNodesByType('paragraph')
|
|
25604
|
+
* const headings = editor.helpers.blockNode.getBlockNodesByType('heading')
|
|
25605
|
+
*/
|
|
25245
25606
|
getBlockNodesByType: (type) => {
|
|
25246
25607
|
return findChildren(this.editor.state.doc, (node) => node.type.name === type);
|
|
25247
25608
|
},
|
|
25609
|
+
/**
|
|
25610
|
+
* Get all block nodes within a position range
|
|
25611
|
+
* @category Helper
|
|
25612
|
+
* @param {number} from - Start position
|
|
25613
|
+
* @param {number} to - End position
|
|
25614
|
+
* @returns {Array<BlockNodeInfo>} Array of block nodes in the range
|
|
25615
|
+
* @example
|
|
25616
|
+
* const selection = editor.state.selection
|
|
25617
|
+
* const blocksInSelection = editor.helpers.blockNode.getBlockNodesInRange(
|
|
25618
|
+
* selection.from,
|
|
25619
|
+
* selection.to
|
|
25620
|
+
* )
|
|
25621
|
+
*/
|
|
25248
25622
|
getBlockNodesInRange: (from2, to) => {
|
|
25249
25623
|
let blockNodes = [];
|
|
25250
25624
|
this.editor.state.doc.nodesBetween(from2, to, (node, pos) => {
|
|
@@ -25300,10 +25674,11 @@ const nodeNeedsSdBlockId = (node) => {
|
|
|
25300
25674
|
return !currentId;
|
|
25301
25675
|
};
|
|
25302
25676
|
const checkForNewBlockNodesInTrs = (transactions) => {
|
|
25303
|
-
return transactions.some((tr) => {
|
|
25677
|
+
return Array.from(transactions).some((tr) => {
|
|
25304
25678
|
return tr.steps.some((step) => {
|
|
25679
|
+
if (!(step instanceof ReplaceStep)) return false;
|
|
25305
25680
|
const hasValidSdBlockNodes = step.slice?.content?.content?.some((node) => nodeAllowsSdBlockIdAttr(node));
|
|
25306
|
-
return
|
|
25681
|
+
return hasValidSdBlockNodes;
|
|
25307
25682
|
});
|
|
25308
25683
|
});
|
|
25309
25684
|
};
|
|
@@ -25332,6 +25707,10 @@ const TextStyle = Mark.create({
|
|
|
25332
25707
|
},
|
|
25333
25708
|
addAttributes() {
|
|
25334
25709
|
return {
|
|
25710
|
+
/**
|
|
25711
|
+
* @category Attribute
|
|
25712
|
+
* @param {string} [styleId] - Style identifier for referencing predefined styles
|
|
25713
|
+
*/
|
|
25335
25714
|
styleId: {}
|
|
25336
25715
|
};
|
|
25337
25716
|
},
|
|
@@ -25340,10 +25719,11 @@ const TextStyle = Mark.create({
|
|
|
25340
25719
|
/**
|
|
25341
25720
|
* Remove empty text style marks
|
|
25342
25721
|
* @category Command
|
|
25343
|
-
* @returns {Function} Command - Removes mark if no attributes present
|
|
25722
|
+
* @returns {Function} Command function - Removes mark if no attributes present
|
|
25344
25723
|
* @example
|
|
25345
25724
|
* removeEmptyTextStyle()
|
|
25346
25725
|
* @note Cleanup utility to prevent empty span elements
|
|
25726
|
+
* @note Automatically checks if any style attributes exist before removal
|
|
25347
25727
|
*/
|
|
25348
25728
|
removeEmptyTextStyle: () => ({ state, commands: commands2 }) => {
|
|
25349
25729
|
const attributes = Attribute.getMarkAttributes(state, this.type);
|
|
@@ -26365,12 +26745,16 @@ const TextTransform = Extension.create({
|
|
|
26365
26745
|
{
|
|
26366
26746
|
types: this.options.types,
|
|
26367
26747
|
attributes: {
|
|
26748
|
+
/**
|
|
26749
|
+
* @category Attribute
|
|
26750
|
+
* @param {string} [textTransform] - Text transform value (uppercase, lowercase, capitalize, none)
|
|
26751
|
+
*/
|
|
26368
26752
|
textTransform: {
|
|
26369
26753
|
default: null,
|
|
26370
26754
|
renderDOM: (attrs) => {
|
|
26371
|
-
if (!attrs.
|
|
26755
|
+
if (!attrs.textTransform) return {};
|
|
26372
26756
|
return {
|
|
26373
|
-
style: `text-transform: ${attrs.
|
|
26757
|
+
style: `text-transform: ${attrs.textTransform}`
|
|
26374
26758
|
};
|
|
26375
26759
|
}
|
|
26376
26760
|
}
|