diff --git a/wax-prosemirror-core/src/FootnoteView.js b/wax-prosemirror-core/src/FootnoteView.js deleted file mode 100644 index 807409849eb3d5d8ac8128577128dc655800b3a8..0000000000000000000000000000000000000000 --- 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 e21b7a5bc229ccaafee8645f63782a7a309dc9da..a327326039c6c21724366e5c42028321f32972c6 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 85993a2daa0512dddce4d84145ef218d14eae526..3337526d551bf1e51851db6f5214c3e53a322525 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 a91948c24d2da91d1a95727738f69eb8de106a3e..6faa44008cf4a12d082cca7d2410ac1174b7c496 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 3759361246b57115e4ad1fe5b356956d9000bb01..b704499c664fba2201641665bc33be226ad900f2 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..82e9f6c95e78ba232c41f4d243aa363ca42fee76 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 70d427d88cf5d72da104ee9199a46b7f4b7e8719..c3c9b1ed5dc7520a25f28f143bda1007426d4373 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..605e051f689aafb1fb642f5c39886d54261fe0c0 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;