syntax_tree-haml 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +3 -1
- data/CHANGELOG.md +8 -1
- data/Gemfile.lock +3 -3
- data/Rakefile +7 -0
- data/lib/syntax_tree/haml/format.rb +425 -0
- data/lib/syntax_tree/haml/pretty_print.rb +158 -0
- data/lib/syntax_tree/haml/version.rb +1 -1
- data/lib/syntax_tree/haml.rb +60 -52
- data/syntax_tree-haml.gemspec +14 -14
- metadata +4 -11
- data/lib/syntax_tree/haml/comment.rb +0 -52
- data/lib/syntax_tree/haml/doctype.rb +0 -64
- data/lib/syntax_tree/haml/filter.rb +0 -42
- data/lib/syntax_tree/haml/haml_comment.rb +0 -38
- data/lib/syntax_tree/haml/plain.rb +0 -40
- data/lib/syntax_tree/haml/root.rb +0 -30
- data/lib/syntax_tree/haml/script.rb +0 -53
- data/lib/syntax_tree/haml/silent_script.rb +0 -62
- data/lib/syntax_tree/haml/tag.rb +0 -306
data/lib/syntax_tree/haml.rb
CHANGED
@@ -4,75 +4,83 @@ require "haml"
|
|
4
4
|
require "prettier_print"
|
5
5
|
require "syntax_tree"
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
class Haml::Parser::ParseNode
|
18
|
-
def format(q)
|
19
|
-
syntax_tree.format(q)
|
20
|
-
end
|
21
|
-
|
22
|
-
def pretty_print(q)
|
23
|
-
syntax_tree.pretty_print(q)
|
24
|
-
end
|
7
|
+
module SyntaxTree
|
8
|
+
module Haml
|
9
|
+
DOCTYPE_TYPES = {
|
10
|
+
"basic" => "Basic",
|
11
|
+
"frameset" => "Frameset",
|
12
|
+
"mobile" => "Mobile",
|
13
|
+
"rdfa" => "RDFa",
|
14
|
+
"strict" => "Strict",
|
15
|
+
"xml" => "XML"
|
16
|
+
}
|
25
17
|
|
26
|
-
|
18
|
+
DOCTYPE_VERSIONS = %w[1.1 5]
|
27
19
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
when :plain then SyntaxTree::Haml::Plain.new(self)
|
35
|
-
when :root then SyntaxTree::Haml::Root.new(self)
|
36
|
-
when :script then SyntaxTree::Haml::Script.new(self)
|
37
|
-
when :silent_script then SyntaxTree::Haml::SilentScript.new(self)
|
38
|
-
when :tag then SyntaxTree::Haml::Tag.new(self)
|
39
|
-
else
|
40
|
-
raise ArgumentError, "Unsupported type: #{type}"
|
20
|
+
# This is the parent class of the various visitors that we provide to access
|
21
|
+
# the HAML syntax tree.
|
22
|
+
class Visitor
|
23
|
+
def visit(node)
|
24
|
+
node&.accept(self)
|
25
|
+
end
|
41
26
|
end
|
42
|
-
end
|
43
|
-
end
|
44
27
|
|
45
|
-
|
46
|
-
|
28
|
+
# This is the main parser entrypoint, and just delegates to the Haml gem's
|
29
|
+
# parser to do the heavy lifting.
|
47
30
|
def self.parse(source)
|
48
31
|
::Haml::Parser.new({}).call(source)
|
49
32
|
end
|
50
33
|
|
34
|
+
# This is the main entrypoint for the formatter. It parses the source,
|
35
|
+
# builds a formatter, then pretty prints the result.
|
51
36
|
def self.format(source, maxwidth = 80)
|
52
37
|
PrettierPrint.format(+"", maxwidth) { |q| parse(source).format(q) }
|
53
38
|
end
|
54
39
|
|
40
|
+
# This is a required API for syntax tree which just delegates to File.read.
|
55
41
|
def self.read(filepath)
|
56
42
|
File.read(filepath)
|
57
43
|
end
|
58
|
-
|
59
|
-
def self.with_children(node, q)
|
60
|
-
if node.children.empty?
|
61
|
-
q.group { yield }
|
62
|
-
else
|
63
|
-
q.group do
|
64
|
-
q.group { yield }
|
65
|
-
q.indent do
|
66
|
-
node.children.each do |child|
|
67
|
-
q.breakable(force: true)
|
68
|
-
child.format(q)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
44
|
end
|
75
45
|
|
76
46
|
# Register our module as a handler for the .haml file type.
|
77
47
|
register_handler(".haml", Haml)
|
78
48
|
end
|
49
|
+
|
50
|
+
require "syntax_tree/haml/format"
|
51
|
+
require "syntax_tree/haml/pretty_print"
|
52
|
+
|
53
|
+
class Haml::Parser::ParseNode
|
54
|
+
# Here we're going to hook into the parse node and define a method that will
|
55
|
+
# accept a visitor in order to walk through the tree.
|
56
|
+
def accept(visitor)
|
57
|
+
case type
|
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)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def format(q)
|
80
|
+
accept(SyntaxTree::Haml::Format.new(q))
|
81
|
+
end
|
82
|
+
|
83
|
+
def pretty_print(q)
|
84
|
+
accept(SyntaxTree::Haml::PrettyPrint.new(q))
|
85
|
+
end
|
86
|
+
end
|
data/syntax_tree-haml.gemspec
CHANGED
@@ -4,24 +4,24 @@ require "ripper"
|
|
4
4
|
require_relative "lib/syntax_tree/haml/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
7
|
+
spec.name = "syntax_tree-haml"
|
8
|
+
spec.version = SyntaxTree::Haml::VERSION
|
9
|
+
spec.authors = ["Kevin Newton"]
|
10
|
+
spec.email = ["kddnewton@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary
|
13
|
-
spec.homepage
|
14
|
-
spec.license
|
15
|
-
spec.metadata
|
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" }
|
16
16
|
|
17
|
-
spec.files
|
18
|
-
|
19
|
-
|
17
|
+
spec.files =
|
18
|
+
Dir.chdir(__dir__) do
|
19
|
+
`git ls-files -z`.split("\x0")
|
20
|
+
.reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
21
|
end
|
21
|
-
end
|
22
22
|
|
23
|
-
spec.bindir
|
24
|
-
spec.executables
|
23
|
+
spec.bindir = "exe"
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
25
|
spec.require_paths = %w[lib]
|
26
26
|
|
27
27
|
spec.add_dependency "haml", ">= 5.2"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: syntax_tree-haml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Newton
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: haml
|
@@ -128,15 +128,8 @@ files:
|
|
128
128
|
- bin/format
|
129
129
|
- bin/parse
|
130
130
|
- lib/syntax_tree/haml.rb
|
131
|
-
- lib/syntax_tree/haml/
|
132
|
-
- lib/syntax_tree/haml/
|
133
|
-
- lib/syntax_tree/haml/filter.rb
|
134
|
-
- lib/syntax_tree/haml/haml_comment.rb
|
135
|
-
- lib/syntax_tree/haml/plain.rb
|
136
|
-
- lib/syntax_tree/haml/root.rb
|
137
|
-
- lib/syntax_tree/haml/script.rb
|
138
|
-
- lib/syntax_tree/haml/silent_script.rb
|
139
|
-
- lib/syntax_tree/haml/tag.rb
|
131
|
+
- lib/syntax_tree/haml/format.rb
|
132
|
+
- lib/syntax_tree/haml/pretty_print.rb
|
140
133
|
- lib/syntax_tree/haml/version.rb
|
141
134
|
- syntax_tree-haml.gemspec
|
142
135
|
homepage: https://github.com/ruby-syntax-tree/syntax_tree-haml
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#html-comments-
|
6
|
-
class Comment
|
7
|
-
attr_reader :node
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def format(q)
|
14
|
-
Haml.with_children(node, q) do
|
15
|
-
q.text("/")
|
16
|
-
q.text("!") if node.value[:revealed]
|
17
|
-
|
18
|
-
if node.value[:conditional]
|
19
|
-
q.text(node.value[:conditional])
|
20
|
-
elsif node.value[:text]
|
21
|
-
q.text(" #{node.value[:text]}")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def pretty_print(q)
|
27
|
-
q.group(2, "(comment", ")") do
|
28
|
-
q.breakable
|
29
|
-
|
30
|
-
if node.value[:conditional]
|
31
|
-
q.text("conditional=")
|
32
|
-
q.pp(node.value[:conditional])
|
33
|
-
elsif node.value[:text]
|
34
|
-
q.text("text=")
|
35
|
-
q.pp(node.value[:text])
|
36
|
-
end
|
37
|
-
|
38
|
-
if node.value[:revealed]
|
39
|
-
q.breakable
|
40
|
-
q.text("revealed")
|
41
|
-
end
|
42
|
-
|
43
|
-
if node.children.any?
|
44
|
-
q.breakable
|
45
|
-
q.text("children=")
|
46
|
-
q.pp(node.children)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#doctype-
|
6
|
-
class Doctype
|
7
|
-
TYPES = {
|
8
|
-
"basic" => "Basic",
|
9
|
-
"frameset" => "Frameset",
|
10
|
-
"mobile" => "Mobile",
|
11
|
-
"rdfa" => "RDFa",
|
12
|
-
"strict" => "Strict",
|
13
|
-
"xml" => "XML"
|
14
|
-
}
|
15
|
-
|
16
|
-
VERSIONS = ["1.1", "5"]
|
17
|
-
|
18
|
-
attr_reader :node
|
19
|
-
|
20
|
-
def initialize(node)
|
21
|
-
@node = node
|
22
|
-
end
|
23
|
-
|
24
|
-
def format(q)
|
25
|
-
parts = ["!!!"]
|
26
|
-
|
27
|
-
parts <<
|
28
|
-
if TYPES.key?(node.value[:type])
|
29
|
-
TYPES[node.value[:type]]
|
30
|
-
elsif VERSIONS.include?(node.value[:version])
|
31
|
-
node.value[:version]
|
32
|
-
else
|
33
|
-
node.value[:type]
|
34
|
-
end
|
35
|
-
|
36
|
-
parts << node.value[:encoding] if node.value[:encoding]
|
37
|
-
q.text(parts.join(" "))
|
38
|
-
end
|
39
|
-
|
40
|
-
def pretty_print(q)
|
41
|
-
q.group(2, "(doctype", ")") do
|
42
|
-
q.breakable
|
43
|
-
|
44
|
-
if TYPES.key?(node.value[:type])
|
45
|
-
q.text("type=")
|
46
|
-
q.pp(node.value[:type])
|
47
|
-
elsif VERSIONS.include?(node.value[:version])
|
48
|
-
q.text("version=")
|
49
|
-
q.pp(node.value[:version])
|
50
|
-
else
|
51
|
-
q.text("type=")
|
52
|
-
q.pp(node.value[:type])
|
53
|
-
end
|
54
|
-
|
55
|
-
if node.value[:encoding]
|
56
|
-
q.breakable
|
57
|
-
q.text("encoding=")
|
58
|
-
q.pp(node.value[:encoding])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#filters
|
6
|
-
class Filter
|
7
|
-
attr_reader :node
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def format(q)
|
14
|
-
q.group do
|
15
|
-
q.text(":")
|
16
|
-
q.text(node.value[:name])
|
17
|
-
|
18
|
-
q.indent do
|
19
|
-
q.breakable(force: true)
|
20
|
-
|
21
|
-
segments = node.value[:text].strip.split("\n")
|
22
|
-
q.seplist(segments, -> { q.breakable(force: true) }) do |segment|
|
23
|
-
q.text(segment)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def pretty_print(q)
|
30
|
-
q.group(2, "(filter", ")") do
|
31
|
-
q.breakable
|
32
|
-
q.text("name=")
|
33
|
-
q.text(node.value[:name])
|
34
|
-
|
35
|
-
q.breakable
|
36
|
-
q.text("text=")
|
37
|
-
q.pp(node.value[:text])
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#haml-comments--
|
6
|
-
class HamlComment
|
7
|
-
attr_reader :node
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def format(q)
|
14
|
-
q.text("-#")
|
15
|
-
text = node.value[:text].strip
|
16
|
-
|
17
|
-
if text.include?("\n")
|
18
|
-
q.indent do
|
19
|
-
q.breakable(force: true)
|
20
|
-
q.seplist(text.split("\n"), -> { q.breakable(force: true) }) do |segment|
|
21
|
-
q.text(segment)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
else
|
25
|
-
q.text(" #{text}")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def pretty_print(q)
|
30
|
-
q.group(2, "(haml_comment", ")") do
|
31
|
-
q.breakable
|
32
|
-
q.text("text=")
|
33
|
-
q.pp(node.value[:text])
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#plain-text
|
6
|
-
class Plain
|
7
|
-
attr_reader :node
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def format(q)
|
14
|
-
text = node.value[:text]
|
15
|
-
|
16
|
-
q.text("\\") if escaped?(text)
|
17
|
-
q.text(text)
|
18
|
-
end
|
19
|
-
|
20
|
-
def pretty_print(q)
|
21
|
-
q.group(2, "(plain", ")") do
|
22
|
-
q.breakable
|
23
|
-
q.text("text=")
|
24
|
-
q.pp(node.value[:text])
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
# If a node comes in as the plain type but starts with one of the special
|
31
|
-
# characters that haml parses, then we need to escape it with a \ when
|
32
|
-
# printing.
|
33
|
-
def escaped?(text)
|
34
|
-
::Haml::Parser::SPECIAL_CHARACTERS.any? do |special|
|
35
|
-
text.start_with?(special)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
class Root
|
6
|
-
attr_reader :node
|
7
|
-
|
8
|
-
def initialize(node)
|
9
|
-
@node = node
|
10
|
-
end
|
11
|
-
|
12
|
-
def format(q)
|
13
|
-
node.children.each do |child|
|
14
|
-
child.format(q)
|
15
|
-
q.breakable(force: true)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def pretty_print(q)
|
20
|
-
q.group(2, "(root", ")") do
|
21
|
-
if node.children.any?
|
22
|
-
q.breakable
|
23
|
-
q.text("children=")
|
24
|
-
q.pp(node.children)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#inserting_ruby
|
6
|
-
class Script
|
7
|
-
attr_reader :node
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def format(q)
|
14
|
-
Haml.with_children(node, q) do
|
15
|
-
q.text("&") if node.value[:escape_html]
|
16
|
-
|
17
|
-
if node.value[:preserve]
|
18
|
-
q.text("~")
|
19
|
-
else
|
20
|
-
q.text("=")
|
21
|
-
end
|
22
|
-
|
23
|
-
q.text(" ")
|
24
|
-
q.text(node.value[:text].strip)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def pretty_print(q)
|
29
|
-
q.group(2, "(script", ")") do
|
30
|
-
q.breakable
|
31
|
-
q.text("text=")
|
32
|
-
q.pp(node.value[:text])
|
33
|
-
|
34
|
-
if node.value[:escape_html]
|
35
|
-
q.breakable
|
36
|
-
q.text("escape_html")
|
37
|
-
end
|
38
|
-
|
39
|
-
if node.value[:preserve]
|
40
|
-
q.breakable
|
41
|
-
q.text("preserve")
|
42
|
-
end
|
43
|
-
|
44
|
-
if node.children.any?
|
45
|
-
q.breakable
|
46
|
-
q.text("children=")
|
47
|
-
q.pp(node.children)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SyntaxTree
|
4
|
-
module Haml
|
5
|
-
# https://haml.info/docs/yardoc/file.REFERENCE.html#running-ruby--
|
6
|
-
class SilentScript
|
7
|
-
attr_reader :node
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def format(q)
|
14
|
-
q.group do
|
15
|
-
q.text("- ")
|
16
|
-
q.text(node.value[:text].strip)
|
17
|
-
|
18
|
-
node.children.each do |child|
|
19
|
-
if continuation?(child)
|
20
|
-
q.breakable(force: true)
|
21
|
-
child.format(q)
|
22
|
-
else
|
23
|
-
q.indent do
|
24
|
-
q.breakable(force: true)
|
25
|
-
child.format(q)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def pretty_print(q)
|
33
|
-
q.group(2, "(silent_script", ")") do
|
34
|
-
q.breakable
|
35
|
-
q.text("text=")
|
36
|
-
q.pp(node.value[:text])
|
37
|
-
|
38
|
-
if node.children.any?
|
39
|
-
q.breakable
|
40
|
-
q.text("children=")
|
41
|
-
q.pp(node.children)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def continuation?(child)
|
49
|
-
return false if child.type != :silent_script
|
50
|
-
|
51
|
-
case [node.value[:keyword], child.value[:keyword]]
|
52
|
-
in ["case", "in" | "when" | "else"]
|
53
|
-
true
|
54
|
-
in ["if" | "unless", "elsif" | "else"]
|
55
|
-
true
|
56
|
-
else
|
57
|
-
false
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|