Skip to content

Commit f410315

Browse files
committed
Split up combinators logic
1 parent 5b84ed8 commit f410315

File tree

6 files changed

+236
-144
lines changed

6 files changed

+236
-144
lines changed

Gemfile.lock

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ GEM
2222
prettier_print (>= 1.2.0)
2323

2424
PLATFORMS
25+
arm64-darwin-23
2526
x86_64-darwin-21
2627
x86_64-linux
2728

lib/syntax_tree/css/format.rb

+64-46
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ def visit_delim_token(node)
4242
q.text(node.value)
4343
end
4444

45-
# Visit an IdentToken node.
46-
def visit_ident_token(node)
45+
# Visit a HashToken node.
46+
def visit_hash_token(node)
4747
q.text(node.value)
4848
end
4949

50-
# Visit a HashToken node.
51-
def visit_hash_token(node)
50+
# Visit an IdentToken node.
51+
def visit_ident_token(node)
5252
q.text(node.value)
5353
end
5454

@@ -70,28 +70,79 @@ def visit_style_rule(node)
7070
end
7171
end
7272

73+
# Visit a Selectors::SubsequentSiblingCombinator node.
74+
def visit_subsequent_sibling_combinator(node)
75+
q.text(" ")
76+
node.value.format(q)
77+
q.text(" ")
78+
end
79+
7380
#-------------------------------------------------------------------------
7481
# Selector nodes
7582
#-------------------------------------------------------------------------
7683

77-
# Visit a Selectors::TypeSelector node.
78-
def visit_type_selector(node)
84+
# Visit a Selectors::ChildCombinator node.
85+
def visit_child_combinator(node)
86+
q.text(" ")
87+
node.value.format(q)
88+
q.text(" ")
89+
end
90+
91+
# Visit a Selectors::ClassSelector node.
92+
def visit_class_selector(node)
93+
q.text(".")
94+
node.value.format(q)
95+
end
96+
97+
# Visit a Selectors::ColumnSiblingCombinator node.
98+
def visit_column_sibling_combinator(node)
99+
q.text(" ")
100+
node.value.each { |value| value.format(q) }
101+
q.text(" ")
102+
end
103+
104+
# Visit a Selectors::ComplexSelector node.
105+
def visit_complex_selector(node)
79106
q.group do
80-
node.prefix.format(q) if node.prefix
81-
node.value.format(q)
107+
node.child_nodes.each do |child_node|
108+
child_node.format(q)
109+
end
110+
end
111+
end
112+
113+
# Visit a Selectors::CompoundSelector node.
114+
def visit_compound_selector(node)
115+
q.group do
116+
node.child_nodes.each do |child_node|
117+
child_node.format(q)
118+
end
82119
end
83120
end
84121

122+
# Visit a Selectors::DescendantCombinator node.
123+
def visit_descendant_combinator(node)
124+
q.text(" ")
125+
end
126+
85127
# Visit a Selectors::IdSelector node.
86128
def visit_id_selector(node)
87129
q.text("#")
88130
node.value.format(q)
89131
end
90132

91-
# Visit a Selectors::ClassSelector node.
92-
def visit_class_selector(node)
93-
q.text(".")
133+
# Visit a Selectors::NextSiblingCombinator node.
134+
def visit_next_sibling_combinator(node)
135+
q.text(" ")
94136
node.value.format(q)
137+
q.text(" ")
138+
end
139+
140+
# Visit a Selectors::TypeSelector node.
141+
def visit_type_selector(node)
142+
q.group do
143+
node.prefix&.format(q)
144+
node.value.format(q)
145+
end
95146
end
96147

97148
# Visit a Selectors::PseudoClassSelector node.
@@ -116,42 +167,9 @@ def visit_pseudo_element_selector(node)
116167
node.value.format(q)
117168
end
118169

119-
# Visit a Selectors::Combinator node.
120-
def visit_combinator(node)
121-
case node.value
122-
when WhitespaceToken
123-
q.text(" ")
124-
when Array
125-
q.text(" ")
126-
node.value.each { |val| val.format(q) }
127-
q.text(" ")
128-
else
129-
q.text(" ")
130-
node.value.format(q)
131-
q.text(" ")
132-
end
133-
end
134-
135-
# Visit a Selectors::ComplexSelector node.
136-
def visit_complex_selector(node)
137-
q.group do
138-
node.child_nodes.each_with_index do |child_node, j|
139-
child_node.format(q)
140-
end
141-
end
142-
end
143-
144-
# Visit a Selectors::CompoundSelector node.
145-
def visit_compound_selector(node)
146-
q.group do
147-
node.child_nodes.each do |node_|
148-
node_.format(q)
149-
end
150-
end
151-
end
152-
170+
# Visit a Selectors::WqName node.
153171
def visit_wqname(node)
154-
node.prefix.format(q) if node.prefix
172+
node.prefix&.format(q)
155173
node.name.format(q)
156174
end
157175
end

lib/syntax_tree/css/pretty_print.rb

+91-59
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,73 @@ def visit_whitespace_token(node)
350350
# Selector nodes
351351
#-------------------------------------------------------------------------
352352

353+
# Visit a Selectors::ChildCombinator node.
354+
def visit_child_combinator(node)
355+
token("child-combinator") do
356+
q.breakable
357+
q.pp(node.value)
358+
end
359+
end
360+
361+
# Visit a Selectors::ColumnSiblingCombinator node.
362+
def visit_column_sibling_combinator(node)
363+
token("column-sibling-combinator") do
364+
q.breakable
365+
q.pp(node.value)
366+
end
367+
end
368+
369+
# Visit a Selectors::ComplexSelector node.
370+
def visit_complex_selector(node)
371+
token("complex-selector") do
372+
node.child_nodes.each do |child|
373+
q.breakable
374+
q.pp(child)
375+
end
376+
end
377+
end
378+
379+
# Visit a Selectors::CompoundSelector node.
380+
def visit_compound_selector(node)
381+
token("compound-selector") do
382+
q.breakable
383+
token("type") do
384+
q.breakable
385+
q.pp(node.type)
386+
end
387+
388+
q.breakable
389+
q.text("(subclasses")
390+
391+
if node.subclasses.any?
392+
q.nest(2) do
393+
q.breakable
394+
q.seplist(node.subclasses) { |subclass| q.pp(subclass) }
395+
end
396+
397+
q.breakable("")
398+
end
399+
400+
q.text(")")
401+
402+
q.breakable("")
403+
q.text("(pseudo-elements")
404+
405+
if node.pseudo_elements.any?
406+
q.nest(2) do
407+
q.breakable
408+
q.seplist(node.pseudo_elements) do |pseudo_element|
409+
q.pp(pseudo_element)
410+
end
411+
end
412+
413+
q.breakable("")
414+
end
415+
416+
q.text(")")
417+
end
418+
end
419+
353420
# Visit a Selectors::ClassSelector node.
354421
def visit_class_selector(node)
355422
token("class-selector") do
@@ -358,6 +425,14 @@ def visit_class_selector(node)
358425
end
359426
end
360427

428+
# Visit a Selectors::DescendantCombinator node.
429+
def visit_descendant_combinator(node)
430+
token("descendant-combinator") do
431+
q.breakable
432+
q.pp(node.value)
433+
end
434+
end
435+
361436
# Visit a Selectors::IdSelector node.
362437
def visit_id_selector(node)
363438
token("id-selector") do
@@ -366,6 +441,14 @@ def visit_id_selector(node)
366441
end
367442
end
368443

444+
# Visit a Selectors::NextSiblingCombinator node.
445+
def visit_next_sibling_combinator(node)
446+
token("next-sibling-combinator") do
447+
q.breakable
448+
q.pp(node.value)
449+
end
450+
end
451+
369452
# Visit a Selectors::PseudoClassSelector node.
370453
def visit_pseudo_class_selector(node)
371454
token("pseudo-class-selector") do
@@ -404,6 +487,14 @@ def visit_pseudo_element_selector(node)
404487
end
405488
end
406489

490+
# Visit a Selectors::SubsequentSiblingCombinator node.
491+
def visit_subsequent_sibling_combinator(node)
492+
token("subsequent-sibling-combinator") do
493+
q.breakable
494+
q.pp(node.value)
495+
end
496+
end
497+
407498
# Visit a Selectors::TypeSelector node.
408499
def visit_type_selector(node)
409500
token("type-selector") do
@@ -430,65 +521,6 @@ def visit_wqname(node)
430521
end
431522
end
432523

433-
# Visit a Selectors::Combinator node.
434-
def visit_combinator(node)
435-
token(node.class::PP_NAME) do
436-
q.breakable
437-
q.pp(node.value)
438-
end
439-
end
440-
441-
# Visit a Selectors::ComplexSelector node.
442-
def visit_complex_selector(node)
443-
token("complex-selector") do
444-
node.child_nodes.each do |child|
445-
q.breakable
446-
q.pp(child)
447-
end
448-
end
449-
end
450-
451-
# Visit a Selectors::CompoundSelector node.
452-
def visit_compound_selector(node)
453-
token("compound-selector") do
454-
q.breakable
455-
token("type") do
456-
q.breakable
457-
q.pp(node.type)
458-
end
459-
460-
q.breakable
461-
q.text("(subclasses")
462-
463-
if node.subclasses.any?
464-
q.nest(2) do
465-
q.breakable
466-
q.seplist(node.subclasses) { |subclass| q.pp(subclass) }
467-
end
468-
469-
q.breakable("")
470-
end
471-
472-
q.text(")")
473-
474-
q.breakable("")
475-
q.text("(pseudo-elements")
476-
477-
if node.pseudo_elements.any?
478-
q.nest(2) do
479-
q.breakable
480-
q.seplist(node.pseudo_elements) do |pseudo_element|
481-
q.pp(pseudo_element)
482-
end
483-
end
484-
485-
q.breakable("")
486-
end
487-
488-
q.text(")")
489-
end
490-
end
491-
492524
private
493525

494526
def token(name)

0 commit comments

Comments
 (0)