prettier/src/language-css/clean.js

170 lines
4.1 KiB
JavaScript

"use strict";
const htmlTagNames = require("html-tag-names");
function clean(ast, newObj, parent) {
[
"raw", // front-matter
"raws",
"sourceIndex",
"source",
"before",
"after",
"trailingComma"
].forEach(name => {
delete newObj[name];
});
if (ast.type === "yaml") {
delete newObj.value;
}
// --insert-pragma
if (
ast.type === "css-comment" &&
parent.type === "css-root" &&
parent.nodes.length !== 0 &&
// first non-front-matter comment
(parent.nodes[0] === ast ||
((parent.nodes[0].type === "yaml" || parent.nodes[0].type === "toml") &&
parent.nodes[1] === ast))
) {
/**
* something
*
* @format
*/
delete newObj.text;
// standalone pragma
if (/^\*\s*@(format|prettier)\s*$/.test(ast.text)) {
return null;
}
}
if (
ast.type === "media-query" ||
ast.type === "media-query-list" ||
ast.type === "media-feature-expression"
) {
delete newObj.value;
}
if (ast.type === "css-rule") {
delete newObj.params;
}
if (ast.type === "selector-combinator") {
newObj.value = newObj.value.replace(/\s+/g, " ");
}
if (ast.type === "media-feature") {
newObj.value = newObj.value.replace(/ /g, "");
}
if (
(ast.type === "value-word" &&
((ast.isColor && ast.isHex) ||
["initial", "inherit", "unset", "revert"].indexOf(
newObj.value.replace().toLowerCase()
) !== -1)) ||
ast.type === "media-feature" ||
ast.type === "selector-root-invalid" ||
ast.type === "selector-pseudo"
) {
newObj.value = newObj.value.toLowerCase();
}
if (ast.type === "css-decl") {
newObj.prop = newObj.prop.toLowerCase();
}
if (ast.type === "css-atrule" || ast.type === "css-import") {
newObj.name = newObj.name.toLowerCase();
}
if (ast.type === "value-number") {
newObj.unit = newObj.unit.toLowerCase();
}
if (
(ast.type === "media-feature" ||
ast.type === "media-keyword" ||
ast.type === "media-type" ||
ast.type === "media-unknown" ||
ast.type === "media-url" ||
ast.type === "media-value" ||
ast.type === "selector-attribute" ||
ast.type === "selector-string" ||
ast.type === "selector-class" ||
ast.type === "selector-combinator" ||
ast.type === "value-string") &&
newObj.value
) {
newObj.value = cleanCSSStrings(newObj.value);
}
if (ast.type === "selector-attribute") {
newObj.attribute = newObj.attribute.trim();
if (newObj.namespace) {
if (typeof newObj.namespace === "string") {
newObj.namespace = newObj.namespace.trim();
if (newObj.namespace.length === 0) {
newObj.namespace = true;
}
}
}
if (newObj.value) {
newObj.value = newObj.value.trim().replace(/^['"]|['"]$/g, "");
delete newObj.quoted;
}
}
if (
(ast.type === "media-value" ||
ast.type === "media-type" ||
ast.type === "value-number" ||
ast.type === "selector-root-invalid" ||
ast.type === "selector-class" ||
ast.type === "selector-combinator" ||
ast.type === "selector-tag") &&
newObj.value
) {
newObj.value = newObj.value.replace(
/([\d.eE+-]+)([a-zA-Z]*)/g,
(match, numStr, unit) => {
const num = Number(numStr);
return isNaN(num) ? match : num + unit.toLowerCase();
}
);
}
if (ast.type === "selector-tag") {
const lowercasedValue = ast.value.toLowerCase();
if (htmlTagNames.indexOf(lowercasedValue) !== -1) {
newObj.value = lowercasedValue;
}
if (["from", "to"].indexOf(lowercasedValue) !== -1) {
newObj.value = lowercasedValue;
}
}
// Workaround when `postcss-values-parser` parse `not`, `and` or `or` keywords as `value-func`
if (ast.type === "css-atrule" && ast.name.toLowerCase() === "supports") {
delete newObj.value;
}
// Workaround for SCSS nested properties
if (ast.type === "selector-unknown") {
delete newObj.value;
}
}
function cleanCSSStrings(value) {
return value.replace(/'/g, '"').replace(/\\([^a-fA-F\d])/g, "$1");
}
module.exports = clean;