]> BookStack Code Mirror - bookstack/blobdiff - resources/js/editor/util.js
Started work on details/summary blocks
[bookstack] / resources / js / editor / util.js
index 6d3fb74176d493212c77a628cfdbab5ff176f2e2..ad077b923cb62a84e1e9a5512a1027b85d51d761 100644 (file)
@@ -33,6 +33,68 @@ export function stateToHtml(state) {
     return renderDoc.body.innerHTML;
 }
 
+/**
+ * @param {Object} object
+ * @return {{}}
+ */
+export function nullifyEmptyValues(object) {
+    const clean = {};
+    for (const [key, value] of Object.entries(object)) {
+        clean[key] = (value === "") ? null : value;
+    }
+    return clean;
+}
+
+/**
+ * @param {PmEditorState} state
+ * @param {PmSelection} selection
+ * @param {PmMarkType} markType
+ * @return {{from: Number, to: Number}}
+ */
+export function expandSelectionToMark(state, selection, markType) {
+    let {from, to} = selection;
+    const noRange = (from === to);
+    if (noRange) {
+        const markRange = markRangeAtPosition(state, markType, from);
+        if (markRange.from !== -1) {
+            from = markRange.from;
+            to = markRange.to;
+        }
+    }
+    return {from, to};
+}
+
+/**
+ * @param {PmEditorState} state
+ * @param {PmMarkType} markType
+ * @param {Number} pos
+ * @return {{from: Number, to: Number}}
+ */
+export function markRangeAtPosition(state, markType, pos) {
+    const $pos = state.doc.resolve(pos);
+
+    const {parent, parentOffset} = $pos;
+    const start = parent.childAfter(parentOffset);
+    if (!start.node) return {from: -1, to: -1};
+
+    const mark = start.node.marks.find((mark) => mark.type === markType);
+    if (!mark) return {from: -1, to: -1};
+
+    let startIndex = $pos.index();
+    let startPos = $pos.start() + start.offset;
+    let endIndex = startIndex + 1;
+    let endPos = startPos + start.node.nodeSize;
+    while (startIndex > 0 && mark.isInSet(parent.child(startIndex - 1).marks)) {
+        startIndex -= 1;
+        startPos -= parent.child(startIndex).nodeSize;
+    }
+    while (endIndex < parent.childCount && mark.isInSet(parent.child(endIndex).marks)) {
+        endPos += parent.child(endIndex).nodeSize;
+        endIndex += 1;
+    }
+    return {from: startPos, to: endPos};
+}
+
 /**
  * @class KeyedMultiStack
  * Holds many stacks, seperated via a key, with a simple