@@ -7,12 +7,13 @@ var s = require('hastscript/svg')
7
7
var zwitch = require ( 'zwitch' )
8
8
var Parser = require ( 'css-selector-parser' ) . CssSelectorParser
9
9
10
- var compile = zwitch ( 'type' )
11
- var handlers = compile . handlers
12
-
13
- handlers . selectors = selectors
14
- handlers . ruleSet = ruleSet
15
- handlers . rule = rule
10
+ var compile = zwitch ( 'type' , {
11
+ handlers : {
12
+ selectors : selectors ,
13
+ ruleSet : ruleSet ,
14
+ rule : rule
15
+ }
16
+ } )
16
17
17
18
var parser = new Parser ( )
18
19
@@ -21,11 +22,9 @@ parser.registerNestingOperators('>', '+', '~')
21
22
parser . registerAttrEqualityMods ( '~' , '|' , '^' , '$' , '*' )
22
23
23
24
function fromSelector ( selector , space ) {
24
- var options = ( typeof space === 'string' ? { space : space } : space ) || { }
25
- var result = parser . parse ( selector || '' )
26
- var config = { space : options . space || 'html' , root : true }
25
+ var config = { space : ( space && space . space ) || space || 'html' , root : true }
27
26
28
- return compile ( result , config ) || build ( config . space ) ( )
27
+ return compile ( parser . parse ( selector || '' ) , config ) || build ( config . space ) ( )
29
28
}
30
29
31
30
function selectors ( ) {
@@ -37,20 +36,15 @@ function ruleSet(query, config) {
37
36
}
38
37
39
38
function rule ( query , config ) {
40
- var subrule = query . rule
41
- var name = query . tagName
42
39
var parentSpace = config . space
43
- var space = parentSpace
44
- var sibling = false
40
+ var name = query . tagName === '*' ? '' : query . tagName
41
+ var space = parentSpace === 'html' && name === 'svg' ? 'svg' : parentSpace
42
+ var sibling
45
43
var operator
46
44
var node
47
45
48
- if ( name === '*' ) {
49
- name = ''
50
- }
51
-
52
- if ( subrule ) {
53
- operator = subrule . nestingOperator
46
+ if ( query . rule ) {
47
+ operator = query . rule . nestingOperator
54
48
sibling = operator === '+' || operator === '~'
55
49
56
50
if ( sibling && config . root ) {
@@ -60,22 +54,17 @@ function rule(query, config) {
60
54
}
61
55
}
62
56
63
- // Switch to SVG when needed.
64
- if ( space === 'html' && name === 'svg' ) {
65
- space = 'svg'
66
- }
67
-
68
57
node = build ( space ) (
69
58
name ,
70
59
Object . assign (
71
60
{ id : query . id , className : query . classNames } ,
72
61
pseudosToHast ( query . pseudos || [ ] ) ,
73
62
attrsToHast ( query . attrs || [ ] )
74
63
) ,
75
- ! subrule || sibling ? [ ] : compile ( subrule , { space : space } )
64
+ ! query . rule || sibling ? [ ] : compile ( query . rule , { space : space } )
76
65
)
77
66
78
- return sibling ? [ node , compile ( subrule , { space : parentSpace } ) ] : node
67
+ return sibling ? [ node , compile ( query . rule , { space : parentSpace } ) ] : node
79
68
}
80
69
81
70
function pseudosToHast ( pseudos ) {
@@ -94,27 +83,22 @@ function pseudosToHast(pseudos) {
94
83
95
84
function attrsToHast ( attrs ) {
96
85
var props = { }
97
- var length = attrs . length
98
86
var index = - 1
99
87
var attr
100
- var name
101
- var operator
102
88
103
- while ( ++ index < length ) {
89
+ while ( ++ index < attrs . length ) {
104
90
attr = attrs [ index ]
105
- name = attr . name
106
- operator = attr . operator
107
91
108
- if ( operator ) {
109
- if ( operator === '=' ) {
110
- props [ name ] = attr . value
92
+ if ( attr . operator ) {
93
+ if ( attr . operator === '=' ) {
94
+ props [ attr . name ] = attr . value
111
95
} else {
112
96
throw new Error (
113
- 'Cannot handle attribute equality modifier `' + operator + '`'
97
+ 'Cannot handle attribute equality modifier `' + attr . operator + '`'
114
98
)
115
99
}
116
100
} else {
117
- props [ name ] = true
101
+ props [ attr . name ] = true
118
102
}
119
103
}
120
104
0 commit comments