From 13b33f745dcbbc6ef92b761fe627feb49d429b86 Mon Sep 17 00:00:00 2001 From: chris <kokosias@yahoo.gr> Date: Wed, 29 Jan 2020 20:00:39 +0200 Subject: [PATCH] more track nodes + cleanup --- wax-prosemirror-core/src/FootnoteView.js | 119 ------------------ wax-prosemirror-core/src/WaxView.js | 6 - .../src/nodes/headingNode.js | 31 +---- .../src/nodes/listItemNode.js | 2 + .../src/nodes/orderedListNode.js | 11 +- .../trackChangesNodes/headingTrackNode.js | 48 +++++++ .../src/nodes/trackChangesNodes/index.js | 6 +- .../trackChangesNodes/orderedListTrackNode.js | 29 +++++ 8 files changed, 90 insertions(+), 162 deletions(-) delete mode 100644 wax-prosemirror-core/src/FootnoteView.js diff --git a/wax-prosemirror-core/src/FootnoteView.js b/wax-prosemirror-core/src/FootnoteView.js deleted file mode 100644 index 807409849..000000000 --- a/wax-prosemirror-core/src/FootnoteView.js +++ /dev/null @@ -1,119 +0,0 @@ -import { StepMap } from "prosemirror-transform"; -import { keymap } from "prosemirror-keymap"; -import { undo, redo } from "prosemirror-history"; -import { EditorView } from "prosemirror-view"; -import { EditorState } from "prosemirror-state"; -import { Schema } from "prosemirror-model"; -import { DefaultSchema } from "wax-prosemirror-schema"; - -class FootnoteView { - constructor(node, view, getPos) { - console.log(node); - // We'll need these later - this.node = node; - - this.outerView = view; - this.getPos = getPos; - - // The node's representation in the editor (empty, for now) - this.dom = document.createElement("footnote"); - // These are used when the footnote is selected - this.innerView = null; - } - selectNode() { - this.dom.classList.add("ProseMirror-selectednode"); - - if (!this.innerView) this.open(); - } - - deselectNode() { - this.dom.classList.remove("ProseMirror-selectednode"); - if (this.innerView) this.close(); - } - - open() { - // Append a tooltip to the outer node - let tooltip = this.dom.appendChild(document.createElement("div")); - tooltip.className = "footnote-tooltip"; - // And put a sub-ProseMirror into that - this.innerView = new EditorView(tooltip, { - // You can use any node as an editor document - state: EditorState.create({ - doc: this.node, - plugins: [ - keymap({ - "Mod-z": () => undo(this.outerView.state, this.outerView.dispatch), - "Mod-y": () => redo(this.outerView.state, this.outerView.dispatch) - }) - ] - }), - // This is the magic part - dispatchTransaction: this.dispatchInner.bind(this), - handleDOMEvents: { - mousedown: () => { - // Kludge to prevent issues due to the fact that the whole - // footnote is node-selected (and thus DOM-selected) when - // the parent editor is focused. - if (this.outerView.hasFocus()) this.innerView.focus(); - } - } - }); - } - - close() { - this.innerView.destroy(); - this.innerView = null; - this.dom.textContent = ""; - } - dispatchInner(tr) { - let { state, transactions } = this.innerView.state.applyTransaction(tr); - this.innerView.updateState(state); - - if (!tr.getMeta("fromOutside")) { - let outerTr = this.outerView.state.tr, - offsetMap = StepMap.offset(this.getPos() + 1); - for (let i = 0; i < transactions.length; i++) { - let steps = transactions[i].steps; - for (let j = 0; j < steps.length; j++) - outerTr.step(steps[j].map(offsetMap)); - } - if (outerTr.docChanged) this.outerView.dispatch(outerTr); - } - } - update(node) { - console.log("update"); - if (!node.sameMarkup(this.node)) return false; - this.node = node; - if (this.innerView) { - let state = this.innerView.state; - let start = node.content.findDiffStart(state.doc.content); - if (start != null) { - let { a: endA, b: endB } = node.content.findDiffEnd(state.doc.content); - let overlap = start - Math.min(endA, endB); - if (overlap > 0) { - endA += overlap; - endB += overlap; - } - this.innerView.dispatch( - state.tr - .replace(start, endB, node.slice(start, endA)) - .setMeta("fromOutside", true) - ); - } - } - return true; - } - destroy() { - if (this.innerView) this.close(); - } - - stopEvent(event) { - return this.innerView && this.innerView.dom.contains(event.target); - } - - ignoreMutation() { - return true; - } -} - -export default FootnoteView; diff --git a/wax-prosemirror-core/src/WaxView.js b/wax-prosemirror-core/src/WaxView.js index e21b7a5bc..a32732603 100644 --- a/wax-prosemirror-core/src/WaxView.js +++ b/wax-prosemirror-core/src/WaxView.js @@ -13,7 +13,6 @@ import "prosemirror-view/style/prosemirror.css"; import trackedTransaction from "./track-changes/trackedTransaction"; import { WaxContext } from "./ioc-react"; -import FootnoteView from "./FootnoteView"; export default props => { const { readonly, onBlur, options, debug, autoFocus } = props; @@ -46,11 +45,6 @@ export default props => { } : null } - // nodeViews: { - // footnote(node, view, getPos) { - // return new FootnoteView(node, view, getPos); - // } - // } } ); context.updateView({ main: view }); diff --git a/wax-prosemirror-schema/src/nodes/headingNode.js b/wax-prosemirror-schema/src/nodes/headingNode.js index 85993a2da..3337526d5 100644 --- a/wax-prosemirror-schema/src/nodes/headingNode.js +++ b/wax-prosemirror-schema/src/nodes/headingNode.js @@ -1,8 +1,6 @@ -import { parseTracks } from "./helpers"; const heading = { attrs: { - level: { default: 1 }, - track: { default: [] } + level: { default: 1 } }, content: "inline*", group: "block", @@ -10,40 +8,19 @@ const heading = { parseDOM: [ { tag: "h1", - attrs: { level: 1 }, - getAttrs(hook, next) { - Object.assign(hook, { - track: parseTracks(hook.dom.dataset.track) - }); - next(); - } + attrs: { level: 1 } }, { tag: "h2", - attrs: { level: 2 }, - getAttrs(hook, next) { - Object.assign(hook, { - track: parseTracks(hook.dom.dataset.track) - }); - next(); - } + attrs: { level: 2 } }, { tag: "h3", - attrs: { level: 3 }, - getAttrs(hook, next) { - Object.assign(hook, { - track: parseTracks(hook.dom.dataset.track) - }); - next(); - } + attrs: { level: 3 } } ], toDOM(hook, next) { const attrs = {}; - if (hook.node.attrs.track.length) { - attrs["data-track"] = JSON.stringify(hook.node.attrs.track); - } hook.value = [`h${hook.node.attrs.level}`, attrs, 0]; next(); } diff --git a/wax-prosemirror-schema/src/nodes/listItemNode.js b/wax-prosemirror-schema/src/nodes/listItemNode.js index a91948c24..6faa44008 100644 --- a/wax-prosemirror-schema/src/nodes/listItemNode.js +++ b/wax-prosemirror-schema/src/nodes/listItemNode.js @@ -1,3 +1,5 @@ +import { parseTracks } from "./helpers"; + const list_item = { content: "block+", attrs: { diff --git a/wax-prosemirror-schema/src/nodes/orderedListNode.js b/wax-prosemirror-schema/src/nodes/orderedListNode.js index 375936124..b704499c6 100644 --- a/wax-prosemirror-schema/src/nodes/orderedListNode.js +++ b/wax-prosemirror-schema/src/nodes/orderedListNode.js @@ -1,9 +1,10 @@ +import { parseTracks } from "./helpers"; + const orderedlist = { group: "block", content: "list_item+", attrs: { - order: { default: 1 }, - track: { default: [] } + order: { default: 1 } }, parseDOM: [ { @@ -12,8 +13,7 @@ const orderedlist = { Object.assign(hook, { order: hook.dom.hasAttribute("start") ? +hook.dom.getAttribute("start") - : 1, - track: parseTracks(hook.dom.dataset.track) + : 1 }); next(); } @@ -24,9 +24,6 @@ const orderedlist = { if (hook.node.attrs.order !== 1) { attrs.start = hook.node.attrs.order; } - if (hook.node.attrs.track.length) { - attrs["data-track"] = JSON.stringify(hook.node.attrs.track); - } hook.value = ["ol", attrs, 0]; next(); } diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js index e69de29bb..82e9f6c95 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js @@ -0,0 +1,48 @@ +import { parseTracks } from "../helpers"; +const heading = { + attrs: { + track: { default: [] } + }, + content: "inline*", + group: "block", + defining: true, + parseDOM: [ + { + tag: "h1", + getAttrs(hook, next) { + Object.assign(hook, { + track: parseTracks(hook.dom.dataset.track) + }); + next(); + } + }, + { + tag: "h2", + getAttrs(hook, next) { + Object.assign(hook, { + track: parseTracks(hook.dom.dataset.track) + }); + next(); + } + }, + { + tag: "h3", + getAttrs(hook, next) { + Object.assign(hook, { + track: parseTracks(hook.dom.dataset.track) + }); + next(); + } + } + ], + toDOM(hook, next) { + if (hook.node.attrs.track.length) { + Object.assign(hook.value[1], { + "data-track": JSON.stringify(hook.node.attrs.track) + }); + } + next(); + } +}; + +export default heading; diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/index.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/index.js index 70d427d88..c3c9b1ed5 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/index.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/index.js @@ -22,10 +22,10 @@ export default { paragraphCont: paragraphContTrackNode, extractProse: extractProseTrackNode, extractPoetry: extractPoetryTrackNode, - sourceNote: sourceNoteTrackNode - // heading: headingTrackNode, + orderedlist: orderedListTrackNode, + sourceNote: sourceNoteTrackNode, + heading: headingTrackNode // bulletlist: bulletListTrackNode, - // orderedlist: orderedListTrackNode, // list_item: listItemTrackNode, // image: imageTrackNode }; diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js index e69de29bb..605e051f6 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js @@ -0,0 +1,29 @@ +import { parseTracks } from "../helpers"; +const orderedlist = { + group: "block", + content: "list_item+", + attrs: { + track: { default: [] } + }, + parseDOM: [ + { + tag: "ol", + getAttrs(hook, next) { + Object.assign(hook, { + track: parseTracks(hook.dom.dataset.track) + }); + next(); + } + } + ], + toDOM(hook, next) { + if (hook.node.attrs.track.length) { + Object.assign(hook.value[1], { + "data-track": JSON.stringify(hook.node.attrs.track) + }); + } + next(); + } +}; + +export default orderedlist; -- GitLab