Skip to content

Commit c152737

Browse files
committed
format: implement CSS selector formatting for more nodes
Implement formatting for IdSelector, HashToken, PseudoClassSelector, and PseudoElementSelector. Also, add formatting test coverage.
1 parent e2096b3 commit c152737

File tree

2 files changed

+63
-6
lines changed

2 files changed

+63
-6
lines changed

lib/syntax_tree/css/format.rb

+25-3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ def visit_ident_token(node)
4747
q.text(node.value)
4848
end
4949

50+
# Visit a HashToken node.
51+
def visit_hash_token(node)
52+
q.text(node.value)
53+
end
54+
5055
# Visit a StyleRule node.
5156
def visit_style_rule(node)
5257
q.group do
@@ -77,12 +82,30 @@ def visit_type_selector(node)
7782
end
7883
end
7984

85+
# Visit a Selectors::IdSelector node.
86+
def visit_id_selector(node)
87+
q.text("#")
88+
node.value.format(q)
89+
end
90+
8091
# Visit a Selectors::ClassSelector node.
8192
def visit_class_selector(node)
8293
q.text(".")
8394
node.value.format(q)
8495
end
8596

97+
# Visit a Selectors::PseudoClassSelector node.
98+
def visit_pseudo_class_selector(node)
99+
q.text(":")
100+
node.value.format(q)
101+
end
102+
103+
# Visit a Selectors::PseudoElementSelector node.
104+
def visit_pseudo_element_selector(node)
105+
q.text(":")
106+
node.value.format(q)
107+
end
108+
86109
# Visit a Selectors::Combinator node.
87110
def visit_combinator(node)
88111
node.value.format(q)
@@ -101,9 +124,8 @@ def visit_complex_selector(node)
101124
# Visit a Selectors::CompoundSelector node.
102125
def visit_compound_selector(node)
103126
q.group do
104-
node.type.format(q) if node.type
105-
node.subclasses.each do |subclass|
106-
subclass.format(q)
127+
node.child_nodes.each do |node_|
128+
node_.format(q)
107129
end
108130
# TODO: pseudo-elements
109131
end

test/selectors_test.rb

+38-3
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,43 @@ class SelectorsTest < Minitest::Spec
212212
end
213213

214214
describe "formatting" do
215-
it "formats complex selectors" do
216-
assert_selector_format(".outer section.foo>table.bar tr", ".outer section.foo > table.bar tr")
215+
describe Selectors::CompoundSelector do
216+
it "with an id selector" do
217+
assert_selector_format(
218+
"div#foo",
219+
"div#foo",
220+
)
221+
end
222+
223+
it "with a pseudo-class selector" do
224+
assert_selector_format(
225+
"div:hover",
226+
"div:hover",
227+
)
228+
end
229+
230+
it "with class selectors" do
231+
assert_selector_format(
232+
"div.flex.text-xl",
233+
"div.flex.text-xl",
234+
)
235+
end
236+
237+
it "with pseudo-elements" do
238+
assert_selector_format(
239+
"div.flex:hover::first-line:last-child:active::first-letter",
240+
"div.flex:hover::first-line:last-child:active::first-letter",
241+
)
242+
end
243+
end
244+
245+
describe Selectors::ComplexSelector do
246+
it "with whitespace" do
247+
assert_selector_format(
248+
".outer section.foo>table.bar tr",
249+
".outer section.foo > table.bar tr",
250+
)
251+
end
217252
end
218253

219254
private
@@ -223,7 +258,7 @@ def assert_selector_format(selectors, expected)
223258

224259
io = StringIO.new
225260
selectors.each do |selector|
226-
selector.format(::PrettyPrint.new(io))
261+
selector.format(::PP.new(io))
227262
assert_equal(expected, io.string)
228263
end
229264
end

0 commit comments

Comments
 (0)