<img> parsing

This commit is contained in:
shamoon
2026-09-23 00:03:12 -07:00
parent 3b26d0d3f6
commit df52670871
4 changed files with 71 additions and 1 deletions
+25 -1
View File
@@ -1,3 +1,4 @@
import sax from "sax";
import { xml2js } from "xml-js";
const asArray = (value) => (value === undefined || value === null ? [] : [].concat(value));
@@ -39,6 +40,27 @@ function findImage(item) {
return image ? attrs(image).url || attrs(image).href : null;
}
const isPixel = ({ width, height }) => ["0", "1"].includes(width) || ["0", "1"].includes(height);
// first usable <img> in item html using sax tokenizer
function findHtmlImage(htmls, baseUrl) {
for (const html of htmls) {
if (!html) continue;
let image = null;
const parser = sax.parser(false, { lowercase: true });
parser.onopentag = ({ name, attributes }) => {
if (!image && name === "img" && !isPixel(attributes)) image = httpUrl(attributes.src, baseUrl);
};
parser.onerror = () => {
parser.error = null;
parser.resume();
};
parser.write(html).close();
if (image) return image;
}
return null;
}
function parseRssItem(item) {
const guid = asArray(item.guid)[0];
const guidLink = attrs(guid).isPermaLink !== "false" ? getText(guid) : null;
@@ -47,6 +69,7 @@ function parseRssItem(item) {
link: getText(item.link) || guidLink,
date: getText(item.pubDate) || getText(item["dc:date"]),
image: findImage(item),
html: [getText(item["content:encoded"]), getText(item.description)],
};
}
@@ -58,6 +81,7 @@ function parseAtomEntry(entry) {
link: attrs(link).href,
date: getText(entry.published) || getText(entry.updated),
image: findImage(entry),
html: [getText(entry.content), getText(entry.summary)],
};
}
@@ -74,7 +98,7 @@ export function parseFeed(xml, baseUrl) {
title: item.title.trim(),
link: httpUrl(item.link, baseUrl),
date: parseDate(item.date),
image: httpUrl(item.image, baseUrl),
image: httpUrl(item.image, baseUrl) ?? findHtmlImage(item.html, baseUrl),
}))
.filter((item) => item.title);
}