diff --git a/wax-prosemirror-components/src/components/HeadingsDropDown.js b/wax-prosemirror-components/src/components/HeadingsDropDown.js index 9de03389a084e87ae5fe7e985017909968ba7b25..d4fdcaea747f914ccf1329ba587303778e7d4258 100644 --- a/wax-prosemirror-components/src/components/HeadingsDropDown.js +++ b/wax-prosemirror-components/src/components/HeadingsDropDown.js @@ -1,6 +1,6 @@ import React from "react"; import styled from "styled-components"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; import Dropdown from "react-dropdown"; import "react-dropdown/style.css"; @@ -21,10 +21,9 @@ const HeadingsDropDown = ({ dispatch, state, item }) => ( <DropdownStyled options={dropDownOptions} onChange={option => { - setBlockType(state.config.schema.nodes.heading, { level: option.value })( - state, - dispatch - ); + Commands.setBlockType(state.config.schema.nodes.heading, { + level: option.value + })(state, dispatch); }} placeholder="Choose heading" select={item.select && item.select(state)} diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js index 6be138dd84d3867dcf35a138f1efc71f55025856..e5bbf60a3a99afaf31834fdab52f2c7a2e181d0c 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class Author extends Tools { @@ -9,13 +9,13 @@ export default class Author extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.author)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.author)(state, dispatch); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.author)(state); + return Commands.setBlockType(state.config.schema.nodes.author)(state); }; } } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js index e3d63856ad2c61fd6adf2e4ed0d59a62ccb49597..f09ca8a8553e70de6d86cfe6342efa9602fd5691 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class EpigraphPoetry extends Tools { @@ -9,13 +9,18 @@ export default class EpigraphPoetry extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.epigraphPoetry)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.epigraphPoetry)(state); + return Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)( + state + ); }; } } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js index 8347f6bcba19e6d9775570556621f413bf7bdb68..735e98ada8f307629065bc97f60919b0f661d391 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class EpigraphProse extends Tools { @@ -9,13 +9,18 @@ export default class EpigraphProse extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.epigraphProse)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.epigraphProse)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.epigraphProse)(state); + return Commands.setBlockType(state.config.schema.nodes.epigraphProse)( + state + ); }; } } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js index 8ad2dc6815cae6e8a5f17475c58c0cbfefdde9df..7cd58aec6fc8c3d468438f110ead120108d5b0a4 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class Heading1 extends Tools { @@ -9,7 +9,7 @@ export default class Heading1 extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.heading, { level: 1 })( + Commands.setBlockType(state.config.schema.nodes.heading, { level: 1 })( state, dispatch ); @@ -18,9 +18,8 @@ export default class Heading1 extends Tools { get enable() { return state => { - return setBlockType(state.config.schema.nodes.heading, { - level: 1, - track: [] + return Commands.setBlockType(state.config.schema.nodes.heading, { + level: 1 })(state); }; } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js index 80a7b88e85be051e845f935af071e30ea4d22e20..77bc4d4eacc65e9d0c247573791bf91023312807 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class Heading2 extends Tools { @@ -9,7 +9,7 @@ export default class Heading2 extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.heading, { level: 2 })( + Commands.setBlockType(state.config.schema.nodes.heading, { level: 2 })( state, dispatch ); @@ -18,9 +18,8 @@ export default class Heading2 extends Tools { get enable() { return state => { - return setBlockType(state.config.schema.nodes.heading, { - level: 2, - track: [] + return Commands.setBlockType(state.config.schema.nodes.heading, { + level: 2 })(state); }; } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js index 8163289fb5ed31ef2f65eea71069b16779202170..bf27f4bcef78b858d9b65eea8f79a0d51fe9fd2a 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class Heading3 extends Tools { @@ -9,7 +9,7 @@ export default class Heading3 extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.heading, { level: 3 })( + Commands.setBlockType(state.config.schema.nodes.heading, { level: 3 })( state, dispatch ); @@ -18,9 +18,8 @@ export default class Heading3 extends Tools { get enable() { return state => { - return setBlockType(state.config.schema.nodes.heading, { - level: 3, - track: [] + return Commands.setBlockType(state.config.schema.nodes.heading, { + level: 3 })(state); }; } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js index caac1427b53f761996822dabc87b6173bcf65b36..e5932b625e8a5987c328e24fd2c17720481e6d3f 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class SubTitle extends Tools { @@ -9,13 +9,16 @@ export default class SubTitle extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.subtitle)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.subtitle)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.subtitle)(state); + return Commands.setBlockType(state.config.schema.nodes.subtitle)(state); }; } } diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js index 9f77b510ceca3a802dc4ee14dca643ac5fa669bc..e61b8665f313518d5a9db82d6cad1b383823445f 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class Title extends Tools { @@ -9,13 +9,13 @@ export default class Title extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.title)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.title)(state, dispatch); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.title)(state); + return Commands.setBlockType(state.config.schema.nodes.title)(state); }; } } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js index f3507f5d87bb4fdb95ed926d34ccb8bd9c2a1eba..6987304d15a9bac667ccb7dfb50fdb47ed366808 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() class ExtractPoetry extends Tools { @@ -9,13 +9,18 @@ class ExtractPoetry extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.extractPoetry)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.extractPoetry)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.extractPoetry)(state); + return Commands.setBlockType(state.config.schema.nodes.extractPoetry)( + state + ); }; } } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js index 261cfe18de1fd51b7b63a0c5376a6fa338bfb281..05dd9edad772c15793154a04d45ea091ceea8e49 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() class ExtractProse extends Tools { @@ -9,13 +9,18 @@ class ExtractProse extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.extractProse)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.extractProse)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.extractProse)(state); + return Commands.setBlockType(state.config.schema.nodes.extractProse)( + state + ); }; } } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js index bcc3c506e807d35422df6cf9fb47621c908c1575..1d2206f842f797173b3242137a045dc32500ebaa 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() class ParagraphContinued extends Tools { @@ -9,13 +9,18 @@ class ParagraphContinued extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.paragraphCont)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.paragraphCont)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.paragraphCont)(state); + return Commands.setBlockType(state.config.schema.nodes.paragraphCont)( + state + ); }; } } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js index b4480b8d9767db366ec8c4ba88dc87ee389bd8c4..4d7b2bbed83fb34b2493daf409e9b45c1c83ca3d 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() export default class Paragraph extends Tools { @@ -9,13 +9,16 @@ export default class Paragraph extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.paragraph)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.paragraph)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.paragraph)(state); + return Commands.setBlockType(state.config.schema.nodes.paragraph)(state); }; } } diff --git a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js index 5e05eea06c5494e8ef41034841d395b82be6bbf5..833bb7fc918cc67b11aef1b21f02e661a8274868 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js +++ b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js @@ -1,6 +1,6 @@ import Tools from "../../lib/Tools"; import { injectable } from "inversify"; -import { setBlockType } from "prosemirror-commands"; +import { Commands } from "wax-prosemirror-utilities"; @injectable() class SourceNote extends Tools { @@ -9,13 +9,16 @@ class SourceNote extends Tools { get run() { return (state, dispatch) => { - setBlockType(state.config.schema.nodes.sourceNote)(state, dispatch); + Commands.setBlockType(state.config.schema.nodes.sourceNote)( + state, + dispatch + ); }; } get enable() { return state => { - return setBlockType(state.config.schema.nodes.sourceNote)(state); + return Commands.setBlockType(state.config.schema.nodes.sourceNote)(state); }; } } diff --git a/wax-prosemirror-utilities/src/commands/Commands.js b/wax-prosemirror-utilities/src/commands/Commands.js index 74d926b4dfe87fc73f790f632b2463d1048afe74..555e9f2fd95fbd5906631ae856ccf64507394707 100644 --- a/wax-prosemirror-utilities/src/commands/Commands.js +++ b/wax-prosemirror-utilities/src/commands/Commands.js @@ -1,5 +1,34 @@ import { v4 as uuidv4 } from "uuid"; +const setBlockType = (nodeType, attrs = {}) => { + return (state, dispatch) => { + const { from, to } = state.selection; + const tr = state.tr; + state.doc.nodesBetween(from, to, (node, pos) => { + if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return; + let applicable = false; + if (node.type == nodeType) { + applicable = true; + } else { + const $pos = state.doc.resolve(pos), + index = $pos.index(); + applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType); + } + if (applicable) { + tr.setBlockType( + pos, + pos + node.nodeSize, + nodeType, + Object.assign({}, node.attrs, attrs) + ); + } + }); + if (!tr.steps.length) return false; + if (dispatch) dispatch(tr.scrollIntoView()); + return true; + }; +}; + const markActive = type => state => { const { from, $from, to, empty } = state.selection; @@ -83,6 +112,7 @@ const createComment = (state, dispatch, group) => { }; export default { + setBlockType, blockActive, canInsert, createComment,