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.
Files changed (283) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -3
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +25 -37
  5. data/CHANGELOG.md +18 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE.txt +23 -2
  8. data/README.md +106 -48
  9. data/REFERENCE.md +222 -0
  10. data/Rakefile +77 -19
  11. data/benchmark/boolean_attribute.haml +6 -0
  12. data/benchmark/class_attribute.haml +5 -0
  13. data/benchmark/common_attribute.haml +3 -0
  14. data/benchmark/data_attribute.haml +4 -0
  15. data/benchmark/dynamic_attributes/boolean_attribute.haml +4 -0
  16. data/benchmark/dynamic_attributes/class_attribute.haml +4 -0
  17. data/benchmark/dynamic_attributes/common_attribute.haml +2 -0
  18. data/benchmark/dynamic_attributes/data_attribute.haml +2 -0
  19. data/benchmark/dynamic_attributes/id_attribute.haml +2 -0
  20. data/benchmark/etc/attribute_builder.haml +5 -0
  21. data/benchmark/etc/real_sample.haml +888 -0
  22. data/benchmark/etc/real_sample.rb +11 -0
  23. data/benchmark/etc/static_analyzer.haml +1 -0
  24. data/benchmark/etc/tags.haml +3 -0
  25. data/benchmark/ext/build_data.rb +15 -0
  26. data/benchmark/ext/build_id.rb +13 -0
  27. data/benchmark/id_attribute.haml +3 -0
  28. data/benchmark/plain.haml +4 -0
  29. data/benchmark/script.haml +4 -0
  30. data/benchmark/slim/LICENSE +21 -0
  31. data/{benchmarks → benchmark/slim}/context.rb +2 -4
  32. data/benchmark/slim/run-benchmarks.rb +94 -0
  33. data/{benchmarks → benchmark/slim}/view.erb +3 -3
  34. data/{benchmarks → benchmark/slim}/view.haml +0 -0
  35. data/{benchmarks/view.escaped.slim → benchmark/slim/view.slim} +1 -1
  36. data/benchmark/string_interpolation.haml +2 -0
  37. data/benchmark/utils/benchmark_ips_extension.rb +43 -0
  38. data/bin/bench +85 -0
  39. data/bin/clone +14 -0
  40. data/bin/console +11 -0
  41. data/bin/lineprof +48 -0
  42. data/bin/ruby +3 -0
  43. data/bin/setup +7 -0
  44. data/bin/stackprof +27 -0
  45. data/{test → bin/test} +6 -10
  46. data/{bin → exe}/hamlit +0 -0
  47. data/ext/hamlit/extconf.rb +14 -0
  48. data/ext/hamlit/hamlit.c +512 -0
  49. data/ext/hamlit/houdini/.gitignore +3 -0
  50. data/ext/hamlit/houdini/COPYING +7 -0
  51. data/ext/hamlit/houdini/Makefile +79 -0
  52. data/ext/hamlit/houdini/README.md +59 -0
  53. data/ext/hamlit/houdini/buffer.c +249 -0
  54. data/ext/hamlit/houdini/buffer.h +113 -0
  55. data/ext/hamlit/houdini/houdini.h +46 -0
  56. data/ext/hamlit/houdini/houdini_href_e.c +115 -0
  57. data/ext/hamlit/houdini/houdini_html_e.c +90 -0
  58. data/ext/hamlit/houdini/houdini_html_u.c +122 -0
  59. data/ext/hamlit/houdini/houdini_js_e.c +90 -0
  60. data/ext/hamlit/houdini/houdini_js_u.c +60 -0
  61. data/ext/hamlit/houdini/houdini_uri_e.c +107 -0
  62. data/ext/hamlit/houdini/houdini_uri_u.c +68 -0
  63. data/ext/hamlit/houdini/houdini_xml_e.c +136 -0
  64. data/ext/hamlit/houdini/html_unescape.gperf +258 -0
  65. data/ext/hamlit/houdini/html_unescape.h +754 -0
  66. data/ext/hamlit/houdini/tools/build_table.py +13 -0
  67. data/ext/hamlit/houdini/tools/build_tables.c +51 -0
  68. data/ext/hamlit/houdini/tools/wikipedia_table.txt +2025 -0
  69. data/hamlit.gemspec +30 -31
  70. data/lib/hamlit.rb +3 -1
  71. data/lib/hamlit/attribute_builder.rb +12 -0
  72. data/lib/hamlit/cli.rb +44 -43
  73. data/lib/hamlit/compiler.rb +92 -16
  74. data/lib/hamlit/compiler/attribute_compiler.rb +148 -0
  75. data/lib/hamlit/compiler/children_compiler.rb +111 -0
  76. data/lib/hamlit/compiler/comment_compiler.rb +36 -0
  77. data/lib/hamlit/compiler/doctype_compiler.rb +45 -0
  78. data/lib/hamlit/compiler/script_compiler.rb +97 -0
  79. data/lib/hamlit/compiler/silent_script_compiler.rb +24 -0
  80. data/lib/hamlit/compiler/tag_compiler.rb +69 -0
  81. data/lib/hamlit/engine.rb +12 -7
  82. data/lib/hamlit/error.rb +14 -0
  83. data/lib/hamlit/escapable.rb +12 -0
  84. data/lib/hamlit/filters.rb +65 -0
  85. data/lib/hamlit/filters/base.rb +4 -62
  86. data/lib/hamlit/filters/coffee.rb +9 -7
  87. data/lib/hamlit/filters/css.rb +25 -8
  88. data/lib/hamlit/filters/erb.rb +4 -6
  89. data/lib/hamlit/filters/escaped.rb +11 -9
  90. data/lib/hamlit/filters/javascript.rb +25 -8
  91. data/lib/hamlit/filters/less.rb +9 -7
  92. data/lib/hamlit/filters/markdown.rb +5 -6
  93. data/lib/hamlit/filters/plain.rb +11 -15
  94. data/lib/hamlit/filters/preserve.rb +15 -5
  95. data/lib/hamlit/filters/ruby.rb +3 -5
  96. data/lib/hamlit/filters/sass.rb +9 -7
  97. data/lib/hamlit/filters/scss.rb +9 -7
  98. data/lib/hamlit/filters/text_base.rb +24 -0
  99. data/lib/hamlit/filters/tilt_base.rb +47 -0
  100. data/lib/hamlit/hash_parser.rb +107 -0
  101. data/lib/hamlit/html.rb +9 -6
  102. data/lib/hamlit/identity.rb +12 -0
  103. data/lib/hamlit/object_ref.rb +29 -0
  104. data/lib/hamlit/parser.rb +25 -142
  105. data/lib/hamlit/parser/MIT-LICENSE +20 -0
  106. data/lib/hamlit/parser/README.md +28 -0
  107. data/lib/hamlit/parser/haml_buffer.rb +348 -0
  108. data/lib/hamlit/parser/haml_compiler.rb +553 -0
  109. data/lib/hamlit/parser/haml_error.rb +61 -0
  110. data/lib/hamlit/parser/haml_helpers.rb +727 -0
  111. data/lib/hamlit/parser/haml_options.rb +286 -0
  112. data/lib/hamlit/parser/haml_parser.rb +801 -0
  113. data/lib/hamlit/parser/haml_util.rb +283 -0
  114. data/lib/hamlit/parser/haml_xss_mods.rb +109 -0
  115. data/lib/hamlit/{helpers.rb → rails_helpers.rb} +2 -7
  116. data/lib/hamlit/rails_template.rb +30 -0
  117. data/lib/hamlit/railtie.rb +1 -12
  118. data/lib/hamlit/ruby_expression.rb +31 -0
  119. data/lib/hamlit/static_analyzer.rb +49 -0
  120. data/lib/hamlit/string_interpolation.rb +69 -0
  121. data/lib/hamlit/template.rb +8 -0
  122. data/lib/hamlit/utils.rb +9 -0
  123. data/lib/hamlit/version.rb +1 -1
  124. metadata +116 -324
  125. data/.rspec +0 -2
  126. data/benchmarks/benchmark.rb +0 -110
  127. data/benchmarks/view.slim +0 -17
  128. data/doc/README.md +0 -19
  129. data/doc/engine/indent.md +0 -48
  130. data/doc/engine/new_attribute.md +0 -77
  131. data/doc/engine/old_attributes.md +0 -198
  132. data/doc/engine/silent_script.md +0 -97
  133. data/doc/engine/tag.md +0 -48
  134. data/doc/engine/text.md +0 -64
  135. data/doc/faml/README.md +0 -16
  136. data/doc/faml/engine/indent.md +0 -48
  137. data/doc/faml/engine/old_attributes.md +0 -111
  138. data/doc/faml/engine/silent_script.md +0 -97
  139. data/doc/faml/engine/text.md +0 -59
  140. data/doc/faml/filters/erb.md +0 -24
  141. data/doc/faml/filters/javascript.md +0 -27
  142. data/doc/faml/filters/less.md +0 -57
  143. data/doc/faml/filters/plain.md +0 -25
  144. data/doc/filters/erb.md +0 -31
  145. data/doc/filters/javascript.md +0 -83
  146. data/doc/filters/less.md +0 -57
  147. data/doc/filters/markdown.md +0 -31
  148. data/doc/filters/plain.md +0 -25
  149. data/doc/haml/README.md +0 -15
  150. data/doc/haml/engine/new_attribute.md +0 -77
  151. data/doc/haml/engine/old_attributes.md +0 -142
  152. data/doc/haml/engine/tag.md +0 -48
  153. data/doc/haml/engine/text.md +0 -29
  154. data/doc/haml/filters/erb.md +0 -26
  155. data/doc/haml/filters/javascript.md +0 -76
  156. data/doc/haml/filters/markdown.md +0 -31
  157. data/lib/hamlit/attribute.rb +0 -78
  158. data/lib/hamlit/compilers/attributes.rb +0 -108
  159. data/lib/hamlit/compilers/comment.rb +0 -13
  160. data/lib/hamlit/compilers/doctype.rb +0 -39
  161. data/lib/hamlit/compilers/filter.rb +0 -53
  162. data/lib/hamlit/compilers/new_attribute.rb +0 -115
  163. data/lib/hamlit/compilers/old_attribute.rb +0 -241
  164. data/lib/hamlit/compilers/runtime_attribute.rb +0 -58
  165. data/lib/hamlit/compilers/script.rb +0 -31
  166. data/lib/hamlit/compilers/strip.rb +0 -19
  167. data/lib/hamlit/compilers/text.rb +0 -111
  168. data/lib/hamlit/concerns/attribute_builder.rb +0 -22
  169. data/lib/hamlit/concerns/balanceable.rb +0 -68
  170. data/lib/hamlit/concerns/deprecation.rb +0 -20
  171. data/lib/hamlit/concerns/error.rb +0 -31
  172. data/lib/hamlit/concerns/escapable.rb +0 -17
  173. data/lib/hamlit/concerns/included.rb +0 -28
  174. data/lib/hamlit/concerns/indentable.rb +0 -117
  175. data/lib/hamlit/concerns/lexable.rb +0 -32
  176. data/lib/hamlit/concerns/line_reader.rb +0 -62
  177. data/lib/hamlit/concerns/registerable.rb +0 -24
  178. data/lib/hamlit/concerns/string_interpolation.rb +0 -48
  179. data/lib/hamlit/concerns/whitespace.rb +0 -91
  180. data/lib/hamlit/filters/tilt.rb +0 -41
  181. data/lib/hamlit/parsers/attribute.rb +0 -71
  182. data/lib/hamlit/parsers/comment.rb +0 -30
  183. data/lib/hamlit/parsers/doctype.rb +0 -18
  184. data/lib/hamlit/parsers/filter.rb +0 -18
  185. data/lib/hamlit/parsers/multiline.rb +0 -58
  186. data/lib/hamlit/parsers/script.rb +0 -126
  187. data/lib/hamlit/parsers/tag.rb +0 -83
  188. data/lib/hamlit/parsers/text.rb +0 -28
  189. data/lib/hamlit/temple.rb +0 -9
  190. data/release +0 -6
  191. data/spec/Rakefile +0 -72
  192. data/spec/hamlit/engine/comment_spec.rb +0 -56
  193. data/spec/hamlit/engine/doctype_spec.rb +0 -19
  194. data/spec/hamlit/engine/error_spec.rb +0 -135
  195. data/spec/hamlit/engine/indent_spec.rb +0 -42
  196. data/spec/hamlit/engine/multiline_spec.rb +0 -44
  197. data/spec/hamlit/engine/new_attribute_spec.rb +0 -110
  198. data/spec/hamlit/engine/old_attributes_spec.rb +0 -404
  199. data/spec/hamlit/engine/script_spec.rb +0 -116
  200. data/spec/hamlit/engine/silent_script_spec.rb +0 -213
  201. data/spec/hamlit/engine/tag_spec.rb +0 -295
  202. data/spec/hamlit/engine/text_spec.rb +0 -239
  203. data/spec/hamlit/engine_spec.rb +0 -58
  204. data/spec/hamlit/filters/coffee_spec.rb +0 -60
  205. data/spec/hamlit/filters/css_spec.rb +0 -33
  206. data/spec/hamlit/filters/erb_spec.rb +0 -16
  207. data/spec/hamlit/filters/javascript_spec.rb +0 -82
  208. data/spec/hamlit/filters/less_spec.rb +0 -37
  209. data/spec/hamlit/filters/markdown_spec.rb +0 -30
  210. data/spec/hamlit/filters/plain_spec.rb +0 -15
  211. data/spec/hamlit/filters/ruby_spec.rb +0 -24
  212. data/spec/hamlit/filters/sass_spec.rb +0 -33
  213. data/spec/hamlit/filters/scss_spec.rb +0 -37
  214. data/spec/hamlit/haml_spec.rb +0 -910
  215. data/spec/rails/.gitignore +0 -18
  216. data/spec/rails/.rspec +0 -2
  217. data/spec/rails/Gemfile +0 -19
  218. data/spec/rails/README.rdoc +0 -28
  219. data/spec/rails/Rakefile +0 -6
  220. data/spec/rails/app/assets/images/.keep +0 -0
  221. data/spec/rails/app/assets/javascripts/application.js +0 -15
  222. data/spec/rails/app/assets/stylesheets/application.css +0 -15
  223. data/spec/rails/app/controllers/application_controller.rb +0 -8
  224. data/spec/rails/app/controllers/concerns/.keep +0 -0
  225. data/spec/rails/app/controllers/users_controller.rb +0 -23
  226. data/spec/rails/app/helpers/application_helper.rb +0 -2
  227. data/spec/rails/app/mailers/.keep +0 -0
  228. data/spec/rails/app/models/.keep +0 -0
  229. data/spec/rails/app/models/concerns/.keep +0 -0
  230. data/spec/rails/app/views/application/index.html.haml +0 -18
  231. data/spec/rails/app/views/layouts/application.html.haml +0 -12
  232. data/spec/rails/app/views/users/capture.html.haml +0 -5
  233. data/spec/rails/app/views/users/capture_haml.html.haml +0 -5
  234. data/spec/rails/app/views/users/form.html.haml +0 -2
  235. data/spec/rails/app/views/users/helpers.html.haml +0 -10
  236. data/spec/rails/app/views/users/index.html.haml +0 -9
  237. data/spec/rails/app/views/users/inline.html.haml +0 -6
  238. data/spec/rails/app/views/users/old_attributes.html.haml +0 -5
  239. data/spec/rails/app/views/users/safe_buffer.html.haml +0 -4
  240. data/spec/rails/app/views/users/whitespace.html.haml +0 -4
  241. data/spec/rails/bin/bundle +0 -3
  242. data/spec/rails/bin/rails +0 -8
  243. data/spec/rails/bin/rake +0 -8
  244. data/spec/rails/bin/setup +0 -29
  245. data/spec/rails/bin/spring +0 -15
  246. data/spec/rails/config.ru +0 -4
  247. data/spec/rails/config/application.rb +0 -34
  248. data/spec/rails/config/boot.rb +0 -3
  249. data/spec/rails/config/database.yml +0 -25
  250. data/spec/rails/config/environment.rb +0 -5
  251. data/spec/rails/config/environments/development.rb +0 -41
  252. data/spec/rails/config/environments/production.rb +0 -79
  253. data/spec/rails/config/environments/test.rb +0 -42
  254. data/spec/rails/config/initializers/assets.rb +0 -11
  255. data/spec/rails/config/initializers/backtrace_silencers.rb +0 -7
  256. data/spec/rails/config/initializers/cookies_serializer.rb +0 -3
  257. data/spec/rails/config/initializers/filter_parameter_logging.rb +0 -4
  258. data/spec/rails/config/initializers/inflections.rb +0 -16
  259. data/spec/rails/config/initializers/mime_types.rb +0 -4
  260. data/spec/rails/config/initializers/session_store.rb +0 -3
  261. data/spec/rails/config/initializers/wrap_parameters.rb +0 -14
  262. data/spec/rails/config/locales/en.yml +0 -24
  263. data/spec/rails/config/routes.rb +0 -16
  264. data/spec/rails/config/secrets.yml +0 -22
  265. data/spec/rails/db/schema.rb +0 -16
  266. data/spec/rails/db/seeds.rb +0 -7
  267. data/spec/rails/lib/assets/.keep +0 -0
  268. data/spec/rails/lib/tasks/.keep +0 -0
  269. data/spec/rails/log/.keep +0 -0
  270. data/spec/rails/public/404.html +0 -67
  271. data/spec/rails/public/422.html +0 -67
  272. data/spec/rails/public/500.html +0 -66
  273. data/spec/rails/public/favicon.ico +0 -0
  274. data/spec/rails/public/robots.txt +0 -5
  275. data/spec/rails/spec/hamlit_spec.rb +0 -123
  276. data/spec/rails/spec/rails_helper.rb +0 -56
  277. data/spec/rails/spec/spec_helper.rb +0 -91
  278. data/spec/rails/vendor/assets/javascripts/.keep +0 -0
  279. data/spec/rails/vendor/assets/stylesheets/.keep +0 -0
  280. data/spec/spec_helper.rb +0 -36
  281. data/spec/spec_helper/document_generator.rb +0 -93
  282. data/spec/spec_helper/render_helper.rb +0 -120
  283. data/spec/spec_helper/test_case.rb +0 -55
@@ -1,58 +0,0 @@
1
- require 'hamlit/concerns/line_reader'
2
-
3
- module Hamlit
4
- module Parsers
5
- module Multiline
6
- include Concerns::LineReader
7
-
8
- SPACED_BLOCK_REGEXP = /do +\| *[^\|]+ *\|\Z/
9
-
10
- def preprocess_multilines(template)
11
- reset_lines(template.split("\n"))
12
- result = []
13
-
14
- while @lines[@current_lineno + 1]
15
- @current_lineno += 1
16
-
17
- unless end_with_pipe?(current_line)
18
- result << current_line
19
- next
20
- end
21
-
22
- prefix = current_line[/\A */]
23
- lines = scan_multilines
24
-
25
- result << prefix + build_multiline(lines)
26
- (lines.length - 1).times { result << '' }
27
- end
28
- result.map { |line| "#{line}\n" }.join
29
- end
30
-
31
- private
32
-
33
- def end_with_pipe?(line)
34
- return false unless line
35
- return false if line =~ SPACED_BLOCK_REGEXP
36
-
37
- line.strip =~ / \|\Z/
38
- end
39
-
40
- def scan_multilines
41
- lines = []
42
- while end_with_pipe?(current_line)
43
- lines << current_line
44
- @current_lineno += 1
45
- end
46
- @current_lineno -= 1
47
- lines
48
- end
49
-
50
- def build_multiline(lines)
51
- lines = lines.map do |line|
52
- line.strip.gsub(/ *\|\Z/, '')
53
- end
54
- lines.map { |l| "#{l} "}.join
55
- end
56
- end
57
- end
58
- end
@@ -1,126 +0,0 @@
1
- require 'hamlit/concerns/escapable'
2
- require 'hamlit/concerns/error'
3
- require 'hamlit/concerns/included'
4
- require 'hamlit/concerns/indentable'
5
-
6
- module Hamlit
7
- module Parsers
8
- module Script
9
- extend Concerns::Included
10
- include Concerns::Error
11
- include Concerns::Indentable
12
-
13
- INTERNAL_STATEMENTS = %w[else elsif rescue ensure when].freeze
14
- DEFAULT_SCRIPT_OPTIONS = { force_escape: false, disable_escape: false }.freeze
15
- PREFIX_BY_STATEMENT = {
16
- 'when' => 'case',
17
- 'rescue' => 'begin',
18
- }.freeze
19
-
20
- included do
21
- include Concerns::Escapable
22
- end
23
-
24
- def parse_script(scanner, options = {})
25
- assert_scan!(scanner, /=|&=|!=|~/)
26
- options = DEFAULT_SCRIPT_OPTIONS.merge(options)
27
-
28
- code, with_comment = scan_code(scanner, comment_check: true)
29
- return syntax_error("There's no Ruby code for = to evaluate.") if code.empty? && !with_comment
30
- unless has_block?
31
- return [:dynamic, code] if options[:disable_escape]
32
- return escape_html([:dynamic, code], options[:force_escape])
33
- end
34
-
35
- ast = [:haml, :script, code, options]
36
- ast += with_indented { parse_lines }
37
- ast << [:code, 'end']
38
- ast
39
- end
40
-
41
- def parse_silent_script(scanner)
42
- assert_scan!(scanner, /-/)
43
- if scanner.scan(/#/)
44
- with_indented { skip_lines }
45
- return [:multi]
46
- end
47
-
48
- code = scan_code(scanner)
49
- ast = [:multi, [:code, code]]
50
- unless has_block?
51
- if internal_statement?(code) && !statement_continuing?
52
- ast << [:code, 'end']
53
- end
54
- return ast
55
- end
56
-
57
- ast += with_indented { parse_lines }
58
- unless statement_continuing?
59
- ast << [:code, 'end']
60
- end
61
- ast
62
- end
63
-
64
- private
65
-
66
- def scan_code(scanner, comment_check: false)
67
- code = ''
68
- loop do
69
- code += (scanner.scan(/.+/) || '').strip
70
- break unless code =~ /,\Z/
71
-
72
- @current_lineno += 1
73
- scanner = StringScanner.new(current_line)
74
- code += ' '
75
- end
76
- remove_comment(code, comment_check: comment_check)
77
- end
78
-
79
- def remove_comment(code, comment_check: false)
80
- result = ''
81
- with_comment = false
82
- prefix = find_prefix(code)
83
- code = "#{prefix}#{code}"
84
-
85
- Ripper.lex(code).each do |_, type, str|
86
- if type == :on_comment
87
- with_comment = true
88
- next
89
- end
90
- result += str
91
- end
92
- result = result.gsub(/\A#{prefix}/, '') if prefix
93
-
94
- return [result, with_comment] if comment_check
95
- result
96
- end
97
-
98
- # Code starting with `when` can't be properly understood by Ripper.lex.
99
- # This method returns `case;` to fix that.
100
- def find_prefix(code)
101
- PREFIX_BY_STATEMENT.each do |statement, prefix|
102
- return "#{prefix};" if code =~ /\A#{statement} /
103
- end
104
- nil
105
- end
106
-
107
- def statement_continuing?
108
- same_indent?(next_line) && internal_statement?(next_line, silent_script: true)
109
- end
110
-
111
- def internal_statement?(line, silent_script: false)
112
- return false unless line
113
-
114
- scanner = StringScanner.new(line)
115
- scanner.scan(/ +/)
116
- if silent_script
117
- return false unless scanner.scan(/-/)
118
- end
119
-
120
- scanner.scan(/ +/)
121
- statement = scanner.scan(/[^ ]+/)
122
- INTERNAL_STATEMENTS.include?(statement)
123
- end
124
- end
125
- end
126
- end
@@ -1,83 +0,0 @@
1
- require 'hamlit/concerns/error'
2
- require 'hamlit/concerns/indentable'
3
- require 'hamlit/concerns/whitespace'
4
- require 'hamlit/helpers'
5
-
6
- module Hamlit
7
- module Parsers
8
- module Tag
9
- include Concerns::Error
10
- include Concerns::Indentable
11
- include Concerns::Whitespace
12
-
13
- TAG_ID_CLASS_REGEXP = /[a-zA-Z0-9_-]+/
14
- TAG_REGEXP = /[a-zA-Z0-9\-_:]+/
15
- DEFAULT_TAG = 'div'
16
-
17
- def parse_tag(scanner)
18
- if scanner.scan(/%/)
19
- tag = scanner.scan(TAG_REGEXP)
20
- unless tag
21
- syntax_error!(%Q{Invalid tag: "#{scanner.string}".})
22
- end
23
- end
24
- tag ||= DEFAULT_TAG
25
-
26
- attrs = [:haml, :attrs]
27
- attrs += parse_tag_id_and_class(scanner)
28
- attrs += parse_attributes(scanner)
29
-
30
- ast = [:html, :tag, tag, attrs]
31
- inner_removal = parse_whitespace_removal(scanner)
32
-
33
- if !has_block? || scanner.match?(/=|&=|!=/)
34
- return syntax_error("Self-closing tags can't have content.") if scanner.scan(/\/ *[^ ]/)
35
- return ast if scanner.scan(/\//)
36
- return ast << parse_line(scanner, inline: true)
37
- elsif scanner.match?(/\//)
38
- return syntax_error("Illegal nesting: nesting within a self-closing tag is illegal.")
39
- end
40
- validate_content_existence!(tag, scanner)
41
-
42
- content = [:multi, [:static, "\n"]]
43
- if inner_removal || Helpers::DEFAULT_PRESERVE_TAGS.include?(tag)
44
- content[0, 1] = [:haml, :strip]
45
- end
46
- content += with_tag_nested { parse_lines }
47
- ast << content
48
- ast
49
- end
50
-
51
- private
52
-
53
- def parse_tag_id_and_class(scanner)
54
- attributes = Hash.new { |h, k| h[k] = [] }
55
-
56
- while prefix = scanner.scan(/[#.]/)
57
- name = assert_scan!(scanner, TAG_ID_CLASS_REGEXP)
58
-
59
- case prefix
60
- when '#'
61
- attributes['id'] = [name]
62
- when '.'
63
- attributes['class'] << name
64
- end
65
- end
66
-
67
- ast = []
68
- attributes.each do |attr, values|
69
- ast << [:html, :attr, attr, [:static, values.join(' ')]]
70
- end
71
- ast
72
- end
73
-
74
- def validate_content_existence!(tag, scanner)
75
- scanner.scan(/ */)
76
-
77
- if scanner.match?(/[^ ]/)
78
- syntax_error!("Illegal nesting: content can't be both given on the same line as %#{tag} and nested within it.")
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,28 +0,0 @@
1
- require 'hamlit/concerns/error'
2
-
3
- module Hamlit
4
- module Parsers
5
- module Text
6
- include Concerns::Error
7
-
8
- def parse_text(scanner, lstrip: false, escape: true, scan: nil, inline: true)
9
- reject_text_nesting! unless inline
10
-
11
- scanner.scan(scan) if scan
12
- text = (scanner.scan(/.+/) || '')
13
- text = text.lstrip if lstrip
14
- [:haml, :text, text, escape]
15
- end
16
-
17
- private
18
-
19
- def reject_text_nesting!
20
- return unless next_line
21
-
22
- if next_indent > @current_indent
23
- syntax_error!('Illegal nesting: nesting within plain text is illegal.')
24
- end
25
- end
26
- end
27
- end
28
- end
data/lib/hamlit/temple.rb DELETED
@@ -1,9 +0,0 @@
1
- module Hamlit
2
- module TempleUtilsExtension
3
- def escape_html_safe(html)
4
- super(html.to_s)
5
- end
6
- end
7
- end
8
-
9
- Temple::Utils.send(:extend, Hamlit::TempleUtilsExtension)
data/release DELETED
@@ -1,6 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -e
4
-
5
- source ./test
6
- bundle exec rake release
data/spec/Rakefile DELETED
@@ -1,72 +0,0 @@
1
- $:.unshift File.expand_path('../../lib', __FILE__)
2
-
3
- require 'json'
4
- require 'unindent'
5
- require 'open-uri'
6
-
7
- def generate_spec(mode)
8
- spec = <<-SPEC.unindent
9
- require "haml"
10
-
11
- # This is a spec converted by haml-spec.
12
- # See: https://github.com/haml/haml-spec
13
- describe "haml #{mode} mode with ecape_html" do
14
- DEFAULT_OPTIONS = { ugly: true, escape_html: true }.freeze
15
-
16
- def assert_haml(haml, locals, options)
17
- engine = Haml::Engine.new(haml, DEFAULT_OPTIONS.merge(options))
18
- hamlit = Hamlit::Template.new(options) { haml }
19
- expect(hamlit.render(Object.new, locals)).to eq(engine.render(Object.new, locals))
20
- end
21
-
22
- SPEC
23
-
24
- url = 'https://raw.githubusercontent.com/haml/haml-spec/master/tests.json'
25
- contexts = JSON.parse(open(url).read)
26
- contexts.each_with_index do |context, index|
27
- spec += "\n" if index != 0
28
- spec += " context \"#{context[0]}\" do\n"
29
-
30
- tests = []
31
- context[1].each do |name, test|
32
- tests << {
33
- name: name,
34
- html: test['html'],
35
- haml: test['haml'],
36
- locals: test['locals'],
37
- config: test['config'],
38
- }
39
- end
40
-
41
- spec += tests.map { |test|
42
- locals = Hash[(test[:locals] || {}).map {|x, y| [x.to_sym, y]}]
43
- options = Hash[(test[:config] || {}).map {|x, y| [x.to_sym, y]}]
44
- options[:format] = options[:format].to_sym if options[:format]
45
-
46
- generate_specify(test, locals, options, mode)
47
- }.join("\n")
48
- spec += " end\n"
49
- end
50
-
51
- spec += "end\n"
52
- File.write("hamlit/haml_spec.rb", spec)
53
- end
54
-
55
- def generate_specify(test, locals, options, mode)
56
- <<-SPEC
57
- specify \"#{test[:name]}\" do
58
- haml = %q{#{test[:haml]}}
59
- html = %q{#{test[:html]}}
60
- locals = #{locals}
61
- options = #{options}
62
- assert_haml(haml, locals, options)
63
- end
64
- SPEC
65
- end
66
-
67
- desc 'Convert tests.json into ugly rspec tests'
68
- task :ugly do
69
- generate_spec(:ugly)
70
- end
71
-
72
- task default: :ugly
@@ -1,56 +0,0 @@
1
- describe Hamlit::Parser do
2
- describe 'comment' do
3
- it 'renders html comment' do
4
- assert_render(<<-HAML, <<-HTML)
5
- / comments
6
- HAML
7
- <!-- comments -->
8
- HTML
9
- end
10
-
11
- it 'strips html comment ignoring around spcaes' do
12
- assert_render('/ comments ', <<-HTML)
13
- <!-- comments -->
14
- HTML
15
- end
16
-
17
- it 'accepts backslash-only line in a comment' do
18
- assert_render(<<-'HAML', <<-HTML)
19
- /
20
- \
21
- HAML
22
- <!--
23
-
24
- -->
25
- HTML
26
- end
27
-
28
- it 'renders a deeply indented comment starting with backslash' do
29
- assert_render(<<-'HAML', <<-HTML)
30
- /
31
- \ a
32
- /
33
- a
34
- HAML
35
- <!--
36
- a
37
- -->
38
- <!--
39
- a
40
- -->
41
- HTML
42
- end
43
-
44
- it 'ignores multiline comment' do
45
- assert_render(<<-'HAML', <<-HTML)
46
- -# if true
47
- - raise 'ng'
48
- = invalid script
49
- too deep indent
50
- ok
51
- HAML
52
- ok
53
- HTML
54
- end
55
- end
56
- end