Blame view

node_modules/css-selector-tokenizer/lib/stringify.js 1.7 KB
ce4c83ff   wxy   初始提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  "use strict";
  
  var stringify;
  
  var regexpu = require("regexpu-core");
  var identifierEscapeRegexp = new RegExp(
  	regexpu("(^[^A-Za-z_\\-\\u{00a0}-\\u{10ffff}]|^\\-\\-|[^A-Za-z_0-9\\-\\u{00a0}-\\u{10ffff}])", "ug"),
  	"g"
  );
  
  function escape(str, identifier) {
  	if(str === "*") {
  		return "*";
  	}
  	if (identifier) {
  		return str.replace(identifierEscapeRegexp, "\\$1");
  	} else {
  		return str.replace(/(^[^A-Za-z_\\-]|^\-\-|[^A-Za-z_0-9\\-])/g, "\\$1");
  	}
  }
  
  function stringifyWithoutBeforeAfter(tree) {
  	switch(tree.type) {
  	case "selectors":
  		return tree.nodes.map(stringify).join(",");
  	case "selector":
  		return tree.nodes.map(stringify).join("");
  	case "element":
  		return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + escape(tree.name);
  	case "class":
  		return "." + escape(tree.name, true);
  	case "id":
  		return "#" + escape(tree.name, true);
  	case "attribute":
  		return "[" + tree.content + "]";
  	case "spacing":
  		return tree.value;
  	case "pseudo-class":
  		return ":" + escape(tree.name) + (typeof tree.content === "string" ? "(" + tree.content + ")" : "");
  	case "nested-pseudo-class":
  		return ":" + escape(tree.name) + "(" + tree.nodes.map(stringify).join(",") + ")";
  	case "pseudo-element":
  		return "::" + escape(tree.name);
  	case "universal":
  		return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + "*";
  	case "operator":
  		return tree.operator;
  	case "comment":
  		return "/*" + tree.content + "*/";
  	case "invalid":
  		return tree.value;
  	}
  }
  
  
  stringify = function stringify(tree) {
  	var str = stringifyWithoutBeforeAfter(tree);
  	if(tree.before) {
  		str = tree.before + str;
  	}
  	if(tree.after) {
  		str = str + tree.after;
  	}
  	return str;
  };
  
  module.exports = stringify;