hamlit 1.7.2 → 2.0.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/.gitignore +4 -3
- data/.gitmodules +3 -0
- data/.travis.yml +25 -37
- data/CHANGELOG.md +18 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +23 -2
- data/README.md +106 -48
- data/REFERENCE.md +222 -0
- data/Rakefile +77 -19
- data/benchmark/boolean_attribute.haml +6 -0
- data/benchmark/class_attribute.haml +5 -0
- data/benchmark/common_attribute.haml +3 -0
- data/benchmark/data_attribute.haml +4 -0
- data/benchmark/dynamic_attributes/boolean_attribute.haml +4 -0
- data/benchmark/dynamic_attributes/class_attribute.haml +4 -0
- data/benchmark/dynamic_attributes/common_attribute.haml +2 -0
- data/benchmark/dynamic_attributes/data_attribute.haml +2 -0
- data/benchmark/dynamic_attributes/id_attribute.haml +2 -0
- data/benchmark/etc/attribute_builder.haml +5 -0
- data/benchmark/etc/real_sample.haml +888 -0
- data/benchmark/etc/real_sample.rb +11 -0
- data/benchmark/etc/static_analyzer.haml +1 -0
- data/benchmark/etc/tags.haml +3 -0
- data/benchmark/ext/build_data.rb +15 -0
- data/benchmark/ext/build_id.rb +13 -0
- data/benchmark/id_attribute.haml +3 -0
- data/benchmark/plain.haml +4 -0
- data/benchmark/script.haml +4 -0
- data/benchmark/slim/LICENSE +21 -0
- data/{benchmarks → benchmark/slim}/context.rb +2 -4
- data/benchmark/slim/run-benchmarks.rb +94 -0
- data/{benchmarks → benchmark/slim}/view.erb +3 -3
- data/{benchmarks → benchmark/slim}/view.haml +0 -0
- data/{benchmarks/view.escaped.slim → benchmark/slim/view.slim} +1 -1
- data/benchmark/string_interpolation.haml +2 -0
- data/benchmark/utils/benchmark_ips_extension.rb +43 -0
- data/bin/bench +85 -0
- data/bin/clone +14 -0
- data/bin/console +11 -0
- data/bin/lineprof +48 -0
- data/bin/ruby +3 -0
- data/bin/setup +7 -0
- data/bin/stackprof +27 -0
- data/{test → bin/test} +6 -10
- data/{bin → exe}/hamlit +0 -0
- data/ext/hamlit/extconf.rb +14 -0
- data/ext/hamlit/hamlit.c +512 -0
- data/ext/hamlit/houdini/.gitignore +3 -0
- data/ext/hamlit/houdini/COPYING +7 -0
- data/ext/hamlit/houdini/Makefile +79 -0
- data/ext/hamlit/houdini/README.md +59 -0
- data/ext/hamlit/houdini/buffer.c +249 -0
- data/ext/hamlit/houdini/buffer.h +113 -0
- data/ext/hamlit/houdini/houdini.h +46 -0
- data/ext/hamlit/houdini/houdini_href_e.c +115 -0
- data/ext/hamlit/houdini/houdini_html_e.c +90 -0
- data/ext/hamlit/houdini/houdini_html_u.c +122 -0
- data/ext/hamlit/houdini/houdini_js_e.c +90 -0
- data/ext/hamlit/houdini/houdini_js_u.c +60 -0
- data/ext/hamlit/houdini/houdini_uri_e.c +107 -0
- data/ext/hamlit/houdini/houdini_uri_u.c +68 -0
- data/ext/hamlit/houdini/houdini_xml_e.c +136 -0
- data/ext/hamlit/houdini/html_unescape.gperf +258 -0
- data/ext/hamlit/houdini/html_unescape.h +754 -0
- data/ext/hamlit/houdini/tools/build_table.py +13 -0
- data/ext/hamlit/houdini/tools/build_tables.c +51 -0
- data/ext/hamlit/houdini/tools/wikipedia_table.txt +2025 -0
- data/hamlit.gemspec +30 -31
- data/lib/hamlit.rb +3 -1
- data/lib/hamlit/attribute_builder.rb +12 -0
- data/lib/hamlit/cli.rb +44 -43
- data/lib/hamlit/compiler.rb +92 -16
- data/lib/hamlit/compiler/attribute_compiler.rb +148 -0
- data/lib/hamlit/compiler/children_compiler.rb +111 -0
- data/lib/hamlit/compiler/comment_compiler.rb +36 -0
- data/lib/hamlit/compiler/doctype_compiler.rb +45 -0
- data/lib/hamlit/compiler/script_compiler.rb +97 -0
- data/lib/hamlit/compiler/silent_script_compiler.rb +24 -0
- data/lib/hamlit/compiler/tag_compiler.rb +69 -0
- data/lib/hamlit/engine.rb +12 -7
- data/lib/hamlit/error.rb +14 -0
- data/lib/hamlit/escapable.rb +12 -0
- data/lib/hamlit/filters.rb +65 -0
- data/lib/hamlit/filters/base.rb +4 -62
- data/lib/hamlit/filters/coffee.rb +9 -7
- data/lib/hamlit/filters/css.rb +25 -8
- data/lib/hamlit/filters/erb.rb +4 -6
- data/lib/hamlit/filters/escaped.rb +11 -9
- data/lib/hamlit/filters/javascript.rb +25 -8
- data/lib/hamlit/filters/less.rb +9 -7
- data/lib/hamlit/filters/markdown.rb +5 -6
- data/lib/hamlit/filters/plain.rb +11 -15
- data/lib/hamlit/filters/preserve.rb +15 -5
- data/lib/hamlit/filters/ruby.rb +3 -5
- data/lib/hamlit/filters/sass.rb +9 -7
- data/lib/hamlit/filters/scss.rb +9 -7
- data/lib/hamlit/filters/text_base.rb +24 -0
- data/lib/hamlit/filters/tilt_base.rb +47 -0
- data/lib/hamlit/hash_parser.rb +107 -0
- data/lib/hamlit/html.rb +9 -6
- data/lib/hamlit/identity.rb +12 -0
- data/lib/hamlit/object_ref.rb +29 -0
- data/lib/hamlit/parser.rb +25 -142
- data/lib/hamlit/parser/MIT-LICENSE +20 -0
- data/lib/hamlit/parser/README.md +28 -0
- data/lib/hamlit/parser/haml_buffer.rb +348 -0
- data/lib/hamlit/parser/haml_compiler.rb +553 -0
- data/lib/hamlit/parser/haml_error.rb +61 -0
- data/lib/hamlit/parser/haml_helpers.rb +727 -0
- data/lib/hamlit/parser/haml_options.rb +286 -0
- data/lib/hamlit/parser/haml_parser.rb +801 -0
- data/lib/hamlit/parser/haml_util.rb +283 -0
- data/lib/hamlit/parser/haml_xss_mods.rb +109 -0
- data/lib/hamlit/{helpers.rb → rails_helpers.rb} +2 -7
- data/lib/hamlit/rails_template.rb +30 -0
- data/lib/hamlit/railtie.rb +1 -12
- data/lib/hamlit/ruby_expression.rb +31 -0
- data/lib/hamlit/static_analyzer.rb +49 -0
- data/lib/hamlit/string_interpolation.rb +69 -0
- data/lib/hamlit/template.rb +8 -0
- data/lib/hamlit/utils.rb +9 -0
- data/lib/hamlit/version.rb +1 -1
- metadata +116 -324
- data/.rspec +0 -2
- data/benchmarks/benchmark.rb +0 -110
- data/benchmarks/view.slim +0 -17
- data/doc/README.md +0 -19
- data/doc/engine/indent.md +0 -48
- data/doc/engine/new_attribute.md +0 -77
- data/doc/engine/old_attributes.md +0 -198
- data/doc/engine/silent_script.md +0 -97
- data/doc/engine/tag.md +0 -48
- data/doc/engine/text.md +0 -64
- data/doc/faml/README.md +0 -16
- data/doc/faml/engine/indent.md +0 -48
- data/doc/faml/engine/old_attributes.md +0 -111
- data/doc/faml/engine/silent_script.md +0 -97
- data/doc/faml/engine/text.md +0 -59
- data/doc/faml/filters/erb.md +0 -24
- data/doc/faml/filters/javascript.md +0 -27
- data/doc/faml/filters/less.md +0 -57
- data/doc/faml/filters/plain.md +0 -25
- data/doc/filters/erb.md +0 -31
- data/doc/filters/javascript.md +0 -83
- data/doc/filters/less.md +0 -57
- data/doc/filters/markdown.md +0 -31
- data/doc/filters/plain.md +0 -25
- data/doc/haml/README.md +0 -15
- data/doc/haml/engine/new_attribute.md +0 -77
- data/doc/haml/engine/old_attributes.md +0 -142
- data/doc/haml/engine/tag.md +0 -48
- data/doc/haml/engine/text.md +0 -29
- data/doc/haml/filters/erb.md +0 -26
- data/doc/haml/filters/javascript.md +0 -76
- data/doc/haml/filters/markdown.md +0 -31
- data/lib/hamlit/attribute.rb +0 -78
- data/lib/hamlit/compilers/attributes.rb +0 -108
- data/lib/hamlit/compilers/comment.rb +0 -13
- data/lib/hamlit/compilers/doctype.rb +0 -39
- data/lib/hamlit/compilers/filter.rb +0 -53
- data/lib/hamlit/compilers/new_attribute.rb +0 -115
- data/lib/hamlit/compilers/old_attribute.rb +0 -241
- data/lib/hamlit/compilers/runtime_attribute.rb +0 -58
- data/lib/hamlit/compilers/script.rb +0 -31
- data/lib/hamlit/compilers/strip.rb +0 -19
- data/lib/hamlit/compilers/text.rb +0 -111
- data/lib/hamlit/concerns/attribute_builder.rb +0 -22
- data/lib/hamlit/concerns/balanceable.rb +0 -68
- data/lib/hamlit/concerns/deprecation.rb +0 -20
- data/lib/hamlit/concerns/error.rb +0 -31
- data/lib/hamlit/concerns/escapable.rb +0 -17
- data/lib/hamlit/concerns/included.rb +0 -28
- data/lib/hamlit/concerns/indentable.rb +0 -117
- data/lib/hamlit/concerns/lexable.rb +0 -32
- data/lib/hamlit/concerns/line_reader.rb +0 -62
- data/lib/hamlit/concerns/registerable.rb +0 -24
- data/lib/hamlit/concerns/string_interpolation.rb +0 -48
- data/lib/hamlit/concerns/whitespace.rb +0 -91
- data/lib/hamlit/filters/tilt.rb +0 -41
- data/lib/hamlit/parsers/attribute.rb +0 -71
- data/lib/hamlit/parsers/comment.rb +0 -30
- data/lib/hamlit/parsers/doctype.rb +0 -18
- data/lib/hamlit/parsers/filter.rb +0 -18
- data/lib/hamlit/parsers/multiline.rb +0 -58
- data/lib/hamlit/parsers/script.rb +0 -126
- data/lib/hamlit/parsers/tag.rb +0 -83
- data/lib/hamlit/parsers/text.rb +0 -28
- data/lib/hamlit/temple.rb +0 -9
- data/release +0 -6
- data/spec/Rakefile +0 -72
- data/spec/hamlit/engine/comment_spec.rb +0 -56
- data/spec/hamlit/engine/doctype_spec.rb +0 -19
- data/spec/hamlit/engine/error_spec.rb +0 -135
- data/spec/hamlit/engine/indent_spec.rb +0 -42
- data/spec/hamlit/engine/multiline_spec.rb +0 -44
- data/spec/hamlit/engine/new_attribute_spec.rb +0 -110
- data/spec/hamlit/engine/old_attributes_spec.rb +0 -404
- data/spec/hamlit/engine/script_spec.rb +0 -116
- data/spec/hamlit/engine/silent_script_spec.rb +0 -213
- data/spec/hamlit/engine/tag_spec.rb +0 -295
- data/spec/hamlit/engine/text_spec.rb +0 -239
- data/spec/hamlit/engine_spec.rb +0 -58
- data/spec/hamlit/filters/coffee_spec.rb +0 -60
- data/spec/hamlit/filters/css_spec.rb +0 -33
- data/spec/hamlit/filters/erb_spec.rb +0 -16
- data/spec/hamlit/filters/javascript_spec.rb +0 -82
- data/spec/hamlit/filters/less_spec.rb +0 -37
- data/spec/hamlit/filters/markdown_spec.rb +0 -30
- data/spec/hamlit/filters/plain_spec.rb +0 -15
- data/spec/hamlit/filters/ruby_spec.rb +0 -24
- data/spec/hamlit/filters/sass_spec.rb +0 -33
- data/spec/hamlit/filters/scss_spec.rb +0 -37
- data/spec/hamlit/haml_spec.rb +0 -910
- data/spec/rails/.gitignore +0 -18
- data/spec/rails/.rspec +0 -2
- data/spec/rails/Gemfile +0 -19
- data/spec/rails/README.rdoc +0 -28
- data/spec/rails/Rakefile +0 -6
- data/spec/rails/app/assets/images/.keep +0 -0
- data/spec/rails/app/assets/javascripts/application.js +0 -15
- data/spec/rails/app/assets/stylesheets/application.css +0 -15
- data/spec/rails/app/controllers/application_controller.rb +0 -8
- data/spec/rails/app/controllers/concerns/.keep +0 -0
- data/spec/rails/app/controllers/users_controller.rb +0 -23
- data/spec/rails/app/helpers/application_helper.rb +0 -2
- data/spec/rails/app/mailers/.keep +0 -0
- data/spec/rails/app/models/.keep +0 -0
- data/spec/rails/app/models/concerns/.keep +0 -0
- data/spec/rails/app/views/application/index.html.haml +0 -18
- data/spec/rails/app/views/layouts/application.html.haml +0 -12
- data/spec/rails/app/views/users/capture.html.haml +0 -5
- data/spec/rails/app/views/users/capture_haml.html.haml +0 -5
- data/spec/rails/app/views/users/form.html.haml +0 -2
- data/spec/rails/app/views/users/helpers.html.haml +0 -10
- data/spec/rails/app/views/users/index.html.haml +0 -9
- data/spec/rails/app/views/users/inline.html.haml +0 -6
- data/spec/rails/app/views/users/old_attributes.html.haml +0 -5
- data/spec/rails/app/views/users/safe_buffer.html.haml +0 -4
- data/spec/rails/app/views/users/whitespace.html.haml +0 -4
- data/spec/rails/bin/bundle +0 -3
- data/spec/rails/bin/rails +0 -8
- data/spec/rails/bin/rake +0 -8
- data/spec/rails/bin/setup +0 -29
- data/spec/rails/bin/spring +0 -15
- data/spec/rails/config.ru +0 -4
- data/spec/rails/config/application.rb +0 -34
- data/spec/rails/config/boot.rb +0 -3
- data/spec/rails/config/database.yml +0 -25
- data/spec/rails/config/environment.rb +0 -5
- data/spec/rails/config/environments/development.rb +0 -41
- data/spec/rails/config/environments/production.rb +0 -79
- data/spec/rails/config/environments/test.rb +0 -42
- data/spec/rails/config/initializers/assets.rb +0 -11
- data/spec/rails/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/rails/config/initializers/cookies_serializer.rb +0 -3
- data/spec/rails/config/initializers/filter_parameter_logging.rb +0 -4
- data/spec/rails/config/initializers/inflections.rb +0 -16
- data/spec/rails/config/initializers/mime_types.rb +0 -4
- data/spec/rails/config/initializers/session_store.rb +0 -3
- data/spec/rails/config/initializers/wrap_parameters.rb +0 -14
- data/spec/rails/config/locales/en.yml +0 -24
- data/spec/rails/config/routes.rb +0 -16
- data/spec/rails/config/secrets.yml +0 -22
- data/spec/rails/db/schema.rb +0 -16
- data/spec/rails/db/seeds.rb +0 -7
- data/spec/rails/lib/assets/.keep +0 -0
- data/spec/rails/lib/tasks/.keep +0 -0
- data/spec/rails/log/.keep +0 -0
- data/spec/rails/public/404.html +0 -67
- data/spec/rails/public/422.html +0 -67
- data/spec/rails/public/500.html +0 -66
- data/spec/rails/public/favicon.ico +0 -0
- data/spec/rails/public/robots.txt +0 -5
- data/spec/rails/spec/hamlit_spec.rb +0 -123
- data/spec/rails/spec/rails_helper.rb +0 -56
- data/spec/rails/spec/spec_helper.rb +0 -91
- data/spec/rails/vendor/assets/javascripts/.keep +0 -0
- data/spec/rails/vendor/assets/stylesheets/.keep +0 -0
- data/spec/spec_helper.rb +0 -36
- data/spec/spec_helper/document_generator.rb +0 -93
- data/spec/spec_helper/render_helper.rb +0 -120
- data/spec/spec_helper/test_case.rb +0 -55
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
require 'hamlit/compilers/new_attribute'
|
|
2
|
-
require 'hamlit/compilers/old_attribute'
|
|
3
|
-
require 'hamlit/compilers/runtime_attribute'
|
|
4
|
-
require 'hamlit/concerns/escapable'
|
|
5
|
-
require 'hamlit/concerns/included'
|
|
6
|
-
|
|
7
|
-
module Hamlit
|
|
8
|
-
module Compilers
|
|
9
|
-
module Attributes
|
|
10
|
-
extend Concerns::Included
|
|
11
|
-
include Compilers::NewAttribute
|
|
12
|
-
include Compilers::OldAttribute
|
|
13
|
-
include Compilers::RuntimeAttribute
|
|
14
|
-
|
|
15
|
-
included do
|
|
16
|
-
include Concerns::Escapable
|
|
17
|
-
|
|
18
|
-
define_options :format, :attr_quote
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def on_haml_attrs(*attrs)
|
|
22
|
-
attrs = compile_attributes(attrs)
|
|
23
|
-
attrs = join_ids(attrs)
|
|
24
|
-
attrs = combine_classes(attrs)
|
|
25
|
-
attrs = sort_attributes(attrs)
|
|
26
|
-
|
|
27
|
-
if has_runtime_attribute?(attrs) && has_attr?(attrs, 'class', 'id')
|
|
28
|
-
attrs = merge_runtime_attributes(attrs)
|
|
29
|
-
return [:html, :attrs, *escape_attribute_values(attrs)]
|
|
30
|
-
end
|
|
31
|
-
attrs = attrs.map { |a| compile(a) }
|
|
32
|
-
|
|
33
|
-
[:html, :attrs, *escape_attribute_values(attrs)]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
private
|
|
37
|
-
|
|
38
|
-
def escape_attribute_values(attrs)
|
|
39
|
-
attrs.map do |attr|
|
|
40
|
-
_, _, name, value = attr
|
|
41
|
-
type, arg = value
|
|
42
|
-
next attr unless name && type && type && arg
|
|
43
|
-
|
|
44
|
-
[:html, :attr, name, escape_html(value, true)]
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def compile_attributes(exps)
|
|
49
|
-
attrs = []
|
|
50
|
-
exps.each do |exp|
|
|
51
|
-
case exp
|
|
52
|
-
when /\A\(.+\)\Z/m
|
|
53
|
-
attrs += compile_new_attribute(exp)
|
|
54
|
-
when /\A{.+}\Z/
|
|
55
|
-
attrs += compile_old_attribute(exp)
|
|
56
|
-
else
|
|
57
|
-
attrs << compile(exp)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
attrs
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def combine_classes(attrs)
|
|
64
|
-
class_attrs = filter_attrs(attrs, 'class')
|
|
65
|
-
return attrs if class_attrs.length <= 1
|
|
66
|
-
|
|
67
|
-
values = class_attrs.map(&:last).sort_by(&:last)
|
|
68
|
-
[[:html, :attr, 'class', [:multi, *insert_static(values, ' ')]]] + (attrs - class_attrs)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def join_ids(attrs)
|
|
72
|
-
id_attrs = filter_attrs(attrs, 'id')
|
|
73
|
-
return attrs if id_attrs.length <= 1
|
|
74
|
-
|
|
75
|
-
values = attrs.map(&:last)
|
|
76
|
-
[[:html, :attr, 'id', [:multi, *insert_static(values, '_')]]] + (attrs - id_attrs)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def has_attr?(attrs, *targets)
|
|
80
|
-
filter_attrs(attrs, *targets).any?
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def filter_attrs(attrs, *targets)
|
|
84
|
-
attrs.select do |html, attr, name, content|
|
|
85
|
-
targets.include?(name)
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def insert_static(array, str)
|
|
90
|
-
result = []
|
|
91
|
-
array.each_with_index do |value, index|
|
|
92
|
-
result << [:static, str] if index > 0
|
|
93
|
-
result << value
|
|
94
|
-
end
|
|
95
|
-
result
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Sort attributes by attribute name.
|
|
99
|
-
# Move runtime attributes to last.
|
|
100
|
-
def sort_attributes(attrs)
|
|
101
|
-
attrs.sort_by do |(sexp, _, attr_name, _)|
|
|
102
|
-
next '' if sexp == :runtime
|
|
103
|
-
attr_name
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Hamlit
|
|
2
|
-
module Compilers
|
|
3
|
-
module Comment
|
|
4
|
-
def on_haml_comment(condition, exps)
|
|
5
|
-
content = [:multi]
|
|
6
|
-
content << [:static, "#{condition}>\n"]
|
|
7
|
-
content += exps.map { |exp| compile(exp) }
|
|
8
|
-
content << [:static, "<![endif]"]
|
|
9
|
-
[:html, :comment, content]
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
module Hamlit
|
|
2
|
-
module Compilers
|
|
3
|
-
module Doctype
|
|
4
|
-
def on_haml_doctype(format, type)
|
|
5
|
-
if type == 'XML'
|
|
6
|
-
return xml_doctype_tag(format)
|
|
7
|
-
elsif type
|
|
8
|
-
return doctype_tag(type)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
case format
|
|
12
|
-
when :html4
|
|
13
|
-
doctype_tag(:transitional)
|
|
14
|
-
when :html5
|
|
15
|
-
doctype_tag(:html)
|
|
16
|
-
when :xhtml
|
|
17
|
-
doctype_tag(:transitional)
|
|
18
|
-
else
|
|
19
|
-
doctype_tag(format)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
def xml_doctype_tag(format)
|
|
26
|
-
case format
|
|
27
|
-
when :html4, :html5
|
|
28
|
-
[:multi]
|
|
29
|
-
else
|
|
30
|
-
[:multi, [:static, "<?xml version='1.0' encoding='utf-8' ?>"], [:static, "\n"]]
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def doctype_tag(type)
|
|
35
|
-
[:multi, [:html, :doctype, type.to_s], [:static, "\n"]]
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
require 'hamlit/concerns/included'
|
|
2
|
-
require 'hamlit/concerns/registerable'
|
|
3
|
-
require 'hamlit/filters/coffee'
|
|
4
|
-
require 'hamlit/filters/css'
|
|
5
|
-
require 'hamlit/filters/erb'
|
|
6
|
-
require 'hamlit/filters/escaped'
|
|
7
|
-
require 'hamlit/filters/javascript'
|
|
8
|
-
require 'hamlit/filters/less'
|
|
9
|
-
require 'hamlit/filters/plain'
|
|
10
|
-
require 'hamlit/filters/preserve'
|
|
11
|
-
require 'hamlit/filters/ruby'
|
|
12
|
-
require 'hamlit/filters/sass'
|
|
13
|
-
require 'hamlit/filters/markdown'
|
|
14
|
-
require 'hamlit/filters/scss'
|
|
15
|
-
|
|
16
|
-
module Hamlit
|
|
17
|
-
module Compilers
|
|
18
|
-
module Filter
|
|
19
|
-
extend Concerns::Included
|
|
20
|
-
|
|
21
|
-
included do
|
|
22
|
-
extend Concerns::Registerable
|
|
23
|
-
|
|
24
|
-
define_options :format
|
|
25
|
-
|
|
26
|
-
register :coffee, Filters::Coffee
|
|
27
|
-
register :coffeescript, Filters::Coffee
|
|
28
|
-
register :css, Filters::Css
|
|
29
|
-
register :erb, Filters::Erb
|
|
30
|
-
register :escaped, Filters::Escaped
|
|
31
|
-
register :javascript, Filters::Javascript
|
|
32
|
-
register :less, Filters::Less
|
|
33
|
-
register :markdown, Filters::Markdown
|
|
34
|
-
register :plain, Filters::Plain
|
|
35
|
-
register :preserve, Filters::Preserve
|
|
36
|
-
register :ruby, Filters::Ruby
|
|
37
|
-
register :sass, Filters::Sass
|
|
38
|
-
register :scss, Filters::Scss
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def on_haml_filter(name, lines)
|
|
42
|
-
ast = compile_filter(name, lines)
|
|
43
|
-
compile(ast)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
private
|
|
47
|
-
|
|
48
|
-
def compile_filter(name, exp)
|
|
49
|
-
self.class.find(name).new(options).compile(exp)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
require 'hamlit/concerns/lexable'
|
|
2
|
-
|
|
3
|
-
# This module compiles new-style attributes, which is
|
|
4
|
-
# surrounded by parentheses.
|
|
5
|
-
module Hamlit
|
|
6
|
-
module Compilers
|
|
7
|
-
module NewAttribute
|
|
8
|
-
include Concerns::Lexable
|
|
9
|
-
|
|
10
|
-
def compile_new_attribute(str)
|
|
11
|
-
str = str.gsub(/\A\(|\)\Z/, '')
|
|
12
|
-
attrs = parse_new_attributes(str)
|
|
13
|
-
attrs.map do |key, value|
|
|
14
|
-
next true_attribute(key) if value == 'true'
|
|
15
|
-
[:html, :attr, key, [:dynamic, value]]
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
def parse_new_attributes(str)
|
|
22
|
-
attributes = {}
|
|
23
|
-
|
|
24
|
-
while str.length > 0
|
|
25
|
-
tokens = Ripper.lex(str)
|
|
26
|
-
key = read_key!(tokens)
|
|
27
|
-
val = read_value!(tokens)
|
|
28
|
-
if key && val
|
|
29
|
-
attributes[key] = val
|
|
30
|
-
elsif key
|
|
31
|
-
attributes[key] = 'true'
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
token = tokens.first
|
|
35
|
-
break unless token
|
|
36
|
-
|
|
37
|
-
pos = convert_position(str, *token.first)
|
|
38
|
-
str = str[pos..-1]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
attributes
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def read_key!(tokens)
|
|
45
|
-
skip_tokens!(tokens, :on_sp, :on_nl, :on_ignored_nl)
|
|
46
|
-
(row, col), type, key = tokens.shift
|
|
47
|
-
|
|
48
|
-
while tokens.any? && tokens.first[2] == '-'
|
|
49
|
-
tokens.shift
|
|
50
|
-
|
|
51
|
-
(row, col), type, part = tokens.shift
|
|
52
|
-
|
|
53
|
-
key = "#{key}-#{part}"
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
key
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def read_value!(tokens)
|
|
60
|
-
skip_tokens!(tokens, :on_sp)
|
|
61
|
-
_, _, str = tokens.shift
|
|
62
|
-
return nil if str != '='
|
|
63
|
-
|
|
64
|
-
skip_tokens!(tokens, :on_sp)
|
|
65
|
-
return if tokens.empty?
|
|
66
|
-
|
|
67
|
-
case tokens.first[TYPE_POSITION]
|
|
68
|
-
when :on_tstring_beg
|
|
69
|
-
val = fetch_balanced_quotes(tokens)
|
|
70
|
-
else
|
|
71
|
-
val = fetch_until(tokens, :on_sp)
|
|
72
|
-
end
|
|
73
|
-
val.length.times { tokens.shift }
|
|
74
|
-
val.map(&:last).join
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def fetch_balanced_quotes(all_tokens)
|
|
78
|
-
tokens = []
|
|
79
|
-
open_count = 0
|
|
80
|
-
|
|
81
|
-
all_tokens.each do |token|
|
|
82
|
-
case type_of(token)
|
|
83
|
-
when :on_tstring_beg then open_count += 1
|
|
84
|
-
when :on_tstring_end then open_count -= 1
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
tokens << token
|
|
88
|
-
break if open_count == 0
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
tokens
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def fetch_until(all_tokens, type)
|
|
95
|
-
tokens = []
|
|
96
|
-
|
|
97
|
-
all_tokens.each do |token|
|
|
98
|
-
break if token[TYPE_POSITION] == type
|
|
99
|
-
tokens << token
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
tokens
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def true_attribute(key)
|
|
106
|
-
case options[:format]
|
|
107
|
-
when :xhtml
|
|
108
|
-
[:html, :attr, key, [:static, key]]
|
|
109
|
-
else
|
|
110
|
-
[:html, :attr, key, [:multi]]
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
require 'hamlit/concerns/attribute_builder'
|
|
2
|
-
require 'hamlit/concerns/balanceable'
|
|
3
|
-
require 'hamlit/concerns/lexable'
|
|
4
|
-
|
|
5
|
-
# This module compiles only old-style attribute, which is
|
|
6
|
-
# surrounded by brackets.
|
|
7
|
-
module Hamlit
|
|
8
|
-
# This error is raised when hamlit copmiler decide to
|
|
9
|
-
# copmile the attributes on runtime.
|
|
10
|
-
class RuntimeBuild < StandardError; end
|
|
11
|
-
|
|
12
|
-
module Compilers
|
|
13
|
-
module OldAttribute
|
|
14
|
-
include Concerns::AttributeBuilder
|
|
15
|
-
include Concerns::Balanceable
|
|
16
|
-
include Concerns::Lexable
|
|
17
|
-
|
|
18
|
-
# Only data can be nested for performance.
|
|
19
|
-
NESTABLE_ATTRIBUTES = %w[data].freeze
|
|
20
|
-
IGNORED_EXPRESSIONS = %w[false nil].freeze
|
|
21
|
-
|
|
22
|
-
# Class and id are joined if the value is an array.
|
|
23
|
-
JOIN_ATTRIBUTES = %w[class id].freeze
|
|
24
|
-
JOINABLE_TOKENS = %i[on_ident on_qwords_beg on_lbracket].freeze
|
|
25
|
-
|
|
26
|
-
# Only boolean attributes can be deleted for performance.
|
|
27
|
-
BOOLEAN_ATTRIBUTES = %w[disabled readonly multiple checked autobuffer
|
|
28
|
-
autoplay controls loop selected hidden scoped async
|
|
29
|
-
defer reversed ismap seamless muted required
|
|
30
|
-
autofocus novalidate formnovalidate open pubdate
|
|
31
|
-
itemscope allowfullscreen default inert sortable
|
|
32
|
-
truespeed typemustmatch data].freeze
|
|
33
|
-
|
|
34
|
-
DEFAULT_COUNTS = {
|
|
35
|
-
brace: -1,
|
|
36
|
-
emb: 0,
|
|
37
|
-
paren: 0,
|
|
38
|
-
bracket: 0,
|
|
39
|
-
}.freeze
|
|
40
|
-
|
|
41
|
-
OPEN_TOKEN_TYPES = {
|
|
42
|
-
on_lbrace: :brace,
|
|
43
|
-
on_embexpr_beg: :emb,
|
|
44
|
-
on_lparen: :paren,
|
|
45
|
-
on_lbracket: :bracket,
|
|
46
|
-
}.freeze
|
|
47
|
-
|
|
48
|
-
CLOSE_TOKEN_TYPES = {
|
|
49
|
-
on_rbrace: :brace,
|
|
50
|
-
on_embexpr_end: :emb,
|
|
51
|
-
on_rparen: :paren,
|
|
52
|
-
on_rbracket: :bracket,
|
|
53
|
-
}.freeze
|
|
54
|
-
|
|
55
|
-
def compile_old_attribute(str)
|
|
56
|
-
raise RuntimeBuild unless valid_hash?(str)
|
|
57
|
-
|
|
58
|
-
attrs = parse_old_attributes(str)
|
|
59
|
-
assert_no_boolean_attributes!(attrs)
|
|
60
|
-
|
|
61
|
-
format_attributes(attrs).map do |key, value|
|
|
62
|
-
next true_attribute(key) if value == 'true'
|
|
63
|
-
assert_static_value!(value) if NESTABLE_ATTRIBUTES.include?(key)
|
|
64
|
-
detect_joinable_value!(value) if JOIN_ATTRIBUTES.include?(key)
|
|
65
|
-
|
|
66
|
-
[:html, :attr, key, [:dynamic, value]]
|
|
67
|
-
end
|
|
68
|
-
rescue RuntimeBuild
|
|
69
|
-
# Give up static compilation when given string is invalid as ruby hash
|
|
70
|
-
[[:runtime, str]]
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
private
|
|
74
|
-
|
|
75
|
-
def valid_hash?(str)
|
|
76
|
-
sexp = Ripper.sexp(str)
|
|
77
|
-
return false unless sexp
|
|
78
|
-
|
|
79
|
-
sexp.flatten[1] == :hash
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def format_attributes(attributes)
|
|
83
|
-
attributes = flatten_attributes(attributes)
|
|
84
|
-
ignore_falsy_values(attributes)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def ignore_falsy_values(attributes)
|
|
88
|
-
attributes = attributes.dup
|
|
89
|
-
attributes.each do |key, value|
|
|
90
|
-
attributes.delete(key) if IGNORED_EXPRESSIONS.include?(value)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# Give up static compilation when variables are detected.
|
|
95
|
-
def assert_static_value!(value)
|
|
96
|
-
tokens = Ripper.lex(value)
|
|
97
|
-
tokens.each do |token|
|
|
98
|
-
raise RuntimeBuild if type_of(token) == :on_ident
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Give up static compilation when the value is a variable or an array.
|
|
103
|
-
def detect_joinable_value!(value)
|
|
104
|
-
tokens = Ripper.lex(value)
|
|
105
|
-
tokens.each do |token|
|
|
106
|
-
raise RuntimeBuild if JOINABLE_TOKENS.include?(type_of(token))
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Give up static compilation when attributes have deletable
|
|
111
|
-
# attributes, such as 'checked'.
|
|
112
|
-
def assert_no_boolean_attributes!(attrs)
|
|
113
|
-
if BOOLEAN_ATTRIBUTES.any? { |key| attrs.keys.include?(key) }
|
|
114
|
-
raise RuntimeBuild
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# Parse brace-balanced string and return the result as hash
|
|
119
|
-
def parse_old_attributes(str)
|
|
120
|
-
attributes = {}
|
|
121
|
-
|
|
122
|
-
split_hash(str).each do |attr|
|
|
123
|
-
tokens = Ripper.lex("{#{attr}").drop(1)
|
|
124
|
-
key = read_hash_key!(tokens)
|
|
125
|
-
val = read_hash_value!(tokens)
|
|
126
|
-
|
|
127
|
-
attributes[key] = val if key
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
attributes
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def read_hash_value!(tokens)
|
|
134
|
-
skip_tokens!(tokens, :on_sp)
|
|
135
|
-
val = tokens.map(&:last).join.strip
|
|
136
|
-
|
|
137
|
-
if type_of(tokens.first) == :on_lbrace
|
|
138
|
-
val = parse_old_attributes(val)
|
|
139
|
-
end
|
|
140
|
-
val
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def read_hash_key!(tokens)
|
|
144
|
-
skip_tokens!(tokens, :on_sp)
|
|
145
|
-
|
|
146
|
-
(row, col), type, str = tokens.shift
|
|
147
|
-
case type
|
|
148
|
-
when :on_label
|
|
149
|
-
str.gsub!(/:\Z/, '')
|
|
150
|
-
when :on_symbeg
|
|
151
|
-
if %w[:" :'].include?(str)
|
|
152
|
-
str = read_string!(tokens)
|
|
153
|
-
else
|
|
154
|
-
(row, col), type, str = tokens.shift
|
|
155
|
-
end
|
|
156
|
-
assert_rocket!(tokens)
|
|
157
|
-
when :on_tstring_beg
|
|
158
|
-
str = read_string!(tokens, assert_rocket: true)
|
|
159
|
-
end
|
|
160
|
-
str
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
def read_string!(tokens, assert_rocket: false)
|
|
164
|
-
_, type, str = tokens.shift
|
|
165
|
-
return '' if type == :on_tstring_end
|
|
166
|
-
|
|
167
|
-
next_token = tokens.shift
|
|
168
|
-
return str if RUBY_VERSION >= "2.2.0" && type_of(next_token) == :on_label_end
|
|
169
|
-
|
|
170
|
-
raise SyntaxError if type_of(next_token) != :on_tstring_end
|
|
171
|
-
assert_rocket!(tokens) if assert_rocket
|
|
172
|
-
|
|
173
|
-
str
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def assert_rocket!(tokens, *types)
|
|
177
|
-
skip_tokens!(tokens, :on_sp)
|
|
178
|
-
_, type, str = tokens.shift
|
|
179
|
-
|
|
180
|
-
raise SyntaxError unless type == :on_op && str == '=>'
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
def split_hash(str)
|
|
184
|
-
columns = HashParser.assoc_columns(str)
|
|
185
|
-
columns = reject_nested_columns(str, columns)
|
|
186
|
-
|
|
187
|
-
splitted = []
|
|
188
|
-
start_pos = 1
|
|
189
|
-
columns.each do |end_pos|
|
|
190
|
-
splitted << str.byteslice(start_pos...end_pos)
|
|
191
|
-
start_pos = end_pos + 1
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
splitted
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def reject_nested_columns(str, columns)
|
|
198
|
-
result = []
|
|
199
|
-
counts = DEFAULT_COUNTS.dup
|
|
200
|
-
|
|
201
|
-
Ripper.lex(str).each do |(_, col), type, _|
|
|
202
|
-
if columns.include?(col) && counts.values.all?(&:zero?)
|
|
203
|
-
result << col
|
|
204
|
-
end
|
|
205
|
-
update_open_counts(counts, type)
|
|
206
|
-
end
|
|
207
|
-
result
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
def update_open_counts(counts, type)
|
|
211
|
-
case
|
|
212
|
-
when OPEN_TOKEN_TYPES[type]
|
|
213
|
-
counts[OPEN_TOKEN_TYPES[type]] += 1
|
|
214
|
-
when CLOSE_TOKEN_TYPES[type]
|
|
215
|
-
counts[CLOSE_TOKEN_TYPES[type]] -= 1
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
class HashParser < Ripper
|
|
220
|
-
attr_reader :columns
|
|
221
|
-
|
|
222
|
-
def self.assoc_columns(src)
|
|
223
|
-
parser = new(src)
|
|
224
|
-
parser.parse
|
|
225
|
-
parser.columns
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
def initialize(src)
|
|
229
|
-
super(src)
|
|
230
|
-
@columns = []
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
private
|
|
234
|
-
|
|
235
|
-
def on_assoc_new(*args)
|
|
236
|
-
@columns << column - 1
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
end
|