@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.
- package/dist/browser/index.d.ts +4 -1
- package/dist/browser/index.js +24 -12
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +45 -13
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.mjs +24 -12
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/browser/index.d.ts
CHANGED
|
@@ -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 };
|
package/dist/browser/index.js
CHANGED
|
@@ -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
|
|
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://
|
|
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, "
|
|
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"></a></div>', "").replace('<div><a href="https://engage.hivechain.app"></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
|
|
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
|
}
|