MCPcopy Create free account
hub / github.com/JsAaron/jQuery / tokenize

Function tokenize

2.0.3/Sizzle-annotation.js:1528–1651  ·  view source on GitHub ↗
(selector, parseOnly)

Source from the content-addressed store, hash-verified

1526 //返回的需要是一个Token序列
1527 //Sizzle的Token格式如下 :{value:'匹配到的字符串', type:'对应的Token类型', matches:'正则匹配到的一个结构'}
1528 function tokenize(selector, parseOnly) {
1529 var matched, match, tokens, type,
1530 soFar, groups, preFilters,
1531 cached = tokenCache[selector + " "];
1532 //这里的soFar是表示目前还未分析的字符串剩余部分
1533 //groups表示目前已经匹配到的规则组,在这个例子里边,groups的长度最后是2,存放的是每个规则对应的Token序列
1534
1535 //如果cache里边有,直接拿出来即可
1536 if (cached) {
1537 return parseOnly ? 0 : cached.slice(0);
1538 }
1539
1540 //初始化
1541 soFar = selector;
1542 groups = []; //这是最后要返回的结果,一个二维数组
1543
1544 //比如"title,div > :nth-child(even)"解析下面的符号流
1545 // [ [{value:"title",type:"TAG",matches:["title"]}],
1546 // [{value:"div",type:["TAG",matches:["div"]},
1547 // {value:">", type: ">"},
1548 // {value:":nth-child(even)",type:"CHILD",matches:["nth",
1549 // "child","even",2,0,undefined,undefined,undefined]}
1550 // ]
1551 // ]
1552 //有多少个并联选择器,里面就有多少个数组,数组里面是拥有value与type的对象
1553
1554 //这里的预处理器为了对匹配到的Token适当做一些调整
1555 //自行查看源码,其实就是正则匹配到的内容的一个预处理
1556 preFilters = Expr.preFilter;
1557
1558 //递归检测字符串x
1559 //比如"div > p + .clr input[type="checkbox"]"
1560 while (soFar) {
1561
1562 // Comma and first run
1563 // 以第一个逗号切割选择符,然后去掉前面的部分
1564 if (!matched || (match = rcomma.exec(soFar))) {
1565 if (match) {
1566 //如果匹配到逗号
1567 // Don't consume trailing commas as valid
1568 soFar = soFar.slice(match[0].length) || soFar;
1569 }
1570 //往规则组里边压入一个Token序列,目前Token序列还是空的
1571 groups.push(tokens = []);
1572 }
1573
1574 matched = false;
1575
1576 // Combinators
1577 //将刚才前面的部分以关系选择器再进行划分
1578 //先处理这几个特殊的Token : >, +, 空格, ~
1579 //因为他们比较简单,并且是单字符的
1580 if ((match = rcombinators.exec(soFar))) {
1581 //获取到匹配的字符
1582 matched = match.shift();
1583 //放入Token序列中
1584 tokens.push({
1585 value: matched,

Callers 2

selectFunction · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected