@ecency/render-helper 2.4.35 → 2.5.0
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.d.ts +2 -1
- package/dist/browser/index.js +22 -2
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +22 -1
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.mjs +22 -2
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -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/methods/simple-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","p","XMLDOMSerializer","text","img","iframe","imgEls","a","match","linkify","Remarkable","LRUCache","he"],"mappings":"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","file":"index.js","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|watch)\\?.+$/i\nexport const SPEAK_AUDIO_REGEX = /https?:\\/\\/audio\\.3speak\\.tv\\/play\\?[^\\s]+/i\nexport const SPEAK_AUDIO_EMBED_REGEX = /^https?:\\/\\/audio\\.3speak\\.tv\\/play\\?.+$/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 'srcset',\n 'sizes',\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, XMLSerializer as XMLDOMSerializer } from '@xmldom/xmldom'\n\n// Lenient error handler for xmldom - suppresses ALL parse errors without throwing.\n// This is critical: xmldom 0.9+ throws on fatalError by default, which causes the\n// render pipeline to fall through to the HTML-escaping fallback, showing raw tags.\nfunction createParser() {\n return new XMLDOMParser({\n onError(level: string, msg: string) {\n void level\n void msg\n },\n })\n}\n\nexport const DOMParser = createParser()\n\nexport { XMLDOMSerializer as XMLSerializer }\n","import { DOMParser } from './consts'\nimport type { Document } from '@xmldom/xmldom'\n\n/**\n * Removes duplicate attributes from HTML tags.\n * @xmldom/xmldom 0.9+ throws fatalError on duplicate attributes (e.g., <iframe allowfullscreen allowfullscreen>).\n *\n * Single-pass tokenizer. The previous regex-based implementation had\n * catastrophic backtracking on malformed inputs such as\n * <div style=background-color:yellow;\">\n * (unquoted attribute value followed by a stray quote, no closing `>` for the\n * tag in the immediate vicinity). The nested alternation\n * (?:[^>\"']+|\"[^\"]*\"|'[^']*')*?\n * combined with a greedy `+` inside the non-greedy `*?` produced O(n²+)\n * backtracking that pinned a 6 KB body for >30 seconds, tripping the watchdog\n * and killing the container.\n */\nfunction isSpaceChar(c: number): boolean {\n return c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d || c === 0x0c\n}\n\nfunction isAsciiLetter(c: number): boolean {\n return (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a)\n}\n\nfunction isTagNameChar(c: number): boolean {\n return isAsciiLetter(c) || (c >= 0x30 && c <= 0x39)\n}\n\nfunction isAttrNameChar(c: number): boolean {\n // a-zA-Z, 0-9, '-', '_', ':', '.'\n return (\n isAsciiLetter(c) ||\n (c >= 0x30 && c <= 0x39) ||\n c === 0x2d ||\n c === 0x5f ||\n c === 0x3a ||\n c === 0x2e\n )\n}\n\nexport function removeDuplicateAttributes(html: string): string {\n const n = html.length\n let out = ''\n let i = 0\n\n while (i < n) {\n const lt = html.indexOf('<', i)\n if (lt < 0) {\n out += html.slice(i)\n break\n }\n out += html.slice(i, lt)\n\n // Only opening tags that start with an ASCII letter and have at least\n // one whitespace before the attributes are normalised — matches the\n // scope of the prior regex (closing tags, comments, doctypes, and bare\n // `<` characters are left untouched).\n if (lt + 1 >= n || !isAsciiLetter(html.charCodeAt(lt + 1))) {\n out += '<'\n i = lt + 1\n continue\n }\n\n let p = lt + 1\n while (p < n && isTagNameChar(html.charCodeAt(p))) p++\n const tagName = html.slice(lt + 1, p)\n\n if (p >= n || !isSpaceChar(html.charCodeAt(p))) {\n out += '<'\n i = lt + 1\n continue\n }\n\n const attrs: string[] = []\n const seen = new Set<string>()\n let q = p\n\n while (q < n) {\n while (q < n && isSpaceChar(html.charCodeAt(q))) q++\n if (q >= n) break\n\n const ch = html.charCodeAt(q)\n if (ch === 0x3e) break // '>'\n if (ch === 0x2f && q + 1 < n && html.charCodeAt(q + 1) === 0x3e) break // '/>'\n\n const nameStart = q\n while (q < n && isAttrNameChar(html.charCodeAt(q))) q++\n if (q === nameStart) {\n // Stray character that can't start an attribute name. Skip it so\n // we make progress; the original tag bytes are preserved verbatim\n // below if we ultimately can't close the tag.\n q++\n continue\n }\n const attrName = html.slice(nameStart, q)\n\n let r = q\n while (r < n && isSpaceChar(html.charCodeAt(r))) r++\n\n let valueEnd = q\n if (r < n && html.charCodeAt(r) === 0x3d /* '=' */) {\n r++\n while (r < n && isSpaceChar(html.charCodeAt(r))) r++\n if (r < n) {\n const v = html.charCodeAt(r)\n if (v === 0x22 || v === 0x27) {\n // Quoted value\n const quote = html[r]\n const end = html.indexOf(quote, r + 1)\n if (end < 0) {\n // Unterminated quote — bail to the next `>` to avoid eating\n // the rest of the document.\n const gt = html.indexOf('>', r + 1)\n valueEnd = gt < 0 ? n : gt\n } else {\n valueEnd = end + 1\n }\n } else {\n // Unquoted value: read until whitespace or `>`\n let s = r\n while (s < n) {\n const k = html.charCodeAt(s)\n if (isSpaceChar(k) || k === 0x3e) break\n s++\n }\n valueEnd = s\n }\n } else {\n valueEnd = r\n }\n }\n\n const fullAttr = html.slice(nameStart, valueEnd)\n q = valueEnd\n\n const key = attrName.toLowerCase()\n if (!seen.has(key)) {\n seen.add(key)\n attrs.push(fullAttr)\n }\n }\n\n let selfClose = false\n if (q < n && html.charCodeAt(q) === 0x2f /* '/' */) {\n selfClose = true\n q++\n }\n if (q >= n || html.charCodeAt(q) !== 0x3e /* '>' */) {\n // Unterminated tag — leave the original input alone past the `<` and\n // continue scanning. This mirrors the prior regex's behaviour of not\n // matching such fragments.\n out += '<'\n i = lt + 1\n continue\n }\n q++\n\n const attrsJoined = attrs.length > 0 ? ' ' + attrs.join(' ') : ''\n out += '<' + tagName + attrsJoined + (selfClose ? ' /' : '') + '>'\n i = q\n }\n\n return out\n}\n\nexport function createDoc(html: string): Document | null {\n if (html.trim() === '') {\n return null\n }\n\n // Preprocess to remove duplicate attributes which cause @xmldom/xmldom 0.9+ to throw fatalError\n const cleanedHtml = removeDuplicateAttributes(html)\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 //\n // @xmldom/xmldom 0.9+ always throws a ParseError from its internal fatalError() path\n // (see dom-parser.js:490) for severely malformed HTML — e.g., mismatched tags like\n // <body>...<p>...</body> — regardless of the onError handler returning undefined.\n // The onError handler only gets to observe; the throw still happens.\n //\n // Wrap in try/catch so that pathologically-malformed post bodies degrade gracefully\n // (no image preload hint) instead of crashing the SSR render of /entry/[...]. Both\n // callers in catch-post-image.ts already handle a null return.\n try {\n return DOMParser.parseFromString(`<body>${cleanedHtml}</body>`, 'text/html')\n } catch {\n return null\n }\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 '../consts'\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 // Validate srcset: reject if any candidate URL uses a non-http(s) protocol\n if (tag === 'img' && name === 'srcset') {\n const candidates = decoded.split(',').map(c => c.trim().split(/\\s+/)[0]);\n if (candidates.some(url => !/^https?:\\/\\//.test(url))) return '';\n }\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'\nimport { LRUCache } from 'lru-cache'\n\nlet proxyBase = 'https://images.ecency.com'\n\n// base58 encoding of the source URL is the dominant cost in proxifyImageSrc.\n// The same URL is encoded repeatedly: once per srcset width (5×), once per\n// image size variant (blur/grid/row), and across requests (trending posts\n// repeat). Caching by URL collapses all of those to a single encode.\nconst urlHashCache = new LRUCache<string, string>({ max: 500 })\n\nfunction getUrlHash(url: string): string {\n const cached = urlHashCache.get(url)\n if (cached) return cached\n const hash = multihash.toB58String(Buffer.from(url))\n urlHashCache.set(url, hash)\n return hash\n}\n\nexport function setProxyBase(p: string): void {\n proxyBase = p\n}\n\nexport function getProxyBase(): string {\n return proxyBase\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|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\n/**\n * @param _format - @deprecated Ignored. Always uses 'match' — format is handled server-side via Accept header.\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 // Always use 'match' format — the server handles WebP via Accept header content negotiation\n const options: Record<string, string | number> = {\n format: 'match',\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 return `${proxyBase}/p/${pHash}?${qs}`\n }\n\n const b58url = getUrlHash(realUrl.toString())\n\n return `${proxyBase}/p/${b58url}?${qs}`\n}\n\n// Widths chosen to align with sizes already cached by the image proxy\n// (600 used by OG/deck thumbnails, 800 by self-hosted thumbnails)\nconst SRCSET_WIDTHS = [320, 600, 800, 1024, 1280];\n\n/**\n * Builds a srcset string with multiple width variants for responsive images.\n * Uses the image proxy's width parameter to serve appropriately sized images.\n */\nexport function buildSrcSet(url?: string): string {\n if (!url || typeof url !== 'string') return '';\n\n // For already-proxied URLs, extract the hash and rebuild with widths\n const escapedBase = proxyBase.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const proxyPattern = new RegExp(`^${escapedBase}/p/([^?]+)`);\n const match = url.match(proxyPattern);\n\n if (match) {\n const phash = extractPHash(url) || match[1];\n return SRCSET_WIDTHS\n .map(w => `${proxyBase}/p/${phash}?format=match&mode=fit&width=${w} ${w}w`)\n .join(', ');\n }\n\n // For non-proxied URLs, proxify at each width\n return SRCSET_WIDTHS\n .map(w => {\n const proxied = proxifyImageSrc(url, w);\n return proxied ? `${proxied} ${w}w` : '';\n })\n .filter(Boolean)\n .join(', ');\n}\n","import { proxifyImageSrc, buildSrcSet, getProxyBase } from \"../proxify-image-src\";\n\nconst IMAGE_SIZES = \"(max-width: 768px) 100vw, 700px\";\n\nexport function img(el: HTMLElement, state?: { firstImageFound: boolean }): void {\n const 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 // Sanitize dangerous attributes regardless of validity\n [\"onerror\", \"dynsrc\", \"lowsrc\", \"width\", \"height\"].forEach(attr => el.removeAttribute(attr));\n\n // ❌ Remove if javascript or empty/invalid\n const isInvalid = !src || decodedSrc.startsWith(\"javascript\") || decodedSrc.startsWith(\"vbscript\") || decodedSrc === \"x\";\n if (isInvalid) {\n el.removeAttribute(\"src\");\n el.removeAttribute(\"srcset\");\n el.removeAttribute(\"sizes\");\n return;\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 el.removeAttribute(\"src\");\n el.removeAttribute(\"srcset\");\n el.removeAttribute(\"sizes\");\n return;\n }\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 const cls = el.getAttribute(\"class\") || \"\";\n const shouldReplace = !cls.includes(\"no-replace\");\n // Only skip re-proxification for URLs already going through proxy/avatar/cover routes\n // Direct upload URLs (e.g. /DQm...) should still be proxified for resizing & format optimization\n const base = getProxyBase().replace(/\\/+$/, '');\n const hasAlreadyProxied = src.startsWith(`${base}/p/`)\n || src.startsWith(`${base}/u/`)\n || new RegExp(`^${base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}/\\\\d+x\\\\d+/`).test(src);\n\n if (shouldReplace && !hasAlreadyProxied) {\n const proxified = proxifyImageSrc(decodedSrc);\n if (proxified) {\n el.setAttribute(\"src\", proxified);\n const srcset = buildSrcSet(decodedSrc);\n if (srcset) {\n el.setAttribute(\"srcset\", srcset);\n el.setAttribute(\"sizes\", IMAGE_SIZES);\n }\n }\n } else if (shouldReplace && hasAlreadyProxied) {\n // Only /p/ URLs have extractable hashes for srcset; /u/ and /WxH/ routes\n // are avatar/cover URLs that shouldn't get responsive srcset\n if (src.startsWith(`${base}/p/`)) {\n const srcset = buildSrcSet(src);\n if (srcset) {\n el.setAttribute(\"srcset\", srcset);\n el.setAttribute(\"sizes\", IMAGE_SIZES);\n }\n }\n }\n}\n\nexport function createImageHTML(src: string, isLCP: boolean): string {\n const proxified = proxifyImageSrc(src);\n if (!proxified) return '';\n\n const base = getProxyBase().replace(/\\/+$/, '');\n const isAlreadyProxied = src.startsWith(`${base}/u/`)\n || new RegExp(`^${base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}/\\\\d+x\\\\d+/`).test(src);\n const srcset = isAlreadyProxied ? '' : buildSrcSet(src);\n const loading = isLCP ? 'eager' : 'lazy';\n const fetch = isLCP ? 'fetchpriority=\"high\"' : 'decoding=\"async\"';\n const srcsetAttr = srcset ? `srcset=\"${srcset}\" sizes=\"${IMAGE_SIZES}\"` : '';\n return `<img\n class=\"markdown-img-link\"\n src=\"${proxified}\"\n ${srcsetAttr}\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 SPEAK_AUDIO_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\";\nimport { RenderOptions, SeoContext } from '../types'\n\nconst NOFOLLOW_REPUTATION_THRESHOLD = 40;\nconst FOLLOW_PAYOUT_THRESHOLD = 5;\n\n/**\n * Determines the rel attribute for external links based on SEO context.\n *\n * Default: \"nofollow ugc noopener\" for all user-generated external links.\n * Exception: \"noopener\" only (followed) when author reputation >= 40 AND post payout > $5.\n */\nfunction getExternalLinkRel(seoContext?: SeoContext): string {\n if (\n seoContext?.authorReputation !== undefined &&\n seoContext?.postPayout !== undefined &&\n seoContext.authorReputation >= NOFOLLOW_REPUTATION_THRESHOLD &&\n seoContext.postPayout > FOLLOW_PAYOUT_THRESHOLD\n ) {\n return 'noopener';\n }\n return 'nofollow ugc noopener';\n}\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\n/**\n * Normalizes display text for inline detection by:\n * - Stripping protocol and domain (ecency.com, peakd.com, hive.blog)\n * - Removing leading/trailing slashes\n * - Removing query parameters\n * - Removing comment hashes (#@...)\n * - Converting to lowercase\n */\nconst normalizeDisplayText = (text: string): string => {\n return text\n .trim()\n .replace(/^https?:\\/\\/(www\\.)?(ecency\\.com|peakd\\.com|hive\\.blog)/i, \"\")\n .replace(/^\\/+/, \"\")\n .split(\"?\")[0]\n .replace(/#@.*$/i, \"\")\n .replace(/\\/+$/, \"\")\n .toLowerCase();\n}\n\n/**\n * Enhanced inline detection that handles edge cases like:\n * - Full URLs: https://ecency.com/@author/permlink\n * - Relative URLs: /@author/permlink\n * - With community tags: hive-123456/@author/permlink\n * - With query params: @author/permlink?ref=twitter\n * - With trailing slashes: @author/permlink/\n */\nconst getInlineMeta = (el: HTMLElement, href: string, author: string, permlink: string, communityTag?: string) => {\n // Simple exact match (original behavior)\n const textMatches = matchesHref(href, el.textContent)\n const titleMatches = matchesHref(href, el.getAttribute('title'))\n\n // Sophisticated normalized matching\n const normalizedDisplay = normalizeDisplayText(el.textContent || \"\");\n const normalizedTarget = `@${author}/${permlink}`.toLowerCase();\n\n // Build expected display patterns\n const expectedDisplays = new Set([normalizedTarget]);\n if (communityTag) {\n expectedDisplays.add(`${communityTag.toLowerCase()}/${normalizedTarget}`);\n }\n\n const sophisticatedMatch =\n normalizedDisplay === normalizedTarget ||\n (communityTag ? normalizedDisplay === `${communityTag.toLowerCase()}/${normalizedTarget}` : false);\n\n return {\n textMatches,\n titleMatches,\n isInline: textMatches || titleMatches || sophisticatedMatch\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, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): 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 (original or enhanced)\n if (className && (\n ['markdown-author-link', 'markdown-tag-link'].includes(className) ||\n className.includes('er-author') ||\n className.includes('er-tag')\n )) {\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);\n const doc = DOMParser.parseFromString(imgHTML, 'text/html');\n const replaceNode = doc.body?.firstChild || doc.firstChild\n\n if (replaceNode && el.parentNode) {\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, author, permlink)\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 // Pass community tag if it starts with \"hive-\"\n const communityTag = tag.toLowerCase().startsWith('hive-') ? tag : undefined\n const inlineMeta = getInlineMeta(el, href, author, permlink, communityTag)\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, author, permlink)\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, author, permlink)\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, '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 if (renderOptions?.embedVideosDirectly) {\n const wrapper = el.ownerDocument.createElement('span')\n wrapper.setAttribute('class', 'er-youtube-frame')\n wrapper.setAttribute('style', 'display:block')\n const iframe = el.ownerDocument.createElement('iframe')\n iframe.setAttribute('class', 'youtube-player')\n iframe.setAttribute('src', embedSrc)\n iframe.setAttribute('title', 'YouTube video')\n iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; web-share')\n iframe.setAttribute('allowfullscreen', '')\n wrapper.appendChild(iframe)\n el.appendChild(wrapper)\n el.setAttribute('class', 'markdown-video-link markdown-video-link-youtube er-youtube')\n } else {\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\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, '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://play.3speak.tv/watch?v=${match[3]}&mode=iframe`\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\n if (renderOptions?.embedVideosDirectly) {\n // Use span (not div) to avoid invalid nesting inside <p> tags\n const wrapper = el.ownerDocument.createElement('span')\n wrapper.setAttribute('class', 'er-speak-frame')\n wrapper.setAttribute('style', 'display:block')\n const iframe = el.ownerDocument.createElement('iframe')\n iframe.setAttribute('class', 'speak-iframe')\n iframe.setAttribute('src', videoHref)\n iframe.setAttribute('title', '3Speak video')\n iframe.setAttribute('allow', 'accelerometer; encrypted-media; gyroscope; picture-in-picture; web-share')\n iframe.setAttribute('allowfullscreen', '')\n wrapper.appendChild(iframe)\n el.appendChild(wrapper)\n el.setAttribute('class', 'markdown-video-link markdown-video-link-speak er-speak')\n } else {\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, '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 }\n return\n }\n }\n }\n\n // Detect 3Speak Audio\n if (href.match(SPEAK_AUDIO_REGEX) && el.textContent.trim() === href) {\n el.setAttribute('class', 'markdown-audio-link markdown-audio-link-speak')\n el.removeAttribute('href')\n\n const embedSrc = /[?&]iframe=/.test(href) ? href : `${href}&iframe=1`\n const finalSrc = /[?&]mode=/.test(embedSrc) ? embedSrc : `${embedSrc}&mode=compact`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('src', finalSrc)\n ifr.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups')\n el.appendChild(ifr)\n\n return\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 if (el.parentNode) {\n el.parentNode.replaceChild(blockquote, el)\n }\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', getExternalLinkRel(seoContext));\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, SPEAK_AUDIO_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', forApp: boolean = false): 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 play.3speak.tv for new embed player\n // Use (?:play\\.)? to avoid doubling the prefix on already-correct URLs\n let normalizedSrc = src.replace(/(?:play\\.)?3speak\\.[a-z]+/i, 'play.3speak.tv');\n\n // Normalize /embed? to /watch? for proper embed endpoint\n normalizedSrc = normalizedSrc.replace(/\\/embed\\?/, '/watch?');\n\n // Ensure mode=iframe parameter is present for minimal embed UI\n const hasMode = /[?&]mode=/.test(normalizedSrc);\n if (!hasMode) {\n normalizedSrc = `${normalizedSrc}&mode=iframe`;\n }\n\n // Add autoplay if not present\n const hasAutoplay = /[?&]autoplay=/.test(normalizedSrc);\n let s = hasAutoplay\n ? normalizedSrc\n : `${normalizedSrc}&autoplay=true`;\n\n // Add mobile layout parameter when rendering for app\n if (forApp && !/[?&]layout=/.test(s)) {\n s = `${s}&layout=mobile`;\n }\n\n el.setAttribute('src', s);\n el.setAttribute('class', 'speak-iframe');\n return;\n }\n\n // 3Speak Audio\n if (src.match(SPEAK_AUDIO_EMBED_REGEX)) {\n let normalizedSrc = src;\n\n // Ensure iframe=1 parameter for clean embedding\n if (!/[?&]iframe=/.test(normalizedSrc)) {\n normalizedSrc = `${normalizedSrc}&iframe=1`;\n }\n\n // Default to compact mode if no mode specified\n if (!/[?&]mode=/.test(normalizedSrc)) {\n normalizedSrc = `${normalizedSrc}&mode=compact`;\n }\n\n el.setAttribute('src', normalizedSrc);\n el.setAttribute('class', 'speak-audio-iframe');\n el.setAttribute('frameborder', '0');\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\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\";\nimport { RenderOptions } from \"../types\";\n\nexport function linkify(content: string, forApp: boolean, renderOptions?: RenderOptions): 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 if (!forApp) {\n return `${preceding}<a class=\"er-tag er-tag-link\" href=\"/trending/${tagLower}\">${tag.trim()}</a>`\n }\n return `${preceding}<a class=\"markdown-tag-link\" data-tag=\"${tagLower}\">${tag.trim()}</a>`\n })\n\n // User mentions - use placeholders for enhanced HTML to prevent image regex\n // from matching URLs inside the avatar <img src=\"...\"> attribute\n const authorPlaceholders: { placeholder: string; html: string }[] = []\n\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 if (!forApp) {\n const avatarSrc = `https://images.ecency.com/u/${userLower}/avatar/small`\n const html = `${preceedings}<a class=\"er-author er-author-link\" href=\"/@${userLower}\"><img class=\"er-author-link-image\" src=\"${avatarSrc}\" alt=\"${userLower}\"/><span class=\"er-author-link-content\"><span class=\"er-author-link-label\">Hive account</span><span>@${userLower}</span></span></a>`\n const placeholder = `\\u200C${authorPlaceholders.length}\\u200C`\n authorPlaceholders.push({ placeholder, html })\n return placeholder\n }\n return `${preceedings}<a class=\"markdown-author-link\" data-author=\"${userLower}\">@${user}</a>`\n } else {\n return match\n }\n }\n )\n\n // internal links with category: /category/@user/permlink\n content = content.replace(\n /(^|\\s)\\/([a-z0-9-]+)\\/@([\\w.\\d-]+)\\/(\\S+)/gi, (match, preceding, tag, author, p3) => {\n const authorLower = author.toLowerCase();\n if (!isValidUsername(authorLower)) return match;\n const permlink = sanitizePermlink(p3);\n if (!isValidPermlink(permlink)) return match;\n\n if (SECTION_LIST.includes(permlink)) {\n const attrs = forApp ? `href=\"https://ecency.com/@${authorLower}/${permlink}\"` : `href=\"/@${authorLower}/${permlink}\"`\n return `${preceding}<a class=\"markdown-profile-link\" ${attrs}>@${authorLower}/${permlink}</a>`\n } else {\n const attrs = forApp ? `data-author=\"${authorLower}\" data-tag=\"${tag}\" data-permlink=\"${permlink}\"` : `href=\"/${tag}/@${authorLower}/${permlink}\"`\n return `${preceding}<a class=\"markdown-post-link\" ${attrs}>@${authorLower}/${permlink}</a>`\n }\n }\n )\n\n // internal links — require leading / to distinguish /@user/permlink (Hive links)\n // from @scope/package (npm packages, GitHub orgs, etc.)\n content = content.replace(\n /((^|\\s)\\/@[\\w.\\d-]+)\\/(\\S+)/gi, (match, u, _p1, 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.includes(permlink)) {\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 // Process images before restoring author placeholders to avoid\n // the image regex matching URLs inside enhanced author HTML\n let firstImageUsed = false;\n\n content = content.replace(IMG_REGEX, (imglink) => {\n const isLCP = !firstImageUsed;\n firstImageUsed = true;\n return createImageHTML(imglink, isLCP);\n });\n\n // Restore author placeholders\n authorPlaceholders.forEach(({ placeholder, html }) => {\n content = content.replace(placeholder, html);\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\";\nimport { RenderOptions } from \"../types\";\n\nfunction hasAncestor(node: Node, tagNames: string[]): boolean {\n let current = node.parentNode\n while (current) {\n if (tagNames.includes(current.nodeName.toLowerCase())) {\n return true\n }\n current = current.parentNode\n }\n return false\n}\n\nexport function text(node: HTMLElement | null, forApp: boolean, renderOptions?: RenderOptions): void {\n if (!node || !node.parentNode) {\n return\n }\n\n // Skip text nodes inside links, inline code, or code blocks (check all ancestors)\n if (hasAncestor(node, ['a', 'code', 'pre'])) {\n return\n }\n\n const nodeValue = node.nodeValue || ''\n const linkified = linkify(nodeValue, forApp, renderOptions)\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);\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, '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'\nimport { RenderOptions, SeoContext } from '../types'\n\nexport function traverse(node: Node, forApp: boolean, depth = 0, state = { firstImageFound: false }, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): void {\n if (!node || !node.childNodes) {\n return\n }\n\n // Walk siblings using nextSibling instead of indexing into the live NodeList.\n // node.childNodes is live: when a handler removes or replaces a child the\n // indices shift, causing index-based loops to skip nodes. Capturing\n // nextSibling before running handlers gives a stable \"next\" pointer that\n // isn't affected by mutations to the current child.\n let child = node.firstChild\n while (child) {\n const next = child.nextSibling\n const prev = child.previousSibling\n\n if (child.nodeName.toLowerCase() === 'a') {\n a(<HTMLElement>child, forApp, parentDomain, seoContext, renderOptions)\n }\n if (child.nodeName.toLowerCase() === 'iframe') {\n iframe(<HTMLElement>child, parentDomain, forApp)\n }\n if (child.nodeName === '#text') {\n text(<HTMLElement>child, forApp, renderOptions)\n }\n if (child.nodeName.toLowerCase() === 'img') {\n img(<HTMLElement>child, state)\n }\n if (child.nodeName.toLowerCase() === 'p') {\n p(<HTMLElement>child)\n }\n\n if (child.parentNode) {\n // Child is still in the DOM — recurse into it normally\n traverse(child, forApp, depth + 1, state, parentDomain, seoContext, renderOptions)\n } else {\n // Child was removed or replaced by a handler. If a replacement was\n // inserted (e.g. text() wraps a URL in <span>, a() swaps a tweet link\n // for <blockquote>), it now sits between `prev` and `next` in the live\n // childNodes. Detect it by comparing next.previousSibling to the\n // captured `prev` — if they differ a new node was inserted.\n const possibleReplacement = next ? next.previousSibling : node.lastChild\n if (possibleReplacement && possibleReplacement !== prev && possibleReplacement.parentNode === node) {\n traverse(possibleReplacement, forApp, depth + 1, state, parentDomain, seoContext, renderOptions)\n }\n }\n\n child = next\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 .filter(item => item.toLowerCase().includes('<sub>[via apps from](') === 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 { removeDuplicateAttributes } from '../helper'\nimport { DOMParser, XMLSerializer, ENTITY_REGEX } from '../consts'\nimport { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\nimport * as htmlparser2 from 'htmlparser2'\nimport * as domSerializerModule from 'dom-serializer'\nimport { RenderOptions, SeoContext } from '../types'\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, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): 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\">${removeDuplicateAttributes(output)}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, { firstImageFound: false }, parentDomain, seoContext, renderOptions)\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 // Reuse the markdown output already produced before the failing\n // DOMParser pass — `md.render(input)` is the expensive step and\n // re-running it costs ~100 ms per fallback hit on a 60 KB body.\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\">${removeDuplicateAttributes(repairedHtml)}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, { firstImageFound: false }, parentDomain, seoContext, renderOptions)\n\n output = serializer.serializeToString(doc)\n } catch (fallbackError) {\n // If DOM parsing fails, sanitize the Remarkable HTML output directly.\n // This skips the traverse() image proxy/link rewriting but preserves\n // readable HTML content instead of showing escaped tags.\n output = sanitizeHtml(output || md.render(input))\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\n .replace(/ xmlns=\"http:\\/\\/www.w3.org\\/1999\\/xhtml\"/g, '')\n // Strip full HTML document wrapper (native browser DOMParser wraps in <html><head><body>)\n .replace(/^<\\?xml[^?]*\\?>/, '')\n .replace(/^<!DOCTYPE[^>]*>/i, '')\n .replace(/<\\/?html[^>]*>/g, '')\n .replace(/<head[^>]*>[\\s\\S]*?<\\/head>/g, '')\n .replace('<body id=\"root\">', '')\n .replace('</body>', '')\n .trim()\n\n return sanitizeHtml(output)\n}\n","import { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\nimport { sanitizeHtml } from './sanitize-html.method'\n\nlet mdInstance: Remarkable | null = null\n\nfunction getMd(): Remarkable {\n if (!mdInstance) {\n mdInstance = new Remarkable({\n html: true,\n breaks: true,\n typographer: false\n }).use(linkify)\n }\n return mdInstance\n}\n\n/**\n * Lightweight markdown-to-HTML conversion with sanitization.\n * Unlike the full `markdownToHTML`, this skips Hive-specific transforms\n * (image proxying, link internalizing, DOM traversal, etc.).\n *\n * Intended for editor input (TipTap), chat messages, and other contexts\n * where simple markdown rendering is sufficient.\n */\nexport function simpleMarkdownToHTML(input: string): string {\n if (!input) return ''\n\n const html = getMd().render(input)\n return sanitizeHtml(html)\n}\n","import { LRUCache } from 'lru-cache'\n\n// A single feed page calls catchPostImage 3× per entry (blur 0×0, grid, row)\n// plus postBodySummary, so 20 entries already produce ~80 keys. The previous\n// max of 60 caused constant eviction and forced re-rendering of full markdown\n// during SSR fan-out.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet cache = new LRUCache<string, any>({ max: 500 })\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, RenderOptions, SeoContext } from './types'\n\n/**\n * @param obj - Entry object or raw markdown string\n * @param forApp - Whether rendering for app context\n * @param _webp - @deprecated Ignored. Format is now handled server-side via Accept header content negotiation.\n * @param parentDomain - Parent domain for iframe embed parameters\n * @param seoContext - Optional SEO context for structured data\n * @param renderOptions - Optional rendering options (e.g. embedVideosDirectly)\n */\nexport function markdown2Html(obj: Entry | string, forApp = true, _webp = false, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): string {\n if (typeof obj === 'string') {\n const cleanedStr = cleanReply(obj)\n return markdownToHTML(cleanedStr, forApp, parentDomain, seoContext, renderOptions)\n }\n\n const key = `${makeEntryCacheKey(obj)}-md-${forApp ? 'app' : 'site'}-${parentDomain}${seoContext ? `-seo${seoContext.authorReputation ?? ''}-${seoContext.postPayout ?? ''}` : ''}${renderOptions?.embedVideosDirectly ? '-embed' : ''}`\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, parentDomain, seoContext, renderOptions)\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'\nimport he from 'he'\n\nconst gifLinkRegex = /\\.(gif)$/i;\n\nfunction isGifLink(link: string) {\n return gifLinkRegex.test(link);\n}\n\n// Strip code regions so that  inside a code block is not mistaken\n// for a real image. The full markdown renderer turns these into <pre><code>\n// with no <img>, so we mirror that behavior here.\n// - backtick fences ``` … ``` (with optional language hint)\n// - tilde fences ~~~ … ~~~ (CommonMark also accepts these)\n// - inline code `…`\n// - indented code blocks (4 spaces or a tab at line start) — over-strips\n// a little (e.g., deeply nested list continuation lines), which is fine:\n// a missed match just falls back to the full parser.\nconst BACKTICK_FENCE_RE = /```[\\s\\S]*?```/g\nconst TILDE_FENCE_RE = /~~~[\\s\\S]*?~~~/g\nconst INLINE_CODE_RE = /`[^`\\n]*`/g\nconst INDENTED_CODE_RE = /^(?: {4}|\\t).+$/gm\n// Requires a closing `)` so broken syntax like ` doesn't\n// match. Also tolerates the optional title form ``.\nconst MD_IMAGE_RE = /!\\[[^\\]]*\\]\\(\\s*([^)\\s]+)(?:\\s+[\"'][^\"']*[\"'])?\\s*\\)/\nconst HTML_IMAGE_RE = /<img\\b[^>]*?\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/i\n\n// The fast-path bypasses sanitize-html (which the full markdown pipeline\n// applies). The sanitizer only preserves http/https <img> sources — ftp,\n// data, javascript, relative, etc. are all dropped. Mirror that policy here\n// so the fast-path can never surface an image the full path would have\n// dropped. Anything else returns null and falls back to the sanitized parse.\nconst SAFE_URL_RE = /^https?:\\/\\//i\n\n/**\n * Fast-path: extract the first image URL from raw markdown without rendering\n * the whole post. Returns null if nothing matches *unambiguously* — when in\n * doubt, the caller falls back to the full markdown2Html → DOM parse path.\n */\nfunction findFirstImageUrl(body: string): string | null {\n if (!body) return null\n const cleaned = body\n .replace(BACKTICK_FENCE_RE, '')\n .replace(TILDE_FENCE_RE, '')\n .replace(INLINE_CODE_RE, '')\n .replace(INDENTED_CODE_RE, '')\n\n const mdMatch = cleaned.match(MD_IMAGE_RE)\n const htmlMatch = cleaned.match(HTML_IMAGE_RE)\n\n // If markdown image syntax is present at all, it must be unambiguous. The\n // capture class `[^)\\s]+` excludes `)`, so a captured URL containing `(`\n // means the URL was truncated mid-paren (e.g., a real\n // `https://x.com/path_(a)_full.jpg`). When ambiguous, bail and let the full\n // markdown parser handle it — returning a truncated URL would be wrong.\n if (mdMatch) {\n const url = mdMatch[1]\n if (!url || !SAFE_URL_RE.test(url) || url.includes('(')) {\n return null\n }\n }\n\n const mdValid = !!mdMatch\n const htmlValid = !!(htmlMatch && htmlMatch[1] && SAFE_URL_RE.test(htmlMatch[1]))\n\n // Pick the earliest match in source order — the full markdown render would\n // surface whichever <img> appears first in the rendered document.\n if (mdValid && htmlValid) {\n return (mdMatch!.index ?? 0) < (htmlMatch!.index ?? 0) ? mdMatch![1] : htmlMatch![1]\n }\n if (mdValid) return mdMatch![1]\n if (htmlValid) return htmlMatch![1]\n return null\n}\n\nfunction proxifyFound(src: string, width: number, height: number, format: string): string {\n const decoded = he.decode(src)\n if (isGifLink(decoded)) {\n return proxifyImageSrc(decoded, 0, 0, format)\n }\n return proxifyImageSrc(decoded, width, height, format)\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 // Decode HTML entities (e.g., & -> &) before proxifying\n const decodedImage = he.decode(meta.image)\n if (isGifLink(decodedImage)) {\n return proxifyImageSrc(decodedImage, 0, 0, format)\n }\n return proxifyImageSrc(decodedImage, width, height, format)\n }\n\n if (meta && meta.image && !!meta.image.length && meta.image[0]) {\n // Only decode if it's a string, otherwise pass through to proxifyImageSrc which will return ''\n if (typeof meta.image[0] === 'string') {\n // Decode HTML entities (e.g., & -> &) before proxifying\n const decodedImage = he.decode(meta.image[0])\n if (isGifLink(decodedImage)) {\n return proxifyImageSrc(decodedImage, 0, 0, format)\n }\n return proxifyImageSrc(decodedImage, width, height, format)\n }\n // For non-string types, let proxifyImageSrc handle it (returns '')\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 // Fast-path: try to find the first image with a regex over the raw body.\n // Avoids the cost of full markdown2Html + DOM parsing for the common case.\n const fast = findFirstImageUrl(entry.body)\n if (fast) {\n return proxifyFound(fast, width, height, format)\n }\n\n // Fall back to the full markdown render (handles edge cases the regex missed)\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 return proxifyFound(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 // Process string directly to avoid cache key collision\n // Don't create Entry wrapper as it would generate invalid cache keys\n\n // Fast-path: regex over raw markdown\n const fast = findFirstImageUrl(obj)\n if (fast) {\n return proxifyFound(fast, width, height, format)\n }\n\n const html = markdown2Html(obj)\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 return proxifyFound(src, width, height, format)\n }\n\n return null\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'\n\n// Reused across all calls — config is constant and Remarkable construction\n// (rule registration via ruler.enable) is non-trivial under SSR fan-out.\n//\n// linkify is intentionally omitted: the post-processing pass below strips bare\n// URLs from the final text, so auto-linking them just to discard the <a>\n// wrapper is wasted CPU during SSR.\nconst summaryRenderer = new Remarkable({\n html: true,\n breaks: true,\n typographer: false,\n})\nsummaryRenderer.core.ruler.enable(['abbr'])\nsummaryRenderer.block.ruler.enable(['footnote', 'deflist'])\nsummaryRenderer.inline.ruler.enable([\n 'footnote_inline',\n 'ins',\n 'mark',\n 'sub',\n 'sup',\n])\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 // 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 = summaryRenderer.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/methods/simple-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","p","XMLDOMSerializer","text","img","iframe","imgEls","a","match","linkify","Remarkable","LRUCache","t0","res","he"],"mappings":"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","file":"index.js","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|watch)\\?.+$/i\nexport const SPEAK_AUDIO_REGEX = /https?:\\/\\/audio\\.3speak\\.tv\\/play\\?[^\\s]+/i\nexport const SPEAK_AUDIO_EMBED_REGEX = /^https?:\\/\\/audio\\.3speak\\.tv\\/play\\?.+$/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 'srcset',\n 'sizes',\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, XMLSerializer as XMLDOMSerializer } from '@xmldom/xmldom'\n\n// Lenient error handler for xmldom - suppresses ALL parse errors without throwing.\n// This is critical: xmldom 0.9+ throws on fatalError by default, which causes the\n// render pipeline to fall through to the HTML-escaping fallback, showing raw tags.\nfunction createParser() {\n return new XMLDOMParser({\n onError(level: string, msg: string) {\n void level\n void msg\n },\n })\n}\n\nexport const DOMParser = createParser()\n\nexport { XMLDOMSerializer as XMLSerializer }\n","import { DOMParser } from './consts'\nimport type { Document } from '@xmldom/xmldom'\n\n/**\n * Removes duplicate attributes from HTML tags.\n * @xmldom/xmldom 0.9+ throws fatalError on duplicate attributes (e.g., <iframe allowfullscreen allowfullscreen>).\n *\n * Single-pass tokenizer. The previous regex-based implementation had\n * catastrophic backtracking on malformed inputs such as\n * <div style=background-color:yellow;\">\n * (unquoted attribute value followed by a stray quote, no closing `>` for the\n * tag in the immediate vicinity). The nested alternation\n * (?:[^>\"']+|\"[^\"]*\"|'[^']*')*?\n * combined with a greedy `+` inside the non-greedy `*?` produced O(n²+)\n * backtracking that pinned a 6 KB body for >30 seconds, tripping the watchdog\n * and killing the container.\n */\nfunction isSpaceChar(c: number): boolean {\n return c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d || c === 0x0c\n}\n\nfunction isAsciiLetter(c: number): boolean {\n return (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a)\n}\n\nfunction isTagNameChar(c: number): boolean {\n return isAsciiLetter(c) || (c >= 0x30 && c <= 0x39)\n}\n\nfunction isAttrNameChar(c: number): boolean {\n // a-zA-Z, 0-9, '-', '_', ':', '.'\n return (\n isAsciiLetter(c) ||\n (c >= 0x30 && c <= 0x39) ||\n c === 0x2d ||\n c === 0x5f ||\n c === 0x3a ||\n c === 0x2e\n )\n}\n\nexport function removeDuplicateAttributes(html: string): string {\n const n = html.length\n let out = ''\n let i = 0\n\n while (i < n) {\n const lt = html.indexOf('<', i)\n if (lt < 0) {\n out += html.slice(i)\n break\n }\n out += html.slice(i, lt)\n\n // Only opening tags that start with an ASCII letter and have at least\n // one whitespace before the attributes are normalised — matches the\n // scope of the prior regex (closing tags, comments, doctypes, and bare\n // `<` characters are left untouched).\n if (lt + 1 >= n || !isAsciiLetter(html.charCodeAt(lt + 1))) {\n out += '<'\n i = lt + 1\n continue\n }\n\n let p = lt + 1\n while (p < n && isTagNameChar(html.charCodeAt(p))) p++\n const tagName = html.slice(lt + 1, p)\n\n if (p >= n || !isSpaceChar(html.charCodeAt(p))) {\n out += '<'\n i = lt + 1\n continue\n }\n\n const attrs: string[] = []\n const seen = new Set<string>()\n let q = p\n\n while (q < n) {\n while (q < n && isSpaceChar(html.charCodeAt(q))) q++\n if (q >= n) break\n\n const ch = html.charCodeAt(q)\n if (ch === 0x3e) break // '>'\n if (ch === 0x2f && q + 1 < n && html.charCodeAt(q + 1) === 0x3e) break // '/>'\n\n const nameStart = q\n while (q < n && isAttrNameChar(html.charCodeAt(q))) q++\n if (q === nameStart) {\n // Stray character that can't start an attribute name. Skip it so\n // we make progress; the original tag bytes are preserved verbatim\n // below if we ultimately can't close the tag.\n q++\n continue\n }\n const attrName = html.slice(nameStart, q)\n\n let r = q\n while (r < n && isSpaceChar(html.charCodeAt(r))) r++\n\n let valueEnd = q\n if (r < n && html.charCodeAt(r) === 0x3d /* '=' */) {\n r++\n while (r < n && isSpaceChar(html.charCodeAt(r))) r++\n if (r < n) {\n const v = html.charCodeAt(r)\n if (v === 0x22 || v === 0x27) {\n // Quoted value\n const quote = html[r]\n const end = html.indexOf(quote, r + 1)\n if (end < 0) {\n // Unterminated quote — bail to the next `>` to avoid eating\n // the rest of the document.\n const gt = html.indexOf('>', r + 1)\n valueEnd = gt < 0 ? n : gt\n } else {\n valueEnd = end + 1\n }\n } else {\n // Unquoted value: read until whitespace or `>`\n let s = r\n while (s < n) {\n const k = html.charCodeAt(s)\n if (isSpaceChar(k) || k === 0x3e) break\n s++\n }\n valueEnd = s\n }\n } else {\n valueEnd = r\n }\n }\n\n const fullAttr = html.slice(nameStart, valueEnd)\n q = valueEnd\n\n const key = attrName.toLowerCase()\n if (!seen.has(key)) {\n seen.add(key)\n attrs.push(fullAttr)\n }\n }\n\n let selfClose = false\n if (q < n && html.charCodeAt(q) === 0x2f /* '/' */) {\n selfClose = true\n q++\n }\n if (q >= n || html.charCodeAt(q) !== 0x3e /* '>' */) {\n // Unterminated tag — leave the original input alone past the `<` and\n // continue scanning. This mirrors the prior regex's behaviour of not\n // matching such fragments.\n out += '<'\n i = lt + 1\n continue\n }\n q++\n\n const attrsJoined = attrs.length > 0 ? ' ' + attrs.join(' ') : ''\n out += '<' + tagName + attrsJoined + (selfClose ? ' /' : '') + '>'\n i = q\n }\n\n return out\n}\n\nexport function createDoc(html: string): Document | null {\n if (html.trim() === '') {\n return null\n }\n\n // Preprocess to remove duplicate attributes which cause @xmldom/xmldom 0.9+ to throw fatalError\n const cleanedHtml = removeDuplicateAttributes(html)\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 //\n // @xmldom/xmldom 0.9+ always throws a ParseError from its internal fatalError() path\n // (see dom-parser.js:490) for severely malformed HTML — e.g., mismatched tags like\n // <body>...<p>...</body> — regardless of the onError handler returning undefined.\n // The onError handler only gets to observe; the throw still happens.\n //\n // Wrap in try/catch so that pathologically-malformed post bodies degrade gracefully\n // (no image preload hint) instead of crashing the SSR render of /entry/[...]. Both\n // callers in catch-post-image.ts already handle a null return.\n try {\n return DOMParser.parseFromString(`<body>${cleanedHtml}</body>`, 'text/html')\n } catch {\n return null\n }\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 '../consts'\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 // Validate srcset: reject if any candidate URL uses a non-http(s) protocol\n if (tag === 'img' && name === 'srcset') {\n const candidates = decoded.split(',').map(c => c.trim().split(/\\s+/)[0]);\n if (candidates.some(url => !/^https?:\\/\\//.test(url))) return '';\n }\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'\nimport { LRUCache } from 'lru-cache'\n\nlet proxyBase = 'https://images.ecency.com'\n\n// base58 encoding of the source URL is the dominant cost in proxifyImageSrc.\n// The same URL is encoded repeatedly: once per srcset width (5×), once per\n// image size variant (blur/grid/row), and across requests (trending posts\n// repeat). Caching by URL collapses all of those to a single encode.\nconst urlHashCache = new LRUCache<string, string>({ max: 500 })\n\nfunction getUrlHash(url: string): string {\n const cached = urlHashCache.get(url)\n if (cached) return cached\n const hash = multihash.toB58String(Buffer.from(url))\n urlHashCache.set(url, hash)\n return hash\n}\n\nexport function setProxyBase(p: string): void {\n proxyBase = p\n}\n\nexport function getProxyBase(): string {\n return proxyBase\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|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\n/**\n * @param _format - @deprecated Ignored. Always uses 'match' — format is handled server-side via Accept header.\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 // Always use 'match' format — the server handles WebP via Accept header content negotiation\n const options: Record<string, string | number> = {\n format: 'match',\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 return `${proxyBase}/p/${pHash}?${qs}`\n }\n\n const b58url = getUrlHash(realUrl.toString())\n\n return `${proxyBase}/p/${b58url}?${qs}`\n}\n\n// Widths chosen to align with sizes already cached by the image proxy\n// (600 used by OG/deck thumbnails, 800 by self-hosted thumbnails)\nconst SRCSET_WIDTHS = [320, 600, 800, 1024, 1280];\n\n/**\n * Builds a srcset string with multiple width variants for responsive images.\n * Uses the image proxy's width parameter to serve appropriately sized images.\n */\nexport function buildSrcSet(url?: string): string {\n if (!url || typeof url !== 'string') return '';\n\n // For already-proxied URLs, extract the hash and rebuild with widths\n const escapedBase = proxyBase.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const proxyPattern = new RegExp(`^${escapedBase}/p/([^?]+)`);\n const match = url.match(proxyPattern);\n\n if (match) {\n const phash = extractPHash(url) || match[1];\n return SRCSET_WIDTHS\n .map(w => `${proxyBase}/p/${phash}?format=match&mode=fit&width=${w} ${w}w`)\n .join(', ');\n }\n\n // For non-proxied URLs, proxify at each width\n return SRCSET_WIDTHS\n .map(w => {\n const proxied = proxifyImageSrc(url, w);\n return proxied ? `${proxied} ${w}w` : '';\n })\n .filter(Boolean)\n .join(', ');\n}\n","import { proxifyImageSrc, buildSrcSet, getProxyBase } from \"../proxify-image-src\";\n\nconst IMAGE_SIZES = \"(max-width: 768px) 100vw, 700px\";\n\nexport function img(el: HTMLElement, state?: { firstImageFound: boolean }): void {\n const 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 // Sanitize dangerous attributes regardless of validity\n [\"onerror\", \"dynsrc\", \"lowsrc\", \"width\", \"height\"].forEach(attr => el.removeAttribute(attr));\n\n // ❌ Remove if javascript or empty/invalid\n const isInvalid = !src || decodedSrc.startsWith(\"javascript\") || decodedSrc.startsWith(\"vbscript\") || decodedSrc === \"x\";\n if (isInvalid) {\n el.removeAttribute(\"src\");\n el.removeAttribute(\"srcset\");\n el.removeAttribute(\"sizes\");\n return;\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 el.removeAttribute(\"src\");\n el.removeAttribute(\"srcset\");\n el.removeAttribute(\"sizes\");\n return;\n }\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 const cls = el.getAttribute(\"class\") || \"\";\n const shouldReplace = !cls.includes(\"no-replace\");\n // Only skip re-proxification for URLs already going through proxy/avatar/cover routes\n // Direct upload URLs (e.g. /DQm...) should still be proxified for resizing & format optimization\n const base = getProxyBase().replace(/\\/+$/, '');\n const hasAlreadyProxied = src.startsWith(`${base}/p/`)\n || src.startsWith(`${base}/u/`)\n || new RegExp(`^${base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}/\\\\d+x\\\\d+/`).test(src);\n\n if (shouldReplace && !hasAlreadyProxied) {\n const proxified = proxifyImageSrc(decodedSrc);\n if (proxified) {\n el.setAttribute(\"src\", proxified);\n const srcset = buildSrcSet(decodedSrc);\n if (srcset) {\n el.setAttribute(\"srcset\", srcset);\n el.setAttribute(\"sizes\", IMAGE_SIZES);\n }\n }\n } else if (shouldReplace && hasAlreadyProxied) {\n // Only /p/ URLs have extractable hashes for srcset; /u/ and /WxH/ routes\n // are avatar/cover URLs that shouldn't get responsive srcset\n if (src.startsWith(`${base}/p/`)) {\n const srcset = buildSrcSet(src);\n if (srcset) {\n el.setAttribute(\"srcset\", srcset);\n el.setAttribute(\"sizes\", IMAGE_SIZES);\n }\n }\n }\n}\n\nexport function createImageHTML(src: string, isLCP: boolean): string {\n const proxified = proxifyImageSrc(src);\n if (!proxified) return '';\n\n const base = getProxyBase().replace(/\\/+$/, '');\n const isAlreadyProxied = src.startsWith(`${base}/u/`)\n || new RegExp(`^${base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}/\\\\d+x\\\\d+/`).test(src);\n const srcset = isAlreadyProxied ? '' : buildSrcSet(src);\n const loading = isLCP ? 'eager' : 'lazy';\n const fetch = isLCP ? 'fetchpriority=\"high\"' : 'decoding=\"async\"';\n const srcsetAttr = srcset ? `srcset=\"${srcset}\" sizes=\"${IMAGE_SIZES}\"` : '';\n return `<img\n class=\"markdown-img-link\"\n src=\"${proxified}\"\n ${srcsetAttr}\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 SPEAK_AUDIO_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\";\nimport { RenderOptions, SeoContext } from '../types'\n\nconst NOFOLLOW_REPUTATION_THRESHOLD = 40;\nconst FOLLOW_PAYOUT_THRESHOLD = 5;\n\n/**\n * Determines the rel attribute for external links based on SEO context.\n *\n * Default: \"nofollow ugc noopener\" for all user-generated external links.\n * Exception: \"noopener\" only (followed) when author reputation >= 40 AND post payout > $5.\n */\nfunction getExternalLinkRel(seoContext?: SeoContext): string {\n if (\n seoContext?.authorReputation !== undefined &&\n seoContext?.postPayout !== undefined &&\n seoContext.authorReputation >= NOFOLLOW_REPUTATION_THRESHOLD &&\n seoContext.postPayout > FOLLOW_PAYOUT_THRESHOLD\n ) {\n return 'noopener';\n }\n return 'nofollow ugc noopener';\n}\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\n/**\n * Normalizes display text for inline detection by:\n * - Stripping protocol and domain (ecency.com, peakd.com, hive.blog)\n * - Removing leading/trailing slashes\n * - Removing query parameters\n * - Removing comment hashes (#@...)\n * - Converting to lowercase\n */\nconst normalizeDisplayText = (text: string): string => {\n return text\n .trim()\n .replace(/^https?:\\/\\/(www\\.)?(ecency\\.com|peakd\\.com|hive\\.blog)/i, \"\")\n .replace(/^\\/+/, \"\")\n .split(\"?\")[0]\n .replace(/#@.*$/i, \"\")\n .replace(/\\/+$/, \"\")\n .toLowerCase();\n}\n\n/**\n * Enhanced inline detection that handles edge cases like:\n * - Full URLs: https://ecency.com/@author/permlink\n * - Relative URLs: /@author/permlink\n * - With community tags: hive-123456/@author/permlink\n * - With query params: @author/permlink?ref=twitter\n * - With trailing slashes: @author/permlink/\n */\nconst getInlineMeta = (el: HTMLElement, href: string, author: string, permlink: string, communityTag?: string) => {\n // Simple exact match (original behavior)\n const textMatches = matchesHref(href, el.textContent)\n const titleMatches = matchesHref(href, el.getAttribute('title'))\n\n // Sophisticated normalized matching\n const normalizedDisplay = normalizeDisplayText(el.textContent || \"\");\n const normalizedTarget = `@${author}/${permlink}`.toLowerCase();\n\n // Build expected display patterns\n const expectedDisplays = new Set([normalizedTarget]);\n if (communityTag) {\n expectedDisplays.add(`${communityTag.toLowerCase()}/${normalizedTarget}`);\n }\n\n const sophisticatedMatch =\n normalizedDisplay === normalizedTarget ||\n (communityTag ? normalizedDisplay === `${communityTag.toLowerCase()}/${normalizedTarget}` : false);\n\n return {\n textMatches,\n titleMatches,\n isInline: textMatches || titleMatches || sophisticatedMatch\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, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): 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 (original or enhanced)\n if (className && (\n ['markdown-author-link', 'markdown-tag-link'].includes(className) ||\n className.includes('er-author') ||\n className.includes('er-tag')\n )) {\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);\n const doc = DOMParser.parseFromString(imgHTML, 'text/html');\n const replaceNode = doc.body?.firstChild || doc.firstChild\n\n if (replaceNode && el.parentNode) {\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, author, permlink)\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 // Pass community tag if it starts with \"hive-\"\n const communityTag = tag.toLowerCase().startsWith('hive-') ? tag : undefined\n const inlineMeta = getInlineMeta(el, href, author, permlink, communityTag)\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, author, permlink)\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, author, permlink)\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, '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 if (renderOptions?.embedVideosDirectly) {\n const wrapper = el.ownerDocument.createElement('span')\n wrapper.setAttribute('class', 'er-youtube-frame')\n wrapper.setAttribute('style', 'display:block')\n const iframe = el.ownerDocument.createElement('iframe')\n iframe.setAttribute('class', 'youtube-player')\n iframe.setAttribute('src', embedSrc)\n iframe.setAttribute('title', 'YouTube video')\n iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; web-share')\n iframe.setAttribute('allowfullscreen', '')\n wrapper.appendChild(iframe)\n el.appendChild(wrapper)\n el.setAttribute('class', 'markdown-video-link markdown-video-link-youtube er-youtube')\n } else {\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\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, '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://play.3speak.tv/watch?v=${match[3]}&mode=iframe`\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\n if (renderOptions?.embedVideosDirectly) {\n // Use span (not div) to avoid invalid nesting inside <p> tags\n const wrapper = el.ownerDocument.createElement('span')\n wrapper.setAttribute('class', 'er-speak-frame')\n wrapper.setAttribute('style', 'display:block')\n const iframe = el.ownerDocument.createElement('iframe')\n iframe.setAttribute('class', 'speak-iframe')\n iframe.setAttribute('src', videoHref)\n iframe.setAttribute('title', '3Speak video')\n iframe.setAttribute('allow', 'accelerometer; encrypted-media; gyroscope; picture-in-picture; web-share')\n iframe.setAttribute('allowfullscreen', '')\n wrapper.appendChild(iframe)\n el.appendChild(wrapper)\n el.setAttribute('class', 'markdown-video-link markdown-video-link-speak er-speak')\n } else {\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, '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 }\n return\n }\n }\n }\n\n // Detect 3Speak Audio\n if (href.match(SPEAK_AUDIO_REGEX) && el.textContent.trim() === href) {\n el.setAttribute('class', 'markdown-audio-link markdown-audio-link-speak')\n el.removeAttribute('href')\n\n const embedSrc = /[?&]iframe=/.test(href) ? href : `${href}&iframe=1`\n const finalSrc = /[?&]mode=/.test(embedSrc) ? embedSrc : `${embedSrc}&mode=compact`\n\n el.textContent = ''\n\n const ifr = el.ownerDocument.createElement('iframe')\n ifr.setAttribute('frameborder', '0')\n ifr.setAttribute('src', finalSrc)\n ifr.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups')\n el.appendChild(ifr)\n\n return\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 if (el.parentNode) {\n el.parentNode.replaceChild(blockquote, el)\n }\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', getExternalLinkRel(seoContext));\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, SPEAK_AUDIO_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', forApp: boolean = false): 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 play.3speak.tv for new embed player\n // Use (?:play\\.)? to avoid doubling the prefix on already-correct URLs\n let normalizedSrc = src.replace(/(?:play\\.)?3speak\\.[a-z]+/i, 'play.3speak.tv');\n\n // Normalize /embed? to /watch? for proper embed endpoint\n normalizedSrc = normalizedSrc.replace(/\\/embed\\?/, '/watch?');\n\n // Ensure mode=iframe parameter is present for minimal embed UI\n const hasMode = /[?&]mode=/.test(normalizedSrc);\n if (!hasMode) {\n normalizedSrc = `${normalizedSrc}&mode=iframe`;\n }\n\n // Add autoplay if not present\n const hasAutoplay = /[?&]autoplay=/.test(normalizedSrc);\n let s = hasAutoplay\n ? normalizedSrc\n : `${normalizedSrc}&autoplay=true`;\n\n // Add mobile layout parameter when rendering for app\n if (forApp && !/[?&]layout=/.test(s)) {\n s = `${s}&layout=mobile`;\n }\n\n el.setAttribute('src', s);\n el.setAttribute('class', 'speak-iframe');\n return;\n }\n\n // 3Speak Audio\n if (src.match(SPEAK_AUDIO_EMBED_REGEX)) {\n let normalizedSrc = src;\n\n // Ensure iframe=1 parameter for clean embedding\n if (!/[?&]iframe=/.test(normalizedSrc)) {\n normalizedSrc = `${normalizedSrc}&iframe=1`;\n }\n\n // Default to compact mode if no mode specified\n if (!/[?&]mode=/.test(normalizedSrc)) {\n normalizedSrc = `${normalizedSrc}&mode=compact`;\n }\n\n el.setAttribute('src', normalizedSrc);\n el.setAttribute('class', 'speak-audio-iframe');\n el.setAttribute('frameborder', '0');\n el.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-popups');\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\";\nimport { RenderOptions } from \"../types\";\n\nexport function linkify(content: string, forApp: boolean, renderOptions?: RenderOptions): 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 if (!forApp) {\n return `${preceding}<a class=\"er-tag er-tag-link\" href=\"/trending/${tagLower}\">${tag.trim()}</a>`\n }\n return `${preceding}<a class=\"markdown-tag-link\" data-tag=\"${tagLower}\">${tag.trim()}</a>`\n })\n\n // User mentions - use placeholders for enhanced HTML to prevent image regex\n // from matching URLs inside the avatar <img src=\"...\"> attribute\n const authorPlaceholders: { placeholder: string; html: string }[] = []\n\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 if (!forApp) {\n const avatarSrc = `https://images.ecency.com/u/${userLower}/avatar/small`\n const html = `${preceedings}<a class=\"er-author er-author-link\" href=\"/@${userLower}\"><img class=\"er-author-link-image\" src=\"${avatarSrc}\" alt=\"${userLower}\"/><span class=\"er-author-link-content\"><span class=\"er-author-link-label\">Hive account</span><span>@${userLower}</span></span></a>`\n const placeholder = `\\u200C${authorPlaceholders.length}\\u200C`\n authorPlaceholders.push({ placeholder, html })\n return placeholder\n }\n return `${preceedings}<a class=\"markdown-author-link\" data-author=\"${userLower}\">@${user}</a>`\n } else {\n return match\n }\n }\n )\n\n // internal links with category: /category/@user/permlink\n content = content.replace(\n /(^|\\s)\\/([a-z0-9-]+)\\/@([\\w.\\d-]+)\\/(\\S+)/gi, (match, preceding, tag, author, p3) => {\n const authorLower = author.toLowerCase();\n if (!isValidUsername(authorLower)) return match;\n const permlink = sanitizePermlink(p3);\n if (!isValidPermlink(permlink)) return match;\n\n if (SECTION_LIST.includes(permlink)) {\n const attrs = forApp ? `href=\"https://ecency.com/@${authorLower}/${permlink}\"` : `href=\"/@${authorLower}/${permlink}\"`\n return `${preceding}<a class=\"markdown-profile-link\" ${attrs}>@${authorLower}/${permlink}</a>`\n } else {\n const attrs = forApp ? `data-author=\"${authorLower}\" data-tag=\"${tag}\" data-permlink=\"${permlink}\"` : `href=\"/${tag}/@${authorLower}/${permlink}\"`\n return `${preceding}<a class=\"markdown-post-link\" ${attrs}>@${authorLower}/${permlink}</a>`\n }\n }\n )\n\n // internal links — require leading / to distinguish /@user/permlink (Hive links)\n // from @scope/package (npm packages, GitHub orgs, etc.)\n content = content.replace(\n /((^|\\s)\\/@[\\w.\\d-]+)\\/(\\S+)/gi, (match, u, _p1, 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.includes(permlink)) {\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 // Process images before restoring author placeholders to avoid\n // the image regex matching URLs inside enhanced author HTML\n let firstImageUsed = false;\n\n content = content.replace(IMG_REGEX, (imglink) => {\n const isLCP = !firstImageUsed;\n firstImageUsed = true;\n return createImageHTML(imglink, isLCP);\n });\n\n // Restore author placeholders\n authorPlaceholders.forEach(({ placeholder, html }) => {\n content = content.replace(placeholder, html);\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\";\nimport { RenderOptions } from \"../types\";\n\nfunction hasAncestor(node: Node, tagNames: string[]): boolean {\n let current = node.parentNode\n while (current) {\n if (tagNames.includes(current.nodeName.toLowerCase())) {\n return true\n }\n current = current.parentNode\n }\n return false\n}\n\nexport function text(node: HTMLElement | null, forApp: boolean, renderOptions?: RenderOptions): void {\n if (!node || !node.parentNode) {\n return\n }\n\n // Skip text nodes inside links, inline code, or code blocks (check all ancestors)\n if (hasAncestor(node, ['a', 'code', 'pre'])) {\n return\n }\n\n const nodeValue = node.nodeValue || ''\n const linkified = linkify(nodeValue, forApp, renderOptions)\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);\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, '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'\nimport { RenderOptions, SeoContext } from '../types'\n\nexport function traverse(node: Node, forApp: boolean, depth = 0, state = { firstImageFound: false }, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): void {\n if (!node || !node.childNodes) {\n return\n }\n\n // Walk siblings using nextSibling instead of indexing into the live NodeList.\n // node.childNodes is live: when a handler removes or replaces a child the\n // indices shift, causing index-based loops to skip nodes. Capturing\n // nextSibling before running handlers gives a stable \"next\" pointer that\n // isn't affected by mutations to the current child.\n let child = node.firstChild\n while (child) {\n const next = child.nextSibling\n const prev = child.previousSibling\n\n if (child.nodeName.toLowerCase() === 'a') {\n a(<HTMLElement>child, forApp, parentDomain, seoContext, renderOptions)\n }\n if (child.nodeName.toLowerCase() === 'iframe') {\n iframe(<HTMLElement>child, parentDomain, forApp)\n }\n if (child.nodeName === '#text') {\n text(<HTMLElement>child, forApp, renderOptions)\n }\n if (child.nodeName.toLowerCase() === 'img') {\n img(<HTMLElement>child, state)\n }\n if (child.nodeName.toLowerCase() === 'p') {\n p(<HTMLElement>child)\n }\n\n if (child.parentNode) {\n // Child is still in the DOM — recurse into it normally\n traverse(child, forApp, depth + 1, state, parentDomain, seoContext, renderOptions)\n } else {\n // Child was removed or replaced by a handler. If a replacement was\n // inserted (e.g. text() wraps a URL in <span>, a() swaps a tweet link\n // for <blockquote>), it now sits between `prev` and `next` in the live\n // childNodes. Detect it by comparing next.previousSibling to the\n // captured `prev` — if they differ a new node was inserted.\n const possibleReplacement = next ? next.previousSibling : node.lastChild\n if (possibleReplacement && possibleReplacement !== prev && possibleReplacement.parentNode === node) {\n traverse(possibleReplacement, forApp, depth + 1, state, parentDomain, seoContext, renderOptions)\n }\n }\n\n child = next\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 .filter(item => item.toLowerCase().includes('<sub>[via apps from](') === 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 { removeDuplicateAttributes } from '../helper'\nimport { DOMParser, XMLSerializer, ENTITY_REGEX } from '../consts'\nimport { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\nimport * as htmlparser2 from 'htmlparser2'\nimport * as domSerializerModule from 'dom-serializer'\nimport { RenderOptions, SeoContext } from '../types'\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, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): 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\">${removeDuplicateAttributes(output)}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, { firstImageFound: false }, parentDomain, seoContext, renderOptions)\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 // Reuse the markdown output already produced before the failing\n // DOMParser pass — `md.render(input)` is the expensive step and\n // re-running it costs ~100 ms per fallback hit on a 60 KB body.\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\">${removeDuplicateAttributes(repairedHtml)}</body>`, 'text/html')\n\n traverse(doc, forApp, 0, { firstImageFound: false }, parentDomain, seoContext, renderOptions)\n\n output = serializer.serializeToString(doc)\n } catch (fallbackError) {\n // If DOM parsing fails, sanitize the Remarkable HTML output directly.\n // This skips the traverse() image proxy/link rewriting but preserves\n // readable HTML content instead of showing escaped tags.\n output = sanitizeHtml(output || md.render(input))\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\n .replace(/ xmlns=\"http:\\/\\/www.w3.org\\/1999\\/xhtml\"/g, '')\n // Strip full HTML document wrapper (native browser DOMParser wraps in <html><head><body>)\n .replace(/^<\\?xml[^?]*\\?>/, '')\n .replace(/^<!DOCTYPE[^>]*>/i, '')\n .replace(/<\\/?html[^>]*>/g, '')\n .replace(/<head[^>]*>[\\s\\S]*?<\\/head>/g, '')\n .replace('<body id=\"root\">', '')\n .replace('</body>', '')\n .trim()\n\n return sanitizeHtml(output)\n}\n","import { Remarkable } from 'remarkable'\nimport { linkify } from 'remarkable/linkify'\nimport { sanitizeHtml } from './sanitize-html.method'\n\nlet mdInstance: Remarkable | null = null\n\nfunction getMd(): Remarkable {\n if (!mdInstance) {\n mdInstance = new Remarkable({\n html: true,\n breaks: true,\n typographer: false\n }).use(linkify)\n }\n return mdInstance\n}\n\n/**\n * Lightweight markdown-to-HTML conversion with sanitization.\n * Unlike the full `markdownToHTML`, this skips Hive-specific transforms\n * (image proxying, link internalizing, DOM traversal, etc.).\n *\n * Intended for editor input (TipTap), chat messages, and other contexts\n * where simple markdown rendering is sufficient.\n */\nexport function simpleMarkdownToHTML(input: string): string {\n if (!input) return ''\n\n const html = getMd().render(input)\n return sanitizeHtml(html)\n}\n","import { LRUCache } from 'lru-cache'\n\n// A single feed page calls catchPostImage 3× per entry (blur 0×0, grid, row)\n// plus postBodySummary, so 20 entries already produce ~80 keys. The previous\n// max of 60 caused constant eviction and forced re-rendering of full markdown\n// during SSR fan-out.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet cache = new LRUCache<string, any>({ max: 500 })\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, RenderOptions, SeoContext } from './types'\n\n// Warn when a single markdown render exceeds this threshold. Surfaces both\n// pathological inputs (e.g. ReDoS-prone tag attributes) and merely-slow ones\n// (huge bodies hitting the xmldom fallback) so they can be triaged from\n// container logs without waiting for the SSR watchdog to kill a replica.\n//\n// Default is **Node-on, everything-else-off**. The string overload of\n// `markdown2Html` is called from comment/reply preview paths with\n// unpublished user input — warnings firing on the client would (a) leak\n// draft content into the console and any client telemetry pipeline, and\n// (b) repeat on every keystroke (the string path is uncached). Restricting\n// the default to Node specifically also keeps React Native bundles\n// (Metro/Hermes), edge runtimes (Workers, Deno, Bun) and arbitrary\n// downstream consumers silent unless they opt in.\n//\n// Opt in from any non-Node runtime by calling `setSlowRenderThresholdMs(500)`\n// during init; pass 0 to disable everywhere.\nconst isNodeRuntime =\n typeof process !== 'undefined' && typeof process?.versions?.node === 'string'\nlet slowRenderThresholdMs = isNodeRuntime ? 500 : 0\n\nexport function setSlowRenderThresholdMs(ms: number): void {\n slowRenderThresholdMs = Math.max(0, ms)\n}\n\nfunction logIfSlow(durationMs: number, context: string): void {\n if (slowRenderThresholdMs > 0 && durationMs >= slowRenderThresholdMs) {\n // Grep-friendly prefix: \"[render-helper] slow markdown render\" is a\n // unique substring that doesn't collide with anything else in the code\n // base. We intentionally do not include a content excerpt — the\n // body_len + (when available) author/permlink is enough to triage, and\n // the string overload can carry unpublished user-authored text from\n // comment/draft preview paths.\n // eslint-disable-next-line no-console\n console.warn(\n `[render-helper] slow markdown render: ${durationMs.toFixed(0)}ms ${context}`\n )\n }\n}\n\n/**\n * @param obj - Entry object or raw markdown string\n * @param forApp - Whether rendering for app context\n * @param _webp - @deprecated Ignored. Format is now handled server-side via Accept header content negotiation.\n * @param parentDomain - Parent domain for iframe embed parameters\n * @param seoContext - Optional SEO context for structured data\n * @param renderOptions - Optional rendering options (e.g. embedVideosDirectly)\n */\nexport function markdown2Html(obj: Entry | string, forApp = true, _webp = false, parentDomain: string = 'ecency.com', seoContext?: SeoContext, renderOptions?: RenderOptions): string {\n if (typeof obj === 'string') {\n const cleanedStr = cleanReply(obj)\n const t0 = performance.now()\n const res = markdownToHTML(cleanedStr, forApp, parentDomain, seoContext, renderOptions)\n logIfSlow(performance.now() - t0, `body_len=${obj.length}`)\n return res\n }\n\n const key = `${makeEntryCacheKey(obj)}-md-${forApp ? 'app' : 'site'}-${parentDomain}${seoContext ? `-seo${seoContext.authorReputation ?? ''}-${seoContext.postPayout ?? ''}` : ''}${renderOptions?.embedVideosDirectly ? '-embed' : ''}`\n\n const item = cacheGet<string>(key)\n if (item) {\n return item\n }\n\n const cleanBody = cleanReply(obj.body)\n\n const t0 = performance.now()\n const res = markdownToHTML(cleanBody, forApp, parentDomain, seoContext, renderOptions)\n logIfSlow(\n performance.now() - t0,\n `author=@${obj.author} permlink=${obj.permlink} body_len=${obj.body?.length ?? 0}`\n )\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'\nimport he from 'he'\n\nconst gifLinkRegex = /\\.(gif)$/i;\n\nfunction isGifLink(link: string) {\n return gifLinkRegex.test(link);\n}\n\n// Strip code regions so that  inside a code block is not mistaken\n// for a real image. The full markdown renderer turns these into <pre><code>\n// with no <img>, so we mirror that behavior here.\n// - backtick fences ``` … ``` (with optional language hint)\n// - tilde fences ~~~ … ~~~ (CommonMark also accepts these)\n// - inline code `…`\n// - indented code blocks (4 spaces or a tab at line start) — over-strips\n// a little (e.g., deeply nested list continuation lines), which is fine:\n// a missed match just falls back to the full parser.\nconst BACKTICK_FENCE_RE = /```[\\s\\S]*?```/g\nconst TILDE_FENCE_RE = /~~~[\\s\\S]*?~~~/g\nconst INLINE_CODE_RE = /`[^`\\n]*`/g\nconst INDENTED_CODE_RE = /^(?: {4}|\\t).+$/gm\n// Requires a closing `)` so broken syntax like ` doesn't\n// match. Also tolerates the optional title form ``.\nconst MD_IMAGE_RE = /!\\[[^\\]]*\\]\\(\\s*([^)\\s]+)(?:\\s+[\"'][^\"']*[\"'])?\\s*\\)/\nconst HTML_IMAGE_RE = /<img\\b[^>]*?\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/i\n\n// The fast-path bypasses sanitize-html (which the full markdown pipeline\n// applies). The sanitizer only preserves http/https <img> sources — ftp,\n// data, javascript, relative, etc. are all dropped. Mirror that policy here\n// so the fast-path can never surface an image the full path would have\n// dropped. Anything else returns null and falls back to the sanitized parse.\nconst SAFE_URL_RE = /^https?:\\/\\//i\n\n/**\n * Fast-path: extract the first image URL from raw markdown without rendering\n * the whole post. Returns null if nothing matches *unambiguously* — when in\n * doubt, the caller falls back to the full markdown2Html → DOM parse path.\n */\nfunction findFirstImageUrl(body: string): string | null {\n if (!body) return null\n const cleaned = body\n .replace(BACKTICK_FENCE_RE, '')\n .replace(TILDE_FENCE_RE, '')\n .replace(INLINE_CODE_RE, '')\n .replace(INDENTED_CODE_RE, '')\n\n const mdMatch = cleaned.match(MD_IMAGE_RE)\n const htmlMatch = cleaned.match(HTML_IMAGE_RE)\n\n // If markdown image syntax is present at all, it must be unambiguous. The\n // capture class `[^)\\s]+` excludes `)`, so a captured URL containing `(`\n // means the URL was truncated mid-paren (e.g., a real\n // `https://x.com/path_(a)_full.jpg`). When ambiguous, bail and let the full\n // markdown parser handle it — returning a truncated URL would be wrong.\n if (mdMatch) {\n const url = mdMatch[1]\n if (!url || !SAFE_URL_RE.test(url) || url.includes('(')) {\n return null\n }\n }\n\n const mdValid = !!mdMatch\n const htmlValid = !!(htmlMatch && htmlMatch[1] && SAFE_URL_RE.test(htmlMatch[1]))\n\n // Pick the earliest match in source order — the full markdown render would\n // surface whichever <img> appears first in the rendered document.\n if (mdValid && htmlValid) {\n return (mdMatch!.index ?? 0) < (htmlMatch!.index ?? 0) ? mdMatch![1] : htmlMatch![1]\n }\n if (mdValid) return mdMatch![1]\n if (htmlValid) return htmlMatch![1]\n return null\n}\n\nfunction proxifyFound(src: string, width: number, height: number, format: string): string {\n const decoded = he.decode(src)\n if (isGifLink(decoded)) {\n return proxifyImageSrc(decoded, 0, 0, format)\n }\n return proxifyImageSrc(decoded, width, height, format)\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 // Decode HTML entities (e.g., & -> &) before proxifying\n const decodedImage = he.decode(meta.image)\n if (isGifLink(decodedImage)) {\n return proxifyImageSrc(decodedImage, 0, 0, format)\n }\n return proxifyImageSrc(decodedImage, width, height, format)\n }\n\n if (meta && meta.image && !!meta.image.length && meta.image[0]) {\n // Only decode if it's a string, otherwise pass through to proxifyImageSrc which will return ''\n if (typeof meta.image[0] === 'string') {\n // Decode HTML entities (e.g., & -> &) before proxifying\n const decodedImage = he.decode(meta.image[0])\n if (isGifLink(decodedImage)) {\n return proxifyImageSrc(decodedImage, 0, 0, format)\n }\n return proxifyImageSrc(decodedImage, width, height, format)\n }\n // For non-string types, let proxifyImageSrc handle it (returns '')\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 // Fast-path: try to find the first image with a regex over the raw body.\n // Avoids the cost of full markdown2Html + DOM parsing for the common case.\n const fast = findFirstImageUrl(entry.body)\n if (fast) {\n return proxifyFound(fast, width, height, format)\n }\n\n // Fall back to the full markdown render (handles edge cases the regex missed)\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 return proxifyFound(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 // Process string directly to avoid cache key collision\n // Don't create Entry wrapper as it would generate invalid cache keys\n\n // Fast-path: regex over raw markdown\n const fast = findFirstImageUrl(obj)\n if (fast) {\n return proxifyFound(fast, width, height, format)\n }\n\n const html = markdown2Html(obj)\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 return proxifyFound(src, width, height, format)\n }\n\n return null\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'\n\n// Reused across all calls — config is constant and Remarkable construction\n// (rule registration via ruler.enable) is non-trivial under SSR fan-out.\n//\n// linkify is intentionally omitted: the post-processing pass below strips bare\n// URLs from the final text, so auto-linking them just to discard the <a>\n// wrapper is wasted CPU during SSR.\nconst summaryRenderer = new Remarkable({\n html: true,\n breaks: true,\n typographer: false,\n})\nsummaryRenderer.core.ruler.enable(['abbr'])\nsummaryRenderer.block.ruler.enable(['footnote', 'deflist'])\nsummaryRenderer.inline.ruler.enable([\n 'footnote_inline',\n 'ins',\n 'mark',\n 'sub',\n 'sup',\n])\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 // 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 = summaryRenderer.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"]}
|