serbea 0.2.0 → 0.3.4

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: 73c7ff8202d675a22d379f36b82f5848465b03c94a47b077467a12c2c321f5c6
4
- data.tar.gz: 65ea57087ca64e0c1f4326b53db82326210fb2269b384da0aa583f0982851acb
3
+ metadata.gz: bbd946514bace35dc47b5a4cf880db55b6b5af2e6060c40dee607bb776072c30
4
+ data.tar.gz: 3cac2624f2e6c5f4dd70393f5c6bbef467115da9bc9e465d6a8e91e69e3155b4
5
5
  SHA512:
6
- metadata.gz: 3e129f0707c7b02325e7fc9e3b73e9a71c4e914a1b4bed7a2cc42aa8d3ccd88d881f3154d17eacb49ef449a0fc304ffef627d9b5bd3a43e40de2ee869c9851a0
7
- data.tar.gz: 6d841de735b6f21c9f8e620e49504af943a1af1322cd067944b03a502b9f1334b5dec0ea67738cd6714e012c8484bcd7030e9360e30a05accb22d43b5308eb76
6
+ metadata.gz: 122fa4b87a75dacfcdc9026aaac10560695ebbf7cc5b6e0e35999bc7694e880e8df6a5ead634b37685cafa8ad6849380029f5beece1ce17665cef0fad5eb9b38
7
+ data.tar.gz: bea81f00f032ed410f976041399f1fae6209fb9f4808e747c69ebf6a4d48faf64b9f2c79cb5a470fc0f5a997574916b25143da64de7ed23d9383b2ae71119a6c
@@ -3,9 +3,9 @@ require "tilt/erubi"
3
3
  require "erubi/capture_end"
4
4
 
5
5
  require "serbea/helpers"
6
- require "serbea/component_renderer"
7
6
  require "serbea/pipeline"
8
7
  require "serbea/template_engine"
8
+ require "serbea/component_renderer"
9
9
 
10
10
  module Tilt
11
11
  class SerbeaTemplate < ErubiTemplate
@@ -1,5 +1,9 @@
1
1
  module Serbea
2
2
  module Helpers
3
+ def self.included(mod)
4
+ Serbea::Pipeline.deny_value_method %i(escape h prepend append map assign)
5
+ end
6
+
3
7
  def capture(obj=nil)
4
8
  previous_buffer_state = @_erbout
5
9
  @_erbout = +""
@@ -21,5 +25,22 @@ module Serbea
21
25
  Erubi.h(input)
22
26
  end
23
27
  alias_method :escape, :h
28
+
29
+ def prepend(old_string, new_string)
30
+ "#{new_string}#{old_string}"
31
+ end
32
+
33
+ def append(old_string, new_string)
34
+ "#{old_string}#{new_string}"
35
+ end
36
+
37
+ def map(input, block)
38
+ input.map(&block)
39
+ end
40
+
41
+ def assign(input, varname, preserve: false)
42
+ self.instance_variable_set("@#{varname}", input)
43
+ preserve ? input : nil
44
+ end
24
45
  end
25
46
  end
@@ -10,19 +10,26 @@ module Serbea
10
10
  end
11
11
  end
12
12
 
13
+ def self.deny_value_method(name)
14
+ value_methods_denylist.merge Array(name)
15
+ end
16
+ def self.value_methods_denylist
17
+ @value_methods_denylist ||= Set.new
18
+ end
19
+
13
20
  def initialize(context, value)
14
21
  @context = context
15
22
  @value = value
16
23
  end
17
24
 
18
- def filter(sym, *aargs)
19
- if @value.respond_to?(sym)
20
- @value = @value.send(sym, *aargs)
21
- elsif @context.respond_to?(sym)
22
- @value = @context.send(sym, @value, *aargs)
25
+ def filter(name, *args)
26
+ if @value.respond_to?(name) && !self.class.value_methods_denylist.include?(name)
27
+ @value = @value.send(name, *args)
28
+ elsif @context.respond_to?(name)
29
+ @value = @context.send(name, @value, *args)
23
30
  else
24
- "Serbea warning: Filter not found: #{sym}".tap do |warning|
25
- raise_on_missing_filters ? raise(warning) : puts(warning)
31
+ "Serbea warning: Filter not found: #{name}".tap do |warning|
32
+ raise_on_missing_filters ? raise(warning) : STDERR.puts(warning)
26
33
  end
27
34
  end
28
35
 
@@ -1,6 +1,13 @@
1
1
  module Serbea
2
2
  class TemplateEngine < Erubi::CaptureEndEngine
3
3
  FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m.freeze
4
+
5
+ def self.render_directive=(directive)
6
+ @render_directive = directive
7
+ end
8
+ def self.render_directive
9
+ @render_directive ||= "render"
10
+ end
4
11
 
5
12
  def self.has_yaml_header?(template)
6
13
  template.lines.first&.match? %r!\A---\s*\r?\n!
@@ -28,11 +35,11 @@ module Serbea
28
35
  string = template.dup
29
36
  if properties[:strip_front_matter] && self.class.has_yaml_header?(string)
30
37
  if string = string.match(FRONT_MATTER_REGEXP)
31
- string = string.post_match
32
- # yaml_data = SafeYAML.load(template.captures[0])
38
+ string = ("{%#%}\n" * string.to_s.lines.count) + string.post_match
33
39
  end
34
40
  end
35
41
 
42
+ # Ensure the raw "tag" will strip out all ERB-style processing
36
43
  until string.empty?
37
44
  text, code, string = string.partition(/{% raw %}.*?{% endraw %}/m)
38
45
 
@@ -47,7 +54,8 @@ module Serbea
47
54
  gsub("%}", "__RAW_END_EVAL__")
48
55
  end
49
56
  end
50
-
57
+
58
+ # Process any pipelines
51
59
  string = buff
52
60
  buff = ""
53
61
  until string.empty?
@@ -59,7 +67,7 @@ module Serbea
59
67
 
60
68
  code = code.gsub('\|', "__PIPE_C__")
61
69
 
62
- subs = code.gsub(/\s*\|\s+(.*?)\s([^|}]*)/) do
70
+ subs = code.gsub(/\s*\|>?\s+(.*?)\s([^|}]*)/) do
63
71
  args = $2
64
72
  args = nil if args.strip == ""
65
73
  prefix = processed_filters ? ")" : "))"
@@ -73,6 +81,54 @@ module Serbea
73
81
  end
74
82
  end
75
83
 
84
+ # Process any directives
85
+ #
86
+ # TODO: allow custom directives! aka
87
+ # {%@something whatever %}
88
+ # {%@script
89
+ # const foo = "really? #{really}!"
90
+ # alert(foo.toLowerCase())
91
+ # %}
92
+ # {%@preact AwesomeChart data={#{ruby_data.to_json}} %}
93
+ string = buff
94
+ buff = ""
95
+ until string.empty?
96
+ text, code, string = string.partition(/{%@.*?%}/m)
97
+
98
+ buff << text
99
+ if code.length > 0
100
+ code.sub! /^\{%@/, ""
101
+ code.sub! /%}$/, ""
102
+ unless ["end", ""].include? code.strip
103
+ pieces = code.split(" ")
104
+ if pieces[0].start_with?(/[A-Z]/) # Ruby class name
105
+ pieces[0].prepend " "
106
+ pieces[0] << ".new("
107
+ else # string or something else
108
+ pieces[0].prepend "("
109
+ end
110
+
111
+ includes_block = false
112
+ pieces.reverse.each do |piece|
113
+ if piece == "do" && (pieces.last == "do" || pieces.last.end_with?("|"))
114
+ piece.prepend(") ")
115
+ includes_block = true
116
+ break
117
+ end
118
+ end
119
+
120
+ if includes_block
121
+ buff << "{%:= #{self.class.render_directive}#{pieces.join(" ")} %}"
122
+ else
123
+ pieces.last << ")"
124
+ buff << "{%= #{self.class.render_directive}#{pieces.join(" ")} %}"
125
+ end
126
+ else
127
+ buff << "{%: end %}"
128
+ end
129
+ end
130
+ end
131
+
76
132
  buff
77
133
  end
78
134
 
@@ -1,3 +1,3 @@
1
1
  module Serbea
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.4"
3
3
  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.2.0
4
+ version: 0.3.4
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-09-19 00:00:00.000000000 Z
11
+ date: 2020-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubi