@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
JavaScript
/*! 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
};
}