@ecency/render-helper 2.4.4 → 2.4.6

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.
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Entry interface for Hive post data
3
+ */
1
4
  interface Entry {
2
5
  author?: string;
3
6
  permlink?: string;
@@ -29,4 +32,4 @@ declare const SECTION_LIST: string[];
29
32
 
30
33
  declare function isValidPermlink(permlink: string): boolean;
31
34
 
32
- export { SECTION_LIST, catchPostImage, isValidPermlink, getPostBodySummary as postBodySummary, proxifyImageSrc, markdown2Html as renderPostBody, setCacheSize, setProxyBase };
35
+ export { type Entry, SECTION_LIST, catchPostImage, isValidPermlink, getPostBodySummary as postBodySummary, proxifyImageSrc, markdown2Html as renderPostBody, setCacheSize, setProxyBase };
@@ -4,8 +4,10 @@ import multihash from 'multihashes';
4
4
  import querystring from 'querystring';
5
5
  import { Remarkable } from 'remarkable';
6
6
  import { linkify as linkify$1 } from 'remarkable/linkify';
7
- import { LRUCache } from 'lru-cache';
8
7
  import he from 'he';
8
+ import * as htmlparser2 from 'htmlparser2';
9
+ import * as domSerializerModule from 'dom-serializer';
10
+ import { LRUCache } from 'lru-cache';
9
11
 
10
12
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
11
13
  get: (a2, b) => (typeof require !== "undefined" ? require : a2)[b]
@@ -57,7 +59,7 @@ var SECTION_LIST = [
57
59
  ];
58
60
 
59
61
  // src/consts/regexes.const.ts
60
- var IMG_REGEX = /(https?:\/\/.*\.(?:tiff?|jpe?g|gif|png|svg|ico|heic|webp))(.*)/gim;
62
+ var IMG_REGEX = /(https?:\/\/.*\.(?:tiff?|jpe?g|gif|png|svg|ico|heic|webp|arw))(.*)/gim;
61
63
  var IPFS_REGEX = /^https?:\/\/[^/]+\/(ip[fn]s)\/([^/?#]+)/gim;
62
64
  var POST_REGEX = /^https?:\/\/(.*)\/(.*)\/(@[\w.\d-]+)\/(.*)/i;
63
65
  var CCC_REGEX = /^https?:\/\/(.*)\/ccc\/([\w.\d-]+)\/(.*)/i;
@@ -182,7 +184,7 @@ function createDoc(html) {
182
184
  if (html.trim() === "") {
183
185
  return null;
184
186
  }
185
- const doc = DOMParser.parseFromString(html, "text/html");
187
+ const doc = DOMParser.parseFromString(`<body>${html}</body>`, "text/html");
186
188
  return doc;
187
189
  }
188
190
  function makeEntryCacheKey(entry) {
@@ -856,7 +858,7 @@ function a(el, forApp, webp, parentDomain = "ecency.com") {
856
858
  const imgEls2 = el.getElementsByTagName("img");
857
859
  if (imgEls2.length === 1 || el.textContent.trim() === href) {
858
860
  if ((match[1] || match[2]) && match[3]) {
859
- const videoHref = `https://play.3speak.tv/embed?v=${match[3]}&mode=iframe`;
861
+ const videoHref = `https://3speak.tv/embed?v=${match[3]}`;
860
862
  el.setAttribute("class", "markdown-video-link markdown-video-link-speak");
861
863
  el.removeAttribute("href");
862
864
  el.setAttribute("data-embed-src", videoHref);
@@ -989,10 +991,7 @@ function iframe(el, parentDomain = "ecency.com") {
989
991
  return;
990
992
  }
991
993
  if (src.match(SPEAK_EMBED_REGEX)) {
992
- let normalizedSrc = src.replace(/3speak\.[a-z]+/i, "play.3speak.tv");
993
- if (!/[?&]mode=iframe/.test(normalizedSrc)) {
994
- normalizedSrc = `${normalizedSrc}${normalizedSrc.includes("?") ? "&" : "?"}mode=iframe`;
995
- }
994
+ let normalizedSrc = src.replace(/3speak\.[a-z]+/i, "3speak.tv");
996
995
  const hasAutoplay = /[?&]autoplay=/.test(normalizedSrc);
997
996
  const s = hasAutoplay ? normalizedSrc : `${normalizedSrc}&autoplay=true`;
998
997
  el.setAttribute("src", s);
@@ -1266,6 +1265,7 @@ function traverse(node, forApp, depth = 0, webp = false, state = { firstImageFou
1266
1265
  function cleanReply(s) {
1267
1266
  return (s ? s.split("\n").filter((item) => item.toLowerCase().includes("posted using [partiko") === false).filter((item) => item.toLowerCase().includes("posted using [dapplr") === false).filter((item) => item.toLowerCase().includes("posted using [leofinance") === false).filter((item) => item.toLowerCase().includes("posted via [neoxian") === false).filter((item) => item.toLowerCase().includes("posted using [neoxian") === false).filter((item) => item.toLowerCase().includes("posted with [stemgeeks") === false).filter((item) => item.toLowerCase().includes("posted using [bilpcoin") === false).filter((item) => item.toLowerCase().includes("posted using [inleo") === false).filter((item) => item.toLowerCase().includes("posted using [sportstalksocial]") === false).filter((item) => item.toLowerCase().includes("<center><sub>[posted using aeneas.blog") === false).filter((item) => item.toLowerCase().includes("<center><sub>posted via [proofofbrain.io") === false).filter((item) => item.toLowerCase().includes("<center>posted on [hypnochain") === false).filter((item) => item.toLowerCase().includes("<center><sub>posted via [weedcash.network") === false).filter((item) => item.toLowerCase().includes("<center>posted on [naturalmedicine.io") === false).filter((item) => item.toLowerCase().includes("<center><sub>posted via [musicforlife.io") === false).filter((item) => item.toLowerCase().includes("if the truvvl embed is unsupported by your current frontend, click this link to view this story") === false).filter((item) => item.toLowerCase().includes("<center><em>posted from truvvl") === false).filter((item) => item.toLowerCase().includes('view this post <a href="https://travelfeed.io/') === false).filter((item) => item.toLowerCase().includes("read this post on travelfeed.io for the best experience") === false).filter((item) => item.toLowerCase().includes('posted via <a href="https://www.dporn.co/"') === false).filter((item) => item.toLowerCase().includes("\u25B6\uFE0F [watch on 3speak](https://3speak") === false).filter((item) => item.toLowerCase().includes("<sup><sub>posted via [inji.com]") === false).filter((item) => item.toLowerCase().includes("view this post on [liketu]") === false).filter((item) => item.toLowerCase().includes("[via Inbox]") === false).join("\n") : "").replace('Posted via <a href="https://d.buzz" data-link="promote-link">D.Buzz</a>', "").replace('<div class="pull-right"><a href="/@hive.engage">![](https://i.imgur.com/XsrNmcl.png)</a></div>', "").replace('<div><a href="https://engage.hivechain.app">![](https://i.imgur.com/XsrNmcl.png)</a></div>', "").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>`, "");
1268
1267
  }
1268
+ var domSerializer = domSerializerModule.default || domSerializerModule;
1269
1269
  var lolight = null;
1270
1270
  function getLolightInstance() {
1271
1271
  if (!lolight) {
@@ -1277,6 +1277,20 @@ function getLolightInstance() {
1277
1277
  }
1278
1278
  return lolight;
1279
1279
  }
1280
+ function fixBlockLevelTagsInParagraphs(html) {
1281
+ const blockTags = "center|div|table|figure|section|article|aside|header|footer|nav|main";
1282
+ const openingPattern = new RegExp(`<p>(<(?:${blockTags})(?:\\s[^>]*)?>)<\\/p>`, "gi");
1283
+ html = html.replace(openingPattern, "$1");
1284
+ const closingPattern = new RegExp(`<p>(<\\/(?:${blockTags})>)<\\/p>`, "gi");
1285
+ html = html.replace(closingPattern, "$1");
1286
+ const startPattern = new RegExp(`<p>(<(?:${blockTags})(?:\\s[^>]*)?>)(?:<br>)?\\s*`, "gi");
1287
+ html = html.replace(startPattern, "$1<p>");
1288
+ const endPattern = new RegExp(`\\s*(?:<br>)?\\s*(<\\/(?:${blockTags})>)<\\/p>`, "gi");
1289
+ html = html.replace(endPattern, "</p>$1");
1290
+ html = html.replace(/<p>\s*<\/p>/g, "");
1291
+ html = html.replace(/<p><br>\s*<\/p>/g, "");
1292
+ return html;
1293
+ }
1280
1294
  function markdownToHTML(input, forApp, webp, parentDomain = "ecency.com") {
1281
1295
  input = input.replace(new RegExp("https://leofinance.io/threads/view/", "g"), "/@");
1282
1296
  input = input.replace(new RegExp("https://leofinance.io/posts/", "g"), "/@");
@@ -1335,6 +1349,7 @@ function markdownToHTML(input, forApp, webp, parentDomain = "ecency.com") {
1335
1349
  }
1336
1350
  try {
1337
1351
  output = md.render(input);
1352
+ output = fixBlockLevelTagsInParagraphs(output);
1338
1353
  const doc = DOMParser.parseFromString(`<body id="root">${output}</body>`, "text/html");
1339
1354
  traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain);
1340
1355
  output = serializer.serializeToString(doc);
@@ -1342,8 +1357,6 @@ function markdownToHTML(input, forApp, webp, parentDomain = "ecency.com") {
1342
1357
  try {
1343
1358
  output = md.render(input);
1344
1359
  const preSanitized = sanitizeHtml(output);
1345
- const htmlparser2 = __require("htmlparser2");
1346
- const domSerializer = __require("dom-serializer").default;
1347
1360
  const dom = htmlparser2.parseDocument(preSanitized, {
1348
1361
  // lenient options - don't throw on malformed HTML
1349
1362
  lowerCaseTags: false,
@@ -1354,8 +1367,7 @@ function markdownToHTML(input, forApp, webp, parentDomain = "ecency.com") {
1354
1367
  traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain);
1355
1368
  output = serializer.serializeToString(doc);
1356
1369
  } catch (fallbackError) {
1357
- const he2 = __require("he");
1358
- const escapedContent = he2.encode(output || md.render(input));
1370
+ const escapedContent = he.encode(output || md.render(input));
1359
1371
  output = `<p dir="auto">${escapedContent}</p>`;
1360
1372
  }
1361
1373
  }