(selector, parseOnly)
| 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, |
no outgoing calls
no test coverage detected