2022-07-09 12:39:44 +02:00
|
|
|
function isJSON (str: string) {
|
|
|
|
try {
|
|
|
|
if (!['{', '['].includes(str.trim()[0]))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
JSON.parse(str);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (_) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function isHTML (str: string) {
|
|
|
|
const tags = [
|
|
|
|
'a',
|
|
|
|
'abbr',
|
|
|
|
'address',
|
|
|
|
'area',
|
|
|
|
'article',
|
|
|
|
'aside',
|
|
|
|
'audio',
|
|
|
|
'b',
|
|
|
|
'base',
|
|
|
|
'bdi',
|
|
|
|
'bdo',
|
|
|
|
'blockquote',
|
|
|
|
'body',
|
|
|
|
'br',
|
|
|
|
'button',
|
|
|
|
'canvas',
|
|
|
|
'caption',
|
|
|
|
'cite',
|
|
|
|
'code',
|
|
|
|
'col',
|
|
|
|
'colgroup',
|
|
|
|
'data',
|
|
|
|
'datalist',
|
|
|
|
'dd',
|
|
|
|
'del',
|
|
|
|
'details',
|
|
|
|
'dfn',
|
|
|
|
'dialog',
|
|
|
|
'div',
|
|
|
|
'dl',
|
|
|
|
'dt',
|
|
|
|
'em',
|
|
|
|
'embed',
|
|
|
|
'fieldset',
|
|
|
|
'figcaption',
|
|
|
|
'figure',
|
|
|
|
'footer',
|
|
|
|
'form',
|
|
|
|
'h1',
|
|
|
|
'h2',
|
|
|
|
'h3',
|
|
|
|
'h4',
|
|
|
|
'h5',
|
|
|
|
'h6',
|
|
|
|
'head',
|
|
|
|
'header',
|
|
|
|
'hgroup',
|
|
|
|
'hr',
|
|
|
|
'html',
|
|
|
|
'i',
|
|
|
|
'iframe',
|
|
|
|
'img',
|
|
|
|
'input',
|
|
|
|
'ins',
|
|
|
|
'kbd',
|
|
|
|
'label',
|
|
|
|
'legend',
|
|
|
|
'li',
|
|
|
|
'link',
|
|
|
|
'main',
|
|
|
|
'map',
|
|
|
|
'mark',
|
|
|
|
'math',
|
|
|
|
'menu',
|
|
|
|
'menuitem',
|
|
|
|
'meta',
|
|
|
|
'meter',
|
|
|
|
'nav',
|
|
|
|
'noscript',
|
|
|
|
'object',
|
|
|
|
'ol',
|
|
|
|
'optgroup',
|
|
|
|
'option',
|
|
|
|
'output',
|
|
|
|
'p',
|
|
|
|
'param',
|
|
|
|
'picture',
|
|
|
|
'pre',
|
|
|
|
'progress',
|
|
|
|
'q',
|
|
|
|
'rb',
|
|
|
|
'rp',
|
|
|
|
'rt',
|
|
|
|
'rtc',
|
|
|
|
'ruby',
|
|
|
|
's',
|
|
|
|
'samp',
|
|
|
|
'script',
|
|
|
|
'section',
|
|
|
|
'select',
|
|
|
|
'slot',
|
|
|
|
'small',
|
|
|
|
'source',
|
|
|
|
'span',
|
|
|
|
'strong',
|
|
|
|
'style',
|
|
|
|
'sub',
|
|
|
|
'summary',
|
|
|
|
'sup',
|
|
|
|
'svg',
|
|
|
|
'table',
|
|
|
|
'tbody',
|
|
|
|
'td',
|
|
|
|
'template',
|
|
|
|
'textarea',
|
|
|
|
'tfoot',
|
|
|
|
'th',
|
|
|
|
'thead',
|
|
|
|
'time',
|
|
|
|
'title',
|
|
|
|
'tr',
|
|
|
|
'track',
|
|
|
|
'u',
|
|
|
|
'ul',
|
|
|
|
'var',
|
|
|
|
'video',
|
|
|
|
'wbr'
|
|
|
|
];
|
|
|
|
const doc = new DOMParser().parseFromString(str, 'text/html');
|
2022-07-11 11:35:30 +02:00
|
|
|
const lowerStr = str.toLowerCase();
|
2022-07-09 12:39:44 +02:00
|
|
|
if (Array.from(doc.body.childNodes).some(node => node.nodeType === 1))
|
2022-07-11 11:35:30 +02:00
|
|
|
return tags.some((tag) => lowerStr.includes(`<${tag}>`));
|
2022-07-09 12:39:44 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-07-11 11:35:30 +02:00
|
|
|
function isSVG (str: string) {
|
|
|
|
const doc = new DOMParser().parseFromString(str, 'text/xml');
|
|
|
|
const lowerStr = str.toLowerCase();
|
|
|
|
const errorNode = doc.querySelector('parsererror');
|
|
|
|
if (!errorNode)
|
|
|
|
return lowerStr.includes('<svg');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-07-09 12:39:44 +02:00
|
|
|
function isXML (str: string) {
|
|
|
|
const doc = new DOMParser().parseFromString(str, 'text/xml');
|
|
|
|
const errorNode = doc.querySelector('parsererror');
|
|
|
|
return !errorNode;
|
|
|
|
}
|
|
|
|
|
2022-07-11 11:35:30 +02:00
|
|
|
function isMD (str: string) {
|
2022-07-09 12:39:44 +02:00
|
|
|
const mdChecks = [
|
|
|
|
'# ',
|
|
|
|
'`',
|
|
|
|
'- ',
|
|
|
|
'+ ',
|
|
|
|
'* ',
|
|
|
|
'1. ',
|
|
|
|
'**',
|
|
|
|
'__',
|
|
|
|
'~~',
|
|
|
|
'>> ',
|
|
|
|
'](http',
|
|
|
|
'![',
|
|
|
|
'[ ]',
|
|
|
|
'[x]'
|
|
|
|
];
|
|
|
|
|
|
|
|
return mdChecks.some((tag) => str.includes(tag));
|
|
|
|
}
|
|
|
|
|
|
|
|
export function langDetector (str: string) {
|
|
|
|
if (!str.trim().length)
|
|
|
|
return 'text';
|
|
|
|
if (isJSON(str))
|
|
|
|
return 'json';
|
|
|
|
if (isHTML(str))
|
|
|
|
return 'html';
|
2022-07-11 11:35:30 +02:00
|
|
|
if (isSVG(str))
|
|
|
|
return 'svg';
|
2022-07-09 12:39:44 +02:00
|
|
|
if (isXML(str))
|
|
|
|
return 'xml';
|
2022-07-11 11:35:30 +02:00
|
|
|
if (isMD(str))
|
2022-07-09 12:39:44 +02:00
|
|
|
return 'markdown';
|
|
|
|
return 'text';
|
|
|
|
}
|