@@ -8,46 +8,66 @@ var search = /[#.]/g
88/**
99 * Create a hast element from a simple CSS selector.
1010 *
11- * @param {string } [selector]
12- * @param {string } [name='div']
13- * @returns {Element }
11+ * @param selector A simple CSS selector.
12+ * Can contain a tag-name (`foo`), classes (`.bar`), and an ID (`#baz`).
13+ * Multiple classes are allowed.
14+ * Uses the last ID if multiple IDs are found.
15+ * @param [defaultTagName='div'] Tag name to use if `selector` does not specify one.
1416 */
15- export function parseSelector ( selector , name = 'div' ) {
16- var value = selector || ''
17- /** @type {Properties } */
18- var props = { }
19- var start = 0
20- /** @type {string } */
21- var subvalue
22- /** @type {string } */
23- var previous
24- /** @type {RegExpMatchArray } */
25- var match
17+ export const parseSelector =
18+ /**
19+ * @type {(
20+ * <Selector extends string, DefaultTagName extends string = 'div'>(selector?: Selector, defaultTagName?: DefaultTagName) => Element & {tagName: import('./extract.js').ExtractTagName<Selector, DefaultTagName>}
21+ * )}
22+ */
23+ (
24+ /**
25+ * @param {string } [selector]
26+ * @param {string } [defaultTagName='div']
27+ * @returns {Element }
28+ */
29+ function ( selector , defaultTagName = 'div' ) {
30+ var value = selector || ''
31+ /** @type {Properties } */
32+ var props = { }
33+ var start = 0
34+ /** @type {string } */
35+ var subvalue
36+ /** @type {string } */
37+ var previous
38+ /** @type {RegExpMatchArray } */
39+ var match
2640
27- while ( start < value . length ) {
28- search . lastIndex = start
29- match = search . exec ( value )
30- subvalue = value . slice ( start , match ? match . index : value . length )
41+ while ( start < value . length ) {
42+ search . lastIndex = start
43+ match = search . exec ( value )
44+ subvalue = value . slice ( start , match ? match . index : value . length )
3145
32- if ( subvalue ) {
33- if ( ! previous ) {
34- name = subvalue
35- } else if ( previous === '#' ) {
36- props . id = subvalue
37- } else if ( Array . isArray ( props . className ) ) {
38- props . className . push ( subvalue )
39- } else {
40- props . className = [ subvalue ]
41- }
46+ if ( subvalue ) {
47+ if ( ! previous ) {
48+ defaultTagName = subvalue
49+ } else if ( previous === '#' ) {
50+ props . id = subvalue
51+ } else if ( Array . isArray ( props . className ) ) {
52+ props . className . push ( subvalue )
53+ } else {
54+ props . className = [ subvalue ]
55+ }
4256
43- start += subvalue . length
44- }
57+ start += subvalue . length
58+ }
4559
46- if ( match ) {
47- previous = match [ 0 ]
48- start ++
49- }
50- }
60+ if ( match ) {
61+ previous = match [ 0 ]
62+ start ++
63+ }
64+ }
5165
52- return { type : 'element' , tagName : name , properties : props , children : [ ] }
53- }
66+ return {
67+ type : 'element' ,
68+ tagName : defaultTagName ,
69+ properties : props ,
70+ children : [ ]
71+ }
72+ }
73+ )
0 commit comments