@shopify/prettier-plugin-liquid
Version:
Prettier Liquid/HTML plugin by Shopify
115 lines • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.printElement = exports.printRawElement = void 0;
const prettier_1 = require("prettier");
const liquid_html_parser_1 = require("@shopify/liquid-html-parser");
const utils_1 = require("../utils");
const tag_1 = require("./tag");
const children_1 = require("./children");
const { builders: { breakParent, dedentToRoot, group, indent, hardline, line, softline }, } = prettier_1.doc;
const { replaceEndOfLine } = prettier_1.doc.utils;
function printRawElement(path, options, print, _args) {
const node = path.getValue();
const attrGroupId = Symbol('element-attr-group-id');
let body = [];
const hasEmptyBody = node.body.value.trim() === '';
if (!hasEmptyBody) {
body = [path.call((p) => print(p), 'body')];
}
return group([
(0, tag_1.printOpeningTagPrefix)(node, options),
group((0, tag_1.printOpeningTag)(path, options, print, attrGroupId), {
id: attrGroupId,
}),
...body,
...(0, tag_1.printClosingTag)(node, options),
(0, tag_1.printClosingTagSuffix)(node, options),
]);
}
exports.printRawElement = printRawElement;
function printElement(path, options, print, args) {
const node = path.getValue();
const attrGroupId = Symbol('element-attr-group-id');
const elementGroupId = Symbol('element-group-id');
if (node.type === liquid_html_parser_1.NodeTypes.HtmlRawNode) {
return printRawElement(path, options, print, args);
}
if ((0, utils_1.hasNoChildren)(node)) {
// TODO, broken for HtmlComment but this code path is not used (so far).
return [
group((0, tag_1.printOpeningTag)(path, options, print, attrGroupId), {
id: attrGroupId,
}),
...(0, tag_1.printClosingTag)(node, options),
(0, tag_1.printClosingTagSuffix)(node, options),
];
}
if ((0, utils_1.shouldPreserveContent)(node)) {
return [
(0, tag_1.printOpeningTagPrefix)(node, options),
group((0, tag_1.printOpeningTag)(path, options, print, attrGroupId), {
id: attrGroupId,
}),
...replaceEndOfLine((0, tag_1.getNodeContent)(node, options)),
...(0, tag_1.printClosingTag)(node, options),
(0, tag_1.printClosingTagSuffix)(node, options),
];
}
const printTag = (doc) => group([
group((0, tag_1.printOpeningTag)(path, options, print, attrGroupId), {
id: attrGroupId,
}),
doc,
(0, tag_1.printClosingTag)(node, options),
], { id: elementGroupId });
const printLineBeforeChildren = () => {
if (node.firstChild.hasLeadingWhitespace && node.firstChild.isLeadingWhitespaceSensitive) {
return line;
}
if (node.firstChild.type === liquid_html_parser_1.NodeTypes.TextNode &&
node.isWhitespaceSensitive &&
node.isIndentationSensitive) {
return dedentToRoot(softline);
}
return softline;
};
const printLineAfterChildren = () => {
// does not have the closing tag
if (node.blockEndPosition.start === node.blockEndPosition.end) {
return '';
}
const needsToBorrow = node.next
? (0, tag_1.needsToBorrowPrevClosingTagEndMarker)(node.next)
: (0, tag_1.needsToBorrowLastChildClosingTagEndMarker)(node.parentNode);
if (needsToBorrow) {
if (node.lastChild.hasTrailingWhitespace && node.lastChild.isTrailingWhitespaceSensitive) {
return ' ';
}
return '';
}
if (node.lastChild.hasTrailingWhitespace && node.lastChild.isTrailingWhitespaceSensitive) {
return line;
}
return softline;
};
if (node.children.length === 0) {
return printTag(node.hasDanglingWhitespace &&
node.isDanglingWhitespaceSensitive &&
node.blockEndPosition.end !== node.blockEndPosition.start
? line
: '');
}
return printTag([
(0, utils_1.forceBreakContent)(node) ? breakParent : '',
indent([
printLineBeforeChildren(),
(0, children_1.printChildren)(path, options, print, {
leadingSpaceGroupId: elementGroupId,
trailingSpaceGroupId: elementGroupId,
}),
]),
printLineAfterChildren(),
]);
}
exports.printElement = printElement;
//# sourceMappingURL=element.js.map