(str)
| 1 | 'use strict'; |
| 2 | |
| 3 | function textFormatting(str) { |
| 4 | |
| 5 | if (str === undefined) return ""; |
| 6 | if (typeof str != 'string') return ""; |
| 7 | |
| 8 | const regTop = /(\*\*?|__?|~~|[<>\r\n])|\[([^[]*)\]\(([^(]*)\)|!\[([^[]*)\]\(([^(]*)\)|`([^`]+)`|```((?:.|\n)*)```|(#{1,6})\ (.*)/g; |
| 9 | |
| 10 | const closeTag = {}; |
| 11 | const renderTag = tag => { |
| 12 | if (!closeTag[tag]) { |
| 13 | closeTag[tag] = true; |
| 14 | return "<" + tag + ">"; |
| 15 | } else { |
| 16 | closeTag[tag] = false; |
| 17 | return "</" + tag + ">"; |
| 18 | } |
| 19 | }; |
| 20 | |
| 21 | return str.replace(regTop, (m, cmd, linkName, linkUrl, imgAlt, imgPath, code, pre, titleNum, title) => { |
| 22 | |
| 23 | if (cmd) { |
| 24 | if (cmd == '**' || cmd == '__') { |
| 25 | return renderTag('strong'); |
| 26 | } else if (cmd == '*' || cmd == '_') { |
| 27 | return renderTag('em'); |
| 28 | } else if (cmd == '~~') { |
| 29 | return renderTag('del'); |
| 30 | } else if (cmd == '>') { |
| 31 | return ">"; |
| 32 | } else if (cmd == '<') { |
| 33 | return "<"; |
| 34 | } else if (cmd == '\n') { |
| 35 | return "<br>"; |
| 36 | } else { |
| 37 | return ""; |
| 38 | } |
| 39 | } else if (linkUrl) { |
| 40 | return `<a href='${linkUrl}'>${linkName || linkUrl}</a>`; |
| 41 | } else if (imgAlt) { |
| 42 | return `<img src='${imgPath}' alt='${imgAlt}'/>`; |
| 43 | } else if (code) { |
| 44 | return `<code>${htmlEntities(code)}</code>` |
| 45 | } else if (pre) { |
| 46 | return `<pre>${htmlEntities(pre)}</pre>` |
| 47 | } else if (title) { |
| 48 | return `<h${titleNum.length}>${title}</h1>` |
| 49 | } else { |
| 50 | return ""; |
| 51 | } |
| 52 | }) |
| 53 | } |
| 54 | |
| 55 | function htmlEntities(str) { |
| 56 | return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); |
nothing calls this directly
no test coverage detected