From 7a1afff6b3fe692a2fb8f797f28a49406a0e861b Mon Sep 17 00:00:00 2001 From: chris <kokosias@yahoo.gr> Date: Wed, 16 Mar 2022 13:09:51 +0200 Subject: [PATCH] link intput rule --- .../src/LinkService/LinkInputRule.js | 36 +++++++++++++++++++ .../src/RulesService/Rules.js | 2 ++ 2 files changed, 38 insertions(+) create mode 100644 wax-prosemirror-services/src/LinkService/LinkInputRule.js diff --git a/wax-prosemirror-services/src/LinkService/LinkInputRule.js b/wax-prosemirror-services/src/LinkService/LinkInputRule.js new file mode 100644 index 000000000..b549f3cdd --- /dev/null +++ b/wax-prosemirror-services/src/LinkService/LinkInputRule.js @@ -0,0 +1,36 @@ +import { InputRule } from 'prosemirror-inputrules'; + +const linkRule = markType => { + return MarkInputRule( + /(?:(?:(https|http|ftp)+):\/\/)?(?:\S+(?::\S*)?(@))?(?:(?:([a-z0-9][a-z0-9\-]*)?[a-z0-9]+)(?:\.(?:[a-z0-9\-])*[a-z0-9]+)*(?:\.(?:[a-z]{2,})(:\d{1,5})?))(?:\/[^\s]*)?\s$/i, + markType, + match => ({ type: match[2] === '@' ? 'email' : 'uri' }), + ); +}; + +const MarkInputRule = (regexp, markType, getAttrs) => { + return new InputRule(regexp, (state, match, start, end) => { + const $start = state.doc.resolve(start); + const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; + if (!$start.parent.type.allowsMarkType(markType)) return null; + const linkString = match[0].substring(0, match[0].length - 1); + + const linkAttrs = + attrs.type === 'email' + ? { href: `mailto:${linkString}` } + : { href: linkString, target: '_blank' }; + const oLink = markType.create(linkAttrs); + + const tr = state.tr + .addMark(start, end, oLink) + .insertText(' ', start + linkString.length); + // .removeMark( + // start + linkString.length, + // start + linkString.length, + // markType, + // ); + return tr; + }); +}; + +export default linkRule; diff --git a/wax-prosemirror-services/src/RulesService/Rules.js b/wax-prosemirror-services/src/RulesService/Rules.js index 466bf45fc..f6cf3e1e9 100644 --- a/wax-prosemirror-services/src/RulesService/Rules.js +++ b/wax-prosemirror-services/src/RulesService/Rules.js @@ -9,6 +9,7 @@ import { // TODO add through service. import inlineInputRule from '../MathService/InlineInputRule'; import blockInputRule from '../MathService/BlockInputRule'; +import linkRule from '../LinkService/LinkInputRule'; @injectable() class Rules { @@ -33,6 +34,7 @@ class Rules { return [ ...smartQuotes, // > blockquote + linkRule(this.schema.marks.link), wrappingInputRule(/^\s*>\s$/, this.schema.nodes.blockquote), // 1. ordered list -- GitLab