Skip to content

Commit 7b2fa81

Browse files
committedJul 6, 2022
Various cleanup
1 parent eedf19d commit 7b2fa81

File tree

7 files changed

+263
-276
lines changed

7 files changed

+263
-276
lines changed
 

‎Rakefile

+7
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@
22

33
require "bundler/gem_tasks"
44
require "rake/testtask"
5+
require "syntax_tree/rake_tasks"
56

67
Rake::TestTask.new(:test) do |t|
78
t.libs << "test"
89
t.libs << "lib"
910
t.test_files = FileList["test/**/*_test.rb"]
1011
end
1112

13+
SOURCE_FILES =
14+
FileList[%w[Gemfile Rakefile syntax_tree-haml.gemspec lib/**/*.rb test/*.rb]]
15+
16+
SyntaxTree::Rake::CheckTask.new { |t| t.source_files = SOURCE_FILES }
17+
SyntaxTree::Rake::WriteTask.new { |t| t.source_files = SOURCE_FILES }
18+
1219
task default: :test

‎lib/syntax_tree/haml.rb

+21-12
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ module Haml
1414
"strict" => "Strict",
1515
"xml" => "XML"
1616
}
17-
18-
DOCTYPE_VERSIONS = ["1.1", "5"]
19-
17+
18+
DOCTYPE_VERSIONS = %w[1.1 5]
19+
2020
# This is the parent class of the various visitors that we provide to access
2121
# the HAML syntax tree.
2222
class Visitor
@@ -55,15 +55,24 @@ class Haml::Parser::ParseNode
5555
# accept a visitor in order to walk through the tree.
5656
def accept(visitor)
5757
case type
58-
in :comment then visitor.visit_comment(self)
59-
in :doctype then visitor.visit_doctype(self)
60-
in :filter then visitor.visit_filter(self)
61-
in :haml_comment then visitor.visit_haml_comment(self)
62-
in :plain then visitor.visit_plain(self)
63-
in :root then visitor.visit_root(self)
64-
in :script then visitor.visit_script(self)
65-
in :silent_script then visitor.visit_silent_script(self)
66-
in :tag then visitor.visit_tag(self)
58+
in :comment
59+
visitor.visit_comment(self)
60+
in :doctype
61+
visitor.visit_doctype(self)
62+
in :filter
63+
visitor.visit_filter(self)
64+
in :haml_comment
65+
visitor.visit_haml_comment(self)
66+
in :plain
67+
visitor.visit_plain(self)
68+
in :root
69+
visitor.visit_root(self)
70+
in :script
71+
visitor.visit_script(self)
72+
in :silent_script
73+
visitor.visit_silent_script(self)
74+
in :tag
75+
visitor.visit_tag(self)
6776
end
6877
end
6978

‎lib/syntax_tree/haml/format.rb

+118-112
Large diffs are not rendered by default.

‎lib/syntax_tree/haml/pretty_print.rb

+91-138
Original file line numberDiff line numberDiff line change
@@ -11,195 +11,148 @@ def initialize(q)
1111

1212
# https://haml.info/docs/yardoc/file.REFERENCE.html#html-comments-
1313
def visit_comment(node)
14-
q.group(2, "(comment", ")") do
15-
q.breakable
16-
14+
group("comment") do
1715
if node.value[:conditional]
18-
q.text("conditional=")
19-
q.pp(node.value[:conditional])
16+
pp_field("conditional", node.value[:conditional])
2017
elsif node.value[:text]
21-
q.text("text=")
22-
q.pp(node.value[:text])
23-
end
24-
25-
if node.value[:revealed]
26-
q.breakable
27-
q.text("revealed")
28-
end
29-
30-
if node.children.any?
31-
q.breakable
32-
q.text("children=")
33-
q.pp(node.children)
18+
pp_field("text", node.value[:text])
3419
end
20+
21+
bool_field("revealed") if node.value[:revealed]
22+
pp_field("children", node.children) if node.children.any?
3523
end
3624
end
37-
25+
3826
# https://haml.info/docs/yardoc/file.REFERENCE.html#doctype-
3927
def visit_doctype(node)
40-
q.group(2, "(doctype", ")") do
41-
q.breakable
42-
28+
group("doctype") do
4329
if DOCTYPE_TYPES.key?(node.value[:type])
44-
q.text("type=")
45-
q.pp(node.value[:type])
30+
pp_field("type", node.value[:type])
4631
elsif DOCTYPE_VERSIONS.include?(node.value[:version])
47-
q.text("version=")
48-
q.pp(node.value[:version])
32+
pp_field("version", node.value[:version])
4933
else
50-
q.text("type=")
51-
q.pp(node.value[:type])
52-
end
53-
54-
if node.value[:encoding]
55-
q.breakable
56-
q.text("encoding=")
57-
q.pp(node.value[:encoding])
34+
pp_field("text", node.value[:text])
5835
end
36+
37+
pp_field("encoding", node.value[:encoding]) if node.value[:encoding]
5938
end
6039
end
61-
40+
6241
# https://haml.info/docs/yardoc/file.REFERENCE.html#filter
6342
def visit_filter(node)
64-
q.group(2, "(filter", ")") do
65-
q.breakable
66-
q.text("name=")
67-
q.text(node.value[:name])
68-
69-
q.breakable
70-
q.text("text=")
71-
q.pp(node.value[:text])
43+
group("filter") do
44+
text_field("name", node.value[:name])
45+
pp_field("text", node.value[:text])
7246
end
7347
end
74-
48+
7549
# https://haml.info/docs/yardoc/file.REFERENCE.html#haml-comments--
7650
def visit_haml_comment(node)
77-
q.group(2, "(haml_comment", ")") do
78-
q.breakable
79-
q.text("text=")
80-
q.pp(node.value[:text])
81-
end
51+
group("haml_comment") { pp_field("text", node.value[:text]) }
8252
end
83-
53+
8454
# https://haml.info/docs/yardoc/file.REFERENCE.html#plain-text
8555
def visit_plain(node)
86-
q.group(2, "(plain", ")") do
87-
q.breakable
88-
q.text("text=")
89-
q.pp(node.value[:text])
90-
end
56+
group("plain") { pp_field("text", node.value[:text]) }
9157
end
92-
58+
9359
# Visit the root node of the AST.
9460
def visit_root(node)
95-
q.group(2, "(root", ")") do
96-
if node.children.any?
97-
q.breakable
98-
q.text("children=")
99-
q.pp(node.children)
100-
end
61+
group("root") do
62+
pp_field("children", node.children) if node.children.any?
10163
end
10264
end
103-
65+
10466
# https://haml.info/docs/yardoc/file.REFERENCE.html#inserting_ruby
10567
def visit_script(node)
106-
q.group(2, "(script", ")") do
107-
q.breakable
108-
q.text("text=")
109-
q.pp(node.value[:text])
110-
111-
if node.value[:escape_html]
112-
q.breakable
113-
q.text("escape_html")
114-
end
115-
116-
if node.value[:preserve]
117-
q.breakable
118-
q.text("preserve")
119-
end
120-
121-
if node.children.any?
122-
q.breakable
123-
q.text("children=")
124-
q.pp(node.children)
125-
end
68+
group("script") do
69+
pp_field("text", node.value[:text])
70+
bool_field("escape_html") if node.value[:escape_html]
71+
bool_field("preserve") if node.value[:preserve]
72+
pp_field("children", node.children) if node.children.any?
12673
end
12774
end
128-
75+
12976
# https://haml.info/docs/yardoc/file.REFERENCE.html#running-ruby--
13077
def visit_silent_script(node)
131-
q.group(2, "(silent_script", ")") do
132-
q.breakable
133-
q.text("text=")
134-
q.pp(node.value[:text])
135-
136-
if node.children.any?
137-
q.breakable
138-
q.text("children=")
139-
q.pp(node.children)
140-
end
78+
group("silent-script") do
79+
pp_field("text", node.value[:text])
80+
pp_field("children", node.children) if node.children.any?
14181
end
14282
end
143-
83+
14484
# Visit a tag node.
14585
def visit_tag(node)
146-
q.group(2, "(tag", ")") do
147-
q.breakable
148-
q.text("name=")
149-
q.pp(node.value[:name])
150-
86+
group("tag") do
87+
pp_field("name", node.value[:name])
88+
15189
if node.value[:attributes].any?
152-
q.breakable
153-
q.text("attributes=")
154-
q.pp(node.value[:attributes])
90+
pp_field("attributes", node.value[:attributes])
15591
end
156-
92+
15793
if node.value[:dynamic_attributes].new
158-
q.breakable
159-
q.text("dynamic_attributes.new=")
160-
q.pp(node.value[:dynamic_attributes].new)
94+
pp_field(
95+
"dynamic_attributes.new",
96+
node.value[:dynamic_attributes].new
97+
)
16198
end
162-
99+
163100
if node.value[:dynamic_attributes].old
164-
q.breakable
165-
q.text("dynamic_attributes.old=")
166-
q.pp(node.value[:dynamic_attributes].old)
101+
pp_field(
102+
"dynamic_attributes.old",
103+
node.value[:dynamic_attributes].old
104+
)
167105
end
168-
106+
169107
if node.value[:object_ref] != :nil
170-
q.breakable
171-
q.text("object_ref=")
172-
q.pp(node.value[:object_ref])
108+
pp_field("object_ref", node.value[:object_ref])
173109
end
174-
110+
175111
if node.value[:nuke_outer_whitespace]
176-
q.breakable
177-
q.text("nuke_outer_whitespace")
112+
bool_field("nuke_outer_whitespace")
178113
end
179-
114+
180115
if node.value[:nuke_inner_whitespace]
181-
q.breakable
182-
q.text("nuke_inner_whitespace")
183-
end
184-
185-
if node.value[:self_closing]
186-
q.breakable
187-
q.text("self_closing")
188-
end
189-
190-
if node.value[:value]
191-
q.breakable
192-
q.text("value=")
193-
q.pp(node.value[:value])
194-
end
195-
196-
if node.children.any?
197-
q.breakable
198-
q.text("children=")
199-
q.pp(node.children)
116+
bool_field("nuke_inner_whitespace")
200117
end
118+
119+
bool_field("self_closing") if node.value[:self_closing]
120+
pp_field("value", node.value[:value]) if node.value[:value]
121+
pp_field("children", node.children) if node.children.any?
122+
end
123+
end
124+
125+
private
126+
127+
def bool_field(name)
128+
q.breakable
129+
q.text(name)
130+
end
131+
132+
def group(name)
133+
q.group do
134+
q.text("(")
135+
q.text(name)
136+
137+
q.nest(2) { yield }
138+
q.breakable("")
139+
q.text(")")
201140
end
202141
end
142+
143+
def pp_field(name, value)
144+
q.breakable
145+
q.text(name)
146+
q.text("=")
147+
q.pp(value)
148+
end
149+
150+
def text_field(name, value)
151+
q.breakable
152+
q.text(name)
153+
q.text("=")
154+
q.text(value)
155+
end
203156
end
204157
end
205158
end

‎syntax_tree-haml.gemspec

+14-14
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@ require "ripper"
44
require_relative "lib/syntax_tree/haml/version"
55

66
Gem::Specification.new do |spec|
7-
spec.name = "syntax_tree-haml"
8-
spec.version = SyntaxTree::Haml::VERSION
9-
spec.authors = ["Kevin Newton"]
10-
spec.email = ["kddnewton@gmail.com"]
7+
spec.name = "syntax_tree-haml"
8+
spec.version = SyntaxTree::Haml::VERSION
9+
spec.authors = ["Kevin Newton"]
10+
spec.email = ["kddnewton@gmail.com"]
1111

12-
spec.summary = "Syntax Tree support for Haml"
13-
spec.homepage = "https://github.com/ruby-syntax-tree/syntax_tree-haml"
14-
spec.license = "MIT"
15-
spec.metadata = { "rubygems_mfa_required" => "true" }
12+
spec.summary = "Syntax Tree support for Haml"
13+
spec.homepage = "https://github.com/ruby-syntax-tree/syntax_tree-haml"
14+
spec.license = "MIT"
15+
spec.metadata = { "rubygems_mfa_required" => "true" }
1616

17-
spec.files = Dir.chdir(__dir__) do
18-
`git ls-files -z`.split("\x0").reject do |f|
19-
f.match(%r{^(test|spec|features)/})
17+
spec.files =
18+
Dir.chdir(__dir__) do
19+
`git ls-files -z`.split("\x0")
20+
.reject { |f| f.match(%r{^(test|spec|features)/}) }
2021
end
21-
end
2222

23-
spec.bindir = "exe"
24-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23+
spec.bindir = "exe"
24+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
2525
spec.require_paths = %w[lib]
2626

2727
spec.add_dependency "haml", ">= 5.2"

‎test/haml_test.rb

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
3+
class HamlTest < Minitest::Test
4+
def test_read
5+
assert_equal(File.read(__FILE__), SyntaxTree::Haml.read(__FILE__))
6+
end
7+
end

‎test/test_helper.rb

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
require "syntax_tree/haml"
88
require "minitest/autorun"
99

10+
# This is here because on Ruby 2.7 it's possible that a thread-local variable
11+
# hasn't been initialized properly which would otherwise make calls to q.pp
12+
# fail.
13+
PP.pp(nil, +"")
14+
1015
class Minitest::Test
1116
private
1217

0 commit comments

Comments
 (0)
Please sign in to comment.