@ecency/render-helper 2.4.12 → 2.4.14

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.
@@ -6,7 +6,7 @@ var multihash = require('multihashes');
6
6
  var querystring = require('querystring');
7
7
  var remarkable = require('remarkable');
8
8
  var linkify$1 = require('remarkable/linkify');
9
- var he = require('he');
9
+ var he2 = require('he');
10
10
  var htmlparser2 = require('htmlparser2');
11
11
  var domSerializerModule = require('dom-serializer');
12
12
  var lruCache = require('lru-cache');
@@ -34,7 +34,7 @@ function _interopNamespace(e) {
34
34
  var xss__default = /*#__PURE__*/_interopDefault(xss);
35
35
  var multihash__default = /*#__PURE__*/_interopDefault(multihash);
36
36
  var querystring__default = /*#__PURE__*/_interopDefault(querystring);
37
- var he__default = /*#__PURE__*/_interopDefault(he);
37
+ var he2__default = /*#__PURE__*/_interopDefault(he2);
38
38
  var htmlparser2__namespace = /*#__PURE__*/_interopNamespace(htmlparser2);
39
39
  var domSerializerModule__namespace = /*#__PURE__*/_interopNamespace(domSerializerModule);
40
40
 
@@ -193,10 +193,11 @@ var ALLOWED_ATTRIBUTES = {
193
193
  "del": [],
194
194
  "ins": []
195
195
  };
196
- var lenientErrorHandler = (level, msg) => {
197
- if (process.env.NODE_ENV === "development" && level === "fatalError") {
196
+ var lenientErrorHandler = (level, msg, context) => {
197
+ if (process.env.NODE_ENV === "development") {
198
198
  console.warn("[DOMParser]", level, msg);
199
199
  }
200
+ return void 0;
200
201
  };
201
202
  var DOMParser = new xmldom.DOMParser({
202
203
  // Use onError instead of deprecated errorHandler
@@ -205,11 +206,30 @@ var DOMParser = new xmldom.DOMParser({
205
206
  });
206
207
 
207
208
  // src/helper.ts
209
+ function removeDuplicateAttributes(html) {
210
+ const tagRegex = /<([a-zA-Z][a-zA-Z0-9]*)\s+((?:[^>"']+|"[^"]*"|'[^']*')*?)\s*(\/?)>/g;
211
+ return html.replace(tagRegex, (match, tagName, attrsString, selfClose) => {
212
+ const seenAttrs = /* @__PURE__ */ new Set();
213
+ const cleanedAttrs = [];
214
+ const attrRegex = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^\s/>]+))?/g;
215
+ let attrMatch;
216
+ while ((attrMatch = attrRegex.exec(attrsString)) !== null) {
217
+ const attrName = attrMatch[1].toLowerCase();
218
+ if (!seenAttrs.has(attrName)) {
219
+ seenAttrs.add(attrName);
220
+ cleanedAttrs.push(attrMatch[0]);
221
+ }
222
+ }
223
+ const attrsJoined = cleanedAttrs.length > 0 ? ` ${cleanedAttrs.join(" ")}` : "";
224
+ return `<${tagName}${attrsJoined}${selfClose ? " /" : ""}>`;
225
+ });
226
+ }
208
227
  function createDoc(html) {
209
228
  if (html.trim() === "") {
210
229
  return null;
211
230
  }
212
- const doc = DOMParser.parseFromString(`<body>${html}</body>`, "text/html");
231
+ const cleanedHtml = removeDuplicateAttributes(html);
232
+ const doc = DOMParser.parseFromString(`<body>${cleanedHtml}</body>`, "text/html");
213
233
  return doc;
214
234
  }
215
235
  function makeEntryCacheKey(entry) {
@@ -1416,7 +1436,7 @@ function markdownToHTML(input, forApp, webp, parentDomain = "ecency.com") {
1416
1436
  try {
1417
1437
  output = md.render(input);
1418
1438
  output = fixBlockLevelTagsInParagraphs(output);
1419
- const doc = DOMParser.parseFromString(`<body id="root">${output}</body>`, "text/html");
1439
+ const doc = DOMParser.parseFromString(`<body id="root">${removeDuplicateAttributes(output)}</body>`, "text/html");
1420
1440
  traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain);
1421
1441
  output = serializer.serializeToString(doc);
1422
1442
  } catch (error) {
@@ -1429,11 +1449,11 @@ function markdownToHTML(input, forApp, webp, parentDomain = "ecency.com") {
1429
1449
  lowerCaseAttributeNames: false
1430
1450
  });
1431
1451
  const repairedHtml = domSerializer(dom.children);
1432
- const doc = DOMParser.parseFromString(`<body id="root">${repairedHtml}</body>`, "text/html");
1452
+ const doc = DOMParser.parseFromString(`<body id="root">${removeDuplicateAttributes(repairedHtml)}</body>`, "text/html");
1433
1453
  traverse(doc, forApp, 0, webp, { firstImageFound: false }, parentDomain);
1434
1454
  output = serializer.serializeToString(doc);
1435
1455
  } catch (fallbackError) {
1436
- const escapedContent = he__default.default.encode(output || md.render(input));
1456
+ const escapedContent = he2__default.default.encode(output || md.render(input));
1437
1457
  output = `<p dir="auto">${escapedContent}</p>`;
1438
1458
  }
1439
1459
  }
@@ -1473,8 +1493,6 @@ function markdown2Html(obj, forApp = true, webp = false, parentDomain = "ecency.
1473
1493
  cacheSet(key, res);
1474
1494
  return res;
1475
1495
  }
1476
-
1477
- // src/catch-post-image.ts
1478
1496
  var gifLinkRegex = /\.(gif)$/i;
1479
1497
  function isGifLink(link) {
1480
1498
  return gifLinkRegex.test(link);
@@ -1491,12 +1509,20 @@ function getImage(entry, width = 0, height = 0, format = "match") {
1491
1509
  }
1492
1510
  }
1493
1511
  if (meta && typeof meta.image === "string" && meta.image.length > 0) {
1494
- if (isGifLink(meta.image)) {
1495
- return proxifyImageSrc(meta.image, 0, 0, format);
1512
+ const decodedImage = he2__default.default.decode(meta.image);
1513
+ if (isGifLink(decodedImage)) {
1514
+ return proxifyImageSrc(decodedImage, 0, 0, format);
1496
1515
  }
1497
- return proxifyImageSrc(meta.image, width, height, format);
1516
+ return proxifyImageSrc(decodedImage, width, height, format);
1498
1517
  }
1499
1518
  if (meta && meta.image && !!meta.image.length && meta.image[0]) {
1519
+ if (typeof meta.image[0] === "string") {
1520
+ const decodedImage = he2__default.default.decode(meta.image[0]);
1521
+ if (isGifLink(decodedImage)) {
1522
+ return proxifyImageSrc(decodedImage, 0, 0, format);
1523
+ }
1524
+ return proxifyImageSrc(decodedImage, width, height, format);
1525
+ }
1500
1526
  if (isGifLink(meta.image[0])) {
1501
1527
  return proxifyImageSrc(meta.image[0], 0, 0, format);
1502
1528
  }
@@ -1513,10 +1539,11 @@ function getImage(entry, width = 0, height = 0, format = "match") {
1513
1539
  if (!src) {
1514
1540
  return null;
1515
1541
  }
1516
- if (isGifLink(src)) {
1517
- return proxifyImageSrc(src, 0, 0, format);
1542
+ const decodedSrc = he2__default.default.decode(src);
1543
+ if (isGifLink(decodedSrc)) {
1544
+ return proxifyImageSrc(decodedSrc, 0, 0, format);
1518
1545
  }
1519
- return proxifyImageSrc(src, width, height, format);
1546
+ return proxifyImageSrc(decodedSrc, width, height, format);
1520
1547
  }
1521
1548
  return null;
1522
1549
  }
@@ -1533,10 +1560,11 @@ function catchPostImage(obj, width = 0, height = 0, format = "match") {
1533
1560
  if (!src) {
1534
1561
  return null;
1535
1562
  }
1536
- if (isGifLink(src)) {
1537
- return proxifyImageSrc(src, 0, 0, format);
1563
+ const decodedSrc = he2__default.default.decode(src);
1564
+ if (isGifLink(decodedSrc)) {
1565
+ return proxifyImageSrc(decodedSrc, 0, 0, format);
1538
1566
  }
1539
- return proxifyImageSrc(src, width, height, format);
1567
+ return proxifyImageSrc(decodedSrc, width, height, format);
1540
1568
  }
1541
1569
  return null;
1542
1570
  }
@@ -1625,7 +1653,7 @@ function postBodySummary(entryBody, length = 200, platform = "web") {
1625
1653
  text2 = joint(text2.split(" "), length);
1626
1654
  }
1627
1655
  if (text2) {
1628
- text2 = he__default.default.decode(text2);
1656
+ text2 = he2__default.default.decode(text2);
1629
1657
  }
1630
1658
  return text2;
1631
1659
  }