UNPKG

@onereach/webform

Version:

Content Builder includes several views for: - Content builder view itself; - Web Form view; - Slack block-kit builder;

176 lines (151 loc) 4.63 kB
/*! https://github.com/blockmar/slackdown by @blockmar | MIT license */ export default function slackdown() { var RE_ALPHANUMERIC = new RegExp('^\\w?$'); var RE_TAG = new RegExp('<(.+?)>', 'g'); var RE_BOLD = new RegExp('\\*([^\\*]+?)\\*', 'g'); var RE_ITALIC = new RegExp('_([^_]+?)_', 'g'); var RE_STRIKE = new RegExp('~([^~]+?)~', 'g'); var RE_CODE = new RegExp('```([^`]+?)```', 'g'); var RE_FIXED = new RegExp('`([^`]+?)`', 'g'); var RE_MERGE_FIELD = new RegExp( "\\${this(.session)?\\.get\\(\\'(.+?)\\'\\)}", 'g' ); var payloads = function(tag, start) { if (!start) { start = 0; } var length = tag.length; return pipeSplit(tag.substr(start, length - start)); }; var pipeSplit = function(payload) { return payload.split('|'); }; var tag = function(tag, attributes, payload) { if (!payload) { payload = attributes; attributes = {}; } var html = '<'.concat(tag); for (var attribute in attributes) { if (attributes.hasOwnProperty(attribute)) { html = html.concat(' ', attribute, '="', attributes[attribute], '"'); } } return html.concat('>', payload, '</', tag, '>'); }; var matchTag = function(match) { var action = match[1].substr(0, 1); var p; switch (action) { case '!': return tag('span', { class: 'slack-cmd' }, payloads(match[1], 1)[0]); case '#': p = payloads(match[1], 2); return tag( 'span', { class: 'slack-channel' }, p.length === 1 ? p[0] : p[1] ); case '@': p = payloads(match[1], 2); return tag( 'span', { class: 'slack-user' }, p.length === 1 ? p[0] : p[1] ); default: p = payloads(match[1]); return tag('a', { href: p[0] }, p.length === 1 ? p[0] : p[1]); } }; var matchBold = function(match) { return safeMatch(match, tag('strong', payloads(match[1])), '*'); }; var matchItalic = function(match) { return safeMatch( match, tag('span', { class: 'italized-value' }, payloads(match[1])), '_' ); // return safeMatch(match, tag("em", payloads(match[1])), "_"); }; var matchStrike = function(match) { return safeMatch( match, tag('span', { class: 'strinkethrough-value' }, payloads(match[1])) ); }; var matchMergeField = function(match) { return safeMatch( match, tag('span', { class: 'merge-tag' }, payloads(match[2])) ); }; var matchFixed = function(match) { return safeMatch( match, tag('span', { class: 'monospace-value text--red' }, payloads(match[1])) ); // return safeMatch(match, tag("code", payloads(match[1]))); }; var matchCode = function(match) { return safeMatch( match, tag('span', { class: 'monospace-value' }, payloads(match[1])) ); // return safeMatch(match, tag("code", payloads(match[1]))); }; var notAlphanumeric = function(input) { return !RE_ALPHANUMERIC.test(input); }; var notRepeatedChar = function(trigger, input) { return !trigger || trigger !== input; }; var safeMatch = function(match, tag, trigger) { var prefix_ok = match.index === 0; var postfix_ok = match.index === match.input.length - match[0].length; if (!prefix_ok) { var charAtLeft = match.input.substr(match.index - 1, 1); prefix_ok = notAlphanumeric(charAtLeft) && notRepeatedChar(trigger, charAtLeft); } if (!postfix_ok) { var charAtRight = match.input.substr(match.index + match[0].length, 1); postfix_ok = notAlphanumeric(charAtRight) && notRepeatedChar(trigger, charAtRight); } if (prefix_ok && postfix_ok) { return tag; } return false; }; var publicParse = function(text) { if (typeof text === 'string') { var patterns = [ { p: RE_TAG, cb: matchTag }, { p: RE_CODE, cb: matchCode }, { p: RE_FIXED, cb: matchFixed }, { p: RE_BOLD, cb: matchBold }, { p: RE_ITALIC, cb: matchItalic }, { p: RE_STRIKE, cb: matchStrike }, { p: RE_MERGE_FIELD, cb: matchMergeField } ]; for (var p = 0; p < patterns.length; p++) { var pattern = patterns[p]; var original = text; var result; while ((result = pattern.p.exec(original)) !== null) { var replace = pattern.cb(result); if (replace) { text = text.replace(result[0], replace); } } } } return text; }; return { parse: publicParse }; }