diff --git a/wax-prosemirror-plugins/index.js b/wax-prosemirror-plugins/index.js index 5377fcb7230b178788d69bf79f966224c53bd20c..72d283b67322f401b18d557fa3cd3d42652009e0 100644 --- a/wax-prosemirror-plugins/index.js +++ b/wax-prosemirror-plugins/index.js @@ -1,6 +1,5 @@ -export { - default as TrackChangePlugin -} from "./src/trackChanges/TrackChangePlugin"; +export { default as TrackChangePlugin } from './src/trackChanges/TrackChangePlugin'; -export { default as CommentPlugin } from "./src/comments/CommentPlugin"; -export { default as WaxSelectionPlugin } from "./src/WaxSelectionPlugin"; +export { default as CommentPlugin } from './src/comments/CommentPlugin'; +export { default as WaxSelectionPlugin } from './src/WaxSelectionPlugin'; +export { default as highlightPlugin } from './src/highlightPlugin'; diff --git a/wax-prosemirror-plugins/package.json b/wax-prosemirror-plugins/package.json index eb7b8de5008c51a6bdb6e44c81fa52c487da4a36..28d548f453cd92b8c0155b97d2539b43eb46b679 100644 --- a/wax-prosemirror-plugins/package.json +++ b/wax-prosemirror-plugins/package.json @@ -16,6 +16,8 @@ "wax-prosemirror-components": "^0.0.13", "wax-prosemirror-core": "^0.0.13", "wax-prosemirror-layouts": "^0.0.13", - "wax-prosemirror-utilities": "^0.0.13" + "wax-prosemirror-utilities": "^0.0.13", + "highlight.js": "^10.1.1", + "prosemirror-highlightjs": "^0.2.0" } } diff --git a/wax-prosemirror-plugins/src/highlightPlugin.js b/wax-prosemirror-plugins/src/highlightPlugin.js new file mode 100644 index 0000000000000000000000000000000000000000..40ee57e2958a57efb19fea37563766ed0832d276 --- /dev/null +++ b/wax-prosemirror-plugins/src/highlightPlugin.js @@ -0,0 +1,56 @@ +import hljs from 'highlight.js/lib/core'; +import { getHighlightDecorations } from 'prosemirror-highlightjs'; +import { DecorationSet } from 'prosemirror-view'; +import { Plugin } from 'prosemirror-state'; + +const highlightPlugin = (nodeTypes = ['code_block']) => { + return new Plugin({ + state: { + init(_, instance) { + const content = getHighlightDecorations( + instance.doc, + hljs, + nodeTypes, + () => undefined, + ); + return DecorationSet.create(instance.doc, content); + }, + apply(tr, set, state) { + if (!tr.docChanged) { + return set.map(tr.mapping, tr.doc); + } + + const { + selection: { $from, $to }, + doc, + } = state; + let codeBlock = false; + + doc.nodesBetween($from.pos, $to.pos, (node, from) => { + if (node.type.name === 'code_block') { + codeBlock = true; + } + }); + + if (codeBlock) { + const content = getHighlightDecorations( + tr.doc, + hljs, + nodeTypes, + () => undefined, + ); + + return DecorationSet.create(tr.doc, content); + } + return set.map(tr.mapping, tr.doc); + }, + }, + props: { + decorations(state) { + return this.getState(state); + }, + }, + }); +}; + +export default highlightPlugin; diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json index 26696389843e70183b11f5806883893c18b6f460..22559ee1200bcddd202490144434b03238b37115 100644 --- a/wax-prosemirror-services/package.json +++ b/wax-prosemirror-services/package.json @@ -10,12 +10,10 @@ "build": "BABEL_ENV=production rollup -c" }, "dependencies": { - "highlight.js": "^10.1.1", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", "lodash": "^4.17.4", "prosemirror-commands": "^1.1.3", - "prosemirror-highlightjs": "^0.2.0", "prosemirror-history": "^1.1.3", "prosemirror-keymap": "^1.1.3", "prosemirror-schema-list": "^1.1.2", @@ -27,7 +25,8 @@ "wax-prosemirror-core": "^0.0.13", "wax-prosemirror-layouts": "^0.0.13", "wax-prosemirror-schema": "^0.0.13", - "wax-prosemirror-utilities": "^0.0.13" + "wax-prosemirror-utilities": "^0.0.13", + "wax-prosemirror-plugins": "^0.0.13" }, "peerDependencies": { "react": "^16.13.1", diff --git a/wax-prosemirror-services/src/CodeBlockService/CodeBlockService.js b/wax-prosemirror-services/src/CodeBlockService/CodeBlockService.js index b1fef70169b1f3cb4b5556c49e1e46d8c9fe51b2..2e851d32204b2fe950ced53c598ede9d09b850bb 100644 --- a/wax-prosemirror-services/src/CodeBlockService/CodeBlockService.js +++ b/wax-prosemirror-services/src/CodeBlockService/CodeBlockService.js @@ -1,5 +1,4 @@ -import hljs from 'highlight.js/lib/core'; -import { highlightPlugin } from 'prosemirror-highlightjs'; +import { highlightPlugin } from 'wax-prosemirror-plugins'; import 'highlight.js/styles/github.css'; import { codeBlockNode } from 'wax-prosemirror-schema'; @@ -8,7 +7,7 @@ import CodeBlockTool from './CodeBlockTool'; export default class CodeBlockService extends Service { boot() { - this.app.PmPlugins.add('highlightPlugin', highlightPlugin(hljs)); + this.app.PmPlugins.add('highlightPlugin', highlightPlugin()); } register() {