@atlaskit/prosemirror-input-rules 2.2.5 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/index.js +14 -1
- package/dist/cjs/plugin.js +3 -3
- package/dist/cjs/utils.js +67 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/index.js +2 -1
- package/dist/es2019/plugin.js +1 -1
- package/dist/es2019/utils.js +59 -0
- package/dist/es2019/version.json +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/plugin.js +1 -1
- package/dist/esm/utils.js +59 -0
- package/dist/esm/version.json +1 -1
- package/dist/types/handler.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/types.d.ts +2 -2
- package/dist/types/utils.d.ts +9 -0
- package/dist/types-ts4.5/handler.d.ts +1 -1
- package/dist/types-ts4.5/index.d.ts +1 -0
- package/dist/types-ts4.5/types.d.ts +2 -2
- package/dist/types-ts4.5/utils.d.ts +9 -0
- package/package.json +6 -7
- package/report.api.md +21 -2
- package/src/__tests__/unit/handler.ts +6 -3
- package/src/__tests__/unit/plugin.ts +2 -3
- package/src/handler.ts +5 -2
- package/src/index.ts +2 -0
- package/src/plugin.ts +1 -2
- package/src/types.ts +5 -2
- package/src/utils.ts +94 -0
- package/tmp/api-report-tmp.d.ts +14 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/prosemirror-input-rules
|
|
2
2
|
|
|
3
|
+
## 2.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`4e6f1bf8511`](https://bitbucket.org/atlassian/atlassian-frontend/commits/4e6f1bf8511) - [ED-19233] Import prosemirror libraries from internal facade package
|
|
8
|
+
|
|
9
|
+
## 2.3.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [`8b891bf3590`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8b891bf3590) - This change introduces `editor-plugin-hyperlink` which separates the hyperlink plugin from `editor-core`. In order to enable this change there are now new entry points on `editor-common` (such as `/link`, `/quick-insert`) in order to separate common code. Further `prosemirror-input-rules` now has new exports of `createPlugin` and `createRule` which are used in many plugins in `editor-core`.
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
|
|
3
19
|
## 2.2.5
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -21,6 +21,18 @@ Object.defineProperty(exports, "createInputRulePlugin", {
|
|
|
21
21
|
return _plugin.createInputRulePlugin;
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
+
Object.defineProperty(exports, "createPlugin", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function get() {
|
|
27
|
+
return _utils.createPlugin;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "createRule", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function get() {
|
|
33
|
+
return _utils.createRule;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
24
36
|
Object.defineProperty(exports, "leafNodeReplacementCharacter", {
|
|
25
37
|
enumerable: true,
|
|
26
38
|
get: function get() {
|
|
@@ -28,4 +40,5 @@ Object.defineProperty(exports, "leafNodeReplacementCharacter", {
|
|
|
28
40
|
}
|
|
29
41
|
});
|
|
30
42
|
var _constants = require("./constants");
|
|
31
|
-
var _plugin = require("./plugin");
|
|
43
|
+
var _plugin = require("./plugin");
|
|
44
|
+
var _utils = require("./utils");
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.createInputRulePlugin = createInputRulePlugin;
|
|
7
|
-
var _prosemirrorState = require("prosemirror-state");
|
|
8
7
|
var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
|
|
8
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
9
9
|
var _constants = require("./constants");
|
|
10
10
|
var _handler = require("./handler");
|
|
11
11
|
function createInputRulePlugin(pluginName, rules) {
|
|
@@ -13,7 +13,7 @@ function createInputRulePlugin(pluginName, rules) {
|
|
|
13
13
|
var onInputEvent = options === null || options === void 0 ? void 0 : options.onInputEvent;
|
|
14
14
|
var onBeforeRegexMatch = options === null || options === void 0 ? void 0 : options.onBeforeRegexMatch;
|
|
15
15
|
var allowInsertTextOnDocument = Boolean(options === null || options === void 0 ? void 0 : options.allowInsertTextOnDocument);
|
|
16
|
-
var pluginKey = new
|
|
16
|
+
var pluginKey = new _state.PluginKey("inputRulePlugin__".concat(pluginName));
|
|
17
17
|
var inputEvent = (0, _handler.createInputEventHandler)({
|
|
18
18
|
allowInsertTextOnDocument: allowInsertTextOnDocument,
|
|
19
19
|
pluginKey: pluginKey,
|
|
@@ -71,7 +71,7 @@ function createInputRulePlugin(pluginName, rules) {
|
|
|
71
71
|
compositionend: function compositionend(view) {
|
|
72
72
|
setTimeout(function () {
|
|
73
73
|
var selection = view.state.selection;
|
|
74
|
-
if (!(selection instanceof
|
|
74
|
+
if (!(selection instanceof _state.TextSelection)) {
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
77
|
var $cursor = selection.$cursor;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createRule = exports.createPlugin = void 0;
|
|
7
|
+
var _selection = require("@atlaskit/editor-common/selection");
|
|
8
|
+
var _history = require("@atlaskit/editor-prosemirror/history");
|
|
9
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
10
|
+
var _plugin = require("./plugin");
|
|
11
|
+
var createRule = function createRule(match, handler) {
|
|
12
|
+
return {
|
|
13
|
+
match: match,
|
|
14
|
+
handler: handler,
|
|
15
|
+
onHandlerApply: function onHandlerApply(state, tr) {
|
|
16
|
+
(0, _history.closeHistory)(tr);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.createRule = createRule;
|
|
21
|
+
var hasUnsupportedMarks = function hasUnsupportedMarks(state, start, end, marksNameUnsupported) {
|
|
22
|
+
var isUnsupportedMark = function isUnsupportedMark(node) {
|
|
23
|
+
return (marksNameUnsupported || []).includes(node.type.name);
|
|
24
|
+
};
|
|
25
|
+
var $from = state.doc.resolve(start);
|
|
26
|
+
var $to = state.doc.resolve(end);
|
|
27
|
+
var marksInSelection = start === end ? $from.marks() : $from.marksAcross($to);
|
|
28
|
+
return (marksInSelection || []).some(isUnsupportedMark);
|
|
29
|
+
};
|
|
30
|
+
var isCursorInsideUnsupportedMarks = function isCursorInsideUnsupportedMarks(state, marksNameUnsupported) {
|
|
31
|
+
var _$cursor$nodeBefore, _$cursor$nodeBefore$m;
|
|
32
|
+
var selection = state.selection;
|
|
33
|
+
if (!(selection instanceof _state.TextSelection)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
var $cursor = selection.$cursor;
|
|
37
|
+
var isUnsupportedMark = function isUnsupportedMark(node) {
|
|
38
|
+
return marksNameUnsupported.includes(node.type.name);
|
|
39
|
+
};
|
|
40
|
+
return Boolean($cursor === null || $cursor === void 0 ? void 0 : (_$cursor$nodeBefore = $cursor.nodeBefore) === null || _$cursor$nodeBefore === void 0 ? void 0 : (_$cursor$nodeBefore$m = _$cursor$nodeBefore.marks) === null || _$cursor$nodeBefore$m === void 0 ? void 0 : _$cursor$nodeBefore$m.some(isUnsupportedMark));
|
|
41
|
+
};
|
|
42
|
+
var createPlugin = function createPlugin(pluginName, rules) {
|
|
43
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
44
|
+
var _options$isBlockNodeR = options.isBlockNodeRule,
|
|
45
|
+
isBlockNodeRule = _options$isBlockNodeR === void 0 ? false : _options$isBlockNodeR,
|
|
46
|
+
_options$allowInsertT = options.allowInsertTextOnDocument,
|
|
47
|
+
allowInsertTextOnDocument = _options$allowInsertT === void 0 ? true : _options$allowInsertT;
|
|
48
|
+
var onInputEvent = function onInputEvent(_ref) {
|
|
49
|
+
var state = _ref.state,
|
|
50
|
+
from = _ref.from,
|
|
51
|
+
to = _ref.to;
|
|
52
|
+
var unsupportedMarks = isBlockNodeRule ? ['code', 'link', 'typeAheadQuery'] : ['code'];
|
|
53
|
+
var $from = state.selection.$from;
|
|
54
|
+
if ($from.parent.type.spec.code || !(state.selection instanceof _state.TextSelection) && !(state.selection instanceof _selection.GapCursorSelection) || hasUnsupportedMarks(state, from, to, unsupportedMarks) || isBlockNodeRule && isCursorInsideUnsupportedMarks(state, unsupportedMarks)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
|
+
return (0, _plugin.createInputRulePlugin)(pluginName, rules, {
|
|
60
|
+
allowInsertTextOnDocument: allowInsertTextOnDocument,
|
|
61
|
+
onInputEvent: onInputEvent,
|
|
62
|
+
onBeforeRegexMatch: function onBeforeRegexMatch(tr) {
|
|
63
|
+
(0, _history.closeHistory)(tr);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
exports.createPlugin = createPlugin;
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/index.js
CHANGED
package/dist/es2019/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PluginKey, TextSelection } from 'prosemirror-state';
|
|
2
1
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey, TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
3
3
|
import { TEXT_INPUT_RULE_TRANSACTION_KEY } from './constants';
|
|
4
4
|
import { createInputEventHandler } from './handler';
|
|
5
5
|
export function createInputRulePlugin(pluginName, rules, options = {}) {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { GapCursorSelection } from '@atlaskit/editor-common/selection';
|
|
2
|
+
import { closeHistory } from '@atlaskit/editor-prosemirror/history';
|
|
3
|
+
import { TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
4
|
+
import { createInputRulePlugin } from './plugin';
|
|
5
|
+
export const createRule = (match, handler) => {
|
|
6
|
+
return {
|
|
7
|
+
match,
|
|
8
|
+
handler,
|
|
9
|
+
onHandlerApply: (state, tr) => {
|
|
10
|
+
closeHistory(tr);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
const hasUnsupportedMarks = (state, start, end, marksNameUnsupported) => {
|
|
15
|
+
const isUnsupportedMark = node => (marksNameUnsupported || []).includes(node.type.name);
|
|
16
|
+
const $from = state.doc.resolve(start);
|
|
17
|
+
const $to = state.doc.resolve(end);
|
|
18
|
+
const marksInSelection = start === end ? $from.marks() : $from.marksAcross($to);
|
|
19
|
+
return (marksInSelection || []).some(isUnsupportedMark);
|
|
20
|
+
};
|
|
21
|
+
const isCursorInsideUnsupportedMarks = (state, marksNameUnsupported) => {
|
|
22
|
+
var _$cursor$nodeBefore, _$cursor$nodeBefore$m;
|
|
23
|
+
const {
|
|
24
|
+
selection
|
|
25
|
+
} = state;
|
|
26
|
+
if (!(selection instanceof TextSelection)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const {
|
|
30
|
+
$cursor
|
|
31
|
+
} = selection;
|
|
32
|
+
const isUnsupportedMark = node => marksNameUnsupported.includes(node.type.name);
|
|
33
|
+
return Boolean($cursor === null || $cursor === void 0 ? void 0 : (_$cursor$nodeBefore = $cursor.nodeBefore) === null || _$cursor$nodeBefore === void 0 ? void 0 : (_$cursor$nodeBefore$m = _$cursor$nodeBefore.marks) === null || _$cursor$nodeBefore$m === void 0 ? void 0 : _$cursor$nodeBefore$m.some(isUnsupportedMark));
|
|
34
|
+
};
|
|
35
|
+
export const createPlugin = (pluginName, rules, options = {}) => {
|
|
36
|
+
const {
|
|
37
|
+
isBlockNodeRule = false,
|
|
38
|
+
allowInsertTextOnDocument = true
|
|
39
|
+
} = options;
|
|
40
|
+
const onInputEvent = ({
|
|
41
|
+
state,
|
|
42
|
+
from,
|
|
43
|
+
to
|
|
44
|
+
}) => {
|
|
45
|
+
const unsupportedMarks = isBlockNodeRule ? ['code', 'link', 'typeAheadQuery'] : ['code'];
|
|
46
|
+
const $from = state.selection.$from;
|
|
47
|
+
if ($from.parent.type.spec.code || !(state.selection instanceof TextSelection) && !(state.selection instanceof GapCursorSelection) || hasUnsupportedMarks(state, from, to, unsupportedMarks) || isBlockNodeRule && isCursorInsideUnsupportedMarks(state, unsupportedMarks)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
return createInputRulePlugin(pluginName, rules, {
|
|
53
|
+
allowInsertTextOnDocument,
|
|
54
|
+
onInputEvent,
|
|
55
|
+
onBeforeRegexMatch: tr => {
|
|
56
|
+
closeHistory(tr);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
package/dist/es2019/version.json
CHANGED
package/dist/esm/index.js
CHANGED
package/dist/esm/plugin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PluginKey, TextSelection } from 'prosemirror-state';
|
|
2
1
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey, TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
3
3
|
import { TEXT_INPUT_RULE_TRANSACTION_KEY } from './constants';
|
|
4
4
|
import { createInputEventHandler } from './handler';
|
|
5
5
|
export function createInputRulePlugin(pluginName, rules) {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { GapCursorSelection } from '@atlaskit/editor-common/selection';
|
|
2
|
+
import { closeHistory } from '@atlaskit/editor-prosemirror/history';
|
|
3
|
+
import { TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
4
|
+
import { createInputRulePlugin } from './plugin';
|
|
5
|
+
export var createRule = function createRule(match, handler) {
|
|
6
|
+
return {
|
|
7
|
+
match: match,
|
|
8
|
+
handler: handler,
|
|
9
|
+
onHandlerApply: function onHandlerApply(state, tr) {
|
|
10
|
+
closeHistory(tr);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
var hasUnsupportedMarks = function hasUnsupportedMarks(state, start, end, marksNameUnsupported) {
|
|
15
|
+
var isUnsupportedMark = function isUnsupportedMark(node) {
|
|
16
|
+
return (marksNameUnsupported || []).includes(node.type.name);
|
|
17
|
+
};
|
|
18
|
+
var $from = state.doc.resolve(start);
|
|
19
|
+
var $to = state.doc.resolve(end);
|
|
20
|
+
var marksInSelection = start === end ? $from.marks() : $from.marksAcross($to);
|
|
21
|
+
return (marksInSelection || []).some(isUnsupportedMark);
|
|
22
|
+
};
|
|
23
|
+
var isCursorInsideUnsupportedMarks = function isCursorInsideUnsupportedMarks(state, marksNameUnsupported) {
|
|
24
|
+
var _$cursor$nodeBefore, _$cursor$nodeBefore$m;
|
|
25
|
+
var selection = state.selection;
|
|
26
|
+
if (!(selection instanceof TextSelection)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
var $cursor = selection.$cursor;
|
|
30
|
+
var isUnsupportedMark = function isUnsupportedMark(node) {
|
|
31
|
+
return marksNameUnsupported.includes(node.type.name);
|
|
32
|
+
};
|
|
33
|
+
return Boolean($cursor === null || $cursor === void 0 ? void 0 : (_$cursor$nodeBefore = $cursor.nodeBefore) === null || _$cursor$nodeBefore === void 0 ? void 0 : (_$cursor$nodeBefore$m = _$cursor$nodeBefore.marks) === null || _$cursor$nodeBefore$m === void 0 ? void 0 : _$cursor$nodeBefore$m.some(isUnsupportedMark));
|
|
34
|
+
};
|
|
35
|
+
export var createPlugin = function createPlugin(pluginName, rules) {
|
|
36
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
37
|
+
var _options$isBlockNodeR = options.isBlockNodeRule,
|
|
38
|
+
isBlockNodeRule = _options$isBlockNodeR === void 0 ? false : _options$isBlockNodeR,
|
|
39
|
+
_options$allowInsertT = options.allowInsertTextOnDocument,
|
|
40
|
+
allowInsertTextOnDocument = _options$allowInsertT === void 0 ? true : _options$allowInsertT;
|
|
41
|
+
var onInputEvent = function onInputEvent(_ref) {
|
|
42
|
+
var state = _ref.state,
|
|
43
|
+
from = _ref.from,
|
|
44
|
+
to = _ref.to;
|
|
45
|
+
var unsupportedMarks = isBlockNodeRule ? ['code', 'link', 'typeAheadQuery'] : ['code'];
|
|
46
|
+
var $from = state.selection.$from;
|
|
47
|
+
if ($from.parent.type.spec.code || !(state.selection instanceof TextSelection) && !(state.selection instanceof GapCursorSelection) || hasUnsupportedMarks(state, from, to, unsupportedMarks) || isBlockNodeRule && isCursorInsideUnsupportedMarks(state, unsupportedMarks)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
return createInputRulePlugin(pluginName, rules, {
|
|
53
|
+
allowInsertTextOnDocument: allowInsertTextOnDocument,
|
|
54
|
+
onInputEvent: onInputEvent,
|
|
55
|
+
onBeforeRegexMatch: function onBeforeRegexMatch(tr) {
|
|
56
|
+
closeHistory(tr);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
package/dist/esm/version.json
CHANGED
package/dist/types/handler.d.ts
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ import type { InputRuleHandler, InputRuleWrapper, OnHandlerApply, OnInputEvent }
|
|
|
2
2
|
export { leafNodeReplacementCharacter, TEXT_INPUT_RULE_TRANSACTION_KEY, MAX_REGEX_MATCH, } from './constants';
|
|
3
3
|
export { createInputRulePlugin } from './plugin';
|
|
4
4
|
export type { InputRuleWrapper, InputRuleHandler, OnInputEvent, OnHandlerApply, };
|
|
5
|
+
export { createRule, createPlugin } from './utils';
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EditorState, Transaction } from 'prosemirror
|
|
2
|
-
import type { EditorView } from 'prosemirror
|
|
1
|
+
import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
2
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
3
3
|
export type InputRuleHandler = (state: EditorState, matchResult: RegExpExecArray, start: number, end: number) => Transaction | null;
|
|
4
4
|
export type HandleInputEvent = (props: {
|
|
5
5
|
view: EditorView;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import type { InputRuleHandler, InputRuleWrapper } from './types';
|
|
3
|
+
export declare const createRule: (match: RegExp, handler: InputRuleHandler) => InputRuleWrapper;
|
|
4
|
+
type Options = {
|
|
5
|
+
isBlockNodeRule?: boolean;
|
|
6
|
+
allowInsertTextOnDocument?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const createPlugin: (pluginName: string, rules: Array<InputRuleWrapper>, options?: Options) => SafePlugin;
|
|
9
|
+
export {};
|
|
@@ -2,3 +2,4 @@ import type { InputRuleHandler, InputRuleWrapper, OnHandlerApply, OnInputEvent }
|
|
|
2
2
|
export { leafNodeReplacementCharacter, TEXT_INPUT_RULE_TRANSACTION_KEY, MAX_REGEX_MATCH, } from './constants';
|
|
3
3
|
export { createInputRulePlugin } from './plugin';
|
|
4
4
|
export type { InputRuleWrapper, InputRuleHandler, OnInputEvent, OnHandlerApply, };
|
|
5
|
+
export { createRule, createPlugin } from './utils';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EditorState, Transaction } from 'prosemirror
|
|
2
|
-
import type { EditorView } from 'prosemirror
|
|
1
|
+
import type { EditorState, Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
2
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
3
3
|
export type InputRuleHandler = (state: EditorState, matchResult: RegExpExecArray, start: number, end: number) => Transaction | null;
|
|
4
4
|
export type HandleInputEvent = (props: {
|
|
5
5
|
view: EditorView;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import type { InputRuleHandler, InputRuleWrapper } from './types';
|
|
3
|
+
export declare const createRule: (match: RegExp, handler: InputRuleHandler) => InputRuleWrapper;
|
|
4
|
+
type Options = {
|
|
5
|
+
isBlockNodeRule?: boolean;
|
|
6
|
+
allowInsertTextOnDocument?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const createPlugin: (pluginName: string, rules: Array<InputRuleWrapper>, options?: Options) => SafePlugin;
|
|
9
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/prosemirror-input-rules",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "A package that contains helpers to create autoformatting rules for ProseMirror",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -28,14 +28,13 @@
|
|
|
28
28
|
"releaseModel": "continuous"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@atlaskit/editor-common": "^74.
|
|
32
|
-
"@
|
|
33
|
-
"
|
|
31
|
+
"@atlaskit/editor-common": "^74.29.0",
|
|
32
|
+
"@atlaskit/editor-prosemirror": "1.0.2",
|
|
33
|
+
"@babel/runtime": "^7.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@atlaskit/editor-test-helpers": "^18.
|
|
37
|
-
"@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1"
|
|
38
|
-
"prosemirror-view": "1.23.7"
|
|
36
|
+
"@atlaskit/editor-test-helpers": "^18.10.0",
|
|
37
|
+
"@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1"
|
|
39
38
|
},
|
|
40
39
|
"techstack": {
|
|
41
40
|
"@atlassian/frontend": {
|
package/report.api.md
CHANGED
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
<!--SECTION START: Main Entry Types-->
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
-
import type { EditorState } from 'prosemirror
|
|
18
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
19
19
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
20
|
-
import type { Transaction } from 'prosemirror
|
|
20
|
+
import type { Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
21
21
|
|
|
22
22
|
// @public (undocumented)
|
|
23
23
|
export function createInputRulePlugin(
|
|
@@ -26,6 +26,19 @@ export function createInputRulePlugin(
|
|
|
26
26
|
options?: Options,
|
|
27
27
|
): SafePlugin;
|
|
28
28
|
|
|
29
|
+
// @public (undocumented)
|
|
30
|
+
export const createPlugin: (
|
|
31
|
+
pluginName: string,
|
|
32
|
+
rules: Array<InputRuleWrapper>,
|
|
33
|
+
options?: Options_2,
|
|
34
|
+
) => SafePlugin;
|
|
35
|
+
|
|
36
|
+
// @public (undocumented)
|
|
37
|
+
export const createRule: (
|
|
38
|
+
match: RegExp,
|
|
39
|
+
handler: InputRuleHandler,
|
|
40
|
+
) => InputRuleWrapper;
|
|
41
|
+
|
|
29
42
|
// @public (undocumented)
|
|
30
43
|
export type InputRuleHandler = (
|
|
31
44
|
state: EditorState,
|
|
@@ -74,6 +87,12 @@ type Options = {
|
|
|
74
87
|
onBeforeRegexMatch?: OnBeforeRegexMatch;
|
|
75
88
|
};
|
|
76
89
|
|
|
90
|
+
// @public (undocumented)
|
|
91
|
+
type Options_2 = {
|
|
92
|
+
isBlockNodeRule?: boolean;
|
|
93
|
+
allowInsertTextOnDocument?: boolean;
|
|
94
|
+
};
|
|
95
|
+
|
|
77
96
|
// @public (undocumented)
|
|
78
97
|
export const TEXT_INPUT_RULE_TRANSACTION_KEY = 'input_rule_plugin_transaction';
|
|
79
98
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
EditorState,
|
|
3
|
+
PluginKey,
|
|
4
|
+
Transaction,
|
|
5
|
+
} from '@atlaskit/editor-prosemirror/state';
|
|
6
|
+
import { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
4
7
|
import { createEditorState } from '@atlaskit/editor-test-helpers/create-editor-state';
|
|
5
8
|
import { code_block, doc, p } from '@atlaskit/editor-test-helpers/doc-builder';
|
|
6
9
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { EditorState } from 'prosemirror-state';
|
|
2
|
-
import { EditorView } from 'prosemirror-view';
|
|
3
|
-
|
|
4
1
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
5
4
|
import { createEditorState } from '@atlaskit/editor-test-helpers/create-editor-state';
|
|
6
5
|
import { doc, DocBuilder, p } from '@atlaskit/editor-test-helpers/doc-builder';
|
|
7
6
|
|
package/src/handler.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { EditorState, PluginKey, Transaction } from 'prosemirror-state';
|
|
2
|
-
|
|
3
1
|
import { GapCursorSelection } from '@atlaskit/editor-common/selection';
|
|
2
|
+
import type {
|
|
3
|
+
EditorState,
|
|
4
|
+
PluginKey,
|
|
5
|
+
Transaction,
|
|
6
|
+
} from '@atlaskit/editor-prosemirror/state';
|
|
4
7
|
|
|
5
8
|
import {
|
|
6
9
|
leafNodeReplacementCharacter,
|
package/src/index.ts
CHANGED
package/src/plugin.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { PluginKey, TextSelection } from 'prosemirror-state';
|
|
2
|
-
|
|
3
1
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { PluginKey, TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
4
3
|
|
|
5
4
|
import { TEXT_INPUT_RULE_TRANSACTION_KEY } from './constants';
|
|
6
5
|
import { createInputEventHandler } from './handler';
|
package/src/types.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type {
|
|
2
|
+
EditorState,
|
|
3
|
+
Transaction,
|
|
4
|
+
} from '@atlaskit/editor-prosemirror/state';
|
|
5
|
+
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
3
6
|
|
|
4
7
|
export type InputRuleHandler = (
|
|
5
8
|
state: EditorState,
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
|
+
import { GapCursorSelection } from '@atlaskit/editor-common/selection';
|
|
3
|
+
import { closeHistory } from '@atlaskit/editor-prosemirror/history';
|
|
4
|
+
import { Mark as PMMark } from '@atlaskit/editor-prosemirror/model';
|
|
5
|
+
import { EditorState, TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
6
|
+
|
|
7
|
+
import { createInputRulePlugin } from './plugin';
|
|
8
|
+
import type { InputRuleHandler, InputRuleWrapper, OnInputEvent } from './types';
|
|
9
|
+
|
|
10
|
+
export const createRule = (
|
|
11
|
+
match: RegExp,
|
|
12
|
+
handler: InputRuleHandler,
|
|
13
|
+
): InputRuleWrapper => {
|
|
14
|
+
return {
|
|
15
|
+
match,
|
|
16
|
+
handler,
|
|
17
|
+
onHandlerApply: (state, tr) => {
|
|
18
|
+
closeHistory(tr);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const hasUnsupportedMarks = (
|
|
24
|
+
state: EditorState,
|
|
25
|
+
start: number,
|
|
26
|
+
end: number,
|
|
27
|
+
marksNameUnsupported: string[],
|
|
28
|
+
) => {
|
|
29
|
+
const isUnsupportedMark = (node: PMMark) =>
|
|
30
|
+
(marksNameUnsupported || []).includes(node.type.name);
|
|
31
|
+
|
|
32
|
+
const $from = state.doc.resolve(start);
|
|
33
|
+
const $to = state.doc.resolve(end);
|
|
34
|
+
const marksInSelection =
|
|
35
|
+
start === end ? $from.marks() : $from.marksAcross($to);
|
|
36
|
+
|
|
37
|
+
return (marksInSelection || []).some(isUnsupportedMark);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const isCursorInsideUnsupportedMarks = (
|
|
41
|
+
state: EditorState,
|
|
42
|
+
marksNameUnsupported: string[],
|
|
43
|
+
): boolean => {
|
|
44
|
+
const { selection } = state;
|
|
45
|
+
if (!(selection instanceof TextSelection)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const { $cursor } = selection;
|
|
49
|
+
const isUnsupportedMark = (node: PMMark) =>
|
|
50
|
+
marksNameUnsupported.includes(node.type.name);
|
|
51
|
+
|
|
52
|
+
return Boolean($cursor?.nodeBefore?.marks?.some(isUnsupportedMark));
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
type Options = {
|
|
56
|
+
isBlockNodeRule?: boolean;
|
|
57
|
+
allowInsertTextOnDocument?: boolean;
|
|
58
|
+
};
|
|
59
|
+
export const createPlugin = (
|
|
60
|
+
pluginName: string,
|
|
61
|
+
rules: Array<InputRuleWrapper>,
|
|
62
|
+
options: Options = {},
|
|
63
|
+
): SafePlugin => {
|
|
64
|
+
const { isBlockNodeRule = false, allowInsertTextOnDocument = true } = options;
|
|
65
|
+
|
|
66
|
+
const onInputEvent: OnInputEvent = ({ state, from, to }) => {
|
|
67
|
+
const unsupportedMarks = isBlockNodeRule
|
|
68
|
+
? ['code', 'link', 'typeAheadQuery']
|
|
69
|
+
: ['code'];
|
|
70
|
+
|
|
71
|
+
const $from = state.selection.$from;
|
|
72
|
+
|
|
73
|
+
if (
|
|
74
|
+
$from.parent.type.spec.code ||
|
|
75
|
+
(!(state.selection instanceof TextSelection) &&
|
|
76
|
+
!(state.selection instanceof GapCursorSelection)) ||
|
|
77
|
+
hasUnsupportedMarks(state, from, to, unsupportedMarks) ||
|
|
78
|
+
(isBlockNodeRule &&
|
|
79
|
+
isCursorInsideUnsupportedMarks(state, unsupportedMarks))
|
|
80
|
+
) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return true;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return createInputRulePlugin(pluginName, rules, {
|
|
88
|
+
allowInsertTextOnDocument,
|
|
89
|
+
onInputEvent,
|
|
90
|
+
onBeforeRegexMatch: (tr) => {
|
|
91
|
+
closeHistory(tr);
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
};
|
package/tmp/api-report-tmp.d.ts
CHANGED
|
@@ -4,13 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
```ts
|
|
6
6
|
|
|
7
|
-
import type { EditorState } from 'prosemirror
|
|
7
|
+
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
8
8
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
9
|
-
import type { Transaction } from 'prosemirror
|
|
9
|
+
import type { Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
10
10
|
|
|
11
11
|
// @public (undocumented)
|
|
12
12
|
export function createInputRulePlugin(pluginName: string, rules: InputRuleWrapper[], options?: Options): SafePlugin;
|
|
13
13
|
|
|
14
|
+
// @public (undocumented)
|
|
15
|
+
export const createPlugin: (pluginName: string, rules: Array<InputRuleWrapper>, options?: Options_2) => SafePlugin;
|
|
16
|
+
|
|
17
|
+
// @public (undocumented)
|
|
18
|
+
export const createRule: (match: RegExp, handler: InputRuleHandler) => InputRuleWrapper;
|
|
19
|
+
|
|
14
20
|
// @public (undocumented)
|
|
15
21
|
export type InputRuleHandler = (state: EditorState, matchResult: RegExpExecArray, start: number, end: number) => Transaction | null;
|
|
16
22
|
|
|
@@ -50,6 +56,12 @@ type Options = {
|
|
|
50
56
|
onBeforeRegexMatch?: OnBeforeRegexMatch;
|
|
51
57
|
};
|
|
52
58
|
|
|
59
|
+
// @public (undocumented)
|
|
60
|
+
type Options_2 = {
|
|
61
|
+
isBlockNodeRule?: boolean;
|
|
62
|
+
allowInsertTextOnDocument?: boolean;
|
|
63
|
+
};
|
|
64
|
+
|
|
53
65
|
// @public (undocumented)
|
|
54
66
|
export const TEXT_INPUT_RULE_TRANSACTION_KEY = "input_rule_plugin_transaction";
|
|
55
67
|
|