1
0
mirror of https://github.com/thangisme/notes.git synced 2024-11-04 16:27:20 -05:00
notes/node_modules/stylelint/lib/utils/findFontFamily.js
Patrick Marsceill b7b0d0d7bf
Initial commit
2017-03-09 13:16:08 -05:00

100 lines
2.8 KiB
JavaScript

/* @flow */
"use strict"
const keywordSets = require("../reference/keywordSets")
const isNumbery = require("./isNumbery")
const isStandardSyntaxValue = require("./isStandardSyntaxValue")
const isValidFontSize = require("./isValidFontSize")
const isVariable = require("./isVariable")
const postcssValueParser = require("postcss-value-parser")
const 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
*/
module.exports = function findFontFamily(value/*: string*/)/*: Array<Object>*/ {
const fontFamilies = []
const valueNodes = postcssValueParser(value)
// Handle `inherit`, `initial` and etc
if (valueNodes.nodes.length === 1 && keywordSets.basicKeywords.has(valueNodes.nodes[0].value.toLowerCase())) {
return [valueNodes.nodes[0]]
}
let needMergeNodesByValue = false
let mergeCharacters = null
valueNodes.walk((valueNode, index, nodes) => {
if (valueNode.type === "function") {
return false
}
if (!nodeTypesToCheck.has(valueNode.type)) {
return
}
const valueLowerCase = valueNode.value.toLowerCase()
// Ignore non standard syntax
if (!isStandardSyntaxValue(valueLowerCase)) {
return
}
// Ignore variables
if (isVariable(valueLowerCase)) {
return
}
// Ignore keywords for other font parts
if (keywordSets.fontShorthandKeywords.has(valueLowerCase) && !keywordSets.fontFamilyKeywords.has(valueLowerCase)) {
return
}
// Ignore font-sizes
if (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] && isValidFontSize(nodes[index - 2].value)) {
return
}
// Ignore number values
if (isNumbery(valueLowerCase)) {
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
}
const fontFamily = valueNode
if (needMergeNodesByValue) {
joinValueNodes(fontFamilies[fontFamilies.length - 1], valueNode, mergeCharacters)
needMergeNodesByValue = false
mergeCharacters = null
} else {
fontFamilies.push(fontFamily)
}
})
return fontFamilies
}