serbea 0.4.2 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22177afa63ae7dccc14171dbfaac1d77b237b75b97f4779eeefc4c7fdf44dd5b
4
- data.tar.gz: fa0591db51fd9d2f78541d48a717369d7d9b5b5e22be38f5c126972fbba8aa57
3
+ metadata.gz: 843083ae2fadbebd662b112d2a5c1710e3724f34857b1c6a2a54245e7abc52b9
4
+ data.tar.gz: 104fdeb290cfd5a94cfa26beed5aa31c55771c8cd23f7501e42af6ec27803de9
5
5
  SHA512:
6
- metadata.gz: 1c5c3e615db4ea48225efc20a0f345a05aadd14f2ba9d38fe7406298fcfa371a77d3e8517d08d05dfe34f42cf7025818309b210ab6e7b0d14daeca0ccabe438c
7
- data.tar.gz: 699e31b8fc7fd9bd32437170c5cf5c48b625f905c1a2b7312b4476ec8b3a89c76cbe1d7056bffdf1000099cbd67abd2862717a58177ee9725eb65090bc983ce1
6
+ metadata.gz: 8cfc623c9246ca644fdd64b5cfe306a66918ae250c066b7500d34e53b9ef2b2b61504cc1707831b40eb44fd3a27ab24dd3556bc9a5cb943ae4725a5269c4670a
7
+ data.tar.gz: 9fc958b5e73f32d6094d9ef811934deb7a0994b74159a7ed3b86ac73137064a2dd727015d7211051dc51901c9c9e444eaa1ea4afbee64fe9e1b526bd43d62da5
@@ -1,6 +1,5 @@
1
1
  require "tilt"
2
2
  require "tilt/erubi"
3
- require "erubi/capture_end"
4
3
 
5
4
  require "serbea/helpers"
6
5
  require "serbea/pipeline"
@@ -10,7 +9,7 @@ require "serbea/component_renderer"
10
9
  module Tilt
11
10
  class SerbeaTemplate < ErubiTemplate
12
11
  def prepare
13
- @options.merge!(outvar: "@_erbout", engine_class: Serbea::TemplateEngine)
12
+ @options.merge!(outvar: "@_erbout", bufval: "Serbea::Buffer.new", engine_class: Serbea::TemplateEngine)
14
13
  super
15
14
  end
16
15
 
@@ -1,12 +1,13 @@
1
1
  require "serbea/rouge_lexer"
2
+ require "bridgetown-core"
2
3
 
3
4
  module Bridgetown
4
5
  class SerbeaView < RubyTemplateView
5
6
  include Serbea::Helpers
6
7
 
7
- def partial(partial_name, options = {})
8
+ def partial(partial_name, options = {}, &block)
8
9
  options.merge!(options[:locals]) if options[:locals]
9
- options[:content] = yield if block_given?
10
+ options[:content] = capture(&block) if block
10
11
 
11
12
  partial_segments = partial_name.split("/")
12
13
  partial_segments.last.sub!(%r!^!, "_")
@@ -17,11 +18,12 @@ module Bridgetown
17
18
  ).render(self, options)
18
19
  end
19
20
 
20
- def markdownify(&block)
21
- content = Bridgetown::Utils.reindent_for_markdown(capture(&block))
21
+ def markdownify(input = nil, &block)
22
+ content = Bridgetown::Utils.reindent_for_markdown(
23
+ block.nil? ? input.to_s : capture(&block)
24
+ )
22
25
  converter = site.find_converter_instance(Bridgetown::Converters::Markdown)
23
- md_output = converter.convert(content).strip
24
- @_erbout << md_output
26
+ converter.convert(content).strip
25
27
  end
26
28
  end
27
29
 
@@ -51,11 +53,15 @@ module Bridgetown
51
53
  end
52
54
  end
53
55
 
54
- def matches(ext, convertible)
55
- if convertible.data[:template_engine] == "serbea" ||
56
- (convertible.data[:template_engine].nil? &&
57
- @config[:template_engine] == "serbea")
58
- return true
56
+ def matches(ext, convertible = nil)
57
+ if convertible
58
+ if convertible.data[:template_engine] == "serbea" ||
59
+ (convertible.data[:template_engine].nil? &&
60
+ @config[:template_engine] == "serbea")
61
+ # make sure Liquid doesn't find {% %} and decide to process Serbea code!
62
+ convertible.data["render_with_liquid"] = false
63
+ return true
64
+ end
59
65
  end
60
66
 
61
67
  super(ext)
@@ -1,16 +1,28 @@
1
+ require "active_support/core_ext/string/output_safety"
2
+
1
3
  module Serbea
2
4
  module Helpers
3
5
  def self.included(mod)
4
6
  Serbea::Pipeline.deny_value_method %i(escape h prepend append assign_to)
5
7
  end
6
8
 
7
- def capture(obj=nil)
9
+ def capture(obj = nil, &block)
8
10
  previous_buffer_state = @_erbout
9
- @_erbout = +""
10
- result = obj ? yield(obj) : yield
11
+ @_erbout = Serbea::Buffer.new
12
+
13
+ # For compatibility with ActionView, not used by Bridgetown normally
14
+ previous_ob_state = @output_buffer
15
+ @output_buffer = Serbea::Buffer.new
16
+
17
+ result = instance_exec(obj, &block)
18
+ if @output_buffer != ""
19
+ # use Rails' ActionView buffer if present
20
+ result = @output_buffer
21
+ end
11
22
  @_erbout = previous_buffer_state
12
-
13
- result.respond_to?(:html_safe) ? result.html_safe : result
23
+ @output_buffer = previous_ob_state
24
+
25
+ result.html_safe
14
26
  end
15
27
 
16
28
  def pipeline(context, value)
@@ -22,11 +34,15 @@ module Serbea
22
34
  end
23
35
 
24
36
  def h(input)
25
- result = Erubi.h(input)
26
- h.respond_to?(:html_safe) ? result.html_safe : result
37
+ ERB::Util.h(input.to_s)
27
38
  end
28
39
  alias_method :escape, :h
29
40
 
41
+ def safe(input)
42
+ input.to_s.html_safe
43
+ end
44
+ alias_method :raw, :safe
45
+
30
46
  def prepend(old_string, new_string)
31
47
  "#{new_string}#{old_string}"
32
48
  end
@@ -1,3 +1,5 @@
1
+ require "active_support/core_ext/string/output_safety"
2
+
1
3
  module Serbea
2
4
  class Pipeline
3
5
  def self.exec(template, input: (no_input_passed = true; nil), include_helpers: nil)
@@ -27,11 +29,17 @@ module Serbea
27
29
  end
28
30
  def self.output_processor
29
31
  @output_processor ||= lambda do |input|
30
- # no-op
31
- input
32
+ (!input.html_safe? && self.autoescape) ? ERB::Util.h(input) : input.html_safe
32
33
  end
33
34
  end
34
35
 
36
+ def self.autoescape=(config_boolean)
37
+ @autoescape = config_boolean
38
+ end
39
+ def self.autoescape
40
+ @autoescape.nil? ? true : @autoescape
41
+ end
42
+
35
43
  def self.raise_on_missing_filters=(config_boolean)
36
44
  @raise_on_missing_filters = config_boolean
37
45
  end
@@ -85,7 +93,7 @@ module Serbea
85
93
  end
86
94
 
87
95
  def to_s
88
- self.class.output_processor.call @value.to_s
96
+ self.class.output_processor.call(@value.is_a?(String) ? @value : @value.to_s)
89
97
  end
90
98
  end
91
99
  end
@@ -16,17 +16,7 @@ module Serbea
16
16
 
17
17
  new.compile(template, source)
18
18
  end
19
-
20
- # def cache_fragment(block, name = {}, options = nil)
21
- # @view.fragment_for(block, name, options) do
22
- # eval("_hamlout.buffer", block.binding)
23
- # end
24
- # end
25
19
  end
26
20
  end
27
21
 
28
22
  ActionView::Template.register_template_handler(:serb, Serbea::Plugin)
29
-
30
- Serbea::Pipeline.output_processor = lambda do |input|
31
- input.html_safe? ? input : ActionController::Base.helpers.strip_tags(input)
32
- end
@@ -1,5 +1,15 @@
1
1
  module Serbea
2
- class TemplateEngine < Erubi::CaptureEndEngine
2
+ class Buffer < String
3
+ def concat_to_s(input)
4
+ concat input.to_s
5
+ end
6
+
7
+ alias_method :safe_append=, :concat_to_s
8
+ alias_method :append=, :concat_to_s
9
+ alias_method :safe_expr_append=, :concat_to_s
10
+ end
11
+
12
+ class TemplateEngine < Erubi::Engine
3
13
  FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
4
14
 
5
15
  def self.render_directive=(directive)
@@ -21,14 +31,14 @@ module Serbea
21
31
  end
22
32
 
23
33
  def initialize(input, properties={})
24
- properties[:regexp] = /{%(\:?={1,2}|-|\#|%|\:)?(.*?)([-=])?%}([ \t]*\r?\n)?/m
34
+ properties[:regexp] = /{%(={1,2}|-|\#|%)?(.*?)([-=])?%}([ \t]*\r?\n)?/m
25
35
  properties[:strip_front_matter] = true unless properties.key?(:strip_front_matter)
26
36
  super process_serbea_input(input, properties), properties
27
37
  end
28
38
 
29
39
  def add_postamble(postamble)
30
40
  src << postamble
31
- src << "@_erbout.html_safe" if postamble.respond_to?(:html_safe)
41
+ src << "#{@bufvar}.html_safe"
32
42
 
33
43
  src.gsub!("__RAW_START_PRINT__", "{{")
34
44
  src.gsub!("__RAW_END_PRINT__", "}}")
@@ -140,7 +150,7 @@ module Serbea
140
150
  end
141
151
 
142
152
  if includes_block
143
- buff << "{%:= #{self.class.render_directive}#{pieces.join(" ")} %}"
153
+ buff << "{%= #{self.class.render_directive}#{pieces.join(" ")} %}"
144
154
  else
145
155
  pieces.last << ")"
146
156
  buff << "{%= #{self.class.render_directive}#{pieces.join(" ")} %}"
@@ -149,7 +159,7 @@ module Serbea
149
159
  buff << "\n{% %}" # preserve original directive line length
150
160
  end
151
161
  else
152
- buff << "{%: end %}"
162
+ buff << "{% end %}"
153
163
  end
154
164
  end
155
165
  end
@@ -158,26 +168,27 @@ module Serbea
158
168
  end
159
169
 
160
170
  private
161
-
162
- # Handle the {%:= and {%:== tags
163
- # Carried over from the Erubi class but with changed indicators
164
- def handle(indicator, code, tailch, rspace, lspace)
165
- case indicator
166
- when ':=', ':=='
167
- rspace = nil if tailch && !tailch.empty?
168
- add_text(lspace) if lspace
169
- escape_capture = !((indicator == ':=') ^ @escape_capture)
170
- src << "begin; (#{@bufstack} ||= []) << #{@bufvar}; #{@bufvar} = #{@bufval}; #{@bufstack}.last << #{@escapefunc if escape_capture}((" << code
171
- add_text(rspace) if rspace
172
- when ':'
173
- rspace = nil if tailch && !tailch.empty?
174
- add_text(lspace) if lspace
175
- result = @yield_returns_buffer ? " #{@bufvar}; " : ""
176
- src << result << code << ")).to_s; ensure; #{@bufvar} = #{@bufstack}.pop; end;"
177
- add_text(rspace) if rspace
171
+
172
+ def add_code(code)
173
+ @src << code
174
+ @src << ";#{@bufvar};" if code.strip.split(".").first == "end"
175
+ @src << ';' unless code[Erubi::RANGE_LAST] == "\n"
176
+ end
177
+
178
+ # pulled from Rails' ActionView
179
+ BLOCK_EXPR = %r!\s*((\s+|\))do|\{)(\s*\|[^|]*\|)?\s*\Z!.freeze
180
+
181
+ def add_expression(indicator, code)
182
+ if BLOCK_EXPR.match?(code)
183
+ src << "#{@bufvar}.append= " << code
178
184
  else
179
185
  super
180
186
  end
181
187
  end
188
+
189
+ # Don't allow == to output escaped strings, as that's the opposite of Rails
190
+ def add_expression_result_escaped(code)
191
+ add_expression_result(code)
192
+ end
182
193
  end # class
183
194
  end
@@ -1,3 +1,3 @@
1
1
  module Serbea
2
- VERSION = "0.4.2"
2
+ VERSION = "0.6.1"
3
3
  end
@@ -17,5 +17,6 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.add_runtime_dependency("erubi", "~> 1.9")
20
+ spec.add_runtime_dependency("activesupport", "~> 6.0")
20
21
  spec.add_runtime_dependency("tilt", "~> 2.0")
21
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serbea
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bridgetown Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-05 00:00:00.000000000 Z
11
+ date: 2020-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubi
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '6.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: tilt
29
43
  requirement: !ruby/object:Gem::Requirement