@ecency/render-helper 2.4.6 → 2.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +34 -15
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +34 -15
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.mjs +34 -15
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/consts/white-list.const.ts","../../src/consts/section-list.const.ts","../../src/consts/regexes.const.ts","../../src/consts/allowed-attributes.const.ts","../../src/consts/dom-parser.const.ts","../../src/helper.ts","../../src/methods/get-inner-html.method.ts","../../src/methods/remove-child-nodes.method.ts","../../src/methods/sanitize-html.method.ts","../../src/proxify-image-src.ts","../../src/methods/img.method.ts","../../src/methods/a.method.ts","../../src/methods/iframe.method.ts","../../src/methods/p.method.ts","../../src/methods/linkify.method.ts","../../src/methods/text.method.ts","../../src/methods/traverse.method.ts","../../src/methods/clean-reply.method.ts","../../src/methods/markdown-to-html.method.ts","../../src/cache.ts","../../src/markdown-2-html.ts","../../src/catch-post-image.ts","../../src/post-body-summary.ts"],"names":["XMLDOMParser","XMLSerializer","xss","p","querystring","multihash","img","imgEls","a","match","domSerializerModule","Remarkable","linkify","htmlparser2","he","LRUCache","text"],"mappings":"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","file":"index.cjs","sourcesContent":["export const WHITE_LIST = [\n 'ecency.com',\n 'hive.blog',\n 'peakd.com',\n 'travelfeed.io',\n 'dapplr.in',\n 'leofinance.io',\n 'inleo.io',\n 'proofofbrain.io',\n 'stemgeeks.net',\n 'hiveblockexplorer.com',\n 'proofofbrain.blog',\n 'weedcash.network',\n 'dapplr.in',\n 'liketu.com',\n 'bilpcoin.com',\n 'inji.com'\n]\nexport const OLD_LIST = [\n 'busy.org',\n 'steemit.com',\n 'esteem.app',\n 'steempeak.com',\n 'partiko.app',\n 'chainbb.com',\n 'utopian.io',\n 'steemkr.com',\n 'strimi.pl',\n 'steemhunt.com',\n 'ulogs.org',\n 'hede.io',\n 'naturalmedicine.io'\n]\n","export const SECTION_LIST = [\n 'wallet',\n 'feed',\n 'followers',\n 'following',\n 'points',\n 'communities',\n 'posts',\n 'blog',\n 'comments',\n 'replies',\n 'settings',\n 'engine',\n 'permissions',\n 'referrals',\n 'payout',\n 'activities',\n 'spk',\n 'trail'\n]\n","// link regex\nexport const URL_REGEX = /(https?:\\/\\/[^\\s]+)/g\nexport const IMG_REGEX = /(https?:\\/\\/.*\\.(?:tiff?|jpe?g|gif|png|svg|ico|heic|webp|arw))(.*)/gim\nexport const ECENCY_IMG_REGEX = /https?:\\/\\/images\\.ecency\\.com\\/(?:(?:p|DQm[a-zA-Z0-9]+)\\/)?[^\\s\"'<>]+/gi\nexport const IPFS_REGEX = /^https?:\\/\\/[^/]+\\/(ip[fn]s)\\/([^/?#]+)/gim\nexport const POST_REGEX = /^https?:\\/\\/(.*)\\/(.*)\\/(@[\\w.\\d-]+)\\/(.*)/i\nexport const CCC_REGEX = /^https?:\\/\\/(.*)\\/ccc\\/([\\w.\\d-]+)\\/(.*)/i\nexport const MENTION_REGEX = /^https?:\\/\\/(.*)\\/(@[\\w.\\d-]+)$/i\nexport const TOPIC_REGEX = /^https?:\\/\\/(.*)\\/(trending|hot|created|promoted|muted|payout)\\/(.*)$/i\nexport const INTERNAL_MENTION_REGEX = /^\\/@[\\w.\\d-]+$/i\nexport const INTERNAL_TOPIC_REGEX = /^\\/(trending|hot|created|promoted|muted|payout)\\/(.*)$/i\nexport const INTERNAL_POST_TAG_REGEX = /(.*)\\/(@[\\w.\\d-]+)\\/(.*)/i\nexport const INTERNAL_POST_REGEX = /^\\/(@[\\w.\\d-]+)\\/(.*)$/i\nexport const CUSTOM_COMMUNITY_REGEX = /^https?:\\/\\/(.*)\\/c\\/(hive-\\d+)(.*)/i\nexport const YOUTUBE_REGEX = /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|shorts\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/i\nexport const YOUTUBE_EMBED_REGEX = /^(https?:)?\\/\\/www.youtube.com\\/(embed|shorts)\\/.*/i\nexport const VIMEO_REGEX = /(https?:\\/\\/)?(www\\.)?(?:vimeo)\\.com.*(?:videos|video|channels|)\\/([\\d]+)/i\nexport const VIMEO_EMBED_REGEX = /https:\\/\\/player\\.vimeo\\.com\\/video\\/([0-9]+)(?:$|[?#])/\nexport const BITCHUTE_REGEX = /^(?:https?:\\/\\/)?(?:www\\.)?bitchute.com\\/(?:video|embed)\\/([a-z0-9]+)/i\nexport const D_TUBE_REGEX = /(https?:\\/\\/d\\.tube\\/#!\\/v\\/)(\\w+)\\/(\\w+)/g\nexport const D_TUBE_REGEX2 = /(https?:\\/\\/d\\.tube\\/v\\/)(\\w+)\\/(\\w+)/g\nexport const D_TUBE_EMBED_REGEX = /^https:\\/\\/emb.d.tube\\/#!\\/[^/?#]+\\/[^/?#]+(?:$|[?#])/i\nexport const TWITCH_REGEX = /https?:\\/\\/(?:www.)?twitch.tv\\/(?:(videos)\\/)?([a-zA-Z0-9][\\w]{3,24})/i\nexport const DAPPLR_REGEX = /^(https?:)?\\/\\/[a-z]*\\.dapplr.in\\/file\\/dapplr-videos\\/.*/i\nexport const TRUVVL_REGEX = /^https?:\\/\\/embed.truvvl.com\\/(@[\\w.\\d-]+)\\/(.*)/i\nexport const LBRY_REGEX = /^(https?:)?\\/\\/lbry.tv\\/\\$\\/embed\\/[^?#]+(?:$|[?#])/i\nexport const ODYSEE_REGEX = /^(https?:)?\\/\\/odysee\\.com\\/(?:\\$|%24)\\/embed\\/[^/?#]+(?:$|[?#])/i\nexport const SKATEHIVE_IPFS_REGEX = /^https?:\\/\\/ipfs\\.skatehive\\.app\\/ipfs\\/([^/?#]+)/i\nexport const ARCH_REGEX = /^(https?:)?\\/\\/archive.org\\/embed\\/[^/?#]+(?:$|[?#])/i\nexport const SPEAK_REGEX = /(?:https?:\\/\\/(?:(?:play\\.)?3speak.([a-z]+)\\/watch\\?v=)|(?:(?:play\\.)?3speak.([a-z]+)\\/embed\\?v=))([A-Za-z0-9\\_\\-\\.\\/]+)(&.*)?/i\nexport const SPEAK_EMBED_REGEX = /^(https?:)?\\/\\/(?:play\\.)?3speak.([a-z]+)\\/embed\\?[^/]+$/i\nexport const TWITTER_REGEX = /(?:https?:\\/\\/(?:(?:twitter\\.com\\/(.*?)\\/status\\/(.*))))/gi\nexport const SPOTIFY_REGEX = /^https:\\/\\/open\\.spotify\\.com\\/playlist\\/(.*)?$/gi\nexport const RUMBLE_REGEX = /^https:\\/\\/rumble.com\\/embed\\/([a-zA-Z0-9-]+)\\/\\?pub=\\w+/\nexport const BRIGHTEON_REGEX = /^https?:\\/\\/(www\\.)?brighteon\\.com\\/(?:embed\\/)?(.*[0-9].*)/i\nexport const VIMM_EMBED_REGEX = /^https:\\/\\/www.vimm.tv\\/[^?#]+(?:$|[?#])/i\nexport const SPOTIFY_EMBED_REGEX = /^https:\\/\\/open\\.spotify\\.com\\/(embed|embed-podcast)\\/(playlist|show|episode|track|album)\\/([^/?#]+)(?:$|[?#])/i\nexport const SOUNDCLOUD_EMBED_REGEX = /^https:\\/\\/w.soundcloud.com\\/player\\/\\?[^#]+$/i\nexport const TWITCH_EMBED_REGEX = /^(https?:)?\\/\\/player.twitch.tv\\/(?:\\?[^/]+)?$/i\nexport const BRAND_NEW_TUBE_REGEX = /^https:\\/\\/brandnewtube\\.com\\/embed\\/[a-z0-9]+$/i\nexport const LOOM_REGEX = /^(https?:)?\\/\\/www.loom.com\\/share\\/([^/?#]+)(?:$|[?#])/i\nexport const LOOM_EMBED_REGEX = /^(https?:)?\\/\\/www.loom.com\\/embed\\/([^/?#]+)(?:$|[?#])/i\nexport const AUREAL_EMBED_REGEX = /^(https?:)?\\/\\/(www\\.)?(?:aureal-embed)\\.web\\.app\\/([0-9]+)(?:$|[?#])/i\nexport const ENTITY_REGEX = /&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/ig\nexport const SECTION_REGEX = /\\B(\\#[\\da-zA-Z-_]+\\b)(?!;)/i\nexport const ID_WHITELIST = /^[A-Za-z][-A-Za-z0-9_]*$/\n\n","import { XSSWhiteList } from '../types'\n\nexport const ALLOWED_ATTRIBUTES: XSSWhiteList = {\n 'a': [\n 'href',\n 'target',\n 'rel',\n 'data-permlink',\n 'data-tag',\n 'data-author',\n 'data-href',\n 'data-community',\n 'data-filter',\n 'data-embed-src',\n 'data-youtube',\n 'data-start-time',\n 'data-video-href',\n 'data-proposal',\n 'data-is-inline',\n 'class',\n 'title',\n 'data-id',\n 'id'\n ],\n 'img': [\n 'src',\n 'alt',\n 'class',\n 'loading',\n 'fetchpriority',\n 'decoding',\n 'itemprop'\n ],\n 'span': ['class', 'id', 'data-align'],\n 'iframe': ['src', 'class', 'frameborder', 'allowfullscreen', 'webkitallowfullscreen', 'mozallowfullscreen', 'sandbox'],\n 'video': ['src', 'controls', 'poster'],\n 'div': ['class', 'id', 'data-align'],\n 'strong': [],\n 'b': [],\n 'i': [],\n 'strike': [],\n 'em': [],\n 'code': [],\n 'pre': [],\n 'blockquote': ['class'],\n 'sup': [],\n 'sub': [],\n 'h1': ['dir', 'id', 'data-align'],\n 'h2': ['dir', 'id', 'data-align'],\n 'h3': ['dir', 'id', 'data-align'],\n 'h4': ['dir', 'id', 'data-align'],\n 'h5': ['dir', 'id', 'data-align'],\n 'h6': ['dir', 'id', 'data-align'],\n 'p': ['dir', 'id', 'data-align'],\n 'center': [],\n 'ul': [],\n 'ol': [],\n 'li': [],\n 'table': [],\n 'thead': [],\n 'tbody': [],\n 'tr': [],\n 'td': [],\n 'th': [],\n 'hr': [],\n 'br': [],\n 'del': [],\n 'ins': []\n}\n","import { DOMParser as XMLDOMParser } from '@xmldom/xmldom'\n\n// Lenient error handler that suppresses all parse errors without stopping\n// This allows @xmldom/xmldom to continue parsing malformed HTML instead of throwing ParseError\n// The parser will do its best to construct a valid DOM tree even with mismatched/unclosed tags\n// This maintains compatibility with the old xmldom behavior and provides better UX for users\n// who accidentally write malformed HTML (e.g., forgot to close a tag)\nconst lenientErrorHandler = (level: 'warning' | 'error' | 'fatalError', msg: string) => {\n // Don't throw - just log in development if needed\n // By not throwing, we allow the parser to recover and continue\n // Unlike onErrorStopParsing/onWarningStopParsing defaults, this allows parsing to continue\n if (process.env.NODE_ENV === 'development' && level === 'fatalError') {\n console.warn('[DOMParser]', level, msg)\n }\n}\n\nexport const DOMParser = new XMLDOMParser({\n // Use onError instead of deprecated errorHandler\n // By providing a non-throwing error handler, parsing continues despite malformed HTML\n onError: lenientErrorHandler,\n})\n","import { DOMParser } from './consts'\nimport type { Document } from '@xmldom/xmldom'\n\nexport function createDoc(html: string): Document | null {\n if (html.trim() === '') {\n return null\n }\n\n // Wrap in body tag to handle multiple root elements\n // This is needed because markdownToHTML can generate multiple top-level elements\n // (e.g., <center>...</center><hr />) which DOMParser doesn't accept without a wrapper\n // Using <body> instead of <div> prevents conflicts with <div> elements in the content\n const doc = DOMParser.parseFromString(`<body>${html}</body>`, 'text/html')\n\n return doc\n}\n\nexport function makeEntryCacheKey(entry: any): string {\n return `${entry.author}-${entry.permlink}-${entry.last_update}-${entry.updated}`\n}\n\nexport function extractYtStartTime(url:string):string {\n try {\n const urlObj = new URL(url);\n const params = new URLSearchParams(urlObj.search);\n if(params.has('t')){\n const t = params.get('t');\n return '' + parseInt(t || '0'); //parsing is important as sometimes t is famated '123s';\n }else if (params.has('start')){\n return params.get('start') || '';\n }\n return '';\n } catch (error) {\n return '';\n }\n}\nexport function sanitizePermlink(permlink: string): string {\n if (!permlink || typeof permlink !== 'string') {\n return ''\n }\n\n const [withoutQuery] = permlink.split('?')\n const [cleaned] = withoutQuery.split('#')\n\n return cleaned\n}\n\nexport function isValidPermlink(permlink: string): boolean {\n const sanitized = sanitizePermlink(permlink)\n\n if (!sanitized) {\n return false\n }\n\n // Should not contain image extensions, query params, or fragments\n const isImage = /\\.(jpg|jpeg|png|webp|gif|svg)$/i.test(sanitized)\n const isCleanFormat = /^[a-z0-9-]+$/.test(sanitized) // Hive standard\n\n return isCleanFormat && !isImage\n}\n\n// Reference: https://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_syntax\n// Hive account names must follow similar rules to DNS (RFC 1035)\nconst LABEL_REGEX = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;\n\nexport function isValidUsername(username: string): boolean {\n if (!username || typeof username !== 'string') return false;\n if (username.length > 16) return false;\n\n const labels = username.split('.');\n\n return labels.every(label => {\n return (\n label.length >= 3 &&\n label.length <= 16 &&\n /^[a-z]/.test(label) && // must start with a letter\n LABEL_REGEX.test(label) && // a-z0-9, hyphens, no start/end hyphen\n !label.includes('..') // double dots are impossible after split, but just in case\n );\n });\n}\n\n\n\n","import { XMLSerializer } from '@xmldom/xmldom'\n\nexport function getSerializedInnerHTML(node: Node): string {\n const serializer = new XMLSerializer()\n\n if (node.childNodes[0]) {\n return serializer.serializeToString(node.childNodes[0])\n }\n\n return ''\n}\n","export function removeChildNodes(node: Node): void {\n // Remove children using stable snapshot to avoid live collection issues\n while (node.firstChild) {\n node.removeChild(node.firstChild)\n }\n}\n","import xss from 'xss'\nimport {ALLOWED_ATTRIBUTES, ID_WHITELIST} from '../consts'\n\nconst decodeEntities = (input: string): string =>\n input\n .replace(/&#(\\d+);?/g, (_, dec) => String.fromCodePoint(Number(dec)))\n .replace(/&#x([0-9a-f]+);?/gi, (_, hex) => String.fromCodePoint(parseInt(hex, 16)));\n\nexport function sanitizeHtml(html: string): string {\n return xss(html, {\n whiteList: ALLOWED_ATTRIBUTES,\n stripIgnoreTag: true,\n stripIgnoreTagBody: ['style'],\n css: false, // block style attrs entirely for safety\n onTagAttr: (tag, name, value) => {\n const decoded = decodeEntities(value.trim());\n const decodedLower = decoded.toLowerCase();\n\n if (name.startsWith('on')) return ''; // 🛡 event handlers\n if (tag === 'img' && name === 'src' && (!/^https?:\\/\\//.test(decodedLower) || decodedLower.startsWith('javascript:'))) return '';\n if (\n tag === 'video' && ['src', 'poster'].includes(name) &&\n (!/^https?:\\/\\//.test(decodedLower) || decodedLower.startsWith('javascript:'))\n ) return '';\n if (tag === 'img' && ['dynsrc', 'lowsrc'].includes(name)) return '';\n if (tag === 'span' && name === 'class' && decoded.toLowerCase().trim() === 'wr') return '';\n if (name === 'id') {\n if (!ID_WHITELIST.test(decoded)) return '';\n }\n return undefined;\n }\n });\n}\n","import multihash from 'multihashes'\nimport querystring from 'querystring'\n\nlet proxyBase = 'https://images.ecency.com'\nlet fileExtension = true\n\nexport function setProxyBase(p: string): void {\n proxyBase = p\n fileExtension = proxyBase == 'https://images.ecency.com';\n}\n\nexport function extractPHash(url: string): string | null {\n if (url.startsWith(`${proxyBase}/p/`)) {\n const [hash] = url.split('/p/')[1].split('?')\n return hash.replace(/.webp/,'').replace(/.png/,'')\n }\n return null\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n return Boolean(new URL(url));\n }\n catch(e){\n return false;\n }\n}\n\nexport function getLatestUrl(str: string): string {\n const [last] = [...str.replace(/https?:\\/\\//g, '\\n$&').trim().split('\\n')].reverse()\n return last\n}\n\nexport function proxifyImageSrc(url?: string, width = 0, height = 0, format = 'match') {\n if (!url || typeof url !== 'string' || !isValidUrl(url)) {\n return ''\n }\n\n // skip images already proxified with images.hive.blog\n if (url.indexOf('https://images.hive.blog/') === 0 && url.indexOf('https://images.hive.blog/D') !== 0) {\n return url.replace('https://images.hive.blog', proxyBase)\n }\n\n if (url.indexOf('https://steemitimages.com/') === 0 && url.indexOf('https://steemitimages.com/D') !== 0) {\n return url.replace('https://steemitimages.com', proxyBase)\n }\n\n const realUrl = getLatestUrl(url)\n const pHash = extractPHash(realUrl)\n\n const options: Record<string, string | number> = {\n format,\n mode: 'fit',\n }\n\n if (width > 0) {\n options.width = width\n }\n\n if (height > 0) {\n options.height = height\n }\n\n const qs = querystring.stringify(options)\n\n if (pHash) {\n if (fileExtension) {\n return `${proxyBase}/p/${pHash}${format==='webp'?'.webp':'.png'}?${qs}`\n } else {\n return `${proxyBase}/p/${pHash}?${qs}`\n }\n }\n\n const b58url = multihash.toB58String(Buffer.from(realUrl.toString()))\n\n return `${proxyBase}/p/${b58url}${fileExtension ? format==='webp'?'.webp':'.png' : ''}?${qs}`\n}\n","import { proxifyImageSrc } from \"../proxify-image-src\";\n\nexport function img(el: HTMLElement, webp: boolean, state?: { firstImageFound: boolean }): void {\n let src = el.getAttribute(\"src\") || \"\";\n\n // Normalize encoded characters\n const decodedSrc = decodeURIComponent(\n src.replace(/&#(\\d+);/g, (_, dec) => String.fromCharCode(dec))\n .replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n ).trim();\n\n // ❌ Remove if javascript or empty/invalid\n const isInvalid = !src || decodedSrc.startsWith(\"javascript\") || decodedSrc.startsWith(\"vbscript\") || decodedSrc === \"x\";\n if (isInvalid) {\n src = \"\"\n }\n\n // ❌ Skip relative paths (e.g., `photo.jpg`, `./photo.png`, `assets/pic.jpeg`)\n // Use trimmed decodedSrc for protocol check to handle leading/trailing whitespace\n const isRelative = !/^https?:\\/\\//i.test(decodedSrc) && !decodedSrc.startsWith(\"/\");\n if (isRelative) {\n //console.warn(\"Skipped relative image:\", src);\n src = \"\"\n }\n\n // Sanitize any dynamic or low-res src-like attributes\n [\"onerror\", \"dynsrc\", \"lowsrc\", \"width\", \"height\"].forEach(attr => el.removeAttribute(attr));\n\n el.setAttribute(\"itemprop\", \"image\");\n const isLCP = state && !state.firstImageFound;\n\n if (isLCP) {\n el.setAttribute(\"loading\", \"eager\");\n el.setAttribute(\"fetchpriority\", \"high\");\n state.firstImageFound = true;\n } else {\n el.setAttribute(\"loading\", \"lazy\");\n el.setAttribute(\"decoding\", \"async\");\n }\n\n\n const cls = el.getAttribute(\"class\") || \"\";\n const shouldReplace = !cls.includes(\"no-replace\");\n const hasAlreadyProxied = src.startsWith(\"https://images.ecency.com\");\n\n if (shouldReplace && !hasAlreadyProxied) {\n const proxified = proxifyImageSrc(src, 0, 0, webp ? \"webp\" : \"match\");\n el.setAttribute(\"src\", proxified);\n }\n}\n\nexport function createImageHTML(src: string, isLCP: boolean, webp: boolean): string {\n const loading = isLCP ? 'eager' : 'lazy';\n const fetch = isLCP ? 'fetchpriority=\"high\"' : 'decoding=\"async\"';\n const proxified = proxifyImageSrc(src, 0, 0, webp ? 'webp' : 'match');\n return `<img\n class=\"markdown-img-link\"\n src=\"${proxified}\"\n loading=\"${loading}\"\n ${fetch}\n itemprop=\"image\"\n />`;\n}\n","import {\n BITCHUTE_REGEX,\n CUSTOM_COMMUNITY_REGEX,\n INTERNAL_POST_REGEX,\n INTERNAL_POST_TAG_REGEX,\n D_TUBE_REGEX,\n D_TUBE_REGEX2,\n IMG_REGEX,\n IPFS_REGEX,\n MENTION_REGEX,\n INTERNAL_MENTION_REGEX,\n TOPIC_REGEX,\n INTERNAL_TOPIC_REGEX,\n POST_REGEX,\n CCC_REGEX,\n SPEAK_REGEX,\n TWITCH_REGEX,\n TWITTER_REGEX,\n VIMEO_REGEX,\n WHITE_LIST,\n YOUTUBE_REGEX,\n SPOTIFY_REGEX,\n RUMBLE_REGEX,\n BRIGHTEON_REGEX,\n DOMParser,\n LOOM_REGEX,\n SECTION_REGEX,\n SECTION_LIST\n} from '../consts'\nimport { getSerializedInnerHTML } from './get-inner-html.method'\nimport { proxifyImageSrc } from '../proxify-image-src'\nimport { removeChildNodes } from './remove-child-nodes.method'\nimport { extractYtStartTime, isValidPermlink, isValidUsername, sanitizePermlink } from '../helper'\nimport { createImageHTML } from \"./img.method\";\n\nconst normalizeValue = (value?: string | null): string => (value ? value.trim() : '')\n\nconst matchesHref = (href: string, value?: string | null): boolean => {\n const normalizedHref = normalizeValue(href)\n if (!normalizedHref) {\n return false\n }\n\n return normalizeValue(value) === normalizedHref\n}\n\nconst getInlineMeta = (el: HTMLElement, href: string) => {\n const textMatches = matchesHref(href, el.textContent)\n const titleMatches = matchesHref(href, el.getAttribute('title'))\n\n return {\n textMatches,\n titleMatches,\n isInline: textMatches || titleMatches\n }\n}\n\n\nexport function a(el: HTMLElement | null, forApp: boolean, webp: boolean, parentDomain: string = 'ecency.com'): void {\n if (!el || !el.parentNode) {\n return\n }\n let href = el.getAttribute('href')\n\n // Continue if href has no value\n if (!href) {\n return\n }\n\n const className = el.getAttribute('class')\n\n // Don't touch user and hashtag links\n if (['markdown-author-link', 'markdown-tag-link'].indexOf(className) !== -1) {\n return\n }\n\n // Do not allow js hrefs (case-insensitive, with colon)\n if (href && href.trim().toLowerCase().startsWith('javascript:')) {\n el.removeAttribute('href')\n return\n }\n\n // if href is an image url and innerHTML same with href then mark it as image\n // & => & can break equality\n if (\n href.match(IMG_REGEX) &&\n href.trim().replace(/&/g, '&') ===\n getSerializedInnerHTML(el).trim().replace(/&/g, '&')\n ) {\n const isLCP = false; // LCP handled elsewhere\n const imgHTML = createImageHTML(href, isLCP, webp);\n const doc = DOMParser.parseFromString(imgHTML, 'text/html');\n const replaceNode = doc.body?.firstChild || doc.firstChild\n\n if (replaceNode) {\n const importedNode = el.ownerDocument.importNode(replaceNode, true)\n el.parentNode.replaceChild(importedNode, el)\n }\n\n return\n }\n\n if (\n href.match(IPFS_REGEX) &&\n href.trim().replace(/&/g, '&') ===\n getSerializedInnerHTML(el).trim().replace(/&/g, '&') &&\n href.indexOf('#') === -1\n ) {\n if (forApp) {\n el.setAttribute('data-href', href)\n el.removeAttribute('href')\n }\n\n el.setAttribute('class', 'markdown-img-link')\n\n removeChildNodes(el)\n\n const img = el.ownerDocument.createElement('img')\n img.setAttribute('src', href)\n el.appendChild(img)\n\n return\n }\n\n // If a hive post\n const postMatch = href.match(POST_REGEX)\n if (postMatch && WHITE_LIST.includes(postMatch[1].replace(/^www\\./,''))) {\n el.setAttribute('class', 'markdown-post-link')\n\n const tag = postMatch[2]\n const author = postMatch[3].replace('@', '')\n const permlink = sanitizePermlink(postMatch[4])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n return\n }\n\n // If a hive user with url\n const mentionMatch = href.match(MENTION_REGEX)\n if (mentionMatch && WHITE_LIST.includes(mentionMatch[1].replace(/^www\\./,'')) && mentionMatch.length === 3) {\n const _author = mentionMatch[2].replace('@', '')\n if (!isValidUsername(_author)) return\n const author = _author.toLowerCase()\n\n el.setAttribute('class', 'markdown-author-link')\n\n if (author.indexOf('/')===-1) {\n if (el.textContent === href) {\n el.textContent = `@${author}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-author', author)\n } else {\n const h = `/@${author}`\n el.setAttribute('href', h)\n }\n }\n return\n }\n\n // If a tagged post and profile section links\n const tpostMatch = href.match(INTERNAL_POST_TAG_REGEX)\n\n // Extract and validate domain from tpostMatch[1]\n let isValidDomain = false;\n if (tpostMatch && tpostMatch.length === 4) {\n if (tpostMatch[1].indexOf('/') === 0) {\n // Internal path like /ecency/@user/post\n isValidDomain = true;\n } else if (tpostMatch[1].includes('.')) {\n // Extract domain from URL (strip protocol and www.)\n const domain = tpostMatch[1]\n .replace(/^https?:\\/\\//, '') // Remove protocol\n .replace(/^www\\./, '') // Remove www. prefix\n isValidDomain = WHITE_LIST.includes(domain);\n }\n }\n\n if (isValidDomain) {\n // check if permlink is section or section with params ?q=xyz\n // Split on '?' first to get path segment\n const pathSegment = tpostMatch[3].split('?')[0]\n if (SECTION_LIST.some(v => pathSegment === v || pathSegment.startsWith(v + '/'))) {\n el.setAttribute('class', 'markdown-profile-link')\n const author = tpostMatch[2].replace('@', '').toLowerCase()\n const section = tpostMatch[3]\n\n if (!isValidPermlink(section)) return;\n if (el.textContent === href) {\n el.textContent = `@${author}/${section}`\n }\n if (forApp) {\n const ha = `https://ecency.com/@${author}/${section}`\n el.setAttribute('href', ha)\n } else {\n const h = `/@${author}/${section}`\n el.setAttribute('href', h)\n }\n return\n } else {\n // Domain already validated in outer if condition\n let tag = 'post'\n // check if tag does exist and doesn't include dot likely word/tag\n if (tpostMatch[1] && !tpostMatch[1].includes('.')) {\n [, tag] = tpostMatch\n tag = tag.replace('/', '')\n }\n\n el.setAttribute('class', 'markdown-post-link')\n const author = tpostMatch[2].replace('@', '')\n const permlink = sanitizePermlink(tpostMatch[3])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n\n return\n }\n }\n\n // If a hive user with internal url\n const imentionMatch = href.match(INTERNAL_MENTION_REGEX)\n if (imentionMatch) {\n const _author = imentionMatch[0].replace('/@', '')\n if (!isValidUsername(_author)) return\n const author = _author.toLowerCase()\n\n el.setAttribute('class', 'markdown-author-link')\n if (author.indexOf('/')===-1) {\n if (el.textContent === href) {\n el.textContent = `@${author}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-author', author)\n } else {\n const h = `/@${author}`\n el.setAttribute('href', h)\n }\n }\n return\n }\n\n // If a copied post and profile section links\n const cpostMatch = href.match(INTERNAL_POST_REGEX)\n if (\n (cpostMatch && cpostMatch.length === 3 && cpostMatch[1].indexOf('@') === 0)\n ) {\n // Split on '?' first to get path segment\n const pathSegment2 = cpostMatch[2].split('?')[0]\n if (SECTION_LIST.some(v => pathSegment2 === v || pathSegment2.startsWith(v + '/'))) {\n el.setAttribute('class', 'markdown-profile-link')\n const author = cpostMatch[1].replace('@', '').toLowerCase()\n const section = cpostMatch[2]\n\n if (el.textContent === href) {\n el.textContent = `@${author}/${section}`\n }\n if (forApp) {\n const ha = `https://ecency.com/@${author}/${section}`\n el.setAttribute('href', ha)\n } else {\n const h = `/@${author}/${section}`\n el.setAttribute('href', h)\n }\n return\n } else {\n el.setAttribute('class', 'markdown-post-link')\n\n const tag = 'post'\n\n const author = cpostMatch[1].replace('@', '')\n const permlink = sanitizePermlink(cpostMatch[2])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n\n return\n }\n }\n\n // If topic with filters url\n const topicMatch = href.match(TOPIC_REGEX)\n if (topicMatch && WHITE_LIST.includes(topicMatch[1].replace(/^www\\./,'')) && topicMatch.length === 4) {\n el.setAttribute('class', 'markdown-tag-link')\n const filter = topicMatch[2]\n const tag = topicMatch[3]\n\n if (el.textContent === href) {\n el.textContent = `/${filter}/${tag}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-filter', filter)\n el.setAttribute('data-tag', tag)\n } else {\n const h = `/${filter}/${tag}`\n el.setAttribute('href', h)\n }\n return\n }\n\n // If topic with filters internal url\n const itopicMatch = href.match(INTERNAL_TOPIC_REGEX)\n if (itopicMatch && itopicMatch.length === 3) {\n el.setAttribute('class', 'markdown-tag-link')\n const filter = itopicMatch[1]\n const tag = itopicMatch[2]\n\n if (el.textContent === href) {\n el.textContent = `/${filter}/${tag}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-filter', filter)\n el.setAttribute('data-tag', tag)\n } else {\n const h = `/${filter}/${tag}`\n el.setAttribute('href', h)\n }\n return\n }\n\n // If a custom hive community link\n const comMatch = href.match(CUSTOM_COMMUNITY_REGEX)\n if (comMatch && WHITE_LIST.includes(comMatch[1].replace(/^www\\./,''))) {\n el.setAttribute('class', 'markdown-community-link')\n\n const community = comMatch[2]\n let filter = comMatch[3].substring(1)\n if (!filter) filter = 'created'\n if (filter === 'about' || filter === 'discord') {\n filter = 'created'\n }\n if (el.textContent === href) {\n el.textContent = `${filter}/${community}`\n }\n\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-community', community)\n el.setAttribute('data-filter', filter)\n } else {\n const h = `/${filter}/${community}`\n el.setAttribute('href', h)\n }\n return\n }\n\n // If a collections post\n const cccMatch = href.match(CCC_REGEX)\n if (cccMatch && WHITE_LIST.includes(cccMatch[1].replace(/^www\\./,''))) {\n el.setAttribute('class', 'markdown-post-link')\n\n const tag = 'ccc'\n const author = cccMatch[2].replace('@', '')\n const permlink = sanitizePermlink(cccMatch[3])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n return\n }\n\n\n const BCmatch = href.match(BITCHUTE_REGEX)\n if (BCmatch && BCmatch[1] && el.textContent.trim() === href) {\n const vid = BCmatch[1]\n el.setAttribute('class', 'markdown-video-link')\n el.removeAttribute('href')\n\n const embedSrc = `https://www.bitchute.com/embed/${vid}/`\n\n el.textContent = ''\n\n el.setAttribute('data-embed-src', embedSrc)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n\n const RBmatch = href.match(RUMBLE_REGEX)\n if (RBmatch && RBmatch[1] && el.textContent.trim() === href) {\n const vid = RBmatch[1]\n const embedSrc = `https://www.rumble.com/embed/${vid}/?pub=4`\n el.setAttribute('class', 'markdown-video-link')\n el.removeAttribute('href')\n\n el.textContent = ''\n el.setAttribute('data-embed-src', embedSrc)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n\n const BNmatch = href.match(BRIGHTEON_REGEX)\n if (BNmatch && BNmatch[2] && el.textContent.trim() === href) {\n const vid = BNmatch[2]\n const embedSrc = `https://www.brighteon.com/embed/${vid}`\n el.setAttribute('class', 'markdown-video-link')\n el.removeAttribute('href')\n\n el.textContent = ''\n el.setAttribute('data-embed-src', embedSrc)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n\n // If a youtube video\n let match = href.match(YOUTUBE_REGEX)\n if (match && match[1] && el.textContent.trim() === href) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-youtube')\n el.removeAttribute('href')\n\n const vid = match[1]\n const thumbnail = proxifyImageSrc(`https://img.youtube.com/vi/${vid.split('?')[0]}/hqdefault.jpg`, 0, 0, webp ? 'webp' : 'match')\n const embedSrc = `https://www.youtube.com/embed/${vid}?autoplay=1`\n\n el.textContent = ''\n\n el.setAttribute('data-embed-src', embedSrc);\n el.setAttribute('data-youtube', vid);\n\n //extract start time if available\n const startTime = extractYtStartTime(href);\n if(startTime){\n el.setAttribute('data-start-time', startTime);\n }\n\n const thumbImg = el.ownerDocument.createElement('img')\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('itemprop', 'thumbnailUrl')\n thumbImg.setAttribute('src', thumbnail)\n\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n\n el.appendChild(thumbImg)\n el.appendChild(play)\n\n return\n }\n\n // If vimeo video\n match = href.match(VIMEO_REGEX)\n if (match && match[3] && href === el.textContent) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-vimeo')\n el.removeAttribute('href')\n\n const embedSrc = `https://player.vimeo.com/video/${match[3]}`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n el.appendChild(ifr)\n\n return\n }\n\n // If twitch video\n match = href.match(TWITCH_REGEX)\n if (match && match[2] && href === el.textContent) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-twitch')\n el.removeAttribute('href')\n\n let embedSrc = ''\n const parent = parentDomain ? `&parent=${parentDomain}` : ''\n\n if (match[1] === undefined) {\n // No \"videos\" in URL, match[2] is the channel name\n embedSrc = `https://player.twitch.tv/?channel=${match[2]}${parent}`\n } else if (match[1] === 'videos') {\n // URL contains \"videos/\", match[2] is the video ID\n embedSrc = `https://player.twitch.tv/?video=${match[2]}${parent}`\n } else {\n // Fallback (shouldn't happen with current regex)\n embedSrc = `https://player.twitch.tv/?channel=${match[2]}${parent}`\n }\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n el.appendChild(ifr)\n\n return\n }\n\n // If a spotify audio\n if (el.textContent.trim() === href) {\n SPOTIFY_REGEX.lastIndex = 0 // Reset regex state\n match = SPOTIFY_REGEX.exec(href)\n if (match && match[1]) {\n el.setAttribute('class', 'markdown-audio-link markdown-audio-link-spotify')\n el.removeAttribute('href')\n\n const embedSrc = `https://open.spotify.com/embed/playlist/${match[1]}`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n ifr.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups')\n el.appendChild(ifr)\n\n return\n }\n }\n\n // If a Loom video\n match = href.match(LOOM_REGEX)\n if (match && match[2] && el.textContent.trim() === href) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-loom')\n el.removeAttribute('href')\n\n const embedSrc = `https://www.loom.com/embed/${match[2]}`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n ifr.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups')\n el.appendChild(ifr)\n\n return\n }\n\n // If a d.tube video\n // Only d.tube links contains an image\n const imgEls = el.getElementsByTagName('img')\n\n if (imgEls.length === 1 || el.textContent.trim() === href) {\n D_TUBE_REGEX.lastIndex = 0 // Reset regex state\n match = D_TUBE_REGEX.exec(href)\n // match[2] = username, match[3] object id\n if (match && match[2] && match[3]) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-dtube')\n el.removeAttribute('href')\n\n const videoHref = `https://emb.d.tube/#!/${match[2]}/${match[3]}`\n\n // el.setAttribute('data-video-href', videoHref)\n el.setAttribute('data-embed-src', videoHref)\n\n //process thumb img element\n if (imgEls.length === 1) {\n const src = imgEls[0].getAttribute('src')\n if (src) {\n const thumbnail = proxifyImageSrc(src.replace(/\\s+/g, ''), 0, 0, webp ? 'webp' : 'match')\n const thumbImg = el.ownerDocument.createElement('img')\n\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('itemprop', 'thumbnailUrl')\n\n thumbImg.setAttribute('src', thumbnail)\n el.appendChild(thumbImg)\n\n // Remove image.\n el.removeChild(imgEls[0])\n }\n } else {\n el.textContent = '';\n }\n\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n\n el.appendChild(play)\n\n return\n }\n }\n D_TUBE_REGEX2.lastIndex = 0 // Reset regex state\n match = D_TUBE_REGEX2.exec(href)\n if (match && match[2] && match[3]) {\n // match[2] = username, match[3] object id\n el.setAttribute('class', 'markdown-video-link markdown-video-link-dtube')\n el.removeAttribute('href')\n el.textContent = '';\n\n const videoHref = `https://emb.d.tube/#!/${match[2]}/${match[3]}`\n\n // el.setAttribute('data-video-href', videoHref);\n el.setAttribute('data-embed-src', videoHref)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n\n el.appendChild(play)\n\n return\n }\n\n // Detect 3Speak\n match = href.match(SPEAK_REGEX)\n if (match) {\n const imgEls = el.getElementsByTagName('img')\n if (imgEls.length === 1 || el.textContent.trim() === href) {\n // match[1] / match[2] = tld , match[3] = embed address\n if ((match[1] || match[2]) && match[3]) {\n const videoHref = `https://3speak.tv/embed?v=${match[3]}`\n el.setAttribute('class', 'markdown-video-link markdown-video-link-speak')\n el.removeAttribute('href')\n el.setAttribute('data-embed-src', videoHref)\n if (el.textContent.trim() === href) {\n el.textContent = ''\n }\n if (imgEls.length === 1) {\n const src = imgEls[0].getAttribute('src')\n if (src) {\n const thumbnail = proxifyImageSrc(src.replace(/\\s+/g, ''), 0, 0, webp ? 'webp' : 'match')\n const thumbImg = el.ownerDocument.createElement('img')\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('itemprop', 'thumbnailUrl')\n thumbImg.setAttribute('src', thumbnail)\n el.appendChild(thumbImg)\n // Remove image.\n el.removeChild(imgEls[0])\n }\n }\n\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n }\n }\n\n // If tweets\n const matchT = href.match(TWITTER_REGEX)\n if (matchT && el.textContent.trim() === href) {\n TWITTER_REGEX.lastIndex = 0 // Reset for exec() after match()\n const e = TWITTER_REGEX.exec(href)\n if (e) {\n const url = e[0].replace(/(<([^>]+)>)/gi, '')\n const author = e[1].replace(/(<([^>]+)>)/gi, '')\n\n // Use proper DOM construction to avoid XSS from unescaped url/author\n const blockquote = el.ownerDocument.createElement('blockquote')\n blockquote.setAttribute('class', 'twitter-tweet')\n\n const p = el.ownerDocument.createElement('p')\n p.textContent = url // textContent automatically escapes\n\n const textNode = el.ownerDocument.createTextNode('- ')\n\n const a = el.ownerDocument.createElement('a')\n a.setAttribute('href', url) // setAttribute escapes automatically\n a.textContent = author // textContent automatically escapes\n\n blockquote.appendChild(p)\n blockquote.appendChild(textNode)\n blockquote.appendChild(a)\n\n el.parentNode.replaceChild(blockquote, el)\n return\n }\n }\n\n if (href.indexOf('https://hivesigner.com/sign/account-witness-vote?witness=') === 0 && forApp) {\n el.setAttribute('class', 'markdown-witnesses-link')\n el.setAttribute('data-href', href)\n el.removeAttribute('href')\n return\n }\n\n if (href.indexOf('hivesigner.com/sign/update-proposal-votes?proposal_ids') >= 0 && forApp) {\n try {\n const m = decodeURI(href).match(/proposal_ids=\\[(\\d+)]/)\n if (m) {\n el.setAttribute('class', 'markdown-proposal-link')\n el.setAttribute('data-href', href)\n el.setAttribute('data-proposal', m[1])\n el.removeAttribute('href')\n return\n }\n } catch (e) {\n // Invalid URI encoding, skip processing\n }\n }\n\n // If nothing matched element as external link so it will be opened in external window\n el.setAttribute('class', 'markdown-external-link')\n\n // Prepend https if no scheme provided\n if (!(/^((#)|(mailto:)|(\\/(?!\\/))|(((steem|hive|esteem|ecency|https?):)?\\/\\/))/.test(href))) {\n href = `https://${href}`\n }\n\n if (forApp) {\n el.setAttribute('data-href', href)\n const match = href.match(YOUTUBE_REGEX)\n if (match && match[1]) {\n const vid = match[1]\n el.setAttribute('data-youtube', vid);\n\n //extract start time if available\n const startTime = extractYtStartTime(href);\n if(startTime){\n el.setAttribute('data-start-time', startTime);\n }\n }\n el.removeAttribute('href')\n } else {\n const matchS = href.match(SECTION_REGEX)\n if(matchS) {\n el.setAttribute('class', 'markdown-internal-link');\n } else {\n el.setAttribute('target', '_blank');\n el.setAttribute('rel', 'noopener');\n }\n el.setAttribute('href', href)\n }\n}\n\n\n\n","import { ARCH_REGEX, DAPPLR_REGEX, LBRY_REGEX, TRUVVL_REGEX, ODYSEE_REGEX, SKATEHIVE_IPFS_REGEX, BITCHUTE_REGEX, RUMBLE_REGEX, BRIGHTEON_REGEX, VIMEO_EMBED_REGEX, SPEAK_EMBED_REGEX, VIMM_EMBED_REGEX, D_TUBE_EMBED_REGEX, SPOTIFY_EMBED_REGEX, SOUNDCLOUD_EMBED_REGEX, TWITCH_EMBED_REGEX, YOUTUBE_EMBED_REGEX, BRAND_NEW_TUBE_REGEX, LOOM_EMBED_REGEX, AUREAL_EMBED_REGEX } from '../consts'\n\nexport function iframe(el: HTMLElement | null, parentDomain: string = 'ecency.com'): void {\n if (!el || !el.parentNode) {\n return;\n }\n const src = el.getAttribute('src');\n if (!src) {\n el.parentNode.removeChild(el);\n return;\n }\n\n // Youtube\n if (src.match(YOUTUBE_EMBED_REGEX)) {\n // strip query string (yt: autoplay=1,controls=0,showinfo=0, etc)\n const s = src.replace(/\\?.+$/, '');\n el.setAttribute('src', s);\n return;\n }\n\n if (src.match(BITCHUTE_REGEX)) {\n return;\n }\n\n // Vimeo\n const m = src.match(VIMEO_EMBED_REGEX);\n if (m && m.length === 2) {\n const s = `https://player.vimeo.com/video/${m[1]}`;\n el.setAttribute('src', s);\n return;\n }\n\n // Twitch\n if (src.match(TWITCH_EMBED_REGEX)) {\n let s = src;\n // Only add parent if not present\n if (!s.includes('parent=')) {\n const separator = s.includes('?') ? '&' : '?';\n s = `${s}${separator}parent=${parentDomain}`;\n }\n // Only add autoplay if not present\n if (!s.includes('autoplay=')) {\n const separator = s.includes('?') ? '&' : '?';\n s = `${s}${separator}autoplay=false`;\n }\n el.setAttribute('src', s);\n return;\n }\n\n // 3Speak\n if (src.match(SPEAK_EMBED_REGEX)) {\n // Normalize domain to 3speak.tv\n let normalizedSrc = src.replace(/3speak\\.[a-z]+/i, '3speak.tv');\n\n // Add autoplay if not present\n const hasAutoplay = /[?&]autoplay=/.test(normalizedSrc);\n const s = hasAutoplay\n ? normalizedSrc\n : `${normalizedSrc}&autoplay=true`;\n el.setAttribute('src', s);\n return;\n }\n\n // Spotify\n if (src.match(SPOTIFY_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Soundcloud\n if (src.match(SOUNDCLOUD_EMBED_REGEX)) {\n const match = src.match(/url=(.+?)(?:&|$)/); // Handle & or end of string\n if (match && match[1]) {\n const s = `https://w.soundcloud.com/player/?url=${match[1]}&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true`;\n el.setAttribute('src', s);\n }\n return; // Always return, even if match fails\n }\n\n // Dtube\n if (src.match(D_TUBE_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // VIMM\n if (src.match(VIMM_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // Dapplr\n if (src.match(DAPPLR_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // Truvvl\n if (src.match(TRUVVL_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\n el.setAttribute('frameborder', '0');\n el.setAttribute('class', 'portrait-embed');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // LBRY.tv\n if (src.match(LBRY_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // ODYSEE\n if (src.match(ODYSEE_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // IPFS Skatehive\n if (src.match(SKATEHIVE_IPFS_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // archive.org\n if (src.match(ARCH_REGEX)) {\n el.setAttribute('src', src);\n return;\n }\n\n // Rumble\n if (src.match(RUMBLE_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Brighteon\n if (src.match(BRIGHTEON_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Brandnew Tube\n if (src.match(BRAND_NEW_TUBE_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Loom\n if (src.match(LOOM_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Aureal\n if (src.match(AUREAL_EMBED_REGEX)) {\n // Normalize protocol-relative URLs to https://\n const normalizedSrc = src.startsWith('//') ? `https:${src}` : src;\n el.setAttribute('src', normalizedSrc);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n const replaceNode = el.ownerDocument.createElement('div');\n replaceNode.setAttribute('class', 'unsupported-iframe');\n replaceNode.textContent = `(Unsupported ${src})`;\n if (el.parentNode) {\n el.parentNode.insertBefore(replaceNode, el);\n el.parentNode.removeChild(el);\n }\n}\n","export function p(el: HTMLElement): void {\n const dir = el.getAttribute('dir')\n if (!dir) {\n el.setAttribute('dir', 'auto')\n }\n}\n","import { IMG_REGEX, SECTION_LIST } from '../consts'\nimport { proxifyImageSrc } from '../proxify-image-src'\nimport { isValidPermlink, isValidUsername, sanitizePermlink } from \"../helper\";\nimport { createImageHTML } from \"./img.method\";\n\nexport function linkify(content: string, forApp: boolean, webp: boolean): string {\n // Tags\n content = content.replace(/(^|\\s|>)(#[-a-z\\d]+)/gi, tag => {\n if (/#[\\d]+$/.test(tag)) return tag // do not allow only numbers (like #1)\n const preceding = /^\\s|>/.test(tag) ? tag[0] : '' // space or closing tag (>)\n tag = tag.replace('>', '') // remove closing tag\n const tag2 = tag.trim().substring(1)\n const tagLower = tag2.toLowerCase()\n\n const attrs = forApp ? `data-tag=\"${tagLower}\"` : `href=\"/trending/${tagLower}\"`\n return `${preceding}<a class=\"markdown-tag-link\" ${attrs}>${tag.trim()}</a>`\n })\n\n // User mentions\n content = content.replace(\n /(^|[^a-zA-Z0-9_!#$%&*@@/]|(^|[^a-zA-Z0-9_+~.-/]))[@@]([a-z][-.a-z\\d^/]+[a-z\\d])/gi,\n (match, preceeding1, preceeding2, user) => {\n const userLower = user.toLowerCase()\n const preceedings = (preceeding1 || '') + (preceeding2 || '')\n if (userLower.indexOf('/') === -1 && isValidUsername(user)) {\n const attrs = forApp ? `data-author=\"${userLower}\"` : `href=\"/@${userLower}\"`\n return `${preceedings}<a class=\"markdown-author-link\" ${attrs}>@${user}</a>`\n } else {\n return match\n }\n }\n )\n\n // internal links\n content = content.replace(\n /((^|\\s)(\\/|)@[\\w.\\d-]+)\\/(\\S+)/gi, (match, u, p1, p2, p3) => {\n const uu = u.trim().toLowerCase().replace('/@', '').replace('@', '');\n const permlink = sanitizePermlink(p3);\n if (!isValidPermlink(permlink)) return match;\n\n if (SECTION_LIST.some(v => p3.includes(v))) {\n const attrs = forApp ? `href=\"https://ecency.com/@${uu}/${permlink}\"` : `href=\"/@${uu}/${permlink}\"`\n return ` <a class=\"markdown-profile-link\" ${attrs}>@${uu}/${permlink}</a>`\n } else {\n const attrs = forApp ? `data-author=\"${uu}\" data-tag=\"post\" data-permlink=\"${permlink}\"` : `href=\"/post/@${uu}/${permlink}\"`\n return ` <a class=\"markdown-post-link\" ${attrs}>@${uu}/${permlink}</a>`\n }\n }\n )\n\n // Image links\n let firstImageUsed = false;\n\n content = content.replace(IMG_REGEX, (imglink) => {\n const isLCP = !firstImageUsed;\n firstImageUsed = true;\n return createImageHTML(imglink, isLCP, webp);\n });\n\n return content\n}\n","import { IMG_REGEX, YOUTUBE_REGEX, WHITE_LIST, DOMParser, POST_REGEX } from '../consts'\nimport { extractYtStartTime, isValidPermlink, isValidUsername, sanitizePermlink } from '../helper'\nimport { proxifyImageSrc } from '../proxify-image-src'\nimport { linkify } from './linkify.method'\nimport {createImageHTML} from \"./img.method\";\n\nexport function text(node: HTMLElement | null, forApp: boolean, webp: boolean): void {\n if (!node || !node.parentNode) {\n return\n }\n\n // Case-insensitive check with null safety\n if (node.parentNode && ['a', 'code'].includes(node.parentNode.nodeName.toLowerCase())) {\n return\n }\n\n const nodeValue = node.nodeValue || ''\n const linkified = linkify(nodeValue, forApp, webp)\n if (linkified !== nodeValue) {\n const doc = DOMParser.parseFromString(\n `<span class=\"wr\">${linkified}</span>`,\n 'text/html'\n )\n const replaceNode = doc.body?.firstChild || doc.firstChild\n\n if (replaceNode) {\n node.parentNode.insertBefore(replaceNode, node)\n node.parentNode.removeChild(node)\n }\n return\n }\n\n if (nodeValue.match(IMG_REGEX)) {\n const isLCP = false; // Traverse handles LCP; no need to double-count\n const imageHTML = createImageHTML(nodeValue, isLCP, webp);\n const doc = DOMParser.parseFromString(imageHTML, 'text/html');\n const replaceNode = doc.body?.firstChild || doc.firstChild\n if (replaceNode) {\n node.parentNode.replaceChild(replaceNode, node);\n }\n return; // Early return after replacing node\n }\n // If a youtube video\n if (nodeValue.match(YOUTUBE_REGEX)) {\n const e = YOUTUBE_REGEX.exec(nodeValue)\n if (e && e[1]) {\n const vid = e[1]\n const thumbnail = proxifyImageSrc(`https://img.youtube.com/vi/${vid.split('?')[0]}/hqdefault.jpg`, 0, 0, webp ? 'webp' : 'match')\n const embedSrc = `https://www.youtube.com/embed/${vid}?autoplay=1`\n const startTime = extractYtStartTime(nodeValue);\n\n // Create container paragraph\n const container = node.ownerDocument.createElement('p')\n\n // Create anchor element\n const anchor = node.ownerDocument.createElement('a')\n anchor.setAttribute('class', 'markdown-video-link markdown-video-link-youtube')\n anchor.setAttribute('data-embed-src', embedSrc)\n anchor.setAttribute('data-youtube', vid)\n if (startTime) {\n anchor.setAttribute('data-start-time', startTime)\n }\n\n // Create and append thumbnail image\n const thumbImg = node.ownerDocument.createElement('img')\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('src', thumbnail)\n anchor.appendChild(thumbImg)\n\n // Create and append play button\n const play = node.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n anchor.appendChild(play)\n\n // Assemble and replace\n container.appendChild(anchor)\n node.parentNode.replaceChild(container, node)\n return; // Early return after replacing node\n }\n }\n if (nodeValue && typeof nodeValue === 'string') {\n const postMatch = nodeValue.trim().match(POST_REGEX)\n if (postMatch && WHITE_LIST.includes(postMatch[1].replace(/^www\\./,''))) {\n const tag = postMatch[2]\n const author = postMatch[3].replace('@', '')\n const permlink = sanitizePermlink(postMatch[4])\n\n // Validate tag to prevent attribute breakout XSS\n // Allow only alphanumeric, hyphens, and underscores\n if (!tag || !/^[a-z0-9_-]+$/i.test(tag)) return\n if (!isValidUsername(author)) return\n if (!isValidPermlink(permlink)) return\n\n const attrs = forApp ? `data-tag=\"${tag}\" data-author=\"${author}\" data-permlink=\"${permlink}\" class=\"markdown-post-link\"` : `class=\"markdown-post-link\" href=\"/${tag}/@${author}/${permlink}\"`\n const doc = DOMParser.parseFromString(\n `<a ${attrs}>/@${author}/${permlink}</a>`,\n 'text/html'\n )\n const replaceNode = doc.body?.firstChild || doc.firstChild\n if (replaceNode) {\n node.parentNode.replaceChild(replaceNode, node)\n }\n }\n }\n}\n","import { a } from './a.method'\nimport { iframe } from './iframe.method'\nimport { img } from './img.method'\nimport { p } from './p.method'\nimport { text } from './text.method'\n\nexport function traverse(node: Node, forApp: boolean, depth = 0, webp = false, state = { firstImageFound: false }, parentDomain: string = 'ecency.com'): void {\n if (!node || !node.childNodes) {\n return\n }\n\n Array.from(Array(node.childNodes.length).keys()).forEach(i => {\n const child = node.childNodes[i];\n if (!child) return; // Child might have been removed\n\n if (child.nodeName.toLowerCase() === 'a') {\n a(<HTMLElement>child, forApp, webp, parentDomain)\n }\n if (child.nodeName.toLowerCase() === 'iframe') {\n iframe(<HTMLElement>child, parentDomain)\n }\n if (child.nodeName === '#text') {\n text(<HTMLElement>child, forApp, webp)\n }\n if (child.nodeName.toLowerCase() === 'img') {\n img(<HTMLElement>child, webp, state)\n }\n if (child.nodeName.toLowerCase() === 'p') {\n p(<HTMLElement>child)\n }\n\n // Recapture child reference in case handler replaced it\n const currentChild = node.childNodes[i];\n if (currentChild) {\n traverse(currentChild, forApp, depth + 1, webp, state, parentDomain)\n }\n })\n}\n","export function cleanReply(s: string): string {\n return (s ? s.split('\\n')\n .filter(item => item.toLowerCase().includes('posted using [partiko') === false)\n .filter(item => item.toLowerCase().includes('posted using [dapplr') === false)\n .filter(item => item.toLowerCase().includes('posted using [leofinance') === false)\n .filter(item => item.toLowerCase().includes('posted via [neoxian') === false)\n .filter(item => item.toLowerCase().includes('posted using [neoxian') === false)\n .filter(item => item.toLowerCase().includes('posted with [stemgeeks') === false)\n .filter(item => item.toLowerCase().includes('posted using [bilpcoin') === false)\n .filter(item => item.toLowerCase().includes('posted using [inleo') === false)\n .filter(item => item.toLowerCase().includes('posted using [sportstalksocial]') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>[posted using aeneas.blog') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>posted via [proofofbrain.io') === false)\n .filter(item => item.toLowerCase().includes('<center>posted on [hypnochain') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>posted via [weedcash.network') === false)\n .filter(item => item.toLowerCase().includes('<center>posted on [naturalmedicine.io') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>posted via [musicforlife.io') === false)\n .filter(item => item.toLowerCase().includes('if the truvvl embed is unsupported by your current frontend, click this link to view this story') === false)\n .filter(item => item.toLowerCase().includes('<center><em>posted from truvvl') === false)\n .filter(item => item.toLowerCase().includes('view this post <a href=\"https://travelfeed.io/') === false)\n .filter(item => item.toLowerCase().includes('read this post on travelfeed.io for the best experience') === false)\n .filter(item => item.toLowerCase().includes('posted via <a href=\"https://www.dporn.co/\"') === false)\n .filter(item => item.toLowerCase().includes('▶️ [watch on 3speak](https://3speak') === false)\n .filter(item => item.toLowerCase().includes('<sup><sub>posted via [inji.com]') === false)\n .filter(item => item.toLowerCase().includes('view this post on [liketu]') === false)\n .filter(item => item.toLowerCase().includes('[via Inbox]') === false)\n .join('\\n') : '')\n .replace('Posted via <a href=\"https://d.buzz\" data-link=\"promote-link\">D.Buzz</a>', '')\n .replace('<div class=\"pull-right\"><a href=\"/@hive.engage\"></a></div>', '')\n .replace('<div><a href=\"https://engage.hivechain.app\"></a></div>', '')\n .replace(`<div class=\"text-center\"><img src=\"https://cdn.steemitimages.com/DQmNp6YwAm2qwquALZw8PdcovDorwaBSFuxQ38TrYziGT6b/A-20.png\"><a href=\"https://bit.ly/actifit-app\"><img src=\"https://cdn.steemitimages.com/DQmQqfpSmcQtfrHAtzfBtVccXwUL9vKNgZJ2j93m8WNjizw/l5.png\"></a><a href=\"https://bit.ly/actifit-ios\"><img src=\"https://cdn.steemitimages.com/DQmbWy8KzKT1UvCvznUTaFPw6wBUcyLtBT5XL9wdbB7Hfmn/l6.png\"></a></div>`, '')\n}\n","import { traverse } from './traverse.method'\nimport { sanitizeHtml } from './sanitize-html.method'\nimport { DOMParser, ENTITY_REGEX } from '../consts'\nimport { XMLSerializer } from '@xmldom/xmldom'\nimport { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\nimport he from 'he'\nimport * as htmlparser2 from 'htmlparser2'\nimport * as domSerializerModule from 'dom-serializer'\n\nconst domSerializer = (domSerializerModule as any).default || domSerializerModule\n\n// Lazy-load lolight to avoid dynamic require issues in browser builds\nlet lolight: any = null\nfunction getLolightInstance() {\n if (!lolight) {\n try {\n lolight = require('lolight')\n } catch (e) {\n // Lolight not available (browser build) - use fallback\n return null\n }\n }\n return lolight\n}\n\n/**\n * Fixes block-level HTML tags that Remarkable incorrectly wraps inside <p> tags.\n *\n * Problem: When Remarkable encounters block-level HTML tags (like <center>, <div>)\n * with blank lines after them, it generates malformed HTML like:\n * <p><center></p>\n * <p>content</p>\n * <p></center></p>\n *\n * This function repairs such patterns by:\n * 1. Extracting block-level tags from paragraph wrappers\n * 2. Removing empty paragraphs created by this mismatch\n *\n * @param html - The HTML string to fix\n * @returns The repaired HTML string\n */\nfunction fixBlockLevelTagsInParagraphs(html: string): string {\n // Block-level tags that should never be wrapped in <p> tags\n const blockTags = 'center|div|table|figure|section|article|aside|header|footer|nav|main'\n\n // Pattern 1: <p><tag></p> - opening tag wrapped in <p>\n // Replace with just <tag> (remove the wrapping <p>)\n const openingPattern = new RegExp(`<p>(<(?:${blockTags})(?:\\\\s[^>]*)?>)<\\\\/p>`, 'gi')\n html = html.replace(openingPattern, '$1')\n\n // Pattern 2: <p></tag></p> - closing tag wrapped in <p>\n // Replace with just </tag> (remove the wrapping <p>)\n const closingPattern = new RegExp(`<p>(<\\\\/(?:${blockTags})>)<\\\\/p>`, 'gi')\n html = html.replace(closingPattern, '$1')\n\n // Pattern 3: <p><tag><br> or <p><tag> at start of <p>\n // This handles cases where the tag is at the start but followed by content\n const startPattern = new RegExp(`<p>(<(?:${blockTags})(?:\\\\s[^>]*)?>)(?:<br>)?\\\\s*`, 'gi')\n html = html.replace(startPattern, '$1<p>')\n\n // Pattern 4: </tag></p> or <br>\\n</tag></p> - closing tag at end of <p>\n const endPattern = new RegExp(`\\\\s*(?:<br>)?\\\\s*(<\\\\/(?:${blockTags})>)<\\\\/p>`, 'gi')\n html = html.replace(endPattern, '</p>$1')\n\n // Clean up any empty paragraphs that may have been created\n html = html.replace(/<p>\\s*<\\/p>/g, '')\n html = html.replace(/<p><br>\\s*<\\/p>/g, '')\n\n return html\n}\n\nexport function markdownToHTML(input: string, forApp: boolean, webp: boolean, parentDomain: string = 'ecency.com'): string {\n // Internalize leofinance.io links\n input = input.replace(new RegExp(\"https://leofinance.io/threads/view/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://leofinance.io/posts/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://leofinance.io/threads/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://inleo.io/threads/view/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://inleo.io/posts/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://inleo.io/threads/\",\"g\"), \"/@\");\n\n\n const md = new Remarkable({\n html: true,\n breaks: true,\n typographer: false,\n highlight: function (str: string) {\n const lolightInstance = getLolightInstance()\n if (!lolightInstance) {\n // Fallback when lolight is not available\n return str\n }\n\n try {\n const tokens = lolightInstance.tok(str);\n return tokens.map(\n (token: string[]) => `<span class=\"ll-${token[0]}\">${token[1]}</span>`\n ).join('')\n } catch (err) { console.error(err) }\n\n return str\n }\n }).use(linkify)\n md.core.ruler.enable([\n 'abbr'\n ]);\n md.block.ruler.enable([\n 'footnote',\n 'deflist'\n ]);\n md.inline.ruler.enable([\n 'footnote_inline',\n 'ins',\n 'mark',\n 'sub',\n 'sup'\n ]);\n const serializer = new XMLSerializer()\n\n if (!input) {\n return ''\n }\n\n let output = '';\n\n // Replace entities with deterministic placeholders to preserve them during rendering\n const entities = input.match(ENTITY_REGEX);\n const entityPlaceholders: string[] = [];\n\n if (entities && forApp) {\n // Deduplicate entities to avoid duplicate placeholders\n const uniqueEntities = [...new Set(entities)];\n uniqueEntities.forEach((entity, index) => {\n // Use markdown-inert Unicode placeholder (zero-width spaces)\n const placeholder = `\\u200B${index}\\u200B`;\n entityPlaceholders.push(entity);\n // Replace all occurrences of this entity\n input = input.split(entity).join(placeholder);\n })\n }\n\n\n try {\n output = md.render(input)\n\n // Fix malformed block-level HTML tags that Remarkable wraps in <p> tags\n // This prevents \"Opening and ending tag mismatch\" errors from DOMParser\n output = fixBlockLevelTagsInParagraphs(output)\n\n const doc = DOMParser.parseFromString(`<body id=\"root\">${output}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain)\n\n output = serializer.serializeToString(doc)\n } catch (error) {\n // @xmldom/xmldom is stricter than old xmldom and throws ParseError for malformed HTML\n // Instead of returning empty string (bad UX), attempt graceful recovery\n try {\n // Strategy:\n // 1. Pre-sanitize to remove XSS vectors\n // 2. Use lenient htmlparser2 to auto-repair malformed HTML (auto-close unclosed tags)\n // 3. Serialize the repaired HTML\n // 4. Re-parse with @xmldom/xmldom (now well-formed)\n // 5. Traverse and serialize as normal\n output = md.render(input)\n const preSanitized = sanitizeHtml(output)\n\n // Use htmlparser2 to parse malformed HTML leniently\n const dom = htmlparser2.parseDocument(preSanitized, {\n // lenient options - don't throw on malformed HTML\n lowerCaseTags: false,\n lowerCaseAttributeNames: false,\n })\n\n // Serialize back to well-formed HTML (htmlparser2 auto-closes tags)\n const repairedHtml = domSerializer(dom.children)\n\n // Now parse the well-formed HTML with @xmldom/xmldom\n const doc = DOMParser.parseFromString(`<body id=\"root\">${repairedHtml}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain)\n\n output = serializer.serializeToString(doc)\n } catch (fallbackError) {\n // If repair + re-parsing fails, HTML-escape to preserve content visibility\n // This prevents XSS while still showing users what they wrote\n const escapedContent = he.encode(output || md.render(input))\n output = `<p dir=\"auto\">${escapedContent}</p>`\n }\n }\n\n // Restore original entities from placeholders\n if (forApp && output && entityPlaceholders.length > 0) {\n entityPlaceholders.forEach((entity, index) => {\n const placeholder = `\\u200B${index}\\u200B`;\n // Replace all occurrences of the placeholder\n output = output.split(placeholder).join(entity);\n })\n }\n\n output = output.replace(/ xmlns=\"http:\\/\\/www.w3.org\\/1999\\/xhtml\"/g, '')\n .replace('<body id=\"root\">', '')\n .replace('</body>', '')\n .trim()\n\n return sanitizeHtml(output)\n}\n","import { LRUCache } from 'lru-cache'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet cache = new LRUCache<string, any>({ max: 60 })\n\nexport function setCacheSize(size: number): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache = new LRUCache<string, any>({ max: size })\n}\n\nexport function cacheGet<T extends unknown>(key: string): T {\n return cache.get(key) as T\n}\n\nexport function cacheSet(key: string, value: unknown): void {\n cache.set(key, value)\n}\n","import { makeEntryCacheKey } from './helper'\nimport { cleanReply, markdownToHTML } from './methods'\nimport { cacheGet, cacheSet } from './cache'\nimport { Entry } from './types'\n\nexport function markdown2Html(obj: Entry | string, forApp = true, webp = false, parentDomain: string = 'ecency.com'): string {\n if (typeof obj === 'string') {\n const cleanedStr = cleanReply(obj)\n return markdownToHTML(cleanedStr, forApp, webp, parentDomain)\n }\n\n const key = `${makeEntryCacheKey(obj)}-md${webp ? '-webp' : ''}-${forApp ? 'app' : 'site'}-${parentDomain}`\n\n const item = cacheGet<string>(key)\n if (item) {\n return item\n }\n\n const cleanBody = cleanReply(obj.body)\n\n const res = markdownToHTML(cleanBody, forApp, webp, parentDomain)\n cacheSet(key, res)\n\n return res\n}\n","import { proxifyImageSrc } from './proxify-image-src'\nimport { markdown2Html } from './markdown-2-html'\nimport { createDoc, makeEntryCacheKey } from './helper'\nimport { cacheGet, cacheSet } from './cache'\nimport { Entry } from './types'\n\nconst gifLinkRegex = /\\.(gif)$/i;\n\nfunction isGifLink(link: string) {\n return gifLinkRegex.test(link);\n}\n\nfunction getImage(entry: Entry, width = 0, height = 0, format = 'match'): string | null {\n /*\n * Return from json metadata if exists\n * */\n let meta: Entry['json_metadata'] | null\n\n if (typeof entry.json_metadata === 'object') {\n meta = entry.json_metadata\n } else {\n try {\n meta = JSON.parse(entry.json_metadata as string)\n } catch (e) {\n meta = null\n }\n }\n\n if (meta && typeof meta.image === 'string' && meta.image.length > 0) {\n if (isGifLink(meta.image)) {\n return proxifyImageSrc(meta.image, 0, 0, format)\n }\n return proxifyImageSrc(meta.image, width, height, format)\n }\n\n if (meta && meta.image && !!meta.image.length && meta.image[0]) {\n if (isGifLink(meta.image[0])) {\n return proxifyImageSrc(meta.image[0], 0, 0, format)\n }\n return proxifyImageSrc(meta.image[0], width, height, format)\n }\n\n // try to find first image from post body\n const html = markdown2Html(entry)\n const doc = createDoc(html)\n if (!doc) {\n return null\n }\n\n const imgEls = doc.getElementsByTagName('img')\n if (imgEls.length >= 1) {\n const src = imgEls[0].getAttribute('src')\n if (!src) {\n return null\n }\n if (isGifLink(src)) {\n return proxifyImageSrc(src, 0, 0, format)\n }\n return proxifyImageSrc(src, width, height, format)\n }\n\n return null\n}\n\nexport function catchPostImage(obj: Entry | string, width = 0, height = 0, format = 'match'): string | null {\n if (typeof obj === 'string') {\n // Create minimal Entry-like wrapper for string input\n const entryWrapper: Entry = {\n body: obj,\n json_metadata: '{}',\n } as Entry\n return getImage(entryWrapper, width, height, format)\n }\n const key = `${makeEntryCacheKey(obj)}-${width}x${height}-${format}`\n\n const item = cacheGet<string | null>(key)\n if (item) {\n return item\n }\n\n const res = getImage(obj, width, height, format)\n cacheSet(key, res)\n\n return res\n}\n\n","import he from 'he'\nimport { makeEntryCacheKey } from './helper'\nimport { cacheGet, cacheSet } from './cache'\nimport { Entry } from './types'\nimport { cleanReply } from './methods'\nimport { ENTITY_REGEX } from './consts'\nimport { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\n\nconst joint = (arr: string[], limit = 200) => {\n let result = '';\n if (arr) {\n for (let i = 0; i < arr.length; i++) {\n // join array with space separator\n if (result) {\n result += \" \";\n }\n // break with length reaches limit\n if (result.length > limit) {\n break;\n } else {\n // make sure last join doesn't break the limit too much\n if ((result + arr[i]).length < limit + 10) {\n result += arr[i];\n } else {\n break;\n }\n }\n }\n }\n return result.trim();\n};\n\n/**\n * Generate a text summary from post body content\n * @param entryBody - The post body content to summarize\n * @param length - Maximum length of the summary (default: 200, use 0 for no truncation)\n * @param platform - Target platform: 'web' for browser/Node.js, 'ios'/'android' for React Native (default: 'web')\n * Controls entity/placeholder handling - 'web' skips placeholder substitution, other values enable it\n */\nfunction postBodySummary(entryBody: string, length: number = 200, platform:'ios'|'android'|'web' = 'web'): string {\n if (!entryBody) {\n return ''\n }\n entryBody = cleanReply(entryBody)\n\n const mdd = new Remarkable({\n html: true,\n breaks: true,\n typographer: false,\n }).use(linkify)\n mdd.core.ruler.enable([\n 'abbr'\n ]);\n mdd.block.ruler.enable([\n 'footnote',\n 'deflist'\n ]);\n mdd.inline.ruler.enable([\n 'footnote_inline',\n 'ins',\n 'mark',\n 'sub',\n 'sup'\n ]);\n\n // Replace entities with deterministic placeholders to preserve them during rendering\n const entities = entryBody.match(ENTITY_REGEX);\n const entityPlaceholders: string[] = [];\n if (entities && platform !== 'web') {\n // Deduplicate entities to avoid duplicate placeholders\n const uniqueEntities = [...new Set(entities)];\n uniqueEntities.forEach((entity, index) => {\n // Use markdown-inert Unicode placeholder (zero-width spaces)\n const placeholder = `\\u200B${index}\\u200B`;\n entityPlaceholders.push(entity);\n // Replace all occurrences of this entity\n entryBody = entryBody.split(entity).join(placeholder);\n })\n }\n\n // Convert markdown to html\n let text = '';\n try {\n text = mdd.render(entryBody)\n } catch (err) {\n // Log error with context for debugging\n console.error('[postBodySummary] Failed to render markdown:', {\n error: err instanceof Error ? err.message : String(err),\n entryBodyLength: entryBody?.length || 0,\n platform\n })\n // Set empty text on error - caller receives empty summary\n text = ''\n }\n\n\n // Restore original entities from placeholders\n if (platform !== 'web' && entityPlaceholders.length > 0) {\n entityPlaceholders.forEach((entity, index) => {\n const placeholder = `\\u200B${index}\\u200B`;\n // Replace all occurrences of the placeholder\n text = text.split(placeholder).join(entity);\n })\n }\n\n\n text = text\n .replace(/(<([^>]+)>)/gi, '') // Remove html tags\n .replace(/\\r?\\n|\\r/g, ' ') // Remove new lines\n .replace(/(?:https?|ftp):\\/\\/[\\n\\S]+/g, '') // Remove urls\n .trim()\n .replace(/ +(?= )/g, '') // Remove all multiple spaces\n\n // Truncate if length > 0 (length === 0 means no truncation)\n if (length > 0) {\n text = joint(text.split(' '), length)\n }\n\n if (text) {\n text = he.decode(text) // decode html entities \n }\n\n return text\n}\n\n/**\n * Generate a text summary from an Entry object or raw string\n * @param obj - Entry object or raw post body string\n * @param length - Maximum length of the summary (default: 200, use 0 for no truncation)\n * @param platform - Target platform: 'web' for browser/Node.js, 'ios'/'android' for React Native (default: 'web')\n * Controls entity/placeholder handling - 'web' skips placeholder substitution, other values enable it\n * @returns Text summary of the post body\n */\nexport function getPostBodySummary(obj: Entry | string, length?: number, platform?:'ios'|'android'|'web'): string {\n // Normalize parameters at function start for consistent behavior and caching\n const normalizedLength = length ?? 200\n const normalizedPlatform = platform || 'web'\n\n if (typeof obj === 'string') {\n return postBodySummary(obj as string, normalizedLength, normalizedPlatform)\n }\n\n const key = `${makeEntryCacheKey(obj)}-sum-${normalizedLength}-${normalizedPlatform}`\n\n const item = cacheGet<string>(key)\n if (item) {\n return item\n }\n\n const res = postBodySummary(obj.body, normalizedLength, normalizedPlatform)\n cacheSet(key, res)\n\n return res\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/consts/white-list.const.ts","../../src/consts/section-list.const.ts","../../src/consts/regexes.const.ts","../../src/consts/allowed-attributes.const.ts","../../src/consts/dom-parser.const.ts","../../src/helper.ts","../../src/methods/get-inner-html.method.ts","../../src/methods/remove-child-nodes.method.ts","../../src/methods/sanitize-html.method.ts","../../src/proxify-image-src.ts","../../src/methods/img.method.ts","../../src/methods/a.method.ts","../../src/methods/iframe.method.ts","../../src/methods/p.method.ts","../../src/methods/linkify.method.ts","../../src/methods/text.method.ts","../../src/methods/traverse.method.ts","../../src/methods/clean-reply.method.ts","../../src/methods/markdown-to-html.method.ts","../../src/cache.ts","../../src/markdown-2-html.ts","../../src/catch-post-image.ts","../../src/post-body-summary.ts"],"names":["XMLDOMParser","XMLSerializer","xss","p","querystring","multihash","img","imgEls","a","match","domSerializerModule","Remarkable","linkify","htmlparser2","he","LRUCache","text"],"mappings":"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","file":"index.cjs","sourcesContent":["export const WHITE_LIST = [\n 'ecency.com',\n 'hive.blog',\n 'peakd.com',\n 'travelfeed.io',\n 'dapplr.in',\n 'leofinance.io',\n 'inleo.io',\n 'proofofbrain.io',\n 'stemgeeks.net',\n 'hiveblockexplorer.com',\n 'proofofbrain.blog',\n 'weedcash.network',\n 'dapplr.in',\n 'liketu.com',\n 'bilpcoin.com',\n 'inji.com'\n]\nexport const OLD_LIST = [\n 'busy.org',\n 'steemit.com',\n 'esteem.app',\n 'steempeak.com',\n 'partiko.app',\n 'chainbb.com',\n 'utopian.io',\n 'steemkr.com',\n 'strimi.pl',\n 'steemhunt.com',\n 'ulogs.org',\n 'hede.io',\n 'naturalmedicine.io'\n]\n","export const SECTION_LIST = [\n 'wallet',\n 'feed',\n 'followers',\n 'following',\n 'points',\n 'communities',\n 'posts',\n 'blog',\n 'comments',\n 'replies',\n 'settings',\n 'engine',\n 'permissions',\n 'referrals',\n 'payout',\n 'activities',\n 'spk',\n 'trail'\n]\n","// link regex\nexport const URL_REGEX = /(https?:\\/\\/[^\\s]+)/g\nexport const IMG_REGEX = /(https?:\\/\\/.*\\.(?:tiff?|jpe?g|gif|png|svg|ico|heic|webp|arw))(.*)/gim\nexport const ECENCY_IMG_REGEX = /https?:\\/\\/images\\.ecency\\.com\\/(?:(?:p|DQm[a-zA-Z0-9]+)\\/)?[^\\s\"'<>]+/gi\nexport const IPFS_REGEX = /^https?:\\/\\/[^/]+\\/(ip[fn]s)\\/([^/?#]+)/gim\nexport const POST_REGEX = /^https?:\\/\\/(.*)\\/(.*)\\/(@[\\w.\\d-]+)\\/(.*)/i\nexport const CCC_REGEX = /^https?:\\/\\/(.*)\\/ccc\\/([\\w.\\d-]+)\\/(.*)/i\nexport const MENTION_REGEX = /^https?:\\/\\/(.*)\\/(@[\\w.\\d-]+)$/i\nexport const TOPIC_REGEX = /^https?:\\/\\/(.*)\\/(trending|hot|created|promoted|muted|payout)\\/(.*)$/i\nexport const INTERNAL_MENTION_REGEX = /^\\/@[\\w.\\d-]+$/i\nexport const INTERNAL_TOPIC_REGEX = /^\\/(trending|hot|created|promoted|muted|payout)\\/(.*)$/i\nexport const INTERNAL_POST_TAG_REGEX = /(.*)\\/(@[\\w.\\d-]+)\\/(.*)/i\nexport const INTERNAL_POST_REGEX = /^\\/(@[\\w.\\d-]+)\\/(.*)$/i\nexport const CUSTOM_COMMUNITY_REGEX = /^https?:\\/\\/(.*)\\/c\\/(hive-\\d+)(.*)/i\nexport const YOUTUBE_REGEX = /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|shorts\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/i\nexport const YOUTUBE_EMBED_REGEX = /^(https?:)?\\/\\/www.youtube.com\\/(embed|shorts)\\/.*/i\nexport const VIMEO_REGEX = /(https?:\\/\\/)?(www\\.)?(?:vimeo)\\.com.*(?:videos|video|channels|)\\/([\\d]+)/i\nexport const VIMEO_EMBED_REGEX = /https:\\/\\/player\\.vimeo\\.com\\/video\\/([0-9]+)(?:$|[?#])/\nexport const BITCHUTE_REGEX = /^(?:https?:\\/\\/)?(?:www\\.)?bitchute.com\\/(?:video|embed)\\/([a-z0-9]+)/i\nexport const D_TUBE_REGEX = /(https?:\\/\\/d\\.tube\\/#!\\/v\\/)(\\w+)\\/(\\w+)/g\nexport const D_TUBE_REGEX2 = /(https?:\\/\\/d\\.tube\\/v\\/)(\\w+)\\/(\\w+)/g\nexport const D_TUBE_EMBED_REGEX = /^https:\\/\\/emb.d.tube\\/#!\\/[^/?#]+\\/[^/?#]+(?:$|[?#])/i\nexport const TWITCH_REGEX = /https?:\\/\\/(?:www.)?twitch.tv\\/(?:(videos)\\/)?([a-zA-Z0-9][\\w]{3,24})/i\nexport const DAPPLR_REGEX = /^(https?:)?\\/\\/[a-z]*\\.dapplr.in\\/file\\/dapplr-videos\\/.*/i\nexport const TRUVVL_REGEX = /^https?:\\/\\/embed.truvvl.com\\/(@[\\w.\\d-]+)\\/(.*)/i\nexport const LBRY_REGEX = /^(https?:)?\\/\\/lbry.tv\\/\\$\\/embed\\/[^?#]+(?:$|[?#])/i\nexport const ODYSEE_REGEX = /^(https?:)?\\/\\/odysee\\.com\\/(?:\\$|%24)\\/embed\\/[^/?#]+(?:$|[?#])/i\nexport const SKATEHIVE_IPFS_REGEX = /^https?:\\/\\/ipfs\\.skatehive\\.app\\/ipfs\\/([^/?#]+)/i\nexport const ARCH_REGEX = /^(https?:)?\\/\\/archive.org\\/embed\\/[^/?#]+(?:$|[?#])/i\nexport const SPEAK_REGEX = /(?:https?:\\/\\/(?:(?:play\\.)?3speak.([a-z]+)\\/watch\\?v=)|(?:(?:play\\.)?3speak.([a-z]+)\\/embed\\?v=))([A-Za-z0-9\\_\\-\\.\\/]+)(&.*)?/i\nexport const SPEAK_EMBED_REGEX = /^(https?:)?\\/\\/(?:play\\.)?3speak.([a-z]+)\\/embed\\?[^/]+$/i\nexport const TWITTER_REGEX = /(?:https?:\\/\\/(?:(?:twitter\\.com\\/(.*?)\\/status\\/(.*))))/gi\nexport const SPOTIFY_REGEX = /^https:\\/\\/open\\.spotify\\.com\\/playlist\\/(.*)?$/gi\nexport const RUMBLE_REGEX = /^https:\\/\\/rumble.com\\/embed\\/([a-zA-Z0-9-]+)\\/\\?pub=\\w+/\nexport const BRIGHTEON_REGEX = /^https?:\\/\\/(www\\.)?brighteon\\.com\\/(?:embed\\/)?(.*[0-9].*)/i\nexport const VIMM_EMBED_REGEX = /^https:\\/\\/www.vimm.tv\\/[^?#]+(?:$|[?#])/i\nexport const SPOTIFY_EMBED_REGEX = /^https:\\/\\/open\\.spotify\\.com\\/(embed|embed-podcast)\\/(playlist|show|episode|track|album)\\/([^/?#]+)(?:$|[?#])/i\nexport const SOUNDCLOUD_EMBED_REGEX = /^https:\\/\\/w.soundcloud.com\\/player\\/\\?[^#]+$/i\nexport const TWITCH_EMBED_REGEX = /^(https?:)?\\/\\/player.twitch.tv\\/(?:\\?[^/]+)?$/i\nexport const BRAND_NEW_TUBE_REGEX = /^https:\\/\\/brandnewtube\\.com\\/embed\\/[a-z0-9]+$/i\nexport const LOOM_REGEX = /^(https?:)?\\/\\/www.loom.com\\/share\\/([^/?#]+)(?:$|[?#])/i\nexport const LOOM_EMBED_REGEX = /^(https?:)?\\/\\/www.loom.com\\/embed\\/([^/?#]+)(?:$|[?#])/i\nexport const AUREAL_EMBED_REGEX = /^(https?:)?\\/\\/(www\\.)?(?:aureal-embed)\\.web\\.app\\/([0-9]+)(?:$|[?#])/i\nexport const ENTITY_REGEX = /&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/ig\nexport const SECTION_REGEX = /\\B(\\#[\\da-zA-Z-_]+\\b)(?!;)/i\nexport const ID_WHITELIST = /^[A-Za-z][-A-Za-z0-9_]*$/\n\n","import { XSSWhiteList } from '../types'\n\nexport const ALLOWED_ATTRIBUTES: XSSWhiteList = {\n 'a': [\n 'href',\n 'target',\n 'rel',\n 'data-permlink',\n 'data-tag',\n 'data-author',\n 'data-href',\n 'data-community',\n 'data-filter',\n 'data-embed-src',\n 'data-youtube',\n 'data-start-time',\n 'data-video-href',\n 'data-proposal',\n 'data-is-inline',\n 'class',\n 'title',\n 'data-id',\n 'id'\n ],\n 'img': [\n 'src',\n 'alt',\n 'class',\n 'loading',\n 'fetchpriority',\n 'decoding',\n 'itemprop'\n ],\n 'span': ['class', 'id', 'data-align'],\n 'iframe': ['src', 'class', 'frameborder', 'allowfullscreen', 'webkitallowfullscreen', 'mozallowfullscreen', 'sandbox'],\n 'video': ['src', 'controls', 'poster'],\n 'div': ['class', 'id', 'data-align'],\n 'strong': [],\n 'b': [],\n 'i': [],\n 'strike': [],\n 'em': [],\n 'code': [],\n 'pre': [],\n 'blockquote': ['class'],\n 'sup': [],\n 'sub': [],\n 'h1': ['dir', 'id', 'data-align'],\n 'h2': ['dir', 'id', 'data-align'],\n 'h3': ['dir', 'id', 'data-align'],\n 'h4': ['dir', 'id', 'data-align'],\n 'h5': ['dir', 'id', 'data-align'],\n 'h6': ['dir', 'id', 'data-align'],\n 'p': ['dir', 'id', 'data-align'],\n 'center': [],\n 'ul': [],\n 'ol': [],\n 'li': [],\n 'table': [],\n 'thead': [],\n 'tbody': [],\n 'tr': [],\n 'td': [],\n 'th': [],\n 'hr': [],\n 'br': [],\n 'del': [],\n 'ins': []\n}\n","import { DOMParser as XMLDOMParser } from '@xmldom/xmldom'\n\n// Lenient error handler that suppresses all parse errors without stopping\n// This allows @xmldom/xmldom to continue parsing malformed HTML instead of throwing ParseError\n// The parser will do its best to construct a valid DOM tree even with mismatched/unclosed tags\n// This maintains compatibility with the old xmldom behavior and provides better UX for users\n// who accidentally write malformed HTML (e.g., forgot to close a tag)\nconst lenientErrorHandler = (level: 'warning' | 'error' | 'fatalError', msg: string) => {\n // Don't throw - just log in development if needed\n // By not throwing, we allow the parser to recover and continue\n // Unlike onErrorStopParsing/onWarningStopParsing defaults, this allows parsing to continue\n if (process.env.NODE_ENV === 'development' && level === 'fatalError') {\n console.warn('[DOMParser]', level, msg)\n }\n}\n\nexport const DOMParser = new XMLDOMParser({\n // Use onError instead of deprecated errorHandler\n // By providing a non-throwing error handler, parsing continues despite malformed HTML\n onError: lenientErrorHandler,\n})\n","import { DOMParser } from './consts'\nimport type { Document } from '@xmldom/xmldom'\n\nexport function createDoc(html: string): Document | null {\n if (html.trim() === '') {\n return null\n }\n\n // Wrap in body tag to handle multiple root elements\n // This is needed because markdownToHTML can generate multiple top-level elements\n // (e.g., <center>...</center><hr />) which DOMParser doesn't accept without a wrapper\n // Using <body> instead of <div> prevents conflicts with <div> elements in the content\n const doc = DOMParser.parseFromString(`<body>${html}</body>`, 'text/html')\n\n return doc\n}\n\nexport function makeEntryCacheKey(entry: any): string {\n return `${entry.author}-${entry.permlink}-${entry.last_update}-${entry.updated}`\n}\n\nexport function extractYtStartTime(url:string):string {\n try {\n const urlObj = new URL(url);\n const params = new URLSearchParams(urlObj.search);\n if(params.has('t')){\n const t = params.get('t');\n return '' + parseInt(t || '0'); //parsing is important as sometimes t is famated '123s';\n }else if (params.has('start')){\n return params.get('start') || '';\n }\n return '';\n } catch (error) {\n return '';\n }\n}\nexport function sanitizePermlink(permlink: string): string {\n if (!permlink || typeof permlink !== 'string') {\n return ''\n }\n\n const [withoutQuery] = permlink.split('?')\n const [cleaned] = withoutQuery.split('#')\n\n return cleaned\n}\n\nexport function isValidPermlink(permlink: string): boolean {\n const sanitized = sanitizePermlink(permlink)\n\n if (!sanitized) {\n return false\n }\n\n // Should not contain image extensions, query params, or fragments\n const isImage = /\\.(jpg|jpeg|png|webp|gif|svg)$/i.test(sanitized)\n const isCleanFormat = /^[a-z0-9-]+$/.test(sanitized) // Hive standard\n\n return isCleanFormat && !isImage\n}\n\n// Reference: https://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_syntax\n// Hive account names must follow similar rules to DNS (RFC 1035)\nconst LABEL_REGEX = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;\n\nexport function isValidUsername(username: string): boolean {\n if (!username || typeof username !== 'string') return false;\n if (username.length > 16) return false;\n\n const labels = username.split('.');\n\n return labels.every(label => {\n return (\n label.length >= 3 &&\n label.length <= 16 &&\n /^[a-z]/.test(label) && // must start with a letter\n LABEL_REGEX.test(label) && // a-z0-9, hyphens, no start/end hyphen\n !label.includes('..') // double dots are impossible after split, but just in case\n );\n });\n}\n\n\n\n","import { XMLSerializer } from '@xmldom/xmldom'\n\nexport function getSerializedInnerHTML(node: Node): string {\n const serializer = new XMLSerializer()\n\n if (node.childNodes[0]) {\n return serializer.serializeToString(node.childNodes[0])\n }\n\n return ''\n}\n","export function removeChildNodes(node: Node): void {\n // Remove children using stable snapshot to avoid live collection issues\n while (node.firstChild) {\n node.removeChild(node.firstChild)\n }\n}\n","import xss from 'xss'\nimport {ALLOWED_ATTRIBUTES, ID_WHITELIST} from '../consts'\n\nconst decodeEntities = (input: string): string =>\n input\n .replace(/&#(\\d+);?/g, (_, dec) => String.fromCodePoint(Number(dec)))\n .replace(/&#x([0-9a-f]+);?/gi, (_, hex) => String.fromCodePoint(parseInt(hex, 16)));\n\nexport function sanitizeHtml(html: string): string {\n return xss(html, {\n whiteList: ALLOWED_ATTRIBUTES,\n stripIgnoreTag: true,\n stripIgnoreTagBody: ['style'],\n css: false, // block style attrs entirely for safety\n onTagAttr: (tag, name, value) => {\n const decoded = decodeEntities(value.trim());\n const decodedLower = decoded.toLowerCase();\n\n if (name.startsWith('on')) return ''; // 🛡 event handlers\n if (tag === 'img' && name === 'src' && (!/^https?:\\/\\//.test(decodedLower) || decodedLower.startsWith('javascript:'))) return '';\n if (\n tag === 'video' && ['src', 'poster'].includes(name) &&\n (!/^https?:\\/\\//.test(decodedLower) || decodedLower.startsWith('javascript:'))\n ) return '';\n if (tag === 'img' && ['dynsrc', 'lowsrc'].includes(name)) return '';\n if (tag === 'span' && name === 'class' && decoded.toLowerCase().trim() === 'wr') return '';\n if (name === 'id') {\n if (!ID_WHITELIST.test(decoded)) return '';\n }\n return undefined;\n }\n });\n}\n","import multihash from 'multihashes'\nimport querystring from 'querystring'\n\nlet proxyBase = 'https://images.ecency.com'\nlet fileExtension = true\n\nexport function setProxyBase(p: string): void {\n proxyBase = p\n fileExtension = proxyBase == 'https://images.ecency.com';\n}\n\nexport function extractPHash(url: string): string | null {\n if (url.startsWith(`${proxyBase}/p/`)) {\n const [hash] = url.split('/p/')[1].split('?')\n return hash.replace(/.webp/,'').replace(/.png/,'')\n }\n return null\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n return Boolean(new URL(url));\n }\n catch(e){\n return false;\n }\n}\n\nexport function getLatestUrl(str: string): string {\n const [last] = [...str.replace(/https?:\\/\\//g, '\\n$&').trim().split('\\n')].reverse()\n return last\n}\n\nexport function proxifyImageSrc(url?: string, width = 0, height = 0, format = 'match') {\n if (!url || typeof url !== 'string' || !isValidUrl(url)) {\n return ''\n }\n\n // skip images already proxified with images.hive.blog\n if (url.indexOf('https://images.hive.blog/') === 0 && url.indexOf('https://images.hive.blog/D') !== 0) {\n return url.replace('https://images.hive.blog', proxyBase)\n }\n\n if (url.indexOf('https://steemitimages.com/') === 0 && url.indexOf('https://steemitimages.com/D') !== 0) {\n return url.replace('https://steemitimages.com', proxyBase)\n }\n\n const realUrl = getLatestUrl(url)\n const pHash = extractPHash(realUrl)\n\n const options: Record<string, string | number> = {\n format,\n mode: 'fit',\n }\n\n if (width > 0) {\n options.width = width\n }\n\n if (height > 0) {\n options.height = height\n }\n\n const qs = querystring.stringify(options)\n\n if (pHash) {\n if (fileExtension) {\n return `${proxyBase}/p/${pHash}${format==='webp'?'.webp':'.png'}?${qs}`\n } else {\n return `${proxyBase}/p/${pHash}?${qs}`\n }\n }\n\n const b58url = multihash.toB58String(Buffer.from(realUrl.toString()))\n\n return `${proxyBase}/p/${b58url}${fileExtension ? format==='webp'?'.webp':'.png' : ''}?${qs}`\n}\n","import { proxifyImageSrc } from \"../proxify-image-src\";\n\nexport function img(el: HTMLElement, webp: boolean, state?: { firstImageFound: boolean }): void {\n let src = el.getAttribute(\"src\") || \"\";\n\n // Normalize encoded characters\n const decodedSrc = decodeURIComponent(\n src.replace(/&#(\\d+);/g, (_, dec) => String.fromCharCode(dec))\n .replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n ).trim();\n\n // ❌ Remove if javascript or empty/invalid\n const isInvalid = !src || decodedSrc.startsWith(\"javascript\") || decodedSrc.startsWith(\"vbscript\") || decodedSrc === \"x\";\n if (isInvalid) {\n src = \"\"\n }\n\n // ❌ Skip relative paths (e.g., `photo.jpg`, `./photo.png`, `assets/pic.jpeg`)\n // Use trimmed decodedSrc for protocol check to handle leading/trailing whitespace\n const isRelative = !/^https?:\\/\\//i.test(decodedSrc) && !decodedSrc.startsWith(\"/\");\n if (isRelative) {\n //console.warn(\"Skipped relative image:\", src);\n src = \"\"\n }\n\n // Sanitize any dynamic or low-res src-like attributes\n [\"onerror\", \"dynsrc\", \"lowsrc\", \"width\", \"height\"].forEach(attr => el.removeAttribute(attr));\n\n el.setAttribute(\"itemprop\", \"image\");\n const isLCP = state && !state.firstImageFound;\n\n if (isLCP) {\n el.setAttribute(\"loading\", \"eager\");\n el.setAttribute(\"fetchpriority\", \"high\");\n state.firstImageFound = true;\n } else {\n el.setAttribute(\"loading\", \"lazy\");\n el.setAttribute(\"decoding\", \"async\");\n }\n\n\n const cls = el.getAttribute(\"class\") || \"\";\n const shouldReplace = !cls.includes(\"no-replace\");\n const hasAlreadyProxied = src.startsWith(\"https://images.ecency.com\");\n\n if (shouldReplace && !hasAlreadyProxied) {\n const proxified = proxifyImageSrc(src, 0, 0, webp ? \"webp\" : \"match\");\n el.setAttribute(\"src\", proxified);\n }\n}\n\nexport function createImageHTML(src: string, isLCP: boolean, webp: boolean): string {\n const loading = isLCP ? 'eager' : 'lazy';\n const fetch = isLCP ? 'fetchpriority=\"high\"' : 'decoding=\"async\"';\n const proxified = proxifyImageSrc(src, 0, 0, webp ? 'webp' : 'match');\n return `<img\n class=\"markdown-img-link\"\n src=\"${proxified}\"\n loading=\"${loading}\"\n ${fetch}\n itemprop=\"image\"\n />`;\n}\n","import {\n BITCHUTE_REGEX,\n CUSTOM_COMMUNITY_REGEX,\n INTERNAL_POST_REGEX,\n INTERNAL_POST_TAG_REGEX,\n D_TUBE_REGEX,\n D_TUBE_REGEX2,\n IMG_REGEX,\n IPFS_REGEX,\n MENTION_REGEX,\n INTERNAL_MENTION_REGEX,\n TOPIC_REGEX,\n INTERNAL_TOPIC_REGEX,\n POST_REGEX,\n CCC_REGEX,\n SPEAK_REGEX,\n TWITCH_REGEX,\n TWITTER_REGEX,\n VIMEO_REGEX,\n WHITE_LIST,\n YOUTUBE_REGEX,\n SPOTIFY_REGEX,\n RUMBLE_REGEX,\n BRIGHTEON_REGEX,\n DOMParser,\n LOOM_REGEX,\n SECTION_REGEX,\n SECTION_LIST\n} from '../consts'\nimport { getSerializedInnerHTML } from './get-inner-html.method'\nimport { proxifyImageSrc } from '../proxify-image-src'\nimport { removeChildNodes } from './remove-child-nodes.method'\nimport { extractYtStartTime, isValidPermlink, isValidUsername, sanitizePermlink } from '../helper'\nimport { createImageHTML } from \"./img.method\";\n\nconst normalizeValue = (value?: string | null): string => (value ? value.trim() : '')\n\nconst matchesHref = (href: string, value?: string | null): boolean => {\n const normalizedHref = normalizeValue(href)\n if (!normalizedHref) {\n return false\n }\n\n return normalizeValue(value) === normalizedHref\n}\n\nconst getInlineMeta = (el: HTMLElement, href: string) => {\n const textMatches = matchesHref(href, el.textContent)\n const titleMatches = matchesHref(href, el.getAttribute('title'))\n\n return {\n textMatches,\n titleMatches,\n isInline: textMatches || titleMatches\n }\n}\n\n/**\n * Adds a line break before inline post links in mobile app mode\n * This ensures enhanced post links (where the raw URL is displayed) render on separate lines\n * in React Native where CSS display properties don't work the same way as in browsers\n */\nconst addLineBreakBeforePostLink = (el: HTMLElement, forApp: boolean, isInline: boolean): void => {\n if (forApp && isInline && el.parentNode) {\n const br = el.ownerDocument.createElement('br')\n el.parentNode.insertBefore(br, el)\n }\n}\n\nexport function a(el: HTMLElement | null, forApp: boolean, webp: boolean, parentDomain: string = 'ecency.com'): void {\n if (!el || !el.parentNode) {\n return\n }\n let href = el.getAttribute('href')\n\n // Continue if href has no value\n if (!href) {\n return\n }\n\n const className = el.getAttribute('class')\n\n // Don't touch user and hashtag links\n if (['markdown-author-link', 'markdown-tag-link'].indexOf(className) !== -1) {\n return\n }\n\n // Do not allow js hrefs (case-insensitive, with colon)\n if (href && href.trim().toLowerCase().startsWith('javascript:')) {\n el.removeAttribute('href')\n return\n }\n\n // if href is an image url and innerHTML same with href then mark it as image\n // & => & can break equality\n if (\n href.match(IMG_REGEX) &&\n href.trim().replace(/&/g, '&') ===\n getSerializedInnerHTML(el).trim().replace(/&/g, '&')\n ) {\n const isLCP = false; // LCP handled elsewhere\n const imgHTML = createImageHTML(href, isLCP, webp);\n const doc = DOMParser.parseFromString(imgHTML, 'text/html');\n const replaceNode = doc.body?.firstChild || doc.firstChild\n\n if (replaceNode) {\n const importedNode = el.ownerDocument.importNode(replaceNode, true)\n el.parentNode.replaceChild(importedNode, el)\n }\n\n return\n }\n\n if (\n href.match(IPFS_REGEX) &&\n href.trim().replace(/&/g, '&') ===\n getSerializedInnerHTML(el).trim().replace(/&/g, '&') &&\n href.indexOf('#') === -1\n ) {\n if (forApp) {\n el.setAttribute('data-href', href)\n el.removeAttribute('href')\n }\n\n el.setAttribute('class', 'markdown-img-link')\n\n removeChildNodes(el)\n\n const img = el.ownerDocument.createElement('img')\n img.setAttribute('src', href)\n el.appendChild(img)\n\n return\n }\n\n // If a hive post\n const postMatch = href.match(POST_REGEX)\n if (postMatch && WHITE_LIST.includes(postMatch[1].replace(/^www\\./,''))) {\n el.setAttribute('class', 'markdown-post-link')\n\n const tag = postMatch[2]\n const author = postMatch[3].replace('@', '')\n const permlink = sanitizePermlink(postMatch[4])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n\n addLineBreakBeforePostLink(el, forApp, isInline)\n return\n }\n\n // If a hive user with url\n const mentionMatch = href.match(MENTION_REGEX)\n if (mentionMatch && WHITE_LIST.includes(mentionMatch[1].replace(/^www\\./,'')) && mentionMatch.length === 3) {\n const _author = mentionMatch[2].replace('@', '')\n if (!isValidUsername(_author)) return\n const author = _author.toLowerCase()\n\n el.setAttribute('class', 'markdown-author-link')\n\n if (author.indexOf('/')===-1) {\n if (el.textContent === href) {\n el.textContent = `@${author}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-author', author)\n } else {\n const h = `/@${author}`\n el.setAttribute('href', h)\n }\n }\n return\n }\n\n // If a tagged post and profile section links\n const tpostMatch = href.match(INTERNAL_POST_TAG_REGEX)\n\n // Extract and validate domain from tpostMatch[1]\n let isValidDomain = false;\n if (tpostMatch && tpostMatch.length === 4) {\n if (tpostMatch[1].indexOf('/') === 0) {\n // Internal path like /ecency/@user/post\n isValidDomain = true;\n } else if (tpostMatch[1].includes('.')) {\n // Extract domain from URL (strip protocol and www.)\n const domain = tpostMatch[1]\n .replace(/^https?:\\/\\//, '') // Remove protocol\n .replace(/^www\\./, '') // Remove www. prefix\n isValidDomain = WHITE_LIST.includes(domain);\n }\n }\n\n if (isValidDomain) {\n // check if permlink is section or section with params ?q=xyz\n // Split on '?' first to get path segment\n const pathSegment = tpostMatch[3].split('?')[0]\n if (SECTION_LIST.some(v => pathSegment === v || pathSegment.startsWith(v + '/'))) {\n el.setAttribute('class', 'markdown-profile-link')\n const author = tpostMatch[2].replace('@', '').toLowerCase()\n const section = tpostMatch[3]\n\n if (!isValidPermlink(section)) return;\n if (el.textContent === href) {\n el.textContent = `@${author}/${section}`\n }\n if (forApp) {\n const ha = `https://ecency.com/@${author}/${section}`\n el.setAttribute('href', ha)\n } else {\n const h = `/@${author}/${section}`\n el.setAttribute('href', h)\n }\n return\n } else {\n // Domain already validated in outer if condition\n let tag = 'post'\n // check if tag does exist and doesn't include dot likely word/tag\n if (tpostMatch[1] && !tpostMatch[1].includes('.')) {\n [, tag] = tpostMatch\n tag = tag.replace('/', '')\n }\n\n el.setAttribute('class', 'markdown-post-link')\n const author = tpostMatch[2].replace('@', '')\n const permlink = sanitizePermlink(tpostMatch[3])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n\n addLineBreakBeforePostLink(el, forApp, isInline)\n return\n }\n }\n\n // If a hive user with internal url\n const imentionMatch = href.match(INTERNAL_MENTION_REGEX)\n if (imentionMatch) {\n const _author = imentionMatch[0].replace('/@', '')\n if (!isValidUsername(_author)) return\n const author = _author.toLowerCase()\n\n el.setAttribute('class', 'markdown-author-link')\n if (author.indexOf('/')===-1) {\n if (el.textContent === href) {\n el.textContent = `@${author}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-author', author)\n } else {\n const h = `/@${author}`\n el.setAttribute('href', h)\n }\n }\n return\n }\n\n // If a copied post and profile section links\n const cpostMatch = href.match(INTERNAL_POST_REGEX)\n if (\n (cpostMatch && cpostMatch.length === 3 && cpostMatch[1].indexOf('@') === 0)\n ) {\n // Split on '?' first to get path segment\n const pathSegment2 = cpostMatch[2].split('?')[0]\n if (SECTION_LIST.some(v => pathSegment2 === v || pathSegment2.startsWith(v + '/'))) {\n el.setAttribute('class', 'markdown-profile-link')\n const author = cpostMatch[1].replace('@', '').toLowerCase()\n const section = cpostMatch[2]\n\n if (el.textContent === href) {\n el.textContent = `@${author}/${section}`\n }\n if (forApp) {\n const ha = `https://ecency.com/@${author}/${section}`\n el.setAttribute('href', ha)\n } else {\n const h = `/@${author}/${section}`\n el.setAttribute('href', h)\n }\n return\n } else {\n el.setAttribute('class', 'markdown-post-link')\n\n const tag = 'post'\n\n const author = cpostMatch[1].replace('@', '')\n const permlink = sanitizePermlink(cpostMatch[2])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n\n addLineBreakBeforePostLink(el, forApp, isInline)\n return\n }\n }\n\n // If topic with filters url\n const topicMatch = href.match(TOPIC_REGEX)\n if (topicMatch && WHITE_LIST.includes(topicMatch[1].replace(/^www\\./,'')) && topicMatch.length === 4) {\n el.setAttribute('class', 'markdown-tag-link')\n const filter = topicMatch[2]\n const tag = topicMatch[3]\n\n if (el.textContent === href) {\n el.textContent = `/${filter}/${tag}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-filter', filter)\n el.setAttribute('data-tag', tag)\n } else {\n const h = `/${filter}/${tag}`\n el.setAttribute('href', h)\n }\n return\n }\n\n // If topic with filters internal url\n const itopicMatch = href.match(INTERNAL_TOPIC_REGEX)\n if (itopicMatch && itopicMatch.length === 3) {\n el.setAttribute('class', 'markdown-tag-link')\n const filter = itopicMatch[1]\n const tag = itopicMatch[2]\n\n if (el.textContent === href) {\n el.textContent = `/${filter}/${tag}`\n }\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-filter', filter)\n el.setAttribute('data-tag', tag)\n } else {\n const h = `/${filter}/${tag}`\n el.setAttribute('href', h)\n }\n return\n }\n\n // If a custom hive community link\n const comMatch = href.match(CUSTOM_COMMUNITY_REGEX)\n if (comMatch && WHITE_LIST.includes(comMatch[1].replace(/^www\\./,''))) {\n el.setAttribute('class', 'markdown-community-link')\n\n const community = comMatch[2]\n let filter = comMatch[3].substring(1)\n if (!filter) filter = 'created'\n if (filter === 'about' || filter === 'discord') {\n filter = 'created'\n }\n if (el.textContent === href) {\n el.textContent = `${filter}/${community}`\n }\n\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-community', community)\n el.setAttribute('data-filter', filter)\n } else {\n const h = `/${filter}/${community}`\n el.setAttribute('href', h)\n }\n return\n }\n\n // If a collections post\n const cccMatch = href.match(CCC_REGEX)\n if (cccMatch && WHITE_LIST.includes(cccMatch[1].replace(/^www\\./,''))) {\n el.setAttribute('class', 'markdown-post-link')\n\n const tag = 'ccc'\n const author = cccMatch[2].replace('@', '')\n const permlink = sanitizePermlink(cccMatch[3])\n\n if (!isValidPermlink(permlink)) return;\n\n const inlineMeta = getInlineMeta(el, href)\n\n if (inlineMeta.textMatches) {\n el.textContent = `@${author}/${permlink}`\n }\n const isInline = inlineMeta.isInline\n if (forApp) {\n el.removeAttribute('href')\n\n el.setAttribute('data-href', href)\n el.setAttribute('data-is-inline', '' + isInline)\n el.setAttribute('data-tag', tag)\n el.setAttribute('data-author', author)\n el.setAttribute('data-permlink', permlink)\n } else {\n const h = `/${tag}/@${author}/${permlink}`\n el.setAttribute('href', h)\n el.setAttribute('data-is-inline', '' + isInline)\n }\n addLineBreakBeforePostLink(el, forApp, isInline)\n return\n }\n\n\n const BCmatch = href.match(BITCHUTE_REGEX)\n if (BCmatch && BCmatch[1] && el.textContent.trim() === href) {\n const vid = BCmatch[1]\n el.setAttribute('class', 'markdown-video-link')\n el.removeAttribute('href')\n\n const embedSrc = `https://www.bitchute.com/embed/${vid}/`\n\n el.textContent = ''\n\n el.setAttribute('data-embed-src', embedSrc)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n\n const RBmatch = href.match(RUMBLE_REGEX)\n if (RBmatch && RBmatch[1] && el.textContent.trim() === href) {\n const vid = RBmatch[1]\n const embedSrc = `https://www.rumble.com/embed/${vid}/?pub=4`\n el.setAttribute('class', 'markdown-video-link')\n el.removeAttribute('href')\n\n el.textContent = ''\n el.setAttribute('data-embed-src', embedSrc)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n\n const BNmatch = href.match(BRIGHTEON_REGEX)\n if (BNmatch && BNmatch[2] && el.textContent.trim() === href) {\n const vid = BNmatch[2]\n const embedSrc = `https://www.brighteon.com/embed/${vid}`\n el.setAttribute('class', 'markdown-video-link')\n el.removeAttribute('href')\n\n el.textContent = ''\n el.setAttribute('data-embed-src', embedSrc)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n\n // If a youtube video\n let match = href.match(YOUTUBE_REGEX)\n if (match && match[1] && el.textContent.trim() === href) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-youtube')\n el.removeAttribute('href')\n\n const vid = match[1]\n const thumbnail = proxifyImageSrc(`https://img.youtube.com/vi/${vid.split('?')[0]}/hqdefault.jpg`, 0, 0, webp ? 'webp' : 'match')\n const embedSrc = `https://www.youtube.com/embed/${vid}?autoplay=1`\n\n el.textContent = ''\n\n el.setAttribute('data-embed-src', embedSrc);\n el.setAttribute('data-youtube', vid);\n\n //extract start time if available\n const startTime = extractYtStartTime(href);\n if(startTime){\n el.setAttribute('data-start-time', startTime);\n }\n\n const thumbImg = el.ownerDocument.createElement('img')\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('itemprop', 'thumbnailUrl')\n thumbImg.setAttribute('src', thumbnail)\n\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n\n el.appendChild(thumbImg)\n el.appendChild(play)\n\n return\n }\n\n // If vimeo video\n match = href.match(VIMEO_REGEX)\n if (match && match[3] && href === el.textContent) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-vimeo')\n el.removeAttribute('href')\n\n const embedSrc = `https://player.vimeo.com/video/${match[3]}`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n el.appendChild(ifr)\n\n return\n }\n\n // If twitch video\n match = href.match(TWITCH_REGEX)\n if (match && match[2] && href === el.textContent) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-twitch')\n el.removeAttribute('href')\n\n let embedSrc = ''\n const parent = parentDomain ? `&parent=${parentDomain}` : ''\n\n if (match[1] === undefined) {\n // No \"videos\" in URL, match[2] is the channel name\n embedSrc = `https://player.twitch.tv/?channel=${match[2]}${parent}`\n } else if (match[1] === 'videos') {\n // URL contains \"videos/\", match[2] is the video ID\n embedSrc = `https://player.twitch.tv/?video=${match[2]}${parent}`\n } else {\n // Fallback (shouldn't happen with current regex)\n embedSrc = `https://player.twitch.tv/?channel=${match[2]}${parent}`\n }\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n el.appendChild(ifr)\n\n return\n }\n\n // If a spotify audio\n if (el.textContent.trim() === href) {\n SPOTIFY_REGEX.lastIndex = 0 // Reset regex state\n match = SPOTIFY_REGEX.exec(href)\n if (match && match[1]) {\n el.setAttribute('class', 'markdown-audio-link markdown-audio-link-spotify')\n el.removeAttribute('href')\n\n const embedSrc = `https://open.spotify.com/embed/playlist/${match[1]}`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n ifr.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups')\n el.appendChild(ifr)\n\n return\n }\n }\n\n // If a Loom video\n match = href.match(LOOM_REGEX)\n if (match && match[2] && el.textContent.trim() === href) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-loom')\n el.removeAttribute('href')\n\n const embedSrc = `https://www.loom.com/embed/${match[2]}`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('allowfullscreen', 'true')\n ifr.setAttribute('src', embedSrc)\n ifr.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups')\n el.appendChild(ifr)\n\n return\n }\n\n // If a d.tube video\n // Only d.tube links contains an image\n const imgEls = el.getElementsByTagName('img')\n\n if (imgEls.length === 1 || el.textContent.trim() === href) {\n D_TUBE_REGEX.lastIndex = 0 // Reset regex state\n match = D_TUBE_REGEX.exec(href)\n // match[2] = username, match[3] object id\n if (match && match[2] && match[3]) {\n el.setAttribute('class', 'markdown-video-link markdown-video-link-dtube')\n el.removeAttribute('href')\n\n const videoHref = `https://emb.d.tube/#!/${match[2]}/${match[3]}`\n\n // el.setAttribute('data-video-href', videoHref)\n el.setAttribute('data-embed-src', videoHref)\n\n //process thumb img element\n if (imgEls.length === 1) {\n const src = imgEls[0].getAttribute('src')\n if (src) {\n const thumbnail = proxifyImageSrc(src.replace(/\\s+/g, ''), 0, 0, webp ? 'webp' : 'match')\n const thumbImg = el.ownerDocument.createElement('img')\n\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('itemprop', 'thumbnailUrl')\n\n thumbImg.setAttribute('src', thumbnail)\n el.appendChild(thumbImg)\n\n // Remove image.\n el.removeChild(imgEls[0])\n }\n } else {\n el.textContent = '';\n }\n\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n\n el.appendChild(play)\n\n return\n }\n }\n D_TUBE_REGEX2.lastIndex = 0 // Reset regex state\n match = D_TUBE_REGEX2.exec(href)\n if (match && match[2] && match[3]) {\n // match[2] = username, match[3] object id\n el.setAttribute('class', 'markdown-video-link markdown-video-link-dtube')\n el.removeAttribute('href')\n el.textContent = '';\n\n const videoHref = `https://emb.d.tube/#!/${match[2]}/${match[3]}`\n\n // el.setAttribute('data-video-href', videoHref);\n el.setAttribute('data-embed-src', videoHref)\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n\n el.appendChild(play)\n\n return\n }\n\n // Detect 3Speak\n match = href.match(SPEAK_REGEX)\n if (match) {\n const imgEls = el.getElementsByTagName('img')\n if (imgEls.length === 1 || el.textContent.trim() === href) {\n // match[1] / match[2] = tld , match[3] = embed address\n if ((match[1] || match[2]) && match[3]) {\n const videoHref = `https://3speak.tv/embed?v=${match[3]}`\n el.setAttribute('class', 'markdown-video-link markdown-video-link-speak')\n el.removeAttribute('href')\n el.setAttribute('data-embed-src', videoHref)\n if (el.textContent.trim() === href) {\n el.textContent = ''\n }\n if (imgEls.length === 1) {\n const src = imgEls[0].getAttribute('src')\n if (src) {\n const thumbnail = proxifyImageSrc(src.replace(/\\s+/g, ''), 0, 0, webp ? 'webp' : 'match')\n const thumbImg = el.ownerDocument.createElement('img')\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('itemprop', 'thumbnailUrl')\n thumbImg.setAttribute('src', thumbnail)\n el.appendChild(thumbImg)\n // Remove image.\n el.removeChild(imgEls[0])\n }\n }\n\n const play = el.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n el.appendChild(play)\n return\n }\n }\n }\n\n // If tweets\n const matchT = href.match(TWITTER_REGEX)\n if (matchT && el.textContent.trim() === href) {\n TWITTER_REGEX.lastIndex = 0 // Reset for exec() after match()\n const e = TWITTER_REGEX.exec(href)\n if (e) {\n const url = e[0].replace(/(<([^>]+)>)/gi, '')\n const author = e[1].replace(/(<([^>]+)>)/gi, '')\n\n // Use proper DOM construction to avoid XSS from unescaped url/author\n const blockquote = el.ownerDocument.createElement('blockquote')\n blockquote.setAttribute('class', 'twitter-tweet')\n\n const p = el.ownerDocument.createElement('p')\n p.textContent = url // textContent automatically escapes\n\n const textNode = el.ownerDocument.createTextNode('- ')\n\n const a = el.ownerDocument.createElement('a')\n a.setAttribute('href', url) // setAttribute escapes automatically\n a.textContent = author // textContent automatically escapes\n\n blockquote.appendChild(p)\n blockquote.appendChild(textNode)\n blockquote.appendChild(a)\n\n el.parentNode.replaceChild(blockquote, el)\n return\n }\n }\n\n if (href.indexOf('https://hivesigner.com/sign/account-witness-vote?witness=') === 0 && forApp) {\n el.setAttribute('class', 'markdown-witnesses-link')\n el.setAttribute('data-href', href)\n el.removeAttribute('href')\n return\n }\n\n if (href.indexOf('hivesigner.com/sign/update-proposal-votes?proposal_ids') >= 0 && forApp) {\n try {\n const m = decodeURI(href).match(/proposal_ids=\\[(\\d+)]/)\n if (m) {\n el.setAttribute('class', 'markdown-proposal-link')\n el.setAttribute('data-href', href)\n el.setAttribute('data-proposal', m[1])\n el.removeAttribute('href')\n return\n }\n } catch (e) {\n // Invalid URI encoding, skip processing\n }\n }\n\n // If nothing matched element as external link so it will be opened in external window\n el.setAttribute('class', 'markdown-external-link')\n\n // Prepend https if no scheme provided\n if (!(/^((#)|(mailto:)|(\\/(?!\\/))|(((steem|hive|esteem|ecency|https?):)?\\/\\/))/.test(href))) {\n href = `https://${href}`\n }\n\n if (forApp) {\n el.setAttribute('data-href', href)\n const match = href.match(YOUTUBE_REGEX)\n if (match && match[1]) {\n const vid = match[1]\n el.setAttribute('data-youtube', vid);\n\n //extract start time if available\n const startTime = extractYtStartTime(href);\n if(startTime){\n el.setAttribute('data-start-time', startTime);\n }\n }\n el.removeAttribute('href')\n } else {\n const matchS = href.match(SECTION_REGEX)\n if(matchS) {\n el.setAttribute('class', 'markdown-internal-link');\n } else {\n el.setAttribute('target', '_blank');\n el.setAttribute('rel', 'noopener');\n }\n el.setAttribute('href', href)\n }\n}\n\n\n\n","import { ARCH_REGEX, DAPPLR_REGEX, LBRY_REGEX, TRUVVL_REGEX, ODYSEE_REGEX, SKATEHIVE_IPFS_REGEX, BITCHUTE_REGEX, RUMBLE_REGEX, BRIGHTEON_REGEX, VIMEO_EMBED_REGEX, SPEAK_EMBED_REGEX, VIMM_EMBED_REGEX, D_TUBE_EMBED_REGEX, SPOTIFY_EMBED_REGEX, SOUNDCLOUD_EMBED_REGEX, TWITCH_EMBED_REGEX, YOUTUBE_EMBED_REGEX, BRAND_NEW_TUBE_REGEX, LOOM_EMBED_REGEX, AUREAL_EMBED_REGEX } from '../consts'\n\nexport function iframe(el: HTMLElement | null, parentDomain: string = 'ecency.com'): void {\n if (!el || !el.parentNode) {\n return;\n }\n const src = el.getAttribute('src');\n if (!src) {\n el.parentNode.removeChild(el);\n return;\n }\n\n // Youtube\n if (src.match(YOUTUBE_EMBED_REGEX)) {\n // strip query string (yt: autoplay=1,controls=0,showinfo=0, etc)\n const s = src.replace(/\\?.+$/, '');\n el.setAttribute('src', s);\n return;\n }\n\n if (src.match(BITCHUTE_REGEX)) {\n return;\n }\n\n // Vimeo\n const m = src.match(VIMEO_EMBED_REGEX);\n if (m && m.length === 2) {\n const s = `https://player.vimeo.com/video/${m[1]}`;\n el.setAttribute('src', s);\n return;\n }\n\n // Twitch\n if (src.match(TWITCH_EMBED_REGEX)) {\n let s = src;\n // Only add parent if not present\n if (!s.includes('parent=')) {\n const separator = s.includes('?') ? '&' : '?';\n s = `${s}${separator}parent=${parentDomain}`;\n }\n // Only add autoplay if not present\n if (!s.includes('autoplay=')) {\n const separator = s.includes('?') ? '&' : '?';\n s = `${s}${separator}autoplay=false`;\n }\n el.setAttribute('src', s);\n return;\n }\n\n // 3Speak\n if (src.match(SPEAK_EMBED_REGEX)) {\n // Normalize domain to 3speak.tv\n let normalizedSrc = src.replace(/3speak\\.[a-z]+/i, '3speak.tv');\n\n // Add autoplay if not present\n const hasAutoplay = /[?&]autoplay=/.test(normalizedSrc);\n const s = hasAutoplay\n ? normalizedSrc\n : `${normalizedSrc}&autoplay=true`;\n el.setAttribute('src', s);\n return;\n }\n\n // Spotify\n if (src.match(SPOTIFY_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Soundcloud\n if (src.match(SOUNDCLOUD_EMBED_REGEX)) {\n const match = src.match(/url=(.+?)(?:&|$)/); // Handle & or end of string\n if (match && match[1]) {\n const s = `https://w.soundcloud.com/player/?url=${match[1]}&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true`;\n el.setAttribute('src', s);\n }\n return; // Always return, even if match fails\n }\n\n // Dtube\n if (src.match(D_TUBE_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // VIMM\n if (src.match(VIMM_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // Dapplr\n if (src.match(DAPPLR_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n el.setAttribute('frameborder', '0');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // Truvvl\n if (src.match(TRUVVL_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\n el.setAttribute('frameborder', '0');\n el.setAttribute('class', 'portrait-embed');\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // LBRY.tv\n if (src.match(LBRY_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // ODYSEE\n if (src.match(ODYSEE_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // IPFS Skatehive\n if (src.match(SKATEHIVE_IPFS_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('allowfullscreen', 'true');\n return;\n }\n\n // archive.org\n if (src.match(ARCH_REGEX)) {\n el.setAttribute('src', src);\n return;\n }\n\n // Rumble\n if (src.match(RUMBLE_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Brighteon\n if (src.match(BRIGHTEON_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Brandnew Tube\n if (src.match(BRAND_NEW_TUBE_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Loom\n if (src.match(LOOM_EMBED_REGEX)) {\n el.setAttribute('src', src);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n // Aureal\n if (src.match(AUREAL_EMBED_REGEX)) {\n // Normalize protocol-relative URLs to https://\n const normalizedSrc = src.startsWith('//') ? `https:${src}` : src;\n el.setAttribute('src', normalizedSrc);\n el.setAttribute('frameborder', '0');\n return;\n }\n\n const replaceNode = el.ownerDocument.createElement('div');\n replaceNode.setAttribute('class', 'unsupported-iframe');\n replaceNode.textContent = `(Unsupported ${src})`;\n if (el.parentNode) {\n el.parentNode.insertBefore(replaceNode, el);\n el.parentNode.removeChild(el);\n }\n}\n","export function p(el: HTMLElement): void {\n const dir = el.getAttribute('dir')\n if (!dir) {\n el.setAttribute('dir', 'auto')\n }\n}\n","import { IMG_REGEX, SECTION_LIST } from '../consts'\nimport { proxifyImageSrc } from '../proxify-image-src'\nimport { isValidPermlink, isValidUsername, sanitizePermlink } from \"../helper\";\nimport { createImageHTML } from \"./img.method\";\n\nexport function linkify(content: string, forApp: boolean, webp: boolean): string {\n // Tags\n content = content.replace(/(^|\\s|>)(#[-a-z\\d]+)/gi, tag => {\n if (/#[\\d]+$/.test(tag)) return tag // do not allow only numbers (like #1)\n const preceding = /^\\s|>/.test(tag) ? tag[0] : '' // space or closing tag (>)\n tag = tag.replace('>', '') // remove closing tag\n const tag2 = tag.trim().substring(1)\n const tagLower = tag2.toLowerCase()\n\n const attrs = forApp ? `data-tag=\"${tagLower}\"` : `href=\"/trending/${tagLower}\"`\n return `${preceding}<a class=\"markdown-tag-link\" ${attrs}>${tag.trim()}</a>`\n })\n\n // User mentions\n content = content.replace(\n /(^|[^a-zA-Z0-9_!#$%&*@@/]|(^|[^a-zA-Z0-9_+~.-/]))[@@]([a-z][-.a-z\\d^/]+[a-z\\d])/gi,\n (match, preceeding1, preceeding2, user) => {\n const userLower = user.toLowerCase()\n const preceedings = (preceeding1 || '') + (preceeding2 || '')\n if (userLower.indexOf('/') === -1 && isValidUsername(user)) {\n const attrs = forApp ? `data-author=\"${userLower}\"` : `href=\"/@${userLower}\"`\n return `${preceedings}<a class=\"markdown-author-link\" ${attrs}>@${user}</a>`\n } else {\n return match\n }\n }\n )\n\n // internal links\n content = content.replace(\n /((^|\\s)(\\/|)@[\\w.\\d-]+)\\/(\\S+)/gi, (match, u, p1, p2, p3) => {\n const uu = u.trim().toLowerCase().replace('/@', '').replace('@', '');\n const permlink = sanitizePermlink(p3);\n if (!isValidPermlink(permlink)) return match;\n\n if (SECTION_LIST.some(v => p3.includes(v))) {\n const attrs = forApp ? `href=\"https://ecency.com/@${uu}/${permlink}\"` : `href=\"/@${uu}/${permlink}\"`\n return ` <a class=\"markdown-profile-link\" ${attrs}>@${uu}/${permlink}</a>`\n } else {\n const attrs = forApp ? `data-author=\"${uu}\" data-tag=\"post\" data-permlink=\"${permlink}\"` : `href=\"/post/@${uu}/${permlink}\"`\n return ` <a class=\"markdown-post-link\" ${attrs}>@${uu}/${permlink}</a>`\n }\n }\n )\n\n // Image links\n let firstImageUsed = false;\n\n content = content.replace(IMG_REGEX, (imglink) => {\n const isLCP = !firstImageUsed;\n firstImageUsed = true;\n return createImageHTML(imglink, isLCP, webp);\n });\n\n return content\n}\n","import { IMG_REGEX, YOUTUBE_REGEX, WHITE_LIST, DOMParser, POST_REGEX } from '../consts'\nimport { extractYtStartTime, isValidPermlink, isValidUsername, sanitizePermlink } from '../helper'\nimport { proxifyImageSrc } from '../proxify-image-src'\nimport { linkify } from './linkify.method'\nimport {createImageHTML} from \"./img.method\";\n\nexport function text(node: HTMLElement | null, forApp: boolean, webp: boolean): void {\n if (!node || !node.parentNode) {\n return\n }\n\n // Case-insensitive check with null safety\n if (node.parentNode && ['a', 'code'].includes(node.parentNode.nodeName.toLowerCase())) {\n return\n }\n\n const nodeValue = node.nodeValue || ''\n const linkified = linkify(nodeValue, forApp, webp)\n if (linkified !== nodeValue) {\n const doc = DOMParser.parseFromString(\n `<span class=\"wr\">${linkified}</span>`,\n 'text/html'\n )\n const replaceNode = doc.body?.firstChild || doc.firstChild\n\n if (replaceNode) {\n node.parentNode.insertBefore(replaceNode, node)\n node.parentNode.removeChild(node)\n }\n return\n }\n\n if (nodeValue.match(IMG_REGEX)) {\n const isLCP = false; // Traverse handles LCP; no need to double-count\n const imageHTML = createImageHTML(nodeValue, isLCP, webp);\n const doc = DOMParser.parseFromString(imageHTML, 'text/html');\n const replaceNode = doc.body?.firstChild || doc.firstChild\n if (replaceNode) {\n node.parentNode.replaceChild(replaceNode, node);\n }\n return; // Early return after replacing node\n }\n // If a youtube video\n if (nodeValue.match(YOUTUBE_REGEX)) {\n const e = YOUTUBE_REGEX.exec(nodeValue)\n if (e && e[1]) {\n const vid = e[1]\n const thumbnail = proxifyImageSrc(`https://img.youtube.com/vi/${vid.split('?')[0]}/hqdefault.jpg`, 0, 0, webp ? 'webp' : 'match')\n const embedSrc = `https://www.youtube.com/embed/${vid}?autoplay=1`\n const startTime = extractYtStartTime(nodeValue);\n\n // Create container paragraph\n const container = node.ownerDocument.createElement('p')\n\n // Create anchor element\n const anchor = node.ownerDocument.createElement('a')\n anchor.setAttribute('class', 'markdown-video-link markdown-video-link-youtube')\n anchor.setAttribute('data-embed-src', embedSrc)\n anchor.setAttribute('data-youtube', vid)\n if (startTime) {\n anchor.setAttribute('data-start-time', startTime)\n }\n\n // Create and append thumbnail image\n const thumbImg = node.ownerDocument.createElement('img')\n thumbImg.setAttribute('class', 'no-replace video-thumbnail')\n thumbImg.setAttribute('src', thumbnail)\n anchor.appendChild(thumbImg)\n\n // Create and append play button\n const play = node.ownerDocument.createElement('span')\n play.setAttribute('class', 'markdown-video-play')\n anchor.appendChild(play)\n\n // Assemble and replace\n container.appendChild(anchor)\n node.parentNode.replaceChild(container, node)\n return; // Early return after replacing node\n }\n }\n if (nodeValue && typeof nodeValue === 'string') {\n const postMatch = nodeValue.trim().match(POST_REGEX)\n if (postMatch && WHITE_LIST.includes(postMatch[1].replace(/^www\\./,''))) {\n const tag = postMatch[2]\n const author = postMatch[3].replace('@', '')\n const permlink = sanitizePermlink(postMatch[4])\n\n // Validate tag to prevent attribute breakout XSS\n // Allow only alphanumeric, hyphens, and underscores\n if (!tag || !/^[a-z0-9_-]+$/i.test(tag)) return\n if (!isValidUsername(author)) return\n if (!isValidPermlink(permlink)) return\n\n const attrs = forApp ? `data-tag=\"${tag}\" data-author=\"${author}\" data-permlink=\"${permlink}\" class=\"markdown-post-link\"` : `class=\"markdown-post-link\" href=\"/${tag}/@${author}/${permlink}\"`\n const doc = DOMParser.parseFromString(\n `<a ${attrs}>/@${author}/${permlink}</a>`,\n 'text/html'\n )\n const replaceNode = doc.body?.firstChild || doc.firstChild\n if (replaceNode) {\n node.parentNode.replaceChild(replaceNode, node)\n }\n }\n }\n}\n","import { a } from './a.method'\nimport { iframe } from './iframe.method'\nimport { img } from './img.method'\nimport { p } from './p.method'\nimport { text } from './text.method'\n\nexport function traverse(node: Node, forApp: boolean, depth = 0, webp = false, state = { firstImageFound: false }, parentDomain: string = 'ecency.com'): void {\n if (!node || !node.childNodes) {\n return\n }\n\n Array.from(Array(node.childNodes.length).keys()).forEach(i => {\n const child = node.childNodes[i];\n if (!child) return; // Child might have been removed\n\n if (child.nodeName.toLowerCase() === 'a') {\n a(<HTMLElement>child, forApp, webp, parentDomain)\n }\n if (child.nodeName.toLowerCase() === 'iframe') {\n iframe(<HTMLElement>child, parentDomain)\n }\n if (child.nodeName === '#text') {\n text(<HTMLElement>child, forApp, webp)\n }\n if (child.nodeName.toLowerCase() === 'img') {\n img(<HTMLElement>child, webp, state)\n }\n if (child.nodeName.toLowerCase() === 'p') {\n p(<HTMLElement>child)\n }\n\n // Recapture child reference in case handler replaced it\n const currentChild = node.childNodes[i];\n if (currentChild) {\n traverse(currentChild, forApp, depth + 1, webp, state, parentDomain)\n }\n })\n}\n","export function cleanReply(s: string): string {\n return (s ? s.split('\\n')\n .filter(item => item.toLowerCase().includes('posted using [partiko') === false)\n .filter(item => item.toLowerCase().includes('posted using [dapplr') === false)\n .filter(item => item.toLowerCase().includes('posted using [leofinance') === false)\n .filter(item => item.toLowerCase().includes('posted via [neoxian') === false)\n .filter(item => item.toLowerCase().includes('posted using [neoxian') === false)\n .filter(item => item.toLowerCase().includes('posted with [stemgeeks') === false)\n .filter(item => item.toLowerCase().includes('posted using [bilpcoin') === false)\n .filter(item => item.toLowerCase().includes('posted using [inleo') === false)\n .filter(item => item.toLowerCase().includes('posted using [sportstalksocial]') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>[posted using aeneas.blog') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>posted via [proofofbrain.io') === false)\n .filter(item => item.toLowerCase().includes('<center>posted on [hypnochain') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>posted via [weedcash.network') === false)\n .filter(item => item.toLowerCase().includes('<center>posted on [naturalmedicine.io') === false)\n .filter(item => item.toLowerCase().includes('<center><sub>posted via [musicforlife.io') === false)\n .filter(item => item.toLowerCase().includes('if the truvvl embed is unsupported by your current frontend, click this link to view this story') === false)\n .filter(item => item.toLowerCase().includes('<center><em>posted from truvvl') === false)\n .filter(item => item.toLowerCase().includes('view this post <a href=\"https://travelfeed.io/') === false)\n .filter(item => item.toLowerCase().includes('read this post on travelfeed.io for the best experience') === false)\n .filter(item => item.toLowerCase().includes('posted via <a href=\"https://www.dporn.co/\"') === false)\n .filter(item => item.toLowerCase().includes('▶️ [watch on 3speak](https://3speak') === false)\n .filter(item => item.toLowerCase().includes('<sup><sub>posted via [inji.com]') === false)\n .filter(item => item.toLowerCase().includes('view this post on [liketu]') === false)\n .filter(item => item.toLowerCase().includes('[via Inbox]') === false)\n .join('\\n') : '')\n .replace('Posted via <a href=\"https://d.buzz\" data-link=\"promote-link\">D.Buzz</a>', '')\n .replace('<div class=\"pull-right\"><a href=\"/@hive.engage\"></a></div>', '')\n .replace('<div><a href=\"https://engage.hivechain.app\"></a></div>', '')\n .replace(`<div class=\"text-center\"><img src=\"https://cdn.steemitimages.com/DQmNp6YwAm2qwquALZw8PdcovDorwaBSFuxQ38TrYziGT6b/A-20.png\"><a href=\"https://bit.ly/actifit-app\"><img src=\"https://cdn.steemitimages.com/DQmQqfpSmcQtfrHAtzfBtVccXwUL9vKNgZJ2j93m8WNjizw/l5.png\"></a><a href=\"https://bit.ly/actifit-ios\"><img src=\"https://cdn.steemitimages.com/DQmbWy8KzKT1UvCvznUTaFPw6wBUcyLtBT5XL9wdbB7Hfmn/l6.png\"></a></div>`, '')\n}\n","import { traverse } from './traverse.method'\nimport { sanitizeHtml } from './sanitize-html.method'\nimport { DOMParser, ENTITY_REGEX } from '../consts'\nimport { XMLSerializer } from '@xmldom/xmldom'\nimport { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\nimport he from 'he'\nimport * as htmlparser2 from 'htmlparser2'\nimport * as domSerializerModule from 'dom-serializer'\n\nconst domSerializer = (domSerializerModule as any).default || domSerializerModule\n\n// Conditionally load lolight for syntax highlighting (Node.js only)\n// Browser builds will gracefully handle missing lolight by using fallback\nlet lolightPromise: Promise<any> | null = null\nlet lolightModule: any = null\n\nasync function loadLolight() {\n if (typeof window !== 'undefined') {\n // Skip in browser environment\n return null\n }\n\n if (lolightModule) {\n return lolightModule\n }\n\n if (!lolightPromise) {\n lolightPromise = import('lolight')\n .then((mod) => {\n lolightModule = mod.default || mod\n return lolightModule\n })\n .catch(() => {\n lolightModule = null\n return null\n })\n }\n\n return lolightPromise\n}\n\n// Synchronous wrapper for backward compatibility\nfunction getLolightInstance() {\n return lolightModule\n}\n\n// Pre-load lolight when module is imported (Node.js only)\nif (typeof window === 'undefined') {\n loadLolight().catch(() => {\n // Silently fail if lolight is not available\n })\n}\n\n/**\n * Fixes block-level HTML tags that Remarkable incorrectly wraps inside <p> tags.\n *\n * Problem: When Remarkable encounters block-level HTML tags (like <center>, <div>)\n * with blank lines after them, it generates malformed HTML like:\n * <p><center></p>\n * <p>content</p>\n * <p></center></p>\n *\n * This function repairs such patterns by:\n * 1. Extracting block-level tags from paragraph wrappers\n * 2. Removing empty paragraphs created by this mismatch\n *\n * @param html - The HTML string to fix\n * @returns The repaired HTML string\n */\nfunction fixBlockLevelTagsInParagraphs(html: string): string {\n // Block-level tags that should never be wrapped in <p> tags\n const blockTags = 'center|div|table|figure|section|article|aside|header|footer|nav|main'\n\n // Pattern 1: <p><tag></p> - opening tag wrapped in <p>\n // Replace with just <tag> (remove the wrapping <p>)\n const openingPattern = new RegExp(`<p>(<(?:${blockTags})(?:\\\\s[^>]*)?>)<\\\\/p>`, 'gi')\n html = html.replace(openingPattern, '$1')\n\n // Pattern 2: <p></tag></p> - closing tag wrapped in <p>\n // Replace with just </tag> (remove the wrapping <p>)\n const closingPattern = new RegExp(`<p>(<\\\\/(?:${blockTags})>)<\\\\/p>`, 'gi')\n html = html.replace(closingPattern, '$1')\n\n // Pattern 3: <p><tag><br> or <p><tag> at start of <p>\n // This handles cases where the tag is at the start but followed by content\n const startPattern = new RegExp(`<p>(<(?:${blockTags})(?:\\\\s[^>]*)?>)(?:<br>)?\\\\s*`, 'gi')\n html = html.replace(startPattern, '$1<p>')\n\n // Pattern 4: </tag></p> or <br>\\n</tag></p> - closing tag at end of <p>\n const endPattern = new RegExp(`\\\\s*(?:<br>)?\\\\s*(<\\\\/(?:${blockTags})>)<\\\\/p>`, 'gi')\n html = html.replace(endPattern, '</p>$1')\n\n // Clean up any empty paragraphs that may have been created\n html = html.replace(/<p>\\s*<\\/p>/g, '')\n html = html.replace(/<p><br>\\s*<\\/p>/g, '')\n\n return html\n}\n\nexport function markdownToHTML(input: string, forApp: boolean, webp: boolean, parentDomain: string = 'ecency.com'): string {\n // Internalize leofinance.io links\n input = input.replace(new RegExp(\"https://leofinance.io/threads/view/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://leofinance.io/posts/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://leofinance.io/threads/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://inleo.io/threads/view/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://inleo.io/posts/\",\"g\"), \"/@\");\n input = input.replace(new RegExp(\"https://inleo.io/threads/\",\"g\"), \"/@\");\n\n\n const md = new Remarkable({\n html: true,\n breaks: true,\n typographer: false,\n highlight: function (str: string) {\n const lolightInstance = getLolightInstance()\n if (!lolightInstance) {\n // Fallback when lolight is not available\n return str\n }\n\n try {\n const tokens = lolightInstance.tok(str);\n return tokens.map(\n (token: string[]) => `<span class=\"ll-${token[0]}\">${token[1]}</span>`\n ).join('')\n } catch (err) { console.error(err) }\n\n return str\n }\n }).use(linkify)\n md.core.ruler.enable([\n 'abbr'\n ]);\n md.block.ruler.enable([\n 'footnote',\n 'deflist'\n ]);\n md.inline.ruler.enable([\n 'footnote_inline',\n 'ins',\n 'mark',\n 'sub',\n 'sup'\n ]);\n const serializer = new XMLSerializer()\n\n if (!input) {\n return ''\n }\n\n let output = '';\n\n // Replace entities with deterministic placeholders to preserve them during rendering\n const entities = input.match(ENTITY_REGEX);\n const entityPlaceholders: string[] = [];\n\n if (entities && forApp) {\n // Deduplicate entities to avoid duplicate placeholders\n const uniqueEntities = [...new Set(entities)];\n uniqueEntities.forEach((entity, index) => {\n // Use markdown-inert Unicode placeholder (zero-width spaces)\n const placeholder = `\\u200B${index}\\u200B`;\n entityPlaceholders.push(entity);\n // Replace all occurrences of this entity\n input = input.split(entity).join(placeholder);\n })\n }\n\n\n try {\n output = md.render(input)\n\n // Fix malformed block-level HTML tags that Remarkable wraps in <p> tags\n // This prevents \"Opening and ending tag mismatch\" errors from DOMParser\n output = fixBlockLevelTagsInParagraphs(output)\n\n const doc = DOMParser.parseFromString(`<body id=\"root\">${output}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain)\n\n output = serializer.serializeToString(doc)\n } catch (error) {\n // @xmldom/xmldom is stricter than old xmldom and throws ParseError for malformed HTML\n // Instead of returning empty string (bad UX), attempt graceful recovery\n try {\n // Strategy:\n // 1. Pre-sanitize to remove XSS vectors\n // 2. Use lenient htmlparser2 to auto-repair malformed HTML (auto-close unclosed tags)\n // 3. Serialize the repaired HTML\n // 4. Re-parse with @xmldom/xmldom (now well-formed)\n // 5. Traverse and serialize as normal\n output = md.render(input)\n const preSanitized = sanitizeHtml(output)\n\n // Use htmlparser2 to parse malformed HTML leniently\n const dom = htmlparser2.parseDocument(preSanitized, {\n // lenient options - don't throw on malformed HTML\n lowerCaseTags: false,\n lowerCaseAttributeNames: false,\n })\n\n // Serialize back to well-formed HTML (htmlparser2 auto-closes tags)\n const repairedHtml = domSerializer(dom.children)\n\n // Now parse the well-formed HTML with @xmldom/xmldom\n const doc = DOMParser.parseFromString(`<body id=\"root\">${repairedHtml}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain)\n\n output = serializer.serializeToString(doc)\n } catch (fallbackError) {\n // If repair + re-parsing fails, HTML-escape to preserve content visibility\n // This prevents XSS while still showing users what they wrote\n const escapedContent = he.encode(output || md.render(input))\n output = `<p dir=\"auto\">${escapedContent}</p>`\n }\n }\n\n // Restore original entities from placeholders\n if (forApp && output && entityPlaceholders.length > 0) {\n entityPlaceholders.forEach((entity, index) => {\n const placeholder = `\\u200B${index}\\u200B`;\n // Replace all occurrences of the placeholder\n output = output.split(placeholder).join(entity);\n })\n }\n\n output = output.replace(/ xmlns=\"http:\\/\\/www.w3.org\\/1999\\/xhtml\"/g, '')\n .replace('<body id=\"root\">', '')\n .replace('</body>', '')\n .trim()\n\n return sanitizeHtml(output)\n}\n","import { LRUCache } from 'lru-cache'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet cache = new LRUCache<string, any>({ max: 60 })\n\nexport function setCacheSize(size: number): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache = new LRUCache<string, any>({ max: size })\n}\n\nexport function cacheGet<T extends unknown>(key: string): T {\n return cache.get(key) as T\n}\n\nexport function cacheSet(key: string, value: unknown): void {\n cache.set(key, value)\n}\n","import { makeEntryCacheKey } from './helper'\nimport { cleanReply, markdownToHTML } from './methods'\nimport { cacheGet, cacheSet } from './cache'\nimport { Entry } from './types'\n\nexport function markdown2Html(obj: Entry | string, forApp = true, webp = false, parentDomain: string = 'ecency.com'): string {\n if (typeof obj === 'string') {\n const cleanedStr = cleanReply(obj)\n return markdownToHTML(cleanedStr, forApp, webp, parentDomain)\n }\n\n const key = `${makeEntryCacheKey(obj)}-md${webp ? '-webp' : ''}-${forApp ? 'app' : 'site'}-${parentDomain}`\n\n const item = cacheGet<string>(key)\n if (item) {\n return item\n }\n\n const cleanBody = cleanReply(obj.body)\n\n const res = markdownToHTML(cleanBody, forApp, webp, parentDomain)\n cacheSet(key, res)\n\n return res\n}\n","import { proxifyImageSrc } from './proxify-image-src'\nimport { markdown2Html } from './markdown-2-html'\nimport { createDoc, makeEntryCacheKey } from './helper'\nimport { cacheGet, cacheSet } from './cache'\nimport { Entry } from './types'\n\nconst gifLinkRegex = /\\.(gif)$/i;\n\nfunction isGifLink(link: string) {\n return gifLinkRegex.test(link);\n}\n\nfunction getImage(entry: Entry, width = 0, height = 0, format = 'match'): string | null {\n /*\n * Return from json metadata if exists\n * */\n let meta: Entry['json_metadata'] | null\n\n if (typeof entry.json_metadata === 'object') {\n meta = entry.json_metadata\n } else {\n try {\n meta = JSON.parse(entry.json_metadata as string)\n } catch (e) {\n meta = null\n }\n }\n\n if (meta && typeof meta.image === 'string' && meta.image.length > 0) {\n if (isGifLink(meta.image)) {\n return proxifyImageSrc(meta.image, 0, 0, format)\n }\n return proxifyImageSrc(meta.image, width, height, format)\n }\n\n if (meta && meta.image && !!meta.image.length && meta.image[0]) {\n if (isGifLink(meta.image[0])) {\n return proxifyImageSrc(meta.image[0], 0, 0, format)\n }\n return proxifyImageSrc(meta.image[0], width, height, format)\n }\n\n // try to find first image from post body\n const html = markdown2Html(entry)\n const doc = createDoc(html)\n if (!doc) {\n return null\n }\n\n const imgEls = doc.getElementsByTagName('img')\n if (imgEls.length >= 1) {\n const src = imgEls[0].getAttribute('src')\n if (!src) {\n return null\n }\n if (isGifLink(src)) {\n return proxifyImageSrc(src, 0, 0, format)\n }\n return proxifyImageSrc(src, width, height, format)\n }\n\n return null\n}\n\nexport function catchPostImage(obj: Entry | string, width = 0, height = 0, format = 'match'): string | null {\n if (typeof obj === 'string') {\n // Create minimal Entry-like wrapper for string input\n const entryWrapper: Entry = {\n body: obj,\n json_metadata: '{}',\n } as Entry\n return getImage(entryWrapper, width, height, format)\n }\n const key = `${makeEntryCacheKey(obj)}-${width}x${height}-${format}`\n\n const item = cacheGet<string | null>(key)\n if (item) {\n return item\n }\n\n const res = getImage(obj, width, height, format)\n cacheSet(key, res)\n\n return res\n}\n\n","import he from 'he'\nimport { makeEntryCacheKey } from './helper'\nimport { cacheGet, cacheSet } from './cache'\nimport { Entry } from './types'\nimport { cleanReply } from './methods'\nimport { ENTITY_REGEX } from './consts'\nimport { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\n\nconst joint = (arr: string[], limit = 200) => {\n let result = '';\n if (arr) {\n for (let i = 0; i < arr.length; i++) {\n // join array with space separator\n if (result) {\n result += \" \";\n }\n // break with length reaches limit\n if (result.length > limit) {\n break;\n } else {\n // make sure last join doesn't break the limit too much\n if ((result + arr[i]).length < limit + 10) {\n result += arr[i];\n } else {\n break;\n }\n }\n }\n }\n return result.trim();\n};\n\n/**\n * Generate a text summary from post body content\n * @param entryBody - The post body content to summarize\n * @param length - Maximum length of the summary (default: 200, use 0 for no truncation)\n * @param platform - Target platform: 'web' for browser/Node.js, 'ios'/'android' for React Native (default: 'web')\n * Controls entity/placeholder handling - 'web' skips placeholder substitution, other values enable it\n */\nfunction postBodySummary(entryBody: string, length: number = 200, platform:'ios'|'android'|'web' = 'web'): string {\n if (!entryBody) {\n return ''\n }\n entryBody = cleanReply(entryBody)\n\n const mdd = new Remarkable({\n html: true,\n breaks: true,\n typographer: false,\n }).use(linkify)\n mdd.core.ruler.enable([\n 'abbr'\n ]);\n mdd.block.ruler.enable([\n 'footnote',\n 'deflist'\n ]);\n mdd.inline.ruler.enable([\n 'footnote_inline',\n 'ins',\n 'mark',\n 'sub',\n 'sup'\n ]);\n\n // Replace entities with deterministic placeholders to preserve them during rendering\n const entities = entryBody.match(ENTITY_REGEX);\n const entityPlaceholders: string[] = [];\n if (entities && platform !== 'web') {\n // Deduplicate entities to avoid duplicate placeholders\n const uniqueEntities = [...new Set(entities)];\n uniqueEntities.forEach((entity, index) => {\n // Use markdown-inert Unicode placeholder (zero-width spaces)\n const placeholder = `\\u200B${index}\\u200B`;\n entityPlaceholders.push(entity);\n // Replace all occurrences of this entity\n entryBody = entryBody.split(entity).join(placeholder);\n })\n }\n\n // Convert markdown to html\n let text = '';\n try {\n text = mdd.render(entryBody)\n } catch (err) {\n // Log error with context for debugging\n console.error('[postBodySummary] Failed to render markdown:', {\n error: err instanceof Error ? err.message : String(err),\n entryBodyLength: entryBody?.length || 0,\n platform\n })\n // Set empty text on error - caller receives empty summary\n text = ''\n }\n\n\n // Restore original entities from placeholders\n if (platform !== 'web' && entityPlaceholders.length > 0) {\n entityPlaceholders.forEach((entity, index) => {\n const placeholder = `\\u200B${index}\\u200B`;\n // Replace all occurrences of the placeholder\n text = text.split(placeholder).join(entity);\n })\n }\n\n\n text = text\n .replace(/(<([^>]+)>)/gi, '') // Remove html tags\n .replace(/\\r?\\n|\\r/g, ' ') // Remove new lines\n .replace(/(?:https?|ftp):\\/\\/[\\n\\S]+/g, '') // Remove urls\n .trim()\n .replace(/ +(?= )/g, '') // Remove all multiple spaces\n\n // Truncate if length > 0 (length === 0 means no truncation)\n if (length > 0) {\n text = joint(text.split(' '), length)\n }\n\n if (text) {\n text = he.decode(text) // decode html entities \n }\n\n return text\n}\n\n/**\n * Generate a text summary from an Entry object or raw string\n * @param obj - Entry object or raw post body string\n * @param length - Maximum length of the summary (default: 200, use 0 for no truncation)\n * @param platform - Target platform: 'web' for browser/Node.js, 'ios'/'android' for React Native (default: 'web')\n * Controls entity/placeholder handling - 'web' skips placeholder substitution, other values enable it\n * @returns Text summary of the post body\n */\nexport function getPostBodySummary(obj: Entry | string, length?: number, platform?:'ios'|'android'|'web'): string {\n // Normalize parameters at function start for consistent behavior and caching\n const normalizedLength = length ?? 200\n const normalizedPlatform = platform || 'web'\n\n if (typeof obj === 'string') {\n return postBodySummary(obj as string, normalizedLength, normalizedPlatform)\n }\n\n const key = `${makeEntryCacheKey(obj)}-sum-${normalizedLength}-${normalizedPlatform}`\n\n const item = cacheGet<string>(key)\n if (item) {\n return item\n }\n\n const res = postBodySummary(obj.body, normalizedLength, normalizedPlatform)\n cacheSet(key, res)\n\n return res\n}\n"]}
|