wecui
Version:
一款基于Vue2.x版本的移动端web组件
156 lines (139 loc) • 3.02 kB
JavaScript
// external tooling
var valueParser = require("postcss-value-parser")
// extended tooling
var stringify = valueParser.stringify
function split(params, start) {
var list = []
var last = params.reduce(function(item, node, index) {
if (index < start) {
return ""
}
if (node.type === "div" && node.value === ",") {
list.push(item)
return ""
}
return item + stringify(node)
}, "")
list.push(last)
return list
}
module.exports = function(result, styles) {
var statements = []
var nodes = []
styles.each(function(node) {
var stmt
if (node.type === "atrule") {
if (node.name === "import") {
stmt = parseImport(result, node)
}
else if (node.name === "media") {
stmt = parseMedia(result, node)
}
}
if (stmt) {
if (nodes.length) {
statements.push({
type: "nodes",
nodes: nodes,
media: [],
})
nodes = []
}
statements.push(stmt)
}
else {
nodes.push(node)
}
})
if (nodes.length) {
statements.push({
type: "nodes",
nodes: nodes,
media: [],
})
}
return statements
}
function parseMedia(result, atRule) {
var params = valueParser(atRule.params).nodes
return {
type: "media",
node: atRule,
media: split(params, 0),
}
}
function parseImport(result, atRule) {
var prev = getPrev(atRule)
if (prev) {
do {
if (
prev.type !== "atrule" ||
prev.name !== "import" &&
prev.name !== "charset"
) {
return result.warn(
"@import must precede all other statements (besides @charset)",
{ node: atRule }
)
}
else {
prev = getPrev(prev)
}
} while (prev)
}
if (atRule.nodes) {
return result.warn(
"It looks like you didn't end your @import statement correctly. " +
"Child nodes are attached to it.",
{ node: atRule }
)
}
var params = valueParser(atRule.params).nodes
var stmt = {
type: "import",
node: atRule,
media: [],
}
if (
!params.length ||
(
params[0].type !== "string" ||
!params[0].value
) &&
(
params[0].type !== "function" ||
params[0].value !== "url" ||
!params[0].nodes.length ||
!params[0].nodes[0].value
)
) {
return result.warn(
"Unable to find uri in '" + atRule.toString() + "'",
{ node: atRule }
)
}
if (params[0].type === "string") {
stmt.uri = params[0].value
}
else {
stmt.uri = params[0].nodes[0].value
}
stmt.fullUri = stringify(params[0])
if (params.length > 2) {
if (params[1].type !== "space") {
return result.warn(
"Invalid import media statement",
{ node: atRule }
)
}
stmt.media = split(params, 2)
}
return stmt
}
function getPrev(item) {
var prev = item.prev()
while (prev && prev.type === "comment") {
prev = prev.prev()
}
return prev
}