@atlaskit/editor-wikimarkup-transformer
Version:
Wiki markup transformer for JIRA and Confluence
75 lines (72 loc) • 2.5 kB
JavaScript
import { isNotBlank } from '../utils/text';
/**
* Inline Card From Text (ICFT).
*
* When we convert WikiMarkup to ADF we stamp all issue keys URLs with the
* #icft= syntax to identify which keys should be involved by brackets
* [XX-999] from the ones which should be blue links in the ADF to WikiMarkup
* convertion.
*/
// Ignored via go/ees005
// eslint-disable-next-line require-unicode-regexp
export const INLINE_CARD_FROM_TEXT_STAMP = /(#icft=)([A-Z][A-Z]+-[0-9]+)/;
export const issueKey = ({
input,
position,
schema,
context
}) => {
// This scenario happens when context is empty
if (!context.issueKeyRegex) {
return fallback(input, position);
}
const match = input.substring(position).match(context.issueKeyRegex);
if (!match) {
return fallback(input, position);
}
const issue = getIssue(context, match[0]);
// This scenario happens when context doesn't has all the issues inside a markup
if (!issue) {
return fallback(input, position);
}
const charBefore = input.charAt(position - 1);
const charAfter = input.charAt(position + issue.key.length);
if (isNotBlank(charBefore) && isNotAllowedChars(charBefore) || isNotBlank(charAfter) && isNotAllowedChars(charAfter)) {
return fallback(input, position);
}
return {
type: 'pmnode',
nodes: buildInlineCard(schema, issue),
length: match[0].length
};
};
const fallback = (input, position) => ({
type: 'text',
text: input.substr(position, 1),
length: 1
});
export const getIssue = (context, key) => context.conversion && context.conversion.inlineCardConversion && context.conversion.inlineCardConversion[key] ? {
key,
url: context.conversion.inlineCardConversion[key]
} : null;
export const buildInlineCard = (schema, issue) => {
return [schema.nodes.inlineCard.createChecked({
url: withInlineCardFromTextStamp(issue)
})];
};
const withInlineCardFromTextStamp = issue => INLINE_CARD_FROM_TEXT_STAMP.test(issue.url) ? issue.url : `${issue.url}#icft=${issue.key}`;
// Ignored via go/ees005
// eslint-disable-next-line require-unicode-regexp
const isNotAllowedChars = char => !/\s|\(|\)|!|\.|\,|\/|\:/.test(char);
export const buildIssueKeyRegex = inlineCardConversion => {
if (!inlineCardConversion) {
return undefined;
}
const pattern = Object.keys(inlineCardConversion).join('|');
if (!pattern) {
return undefined;
}
// Ignored via go/ees005
// eslint-disable-next-line require-unicode-regexp
return new RegExp(`^(${pattern})`);
};