mirror of
https://github.com/gethomepage/homepage.git
synced 2026-09-27 14:31:17 -07:00
<img> parsing
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user