diff --git a/wax-prosemirror-plugins/index.js b/wax-prosemirror-plugins/index.js index ec6147c23f2ab8ed646e954abfa0356228f650ae..1a20ab5ca4d911d8a5fe26bf4288701836234999 100644 --- a/wax-prosemirror-plugins/index.js +++ b/wax-prosemirror-plugins/index.js @@ -1,17 +1,31 @@ -export { default as TrackChangePlugin } from "./src/trackChanges/TrackChangePlugin"; +export { + default as TrackChangePlugin +} from "./src/trackChanges/TrackChangePlugin"; export { default as FindAndReplacePlugin } from "./src/FindAndReplacePlugin"; export { default as OverlayPlugin } from "./src/overlay/OverlayPlugin"; export { default as LinkService } from "./src/LinkService/LinkService"; export { default as MenuService } from "./src/MenuService/MenuService"; -export { default as RedoUndoService } from "./src/RedoUndoService/RedoUndoService"; -export { default as AnnotationService } from "./src/AnnotationService/AnnotationService"; -export { default as TextStyleService } from "./src/TextStyleService/TextStyleService"; -export { default as PlaceholderService } from "./src/PlaceholderService/PlaceholderService"; +export { + default as RedoUndoService +} from "./src/RedoUndoService/RedoUndoService"; +export { + default as AnnotationService +} from "./src/AnnotationService/AnnotationService"; +export { + default as TextStyleService +} from "./src/TextStyleService/TextStyleService"; +export { + default as PlaceholderService +} from "./src/PlaceholderService/PlaceholderService"; export { default as ImageService } from "./src/ImageService/ImageService"; export { default as RulesService } from "./src/RulesService/RulesService"; export { default as SchemaService } from "./src/SchemaService/SchemaService"; -export { default as ShortCutsService } from "./src/ShortCutsService/ShortCutsService"; +export { + default as ShortCutsService +} from "./src/ShortCutsService/ShortCutsService"; export { default as Tool } from "./src/lib/Tools"; -export { default as InlineAnnotationsService } from "./src/InlineAnnotations/InlineAnnotationsService"; -export { default as OverlayService } from "./src/OverlayService/OverlayService"; +export { + default as InlineAnnotationsService +} from "./src/InlineAnnotations/InlineAnnotationsService"; +// export { default as OverlayService } from "./src/OverlayService/OverlayService"; diff --git a/wax-prosemirror-plugins/src/AnnotationService/Annotation.js b/wax-prosemirror-plugins/src/AnnotationService/Annotation.js index a1e2f359fdc85a1596d66a3cc78ce03c8e3980f5..90f17c46bcec60a060c41511ab6e41bddb0ccd56 100644 --- a/wax-prosemirror-plugins/src/AnnotationService/Annotation.js +++ b/wax-prosemirror-plugins/src/AnnotationService/Annotation.js @@ -6,7 +6,7 @@ export default class Annotation extends ToolGroup { tools = []; constructor( @inject("Code") code, - @inject("Em") em, + @inject("Emphasis") emphasis, @inject("Link") link, @inject("SmallCaps") smallcaps, @inject("StrikeThrough") strikethrough, @@ -22,7 +22,7 @@ export default class Annotation extends ToolGroup { super(); this.tools = [ code, - em, + emphasis, link, smallcaps, strikethrough, diff --git a/wax-prosemirror-plugins/src/AnnotationService/tools/Code.js b/wax-prosemirror-plugins/src/AnnotationService/tools/Code.js deleted file mode 100644 index 61887249a4c332293482402b79f9609392391ce7..0000000000000000000000000000000000000000 --- a/wax-prosemirror-plugins/src/AnnotationService/tools/Code.js +++ /dev/null @@ -1,23 +0,0 @@ -import { toggleMark } from "prosemirror-commands"; -import { markActive } from "../../lib/Utils"; -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { icons } from "wax-prosemirror-components"; - -@injectable() -export default class Code extends Tools { - title = "Toggle code"; - content = icons.code; - - get run() { - return (state, dispatch) => { - toggleMark(state.config.schema.marks.code)(state, dispatch); - }; - } - - get active() { - return state => { - return markActive(state.config.schema.marks.code)(state); - }; - } -} diff --git a/wax-prosemirror-plugins/src/AnnotationService/tools/index.js b/wax-prosemirror-plugins/src/AnnotationService/tools/index.js index 9d57c1c80bd447e46cd1b78928c913bd61b19b56..643a61eb5ed0471e7a9d09cac947dd4c4bb30c55 100644 --- a/wax-prosemirror-plugins/src/AnnotationService/tools/index.js +++ b/wax-prosemirror-plugins/src/AnnotationService/tools/index.js @@ -1,8 +1,6 @@ export { default as Blockquote } from "./Blockquote"; -export { default as Em } from "./Em"; export { default as SmallCaps } from "./SmallCaps"; export { default as StrikeThrough } from "./StrikeThrough"; -export { default as Strong } from "./Strong"; export { default as Subscript } from "./Subscript"; export { default as Superscript } from "./Superscript"; export { default as Underline } from "./Underline"; diff --git a/wax-prosemirror-plugins/src/InlineAnnotations/CodeService/CodeService.js b/wax-prosemirror-plugins/src/InlineAnnotations/CodeService/CodeService.js index 0eb718ab22c766bfccc548a227a2a22e4bd7a179..d714f11dc93c9cf44a96954ee5f2245fafaa78f6 100644 --- a/wax-prosemirror-plugins/src/InlineAnnotations/CodeService/CodeService.js +++ b/wax-prosemirror-plugins/src/InlineAnnotations/CodeService/CodeService.js @@ -1,5 +1,6 @@ import Service from "wax-prosemirror-core/src/services/Service"; import Code from "./Code"; + class CodeService extends Service { boot() {} diff --git a/wax-prosemirror-plugins/src/AnnotationService/tools/Em.js b/wax-prosemirror-plugins/src/InlineAnnotations/EmphasisService/Emphasis.js similarity index 92% rename from wax-prosemirror-plugins/src/AnnotationService/tools/Em.js rename to wax-prosemirror-plugins/src/InlineAnnotations/EmphasisService/Emphasis.js index 8590d70048dd8708ffc1b9e7edf43e0418b5bdd0..21f977f7afa47e192c485d870769704b00fd18b9 100644 --- a/wax-prosemirror-plugins/src/AnnotationService/tools/Em.js +++ b/wax-prosemirror-plugins/src/InlineAnnotations/EmphasisService/Emphasis.js @@ -5,7 +5,7 @@ import { injectable } from "inversify"; import { icons } from "wax-prosemirror-components"; @injectable() -export default class Em extends Tools { +export default class Emphasis extends Tools { title = "Toggle emphasis"; content = icons.em; diff --git a/wax-prosemirror-plugins/src/InlineAnnotations/EmphasisService/EmphasisService.js b/wax-prosemirror-plugins/src/InlineAnnotations/EmphasisService/EmphasisService.js new file mode 100644 index 0000000000000000000000000000000000000000..f86f6130512f8db0a371ac7742171007832622b8 --- /dev/null +++ b/wax-prosemirror-plugins/src/InlineAnnotations/EmphasisService/EmphasisService.js @@ -0,0 +1,17 @@ +import Service from "wax-prosemirror-core/src/services/Service"; +import { emphasisMark } from "wax-prosemirror-schema"; +import Emphasis from "./Emphasis"; + +class EmphasisService extends Service { + boot() { + const createMark = this.container.get("CreateMark"); + + createMark({ em: emphasisMark }); + } + + register() { + this.container.bind("Emphasis").to(Emphasis); + } +} + +export default EmphasisService; diff --git a/wax-prosemirror-plugins/src/InlineAnnotations/LinkService/Link.js b/wax-prosemirror-plugins/src/InlineAnnotations/LinkService/Link.js new file mode 100644 index 0000000000000000000000000000000000000000..c8cc20bb02172673aa1306cba9ce2de0b1cc19af --- /dev/null +++ b/wax-prosemirror-plugins/src/InlineAnnotations/LinkService/Link.js @@ -0,0 +1,35 @@ +import { toggleMark } from "prosemirror-commands"; +import { markActive, promptForURL } from "../../lib/Utils"; +import Tools from "../../lib/Tools"; +import { injectable } from "inversify"; +import { icons } from "wax-prosemirror-components"; + +@injectable() +export default class Link extends Tools { + title = "Add or remove link"; + content = icons.link; + + get run() { + return (state, dispatch) => { + if (markActive(state.config.schema.marks.link)(state)) { + toggleMark(state.config.schema.marks.link)(state, dispatch); + return true; + } + + const href = promptForURL(); + if (!href) return false; + + toggleMark(state.config.schema.marks.link, { href })(state, dispatch); + }; + } + + get enable() { + return state => !state.selection.empty; + } + + get active() { + return state => { + return markActive(state.config.schema.marks.link)(state); + }; + } +} diff --git a/wax-prosemirror-plugins/src/InlineAnnotations/LinkService/LinkService.js b/wax-prosemirror-plugins/src/InlineAnnotations/LinkService/LinkService.js new file mode 100644 index 0000000000000000000000000000000000000000..10720c6719efa08ecc56544fbf044b9ce418dad7 --- /dev/null +++ b/wax-prosemirror-plugins/src/InlineAnnotations/LinkService/LinkService.js @@ -0,0 +1,17 @@ +import Service from "wax-prosemirror-core/src/services/Service"; +import { linkMark } from "wax-prosemirror-schema"; +import Link from "./Link"; + +class LinkService extends Service { + boot() { + const createMark = this.container.get("CreateMark"); + + createMark({ link: linkMark }); + } + + register() { + this.container.bind("Link").to(Link); + } +} + +export default LinkService; diff --git a/wax-prosemirror-plugins/src/AnnotationService/tools/Strong.js b/wax-prosemirror-plugins/src/InlineAnnotations/StrongService/Strong.js similarity index 100% rename from wax-prosemirror-plugins/src/AnnotationService/tools/Strong.js rename to wax-prosemirror-plugins/src/InlineAnnotations/StrongService/Strong.js diff --git a/wax-prosemirror-plugins/src/InlineAnnotations/StrongService/StrongService.js b/wax-prosemirror-plugins/src/InlineAnnotations/StrongService/StrongService.js new file mode 100644 index 0000000000000000000000000000000000000000..fe29b891118d8a7535c32628a96900920bf11d94 --- /dev/null +++ b/wax-prosemirror-plugins/src/InlineAnnotations/StrongService/StrongService.js @@ -0,0 +1,17 @@ +import Service from "wax-prosemirror-core/src/services/Service"; +import { strongMark } from "wax-prosemirror-schema"; +import Strong from "./Strong"; + +class StrongService extends Service { + boot() { + const createMark = this.container.get("CreateMark"); + + createMark({ strong: strongMark }); + } + + register() { + this.container.bind("Strong").to(Strong); + } +} + +export default StrongService; diff --git a/wax-prosemirror-plugins/src/InlineAnnotations/index.js b/wax-prosemirror-plugins/src/InlineAnnotations/index.js index 87f98ab4f678d90d4eace4ca8f3a23d7f143d6b6..4f9703b740872f317ead7389a65bbb4db58c1b54 100644 --- a/wax-prosemirror-plugins/src/InlineAnnotations/index.js +++ b/wax-prosemirror-plugins/src/InlineAnnotations/index.js @@ -1,2 +1,10 @@ import CodeService from "./CodeService/CodeService"; -export default [new CodeService()]; +import StrongService from "./StrongService/StrongService"; +import LinkService from "./LinkService/LinkService"; +import EmphasisService from "./EmphasisService/EmphasisService"; +export default [ + new CodeService(), + new StrongService(), + new LinkService(), + new EmphasisService() +]; diff --git a/wax-prosemirror-plugins/src/LinkService/LinkComponent.js b/wax-prosemirror-plugins/src/LinkService/LinkComponent.js new file mode 100644 index 0000000000000000000000000000000000000000..b4f58d0117f2f972ab633e768f78dc702b4b32e0 --- /dev/null +++ b/wax-prosemirror-plugins/src/LinkService/LinkComponent.js @@ -0,0 +1,9 @@ +import React from "react"; +export default props => { + console.log(props); + return ( + <div> + <input type="text" /> + </div> + ); +}; diff --git a/wax-prosemirror-plugins/src/LinkService/LinkTool.js b/wax-prosemirror-plugins/src/LinkService/LinkTool.js new file mode 100644 index 0000000000000000000000000000000000000000..5602dd4ff33c396f0b4b9638147142043a2c1923 --- /dev/null +++ b/wax-prosemirror-plugins/src/LinkService/LinkTool.js @@ -0,0 +1,35 @@ +import { toggleMark } from "prosemirror-commands"; +import { markActive, promptForURL } from "../lib/Utils"; +import Tools from "../lib/Tools"; +import { injectable } from "inversify"; +import { icons } from "wax-prosemirror-components"; + +@injectable() +export default class LinkTool extends Tools { + title = "Add or remove link"; + content = icons.link; + + get run() { + return (state, dispatch) => { + if (markActive(state.config.schema.marks.link)(state)) { + toggleMark(state.config.schema.marks.link)(state, dispatch); + return true; + } + + const href = promptForURL(); + if (!href) return false; + + toggleMark(state.config.schema.marks.link, { href })(state, dispatch); + }; + } + + get enable() { + return state => !state.selection.empty; + } + + get active() { + return state => { + return markActive(state.config.schema.marks.link)(state); + }; + } +} diff --git a/wax-prosemirror-schema/index.js b/wax-prosemirror-schema/index.js index 20910b0342aa3109c60fdce111e319b923069aac..7520b51b6a7c578ac9bb7fa2334a5fb64cf6aa3e 100644 --- a/wax-prosemirror-schema/index.js +++ b/wax-prosemirror-schema/index.js @@ -2,3 +2,6 @@ export { default as DefaultSchema } from "./src/DefaultSchema"; export { default as EditoriaSchema } from "./src/editoria/EditoriaSchema"; export { default as XpubSchema } from "./src/XpubSchema"; export { default as codeMark } from "./src/marks/codeMark"; +export { default as strongMark } from "./src/marks/strongMark"; +export { default as linkMark } from "./src/marks/linkMark"; +export { default as emphasisMark } from "./src/marks/emphasisMark"; diff --git a/wax-prosemirror-schema/src/editoria/marks.js b/wax-prosemirror-schema/src/editoria/marks.js index aa3a786d6cea090c2d96ee67e3775c56aaf40f04..64f02b362920ecfa3048758b3137ff9f8d60dd1c 100644 --- a/wax-prosemirror-schema/src/editoria/marks.js +++ b/wax-prosemirror-schema/src/editoria/marks.js @@ -3,60 +3,6 @@ const emDOM = ["em", 0], codeDOM = ["code", 0]; const marks = { - // link: { - // attrs: { - // href: { default: null }, - // rel: { default: "" }, - // target: { default: "blank" }, - // title: { default: null } - // }, - // inclusive: false, - // parseDOM: [ - // { - // tag: "a[href]", - // getAttrs: dom => { - // const href = dom.getAttribute("href"); - // const target = href && href.indexOf("#") === 0 ? "" : "blank"; - // return { - // href: dom.getAttribute("href"), - // title: dom.getAttribute("title"), - // target - // }; - // } - // } - // ], - // toDOM(node) { - // return ["a", node.attrs, 0]; - // } - // }, - em: { - parseDOM: [{ tag: "i" }, { tag: "em" }, { style: "font-style=italic" }], - toDOM() { - return emDOM; - } - }, - strong: { - parseDOM: [ - { tag: "strong" }, - { - tag: "b", - getAttrs: node => node.style.fontWeight != "normal" && null - }, - { - style: "font-weight", - getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null - } - ], - toDOM() { - return strongDOM; - } - }, - // code: { - // parseDOM: [{ tag: "code" }], - // toDOM() { - // return codeDOM; - // } - // }, subscript: { excludes: "superscript", parseDOM: [{ tag: "sub" }, { style: "vertical-align=sub" }], diff --git a/wax-prosemirror-schema/src/marks/codeMark.js b/wax-prosemirror-schema/src/marks/codeMark.js index ee9d55f2aa7ba463e87d92ff7d038546cb9ec6c1..a9e6ab1ef818a09622c2a272826ba30ba38c3e65 100644 --- a/wax-prosemirror-schema/src/marks/codeMark.js +++ b/wax-prosemirror-schema/src/marks/codeMark.js @@ -1,7 +1,8 @@ const code = { - parseDOM: [{ tag: "code" }], - toDOM() { - return ["code", 0]; + parseDOM: { tag: "code" }, + toDOM(hook, next) { + hook.value = ["code", 0]; + next(); } }; diff --git a/wax-prosemirror-schema/src/marks/emphasisMark.js b/wax-prosemirror-schema/src/marks/emphasisMark.js new file mode 100644 index 0000000000000000000000000000000000000000..0e570668cbb7e8478ed00a3d4c1ac19b7e371fda --- /dev/null +++ b/wax-prosemirror-schema/src/marks/emphasisMark.js @@ -0,0 +1,9 @@ +const em = { + parseDOM: [{ tag: "i" }, { tag: "em" }, { style: "font-style=italic" }], + toDOM(hook, next) { + hook.value = ["em", 0]; + next(); + } +}; + +export default em; diff --git a/wax-prosemirror-schema/src/marks/linkMark.js b/wax-prosemirror-schema/src/marks/linkMark.js new file mode 100644 index 0000000000000000000000000000000000000000..1549d1537c93867c3e21af718a08f746ad806268 --- /dev/null +++ b/wax-prosemirror-schema/src/marks/linkMark.js @@ -0,0 +1,29 @@ +const link = { + attrs: { + href: { default: null }, + rel: { default: "" }, + target: { default: "blank" }, + title: { default: null } + }, + inclusive: false, + parseDOM: [ + { + tag: "a[href]", + getAttrs: dom => { + const href = dom.getAttribute("href"); + const target = href && href.indexOf("#") === 0 ? "" : "blank"; + return { + href: dom.getAttribute("href"), + title: dom.getAttribute("title"), + target + }; + } + } + ], + toDOM(hook, next, node) { + hook.value = ["a", node.attrs, 0]; + next(); + } +}; + +export default link; diff --git a/wax-prosemirror-schema/src/marks/strongMark.js b/wax-prosemirror-schema/src/marks/strongMark.js new file mode 100644 index 0000000000000000000000000000000000000000..32b9482a176d9ee2af6e4fcfe5b10b43c2ad06ad --- /dev/null +++ b/wax-prosemirror-schema/src/marks/strongMark.js @@ -0,0 +1,19 @@ +const strong = { + parseDOM: [ + { tag: "strong" }, + { + tag: "b", + getAttrs: node => node.style.fontWeight != "normal" && null + }, + { + style: "font-weight", + getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null + } + ], + toDOM(hook, next) { + hook.value = ["strong", 0]; + next(); + } +}; + +export default strong;