quill-delta-to-html
Version:
Converts Quill's delta ops to HTML
91 lines (81 loc) • 2.06 kB
text/typescript
interface ITagKeyValue {
key: string;
value?: string;
}
enum EncodeTarget {
Html = 0,
Url = 1,
}
function makeStartTag(
tag: any,
attrs: ITagKeyValue | ITagKeyValue[] | undefined = undefined
) {
if (!tag) {
return '';
}
var attrsStr = '';
if (attrs) {
var arrAttrs = ([] as ITagKeyValue[]).concat(attrs);
attrsStr = arrAttrs
.map(function (attr: any) {
return attr.key + (attr.value ? '="' + attr.value + '"' : '');
})
.join(' ');
}
var closing = '>';
if (tag === 'img' || tag === 'br') {
closing = '/>';
}
return attrsStr ? `<${tag} ${attrsStr}${closing}` : `<${tag}${closing}`;
}
function makeEndTag(tag: any = '') {
return (tag && `</${tag}>`) || '';
}
function decodeHtml(str: string) {
return encodeMappings(EncodeTarget.Html).reduce(decodeMapping, str);
}
function encodeHtml(str: string, preventDoubleEncoding = true) {
if (preventDoubleEncoding) {
str = decodeHtml(str);
}
return encodeMappings(EncodeTarget.Html).reduce(encodeMapping, str);
}
function encodeLink(str: string) {
let linkMaps = encodeMappings(EncodeTarget.Url);
let decoded = linkMaps.reduce(decodeMapping, str);
return linkMaps.reduce(encodeMapping, decoded);
}
function encodeMappings(mtype: EncodeTarget) {
let maps = [
['&', '&'],
['<', '<'],
['>', '>'],
['"', '"'],
["'", '''],
['\\/', '/'],
['\\(', '('],
['\\)', ')'],
];
if (mtype === EncodeTarget.Html) {
return maps.filter(
([v, _]) => v.indexOf('(') === -1 && v.indexOf(')') === -1
);
} else {
// for url
return maps.filter(([v, _]) => v.indexOf('/') === -1);
}
}
function encodeMapping(str: string, mapping: string[]) {
return str.replace(new RegExp(mapping[0], 'g'), mapping[1]);
}
function decodeMapping(str: string, mapping: string[]) {
return str.replace(new RegExp(mapping[1], 'g'), mapping[0].replace('\\', ''));
}
export {
makeStartTag,
makeEndTag,
encodeHtml,
decodeHtml,
encodeLink,
ITagKeyValue,
};