22
33module . exports = match
44
5- var camelcase = require ( 'camelcase' )
65var zwitch = require ( 'zwitch' )
76var has = require ( 'hast-util-has-property' )
8- var information = require ( 'property-information' )
9- var spaceSeparated = require ( 'space-separated-tokens' )
10- var commaSeparated = require ( 'comma-separated-tokens' )
7+ var find = require ( 'property-information/find ' )
8+ var spaceSeparated = require ( 'space-separated-tokens' ) . stringify
9+ var commaSeparated = require ( 'comma-separated-tokens' ) . stringify
1110
1211var handle = zwitch ( 'operator' )
1312var handlers = handle . handlers
@@ -23,7 +22,7 @@ handlers['^='] = begins
2322handlers [ '$=' ] = ends
2423handlers [ '*=' ] = contains
2524
26- function match ( query , node ) {
25+ function match ( query , node , schema ) {
2726 var attrs = query . attrs
2827 var length = attrs . length
2928 var index = - 1
@@ -32,8 +31,7 @@ function match(query, node) {
3231
3332 while ( ++ index < length ) {
3433 attr = attrs [ index ]
35- info = information ( attr . name ) || { }
36- attr . propertyName = info . propertyName || camelcase ( attr . name )
34+ info = find ( schema , attr . name )
3735
3836 if ( ! handle ( attr , node , info ) ) {
3937 return false
@@ -44,30 +42,28 @@ function match(query, node) {
4442}
4543
4644/* [attr] */
47- function exists ( query , node ) {
48- return has ( node , query . propertyName )
45+ function exists ( query , node , info ) {
46+ return has ( node , info . property )
4947}
5048
5149/* [attr=value] */
5250function exact ( query , node , info ) {
53- if ( ! has ( node , query . propertyName ) ) {
51+ if ( ! has ( node , info . property ) ) {
5452 return false
5553 }
5654
57- return (
58- normalizeValue ( node . properties [ query . propertyName ] , info ) === query . value
59- )
55+ return normalizeValue ( node . properties [ info . property ] , info ) === query . value
6056}
6157
6258/* [attr~=value] */
6359function spaceSeparatedList ( query , node , info ) {
6460 var val
6561
66- if ( ! has ( node , query . propertyName ) ) {
62+ if ( ! has ( node , info . property ) ) {
6763 return false
6864 }
6965
70- val = node . properties [ query . propertyName ]
66+ val = node . properties [ info . property ]
7167
7268 /* If this is a comma-separated list, and the query is contained in it,
7369 * return true. */
@@ -88,11 +84,11 @@ function spaceSeparatedList(query, node, info) {
8884function exactOrPrefix ( query , node , info ) {
8985 var value
9086
91- if ( ! has ( node , query . propertyName ) ) {
87+ if ( ! has ( node , info . property ) ) {
9288 return false
9389 }
9490
95- value = normalizeValue ( node . properties [ query . propertyName ] , info )
91+ value = normalizeValue ( node . properties [ info . property ] , info )
9692
9793 return Boolean (
9894 value === query . value ||
@@ -103,39 +99,38 @@ function exactOrPrefix(query, node, info) {
10399
104100/* [attr^=value] */
105101function begins ( query , node , info ) {
106- if ( ! has ( node , query . propertyName ) ) {
102+ var value
103+
104+ if ( ! has ( node , info . property ) ) {
107105 return false
108106 }
109107
110- return (
111- normalizeValue ( node . properties [ query . propertyName ] , info ) . slice (
112- 0 ,
113- query . value . length
114- ) === query . value
115- )
108+ value = normalizeValue ( node . properties [ info . property ] , info )
109+
110+ return value . slice ( 0 , query . value . length ) === query . value
116111}
117112
118113/* [attr$=value] */
119114function ends ( query , node , info ) {
120- if ( ! has ( node , query . propertyName ) ) {
115+ if ( ! has ( node , info . property ) ) {
121116 return false
122117 }
123118
124119 return (
125- normalizeValue ( node . properties [ query . propertyName ] , info ) . slice (
120+ normalizeValue ( node . properties [ info . property ] , info ) . slice (
126121 - query . value . length
127122 ) === query . value
128123 )
129124}
130125
131126/* [attr*=value] */
132127function contains ( query , node , info ) {
133- if ( ! has ( node , query . propertyName ) ) {
128+ if ( ! has ( node , info . property ) ) {
134129 return false
135130 }
136131
137132 return (
138- normalizeValue ( node . properties [ query . propertyName ] , info ) . indexOf (
133+ normalizeValue ( node . properties [ info . property ] , info ) . indexOf (
139134 query . value
140135 ) !== - 1
141136 )
@@ -148,19 +143,12 @@ function unknownOperator(query) {
148143
149144/* Stringify a HAST value back to its HTML form. */
150145function normalizeValue ( value , info ) {
151- if ( info . commaSeparated ) {
152- value = commaSeparated . stringify ( value )
153- } else if ( info . spaceSeparated ) {
154- value = spaceSeparated . stringify ( value )
155- } else if ( info . boolean ) {
156- /* `false` is ignored by `has()`. */
157- value = info . name
158- } else if ( info . overloadedBoolean ) {
159- if ( value === true ) {
160- value = info . name
161- }
162- } else if ( info . positiveNumeric || info . numeric ) {
146+ if ( typeof value === 'number' ) {
163147 value = String ( value )
148+ } else if ( typeof value === 'boolean' ) {
149+ value = info . attribute
150+ } else if ( typeof value === 'object' && 'length' in value ) {
151+ value = ( info . commaSeparated ? commaSeparated : spaceSeparated ) ( value )
164152 }
165153
166154 return value
0 commit comments