serbea 0.4.3 → 0.6.2

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: fd530996d44bf1ab692ebef54630f131669dc773b084a0181713c7d929a1eb3b
4
- data.tar.gz: a65ff4d61f7c400177f83ac2f83986fcb26b30eaf85d386ec9d4497aa4ec9a48
3
+ metadata.gz: 34249683bdebe93a40e03acefcd4201f315144a5c87e1a83991ef9919e982153
4
+ data.tar.gz: e83e7b8e9dbefe2791f5f9d4301a000d5e53ddef6f4ce9cb281a4a089bbeadd2
5
5
  SHA512:
6
- metadata.gz: 780f93e3d44d80e8ddfc0cd9cff2482027ed003a26d35e78f7b78748996162e1a5df1c7097b69f4526528efa1c3c04950c11cf963cf1c88b7dca72cfc9f4daf9
7
- data.tar.gz: b18cec53f65e1ae0d91333885657a9b2adec3ebcd61920a8a3c12363d7b95d6168898ed899bebbf48cf7f58990138e8d8c0843c7a4d385b9c41f6ad5861d5a1e
6
+ metadata.gz: 511a5355a79a5afac0bd81787c8d40be68915e39bb2144d1ade08aae40bbc18bcf5ade5408f9295f048d21ef20d0ba4a9f16dc997534fa8a120de6d945b7db60
7
+ data.tar.gz: 1fc0bde29f6e0e532be6863648807d519cf37994ceec057a367e65ed542f4f4608aa14dca9a55a47997b34fd4c35dec2d4183ce8cba94f38a2763d485859aea2
@@ -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,13 @@ 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
+ return true
62
+ end
59
63
  end
60
64
 
61
65
  super(ext)
@@ -67,3 +71,13 @@ module Bridgetown
67
71
  end
68
72
  end
69
73
  end
74
+
75
+ Bridgetown::Hooks.register :site, :pre_render 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.3"
2
+ VERSION = "0.6.2"
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.3
4
+ version: 0.6.2
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