@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
64 lines • 3.31 kB
JavaScript
import { inputRules } from '../../prosemirror';
import { analyticsService } from '../../analytics';
import { transformToCodeAction } from './transform-to-code';
import { createInputRule } from '../utils';
function addMark(markType, schema, charSize) {
return function (state, match, start, end) {
var to = end;
// in case of *string* pattern it matches the text from beginning of the paragraph,
// because we want ** to work for strong text
// that's why "start" argument is wrong and we need to calculate it ourselves
var from = match[1] ? to - match[1].length + 1 : start;
// fixes the following case: my `*name` is *
// expected result: should ignore special characters inside "code"
if (state.schema.marks.code && state.schema.marks.code.isInSet(state.doc.resolve(from + 1).marks())) {
return;
}
analyticsService.trackEvent("atlassian.editor.format." + markType.name + ".autoformatting");
// apply mark to the range (from, to)
var tr = state.tr.addMark(from, to, markType.create());
if (charSize > 1) {
// delete special characters after the text
// Prosemirror removes the last symbol by itself, so we need to remove "charSize - 1" symbols
tr = tr.delete(to - (charSize - 1), to);
}
return tr
.delete(from, from + charSize)
.removeStoredMark(markType);
};
}
function addCodeMark(markType, schema, specialChar) {
return function (state, match, start, end) {
analyticsService.trackEvent('atlassian.editor.format.code.autoformatting');
return transformToCodeAction(state, start, end).delete(start, start + specialChar.length).removeStoredMark(markType);
};
}
export function inputRulePlugin(schema) {
var rules = [];
if (schema.marks.strong) {
// **string** or __strong__ should bold the text
var markLength = 2;
rules.push(createInputRule(/(?:[^`0-9A-Za-z]+)(\_\_([^\s\_][^\_]+)\_\_)$|^(\_\_([^\s \_][^\_]+)\_\_)$/, addMark(schema.marks.strong, schema, markLength)));
rules.push(createInputRule(/^(?:[^`]+)(\*\*([^\s\*][^\*]+)\*\*)$|^(\*\*([^\s\*][^\*]+)\*\*)$/, addMark(schema.marks.strong, schema, markLength)));
}
if (schema.marks.em) {
// *string* or _string_ should italic the text
var markLength = 1;
rules.push(createInputRule(/(?:[^\_`0-9A-Za-z]+)(\_([^\s\_][^\_]+?)\_)$|^(\_([^\s\_][^\_]+)\_)$/, addMark(schema.marks.em, schema, markLength)));
rules.push(createInputRule(/^(?:[^\*`]+)(\*([^\s\*][^\*]+?)\*)$|^(\*([^\s\*][^\*]+)\*)$/, addMark(schema.marks.em, schema, markLength)));
}
if (schema.marks.strike) {
// ~~string~~ should strikethrough the text
var markLength = 2;
rules.push(createInputRule(/^(?:[^`]+)(\~\~([^\s\~][^\~]+)\~\~)$|^(\~\~([^\s\~][^\~]+)\~\~)$/, addMark(schema.marks.strike, schema, markLength)));
}
if (schema.marks.code) {
// `string` should monospace the text
rules.push(createInputRule(/(`([^\s`][^`]+)`)$/, addCodeMark(schema.marks.code, schema, '`')));
}
if (rules.length !== 0) {
return inputRules({ rules: rules });
}
}
export default inputRulePlugin;
//# sourceMappingURL=input-rule.js.map