caniemail
Version:
HTML and CSS Feature Support for Email Clients from caniemail.com
66 lines • 2.43 kB
JavaScript
import css from '@adobe/css-tools';
import * as htmlparser from 'htmlparser2';
export function fromTitleEntries(entries) {
return Object.fromEntries(entries.filter((entry) => entry !== void 0).map((entry) => [entry.title, entry.value]));
}
export const getTitleMatches = (pairs, targetValue, comparer) => Object.entries(pairs)
.filter(([, value]) => (comparer ? comparer(value, targetValue) : targetValue.includes(value)))
.map(([title]) => title);
const getStyleNodes = (node) => {
if (node.type === htmlparser.ElementType.Style)
return [node];
const results = [];
if ('childNodes' in node) {
for (const child of node.childNodes) {
results.push(...getStyleNodes(child));
}
}
return results;
};
export const groupIssues = (issues) => {
const groupedIssues = new Map();
for (const [client, clientIssues] of issues.entries()) {
for (const issue of clientIssues) {
if (!issue.position)
continue;
const key = `${issue.position.start.line}:${issue.position.start.column}:${issue.title}`;
if (!groupedIssues.has(key)) {
groupedIssues.set(key, {
issue,
clients: [client]
});
}
else {
groupedIssues.get(key).clients.push(client);
}
}
}
return Array.from(groupedIssues.values());
};
export const parseCss = (cssContent) => css.parse(cssContent, { silent: true });
export const parseHtml = (html) => {
const document = htmlparser.parseDocument(html, { withStartIndices: true, withEndIndices: true });
const styleNodes = [];
for (const childNode of document.childNodes) {
styleNodes.push(...getStyleNodes(childNode));
}
const stylesheets = [];
for (const styleNode of styleNodes) {
const styleTextNode = styleNode.childNodes[0];
if (styleTextNode !== void 0) {
stylesheets.push(parseCss(styleTextNode.data));
}
}
return {
document,
stylesheets
};
};
export const sortIssues = (groupedIssues) => {
return [...groupedIssues].sort((a, b) => {
const aPos = a.issue.position.start;
const bPos = b.issue.position.start;
return aPos.line === bPos.line ? aPos.column - bPos.column : aPos.line - bPos.line;
});
};
//# sourceMappingURL=helpers.js.map