haml 6.0.11 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1775ac3d762a6136ef378f69b5522a73b98dfe5ce5a4727c06a061e3d6ceb989
4
- data.tar.gz: '06938ad9c4452c051d39dbc1d03bd352fa260a4f3768afb3bcce66f3f3b81b70'
3
+ metadata.gz: 85f9ebef95ef0ad6c4eece471031137c6ed9fe0eea2d487c66c2aa7416ed6a1f
4
+ data.tar.gz: bfda96ada6de5a9cecb466ddc1cc9246406df4395e6f06e362980e89dfb4b929
5
5
  SHA512:
6
- metadata.gz: ac77e8fd0f76d1bdec1092f34e95b438ce0e85477d7eb5a9a973f8ab1d95327be035eac8b70589cb043d99a7ab5bb9d112136ca21c022d2f157239d99aea62a7
7
- data.tar.gz: c76565dda6a32822dfb98a8c808b7dfe8c0b640cc59516bf2c69cb6b51aa1605aafbe506d747a67c26c35f46e09f342bf4493191cd8cfb71f100c146ea74c935
6
+ metadata.gz: 8b2809a903761ad6e2049b77fbe0d7fa56100c3e0b0e0b0a4aa8d56d5970d52cb3b1b1e31c04ba9f75bd55b7140bc6945042e85ac7f328bc197be510b8703233
7
+ data.tar.gz: 13e703e2c67ea7ab3e8846b85b1fa656230b7d2015e8c9f3c08ea83a4e5771c20ced4e8d9ae317c0e3e381a60992ef38cfdc63d3fc1e14caa0d0d0206cc92562
@@ -14,6 +14,7 @@ jobs:
14
14
  test:
15
15
  runs-on: ubuntu-latest
16
16
  strategy:
17
+ fail-fast: false
17
18
  matrix:
18
19
  ruby:
19
20
  - '2.5'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Haml Changelog
2
2
 
3
+ ## 6.1.0
4
+
5
+ * Optimize away a `to_s` call on `=` scripts
6
+ * Fix escaping for objects that return an `html_safe` string on `to_s` [#1117](https://github.com/haml/haml/issues/1117)
7
+
8
+ ## 6.0.12
9
+
10
+ * Fix a whitespace removal with `>` and an `if`-`else` statement [#1114](https://github.com/haml/haml/issues/1114)
11
+
3
12
  ## 6.0.11
4
13
 
5
14
  * Fix a whitespace removal with `>` and an `if` statement [#1114](https://github.com/haml/haml/issues/1114)
@@ -6,6 +6,7 @@ module Haml
6
6
  class ChildrenCompiler
7
7
  def initialize
8
8
  @lineno = 1
9
+ @multi_flattener = Temple::Filters::MultiFlattener.new
9
10
  end
10
11
 
11
12
  def compile(node, &block)
@@ -89,15 +90,48 @@ module Haml
89
90
  end
90
91
 
91
92
  def rstrip_whitespace!(temple)
93
+ return if temple.size == 1
94
+
92
95
  case temple[0]
93
- when :multi, :block
96
+ when :multi
94
97
  case temple[-1][0]
95
- when :multi, :block
96
- rstrip_whitespace!(temple[-1])
97
98
  when :whitespace
98
99
  temple.delete_at(-1)
100
+ when :multi, :block
101
+ rstrip_whitespace!(temple[-1])
102
+ end
103
+ when :block
104
+ _block, code, exp = temple
105
+ if code.start_with?(/\s*if\s/)
106
+ # Remove [:whitespace] before `end`
107
+ exp.replace(@multi_flattener.call(exp))
108
+ rstrip_whitespace!(exp)
109
+
110
+ # Remove [:whitespace] before `else` if exists
111
+ else_index = find_else_index(exp)
112
+ if else_index
113
+ whitespace_index = else_index - 1
114
+ while exp[whitespace_index] == [:newline]
115
+ whitespace_index -= 1
116
+ end
117
+ if exp[whitespace_index] == [:whitespace]
118
+ exp.delete_at(whitespace_index)
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ def find_else_index(temple)
126
+ multi, *args = temple
127
+ return nil if multi != :multi
128
+
129
+ args.each_with_index do |arg, index|
130
+ if arg[0] == :code && arg[1].match?(/\A\s*else\s*\z/)
131
+ return index + 1
99
132
  end
100
133
  end
134
+ nil
101
135
  end
102
136
 
103
137
  def insert_whitespace?(node)
@@ -98,10 +98,8 @@ module Haml
98
98
  def compile_script_result(result, node)
99
99
  if !node.value[:escape_html] && node.value[:preserve]
100
100
  result = find_and_preserve(result)
101
- else
102
- result = "(#{result}).to_s"
103
101
  end
104
- [:escape, node.value[:escape_html], [:dynamic, result]]
102
+ [:escapeany, node.value[:escape_html], [:dynamic, result]]
105
103
  end
106
104
 
107
105
  def find_and_preserve(code)
data/lib/haml/engine.rb CHANGED
@@ -4,8 +4,9 @@ require 'haml/parser'
4
4
  require 'haml/compiler'
5
5
  require 'haml/html'
6
6
  require 'haml/string_splitter'
7
- require 'haml/escapable'
8
- require 'haml/force_escapable'
7
+ require 'haml/escape'
8
+ require 'haml/escape_any'
9
+ require 'haml/force_escape'
9
10
  require 'haml/dynamic_merger'
10
11
  require 'haml/ambles'
11
12
  require 'haml/whitespace'
@@ -32,8 +33,9 @@ module Haml
32
33
  use HTML
33
34
  use StringSplitter
34
35
  filter :StaticAnalyzer
35
- use Escapable
36
- use ForceEscapable
36
+ use Escape
37
+ use EscapeAny
38
+ use ForceEscape
37
39
  filter :ControlFlow
38
40
  use Ambles
39
41
  filter :MultiFlattener
@@ -2,7 +2,7 @@
2
2
  require 'haml/util'
3
3
 
4
4
  module Haml
5
- class Escapable < Temple::Filters::Escapable
5
+ class Escape < Temple::Filters::Escapable
6
6
  def initialize(opts = {})
7
7
  super
8
8
  @escape_code = options[:escape_code] ||
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ require 'haml/escape'
3
+
4
+ module Haml
5
+ # This module allows Temple::Filter to dispatch :fescape on `#compile`.
6
+ module EscapeanyDispathcer
7
+ def on_escapeany(flag, exp)
8
+ [:escapeany, flag, compile(exp)]
9
+ end
10
+ end
11
+ ::Temple::Filter.include EscapeanyDispathcer
12
+
13
+ # Unlike Haml::Escape, this calls to_s when not escaped.
14
+ class EscapeAny < Escape
15
+ alias_method :on_escapeany, :on_escape
16
+
17
+ def on_dynamic(value)
18
+ [:dynamic, @escape ? @escape_code % value : "(#{value}).to_s"]
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'haml/escapable'
2
+ require 'haml/escape'
3
3
 
4
4
  module Haml
5
5
  # This module allows Temple::Filter to dispatch :fescape on `#compile`.
@@ -10,8 +10,8 @@ module Haml
10
10
  end
11
11
  ::Temple::Filter.include FescapeDispathcer
12
12
 
13
- # Unlike Haml::Escapable, this escapes value even if it's html_safe.
14
- class ForceEscapable < Escapable
13
+ # Unlike Haml::Escape, this escapes value even if it's html_safe.
14
+ class ForceEscape < Escape
15
15
  def initialize(opts = {})
16
16
  super
17
17
  @escape_code = options[:escape_code] || "::Haml::Util.escape_html((%s))"
@@ -20,8 +20,8 @@ module Haml
20
20
 
21
21
  alias_method :on_fescape, :on_escape
22
22
 
23
- # ForceEscapable doesn't touch :escape expression.
24
- # This method is not used if it's inserted after Haml::Escapable.
23
+ # ForceEscape doesn't touch :escape expression.
24
+ # This method is not used if it's inserted after Haml::Escape.
25
25
  def on_escape(flag, exp)
26
26
  [:escape, flag, compile(exp)]
27
27
  end
@@ -52,4 +52,6 @@ end
52
52
 
53
53
  # Haml extends Haml::Helpers in ActionView each time.
54
54
  # It costs much, so Haml includes a compatible module at first.
55
- ActionView::Base.send :include, Haml::RailsHelpers
55
+ ActiveSupport.on_load(:action_view) do
56
+ include Haml::RailsHelpers
57
+ end
data/lib/haml/util.rb CHANGED
@@ -27,6 +27,7 @@ module Haml
27
27
 
28
28
  # TODO: Remove unescape_interpolation's workaround and get rid of `respond_to?`.
29
29
  def self.escape_html_safe(html)
30
+ html = html.to_s
30
31
  (html.respond_to?(:html_safe?) && html.html_safe?) ? html : escape_html(html)
31
32
  end
32
33
 
data/lib/haml/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Haml
3
- VERSION = '6.0.11'
3
+ VERSION = '6.1.0'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.11
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Natalie Weizenbaum
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: exe
14
14
  cert_chain: []
15
- date: 2022-11-26 00:00:00.000000000 Z
15
+ date: 2022-12-10 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: temple
@@ -301,7 +301,8 @@ files:
301
301
  - lib/haml/dynamic_merger.rb
302
302
  - lib/haml/engine.rb
303
303
  - lib/haml/error.rb
304
- - lib/haml/escapable.rb
304
+ - lib/haml/escape.rb
305
+ - lib/haml/escape_any.rb
305
306
  - lib/haml/filters.rb
306
307
  - lib/haml/filters/base.rb
307
308
  - lib/haml/filters/cdata.rb
@@ -319,7 +320,7 @@ files:
319
320
  - lib/haml/filters/scss.rb
320
321
  - lib/haml/filters/text_base.rb
321
322
  - lib/haml/filters/tilt_base.rb
322
- - lib/haml/force_escapable.rb
323
+ - lib/haml/force_escape.rb
323
324
  - lib/haml/helpers.rb
324
325
  - lib/haml/html.rb
325
326
  - lib/haml/identity.rb