Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commiteb3e2a7

Browse files
authored
Merge pull request#58 from flavorjones/flavorjones-work-on-selectors
Improve selectors, fix complex selector parsing issues
2 parents24042c2 +45b5ece commiteb3e2a7

File tree

5 files changed

+365
-13
lines changed

5 files changed

+365
-13
lines changed

‎lib/syntax_tree/css/format.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,43 @@ def visit_type_selector(node)
7676
node.value.format(q)
7777
end
7878
end
79+
80+
# Visit a Selectors::ClassSelector node.
81+
defvisit_class_selector(node)
82+
q.text(".")
83+
node.value.format(q)
84+
end
85+
86+
# Visit a Selectors::Combinator node.
87+
defvisit_combinator(node)
88+
node.value.format(q)
89+
end
90+
91+
# Visit a Selectors::ComplexSelector node.
92+
defvisit_complex_selector(node)
93+
q.groupdo
94+
node.child_nodes.each_with_indexdo |child_node,j|
95+
q.text(" ")unlessj ==0
96+
child_node.format(q)
97+
end
98+
end
99+
end
100+
101+
# Visit a Selectors::CompoundSelector node.
102+
defvisit_compound_selector(node)
103+
q.groupdo
104+
node.type.format(q)ifnode.type
105+
node.subclasses.eachdo |subclass|
106+
subclass.format(q)
107+
end
108+
# TODO: pseudo-elements
109+
end
110+
end
111+
112+
defvisit_wqname(node)
113+
node.prefix.format(q)ifnode.prefix
114+
node.name.format(q)
115+
end
79116
end
80117
end
81118
end

‎lib/syntax_tree/css/pretty_print.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,62 @@ def visit_wqname(node)
421421
end
422422
end
423423

424+
# Visit a Selectors::Combinator node.
425+
defvisit_combinator(node)
426+
token("combinator")do
427+
q.breakable
428+
q.pp(node.value)
429+
end
430+
end
431+
432+
# Visit a Selectors::ComplexSelector node.
433+
defvisit_complex_selector(node)
434+
token("complex-selector")do
435+
node.child_nodes.eachdo |child|
436+
q.breakable
437+
q.pp(child)
438+
end
439+
end
440+
end
441+
442+
# Visit a Selectors::CompoundSelector node.
443+
defvisit_compound_selector(node)
444+
token("compound-selector")do
445+
q.breakable
446+
q.pp(node.type)
447+
448+
q.breakable
449+
q.text("(subclasses")
450+
451+
ifnode.subclasses.any?
452+
q.nest(2)do
453+
q.breakable
454+
q.seplist(node.subclasses){ |subclass|q.pp(subclass)}
455+
end
456+
457+
q.breakable("")
458+
end
459+
460+
q.text(")")
461+
462+
q.breakable("")
463+
q.text("(pseudo-elements")
464+
465+
ifnode.pseudo_elements.any?
466+
q.nest(2)do
467+
q.breakable
468+
q.seplist(node.pseudo_elements)do |pseudo_element|
469+
q.pp(pseudo_element)
470+
end
471+
end
472+
473+
q.breakable("")
474+
end
475+
476+
q.text(")")
477+
end
478+
end
479+
424480
private
425481

426482
deftoken(name)

‎lib/syntax_tree/css/selectors.rb

Lines changed: 84 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,73 @@ def deconstruct_keys(keys)
7171
end
7272
end
7373

74-
Combinator=Struct.new(:value,keyword_init:true)
75-
ComplexSelector=Struct.new(:left,:combinator,:right,keyword_init:true)
76-
CompoundSelector=Struct.new(:type,:subclasses,:pseudo_elements,keyword_init:true)
74+
classCombinator <Node
75+
attr_reader:value
76+
77+
definitialize(value:)
78+
@value=value
79+
end
80+
81+
defaccept(visitor)
82+
visitor.visit_combinator(self)
83+
end
84+
85+
defchild_nodes
86+
[value]
87+
end
88+
89+
aliasdeconstructchild_nodes
90+
91+
defdeconstruct_keys(keys)
92+
{value:value}
93+
end
94+
end
95+
96+
classComplexSelector <Node
97+
attr_reader:child_nodes
98+
99+
definitialize(child_nodes:)
100+
@child_nodes=child_nodes
101+
end
102+
103+
defaccept(visitor)
104+
visitor.visit_complex_selector(self)
105+
end
106+
107+
aliasdeconstructchild_nodes
108+
109+
defdeconstruct_keys(keys)
110+
{child_nodes:child_nodes}
111+
end
112+
end
113+
114+
classCompoundSelector <Node
115+
attr_reader:type,:subclasses,:pseudo_elements
116+
117+
definitialize(type:,subclasses:,pseudo_elements:)
118+
@type=type
119+
@subclasses=subclasses
120+
@pseudo_elements=pseudo_elements
121+
end
122+
123+
defaccept(visitor)
124+
visitor.visit_compound_selector(self)
125+
end
126+
127+
defchild_nodes
128+
[type,subclasses,pseudo_elements].flatten
129+
end
130+
131+
aliasdeconstructchild_nodes
132+
133+
defdeconstruct_keys(keys)
134+
{
135+
type:type,
136+
subclasses:subclasses,
137+
pseudo_elements:pseudo_elements
138+
}
139+
end
140+
end
77141

78142
# The ID of an element, e.g., #foo
79143
# https://www.w3.org/TR/selectors-4/#typedef-id-selector
@@ -267,27 +331,30 @@ def relative_selector_list
267331

268332
# <complex-selector> = <compound-selector> [ <combinator>? <compound-selector> ]*
269333
defcomplex_selector
270-
left=compound_selector
334+
child_nodes=[compound_selector]
271335

272336
loopdo
273-
if(combinator=maybe{combinator})
274-
ComplexSelector.new(left:left,combinator:combinator,right:compound_selector)
275-
elsif(right=maybe{compound_selector})
276-
ComplexSelector.new(left:left,combinator:nil,right:right)
337+
if(c=maybe{combinator})
338+
child_nodes <<c
339+
end
340+
if(s=maybe{compound_selector})
341+
child_nodes <<s
277342
else
278343
break
279344
end
280345
end
281346

282-
left
347+
ifchild_nodes.length >1
348+
ComplexSelector.new(child_nodes:child_nodes)
349+
else
350+
child_nodes.first
351+
end
283352
end
284353

285354
# <relative-selector> = <combinator>? <complex-selector>
286355
defrelative_selector
287-
combinator=maybe{combinator}
288-
289-
ifcombinator
290-
RelativeSelector.new(combinator:combinator,complex_selector:complex_selector)
356+
if(c=maybe{combinator})
357+
RelativeSelector.new(combinator:c,complex_selector:complex_selector)
291358
else
292359
complex_selector
293360
end
@@ -296,6 +363,8 @@ def relative_selector
296363
# <compound-selector> = [ <type-selector>? <subclass-selector>*
297364
# [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!
298365
defcompound_selector
366+
consume_whitespace
367+
299368
type=maybe{type_selector}
300369
subclasses=[]
301370

@@ -332,6 +401,8 @@ def simple_selector
332401

333402
# <combinator> = '>' | '+' | '~' | [ '|' '|' ]
334403
defcombinator
404+
consume_whitespace
405+
335406
value=
336407
optionsdo
337408
maybe{consume(">")} ||

‎lib/syntax_tree/css/visitor.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ def visit_child_nodes(node)
132132
# Visit a Selectors::ClassSelector node.
133133
aliasvisit_class_selectorvisit_child_nodes
134134

135+
# Visit a Selectors::Combinator node.
136+
aliasvisit_combinatorvisit_child_nodes
137+
138+
# Visit a Selectors::ComplexSelector node.
139+
aliasvisit_complex_selectorvisit_child_nodes
140+
141+
# Visit a Selectors::CompoundSelector node.
142+
aliasvisit_compound_selectorvisit_child_nodes
143+
135144
# Visit a Selectors::IdSelector node.
136145
aliasvisit_id_selectorvisit_child_nodes
137146

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp