serbea 0.4.4 → 0.6.3

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: edb5cf139c2f14b2f524192f87b45fcfcc931efa0eb27b25e19d6f86ec98f3b2
4
- data.tar.gz: 40b5e1177175daad6b356371d58a608e838d214a90b08415f63f4930dd28f4e3
3
+ metadata.gz: 73996980f3fc5dad7372d79b970912fafc75ae4da2663838f6af696c57be29aa
4
+ data.tar.gz: d5eabe6bc2a70b461870e085ebfb9d628941e862e09b8e567b50e5dd4798f334
5
5
  SHA512:
6
- metadata.gz: 074cb4b928fe2e79ab5786169f88be23dc01e17f5545d43b6bacdbe619491dc9a656a16fb019ea86e3f7c3feee1ce45f7f3f916063aaed2b61c6ecf21af00066
7
- data.tar.gz: 14f6024cec0af16f22de2549f6c0bf25ede4a75b458ab64b9970dc71088923643cdc4be0414b952dd2c12cc814d2b34aa17b6cc9cda97cfe71d72b8b15efa97a
6
+ metadata.gz: d281941782dbf85eae47f60d8918bd293ffd4e9f760e8725d0e3249faf638ddd42bc5652cfe9d1d3ccc7be0619a54fe9184a5f04a8ecfef186a17c43760ce6f4
7
+ data.tar.gz: 8c652f07cafdd6026b81508442f6cee1d1bc8b9f87c946b53f90370b15f9da39017aeaeed27114d0c704e456010cce0a8ace18d3fd173ee6ed6b4755d1ead8d6
@@ -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
 
@@ -69,3 +71,13 @@ module Bridgetown
69
71
  end
70
72
  end
71
73
  end
74
+
75
+ Bridgetown::Hooks.register :site, :pre_render, reloadable: false do |site|
76
+ # make sure Liquid doesn't find {% %} and decide to process Serbea code!
77
+ site.contents.each do |convertible|
78
+ convertible.data.render_with_liquid = false if convertible.extname == ".serb"
79
+ end
80
+ site.layouts.values.each do |convertible|
81
+ convertible.data.render_with_liquid = false if convertible.ext == ".serb"
82
+ end
83
+ end
@@ -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
- result.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.4"
2
+ VERSION = "0.6.3"
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.4
4
+ version: 0.6.3
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-19 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