UNPKG

@atlaskit/editor-wikimarkup-transformer

Version:

Wiki markup transformer for JIRA and Confluence

75 lines (72 loc) 2.5 kB
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})`); };