UNPKG

@shopify/prettier-plugin-liquid

Version:
210 lines 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.augmentWithCSSProperties = void 0; const liquid_html_parser_1 = require("@shopify/liquid-html-parser"); const constants_evaluate_1 = require("../../constants.evaluate"); const utils_1 = require("../../utils"); function getCssDisplayFromComment(body) { var _a; return (_a = body.match(/^\s*display:\s*([a-z]+)\s*$/)) === null || _a === void 0 ? void 0 : _a[1]; } function getCssWhitespaceFromComment(body) { var _a; return (_a = body.match(/^\s*white-?space:\s*([a-z]+)\s*$/)) === null || _a === void 0 ? void 0 : _a[1]; } function getCssDisplay(node, options) { if (node.prev && node.prev.type === liquid_html_parser_1.NodeTypes.HtmlComment) { // <!-- display: block --> const cssDisplay = getCssDisplayFromComment(node.prev.body); if (cssDisplay) { return cssDisplay; } } if (node.prev && node.prev.type === liquid_html_parser_1.NodeTypes.LiquidTag && node.prev.name === '#') { // {% # display: block %} const cssDisplay = getCssDisplayFromComment(node.prev.markup); if (cssDisplay) { return cssDisplay; } } switch (node.type) { case liquid_html_parser_1.NodeTypes.HtmlElement: case liquid_html_parser_1.NodeTypes.HtmlDanglingMarkerClose: case liquid_html_parser_1.NodeTypes.HtmlSelfClosingElement: { switch (options.htmlWhitespaceSensitivity) { case 'strict': return 'inline'; case 'ignore': return 'block'; default: { return ((node.name.length === 1 && node.name[0].type === liquid_html_parser_1.NodeTypes.TextNode && constants_evaluate_1.CSS_DISPLAY_TAGS[node.name[0].value]) || constants_evaluate_1.CSS_DISPLAY_DEFAULT); } } } case liquid_html_parser_1.NodeTypes.HtmlVoidElement: case liquid_html_parser_1.NodeTypes.HtmlRawNode: { switch (options.htmlWhitespaceSensitivity) { case 'strict': return 'inline'; case 'ignore': return 'block'; default: { return constants_evaluate_1.CSS_DISPLAY_TAGS[node.name] || constants_evaluate_1.CSS_DISPLAY_DEFAULT; } } } case liquid_html_parser_1.NodeTypes.RawMarkup: case liquid_html_parser_1.NodeTypes.TextNode: return 'inline'; case liquid_html_parser_1.NodeTypes.LiquidTag: case liquid_html_parser_1.NodeTypes.LiquidRawTag: switch (options.htmlWhitespaceSensitivity) { case 'strict': return 'inline'; case 'ignore': return 'block'; default: { return constants_evaluate_1.CSS_DISPLAY_LIQUID_TAGS[node.name] || constants_evaluate_1.CSS_DISPLAY_LIQUID_DEFAULT; } } case liquid_html_parser_1.NodeTypes.LiquidBranch: case liquid_html_parser_1.NodeTypes.LiquidVariableOutput: return 'inline'; case liquid_html_parser_1.NodeTypes.AttrDoubleQuoted: case liquid_html_parser_1.NodeTypes.AttrSingleQuoted: case liquid_html_parser_1.NodeTypes.AttrUnquoted: case liquid_html_parser_1.NodeTypes.AttrEmpty: return 'inline'; case liquid_html_parser_1.NodeTypes.HtmlDoctype: case liquid_html_parser_1.NodeTypes.HtmlComment: return 'block'; case liquid_html_parser_1.NodeTypes.Document: return 'block'; case liquid_html_parser_1.NodeTypes.YAMLFrontmatter: return 'block'; case liquid_html_parser_1.NodeTypes.LiquidVariable: case liquid_html_parser_1.NodeTypes.LiquidFilter: case liquid_html_parser_1.NodeTypes.NamedArgument: case liquid_html_parser_1.NodeTypes.LiquidLiteral: case liquid_html_parser_1.NodeTypes.String: case liquid_html_parser_1.NodeTypes.Number: case liquid_html_parser_1.NodeTypes.Range: case liquid_html_parser_1.NodeTypes.VariableLookup: case liquid_html_parser_1.NodeTypes.AssignMarkup: case liquid_html_parser_1.NodeTypes.CycleMarkup: case liquid_html_parser_1.NodeTypes.ContentForMarkup: case liquid_html_parser_1.NodeTypes.ForMarkup: case liquid_html_parser_1.NodeTypes.PaginateMarkup: case liquid_html_parser_1.NodeTypes.RenderMarkup: case liquid_html_parser_1.NodeTypes.RenderVariableExpression: case liquid_html_parser_1.NodeTypes.LogicalExpression: case liquid_html_parser_1.NodeTypes.Comparison: case liquid_html_parser_1.NodeTypes.LiquidDocParamNode: case liquid_html_parser_1.NodeTypes.LiquidDocExampleNode: case liquid_html_parser_1.NodeTypes.LiquidDocDescriptionNode: return 'should not be relevant'; default: return (0, utils_1.assertNever)(node); } } function getNodeCssStyleWhiteSpace(node, options) { if (node.prev && node.prev.type === liquid_html_parser_1.NodeTypes.HtmlComment) { // <!-- white-space: normal --> const whitespace = getCssWhitespaceFromComment(node.prev.body); if (whitespace) { return whitespace; } } if (node.prev && node.prev.type === liquid_html_parser_1.NodeTypes.LiquidTag && node.prev.name === '#') { // {% # white-space: normal %} const whitespace = getCssWhitespaceFromComment(node.prev.markup); if (whitespace) { return whitespace; } } switch (node.type) { case liquid_html_parser_1.NodeTypes.HtmlElement: case liquid_html_parser_1.NodeTypes.HtmlDanglingMarkerClose: case liquid_html_parser_1.NodeTypes.HtmlSelfClosingElement: { return ((node.name.length === 1 && node.name[0].type === liquid_html_parser_1.NodeTypes.TextNode && constants_evaluate_1.CSS_WHITE_SPACE_TAGS[node.name[0].value]) || constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT); } case liquid_html_parser_1.NodeTypes.HtmlVoidElement: case liquid_html_parser_1.NodeTypes.HtmlRawNode: { return constants_evaluate_1.CSS_WHITE_SPACE_TAGS[node.name] || constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; } case liquid_html_parser_1.NodeTypes.TextNode: return constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; case liquid_html_parser_1.NodeTypes.RawMarkup: case liquid_html_parser_1.NodeTypes.YAMLFrontmatter: case liquid_html_parser_1.NodeTypes.LiquidRawTag: return 'pre'; case liquid_html_parser_1.NodeTypes.LiquidTag: switch (node.name) { case 'capture': { switch (options.captureWhitespaceSensitivity) { case 'strict': return 'pre'; case 'ignore': return 'normal'; default: { throw (0, utils_1.assertNever)(options.captureWhitespaceSensitivity); } } } default: { return constants_evaluate_1.CSS_WHITE_SPACE_LIQUID_TAGS[node.name] || constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; } } case liquid_html_parser_1.NodeTypes.LiquidBranch: case liquid_html_parser_1.NodeTypes.LiquidVariableOutput: return constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; case liquid_html_parser_1.NodeTypes.AttrDoubleQuoted: case liquid_html_parser_1.NodeTypes.AttrSingleQuoted: case liquid_html_parser_1.NodeTypes.AttrUnquoted: case liquid_html_parser_1.NodeTypes.AttrEmpty: return constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; case liquid_html_parser_1.NodeTypes.HtmlDoctype: case liquid_html_parser_1.NodeTypes.HtmlComment: return constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; case liquid_html_parser_1.NodeTypes.Document: return constants_evaluate_1.CSS_WHITE_SPACE_DEFAULT; case liquid_html_parser_1.NodeTypes.LiquidVariable: case liquid_html_parser_1.NodeTypes.LiquidFilter: case liquid_html_parser_1.NodeTypes.NamedArgument: case liquid_html_parser_1.NodeTypes.LiquidLiteral: case liquid_html_parser_1.NodeTypes.String: case liquid_html_parser_1.NodeTypes.Number: case liquid_html_parser_1.NodeTypes.Range: case liquid_html_parser_1.NodeTypes.VariableLookup: case liquid_html_parser_1.NodeTypes.AssignMarkup: case liquid_html_parser_1.NodeTypes.CycleMarkup: case liquid_html_parser_1.NodeTypes.ContentForMarkup: case liquid_html_parser_1.NodeTypes.ForMarkup: case liquid_html_parser_1.NodeTypes.PaginateMarkup: case liquid_html_parser_1.NodeTypes.RenderMarkup: case liquid_html_parser_1.NodeTypes.RenderVariableExpression: case liquid_html_parser_1.NodeTypes.LogicalExpression: case liquid_html_parser_1.NodeTypes.Comparison: case liquid_html_parser_1.NodeTypes.LiquidDocParamNode: case liquid_html_parser_1.NodeTypes.LiquidDocExampleNode: case liquid_html_parser_1.NodeTypes.LiquidDocDescriptionNode: return 'should not be relevant'; default: return (0, utils_1.assertNever)(node); } } const augmentWithCSSProperties = (options, node) => { const augmentations = { cssDisplay: getCssDisplay(node, options), cssWhitespace: getNodeCssStyleWhiteSpace(node, options), }; Object.assign(node, augmentations); }; exports.augmentWithCSSProperties = augmentWithCSSProperties; //# sourceMappingURL=augment-with-css-properties.js.map