chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
import type { AST, ElementAST, ElementAttribute } from './types';
|
||||
import { voidTags } from './tags';
|
||||
|
||||
export const formatAttributes = (attributes: ElementAttribute[]) => {
|
||||
return attributes.reduce((attrs, attribute) => {
|
||||
const { key, value } = attribute;
|
||||
if (value === null) return `${attrs} ${key}`;
|
||||
// Omit an empty style attribute, but keep the attributes accumulated so far.
|
||||
// Returning '' here dropped every earlier attribute (this is a reduce).
|
||||
if (key === 'style' && !value) return attrs;
|
||||
|
||||
const quoteEscape = value.indexOf("'") !== -1;
|
||||
const quote = quoteEscape ? '"' : "'";
|
||||
return `${attrs} ${key}=${quote}${value}${quote}`;
|
||||
}, '');
|
||||
};
|
||||
|
||||
export const toHTML = (tree: AST[]) => {
|
||||
const htmlStrings: string[] = tree.map((node) => {
|
||||
if (node.type === 'text') return node.content;
|
||||
if (node.type === 'comment') return `<!--${node.content}-->`;
|
||||
|
||||
const { tagName, attributes, children } = node as ElementAST;
|
||||
const isSelfClosing = voidTags.includes(tagName.toLowerCase());
|
||||
|
||||
if (isSelfClosing) return `<${tagName}${formatAttributes(attributes)}>`;
|
||||
return `<${tagName}${formatAttributes(attributes)}>${toHTML(children)}</${tagName}>`;
|
||||
});
|
||||
return htmlStrings.join('');
|
||||
};
|
||||
Reference in New Issue
Block a user