stylelint
Version:
Modern CSS linter
101 lines (77 loc) • 2.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = findFontFamily;
var _postcssValueParser = require("postcss-value-parser");
var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
var _ = require("./");
var _keywordSets = require("../reference/keywordSets");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var nodeTypesToCheck = new Set(["word", "string", "space", "div"]);
function joinValueNodes(firstNode, secondNode, charactersBetween) {
firstNode.value = firstNode.value + charactersBetween + secondNode.value;
return firstNode;
}
/**
* Get the font-families within a `font` shorthand property value.
*
* @param {string} value
* @return {object} Collection font-family nodes
*/
function findFontFamily(value) {
var fontFamilies = [];
var valueNodes = (0, _postcssValueParser2.default)(value);
// Handle `inherit`, `initial` and etc
if (valueNodes.nodes.length === 1 && _keywordSets.basicKeywords.has(valueNodes.nodes[0].value.toLowerCase())) {
return [valueNodes.nodes[0]];
}
var needMergeNodesByValue = false;
var mergeCharacters = null;
valueNodes.walk(function (valueNode, index, nodes) {
if (valueNode.type === "function") {
return false;
}
if (!nodeTypesToCheck.has(valueNode.type)) {
return;
}
var valueLowerCase = valueNode.value.toLowerCase();
// Ignore non standard syntax
if (!(0, _.isStandardSyntaxValue)(valueLowerCase)) {
return;
}
// Ignore variables
if ((0, _.isVariable)(valueLowerCase)) {
return;
}
// Ignore keywords for other font parts
if (_keywordSets.fontShorthandKeywords.has(valueLowerCase) && !_keywordSets.fontFamilyKeywords.has(valueLowerCase)) {
return;
}
// Ignore font-sizes
if ((0, _.isValidFontSize)(valueNode.value)) {
return;
}
// Ignore anything come after a <font-size>/, because it's a line-height
if (nodes[index - 1] && nodes[index - 1].value === "/" && nodes[index - 2] && (0, _.isValidFontSize)(nodes[index - 2].value)) {
return;
}
// Detect when a space or comma is dividing a list of font-families, and save the joining character.
if ((valueNode.type === "space" || valueNode.type === "div" && valueNode.value !== ",") && fontFamilies.length !== 0) {
needMergeNodesByValue = true;
mergeCharacters = valueNode.value;
return;
} else if (valueNode.type === "space" || valueNode.type === "div") {
return;
}
var fontFamily = valueNode;
if (needMergeNodesByValue) {
joinValueNodes(fontFamilies[fontFamilies.length - 1], valueNode, mergeCharacters);
needMergeNodesByValue = false;
mergeCharacters = null;
} else {
fontFamilies.push(fontFamily);
}
});
return fontFamilies;
}