serbea 0.11.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/docs/src/index.md +13 -1
- data/lib/{serbea/rouge_lexer.rb → rouge/lexers/serbea.rb} +1 -1
- data/lib/serbea/helpers.rb +12 -9
- data/lib/serbea/pipeline.rb +5 -21
- data/lib/serbea.rb +0 -16
- data/lib/version.rb +1 -1
- data/serbea.gemspec +2 -2
- metadata +11 -13
- data/lib/serbea/bridgetown_support.rb +0 -68
- data/lib/serbea/rails_support.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2014debe9382e252988c8d41ebec4102153508a856dca4dd7b72d2e347fb4023
|
4
|
+
data.tar.gz: aa729c3b2212ff33e5399544bc798593864248d6aacaeb0764c92fa43dc0cf8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7d3037ee50671772fad0ab5e8cbce90a9ae402769d5ffd49163df182a8c011da83d66809602d01d3186b2cc513d30116922fab461f03d3d0746b2d3f17a977e
|
7
|
+
data.tar.gz: 63f25bbbc2edd056c6c5cb461c356b52301f4590cc8733ca2be621f430b39d20df30f8ee881344e3c4088e19fb34d5630f4b9ac045db2fb5a3908830ae6bef18
|
data/docs/src/index.md
CHANGED
@@ -48,7 +48,19 @@ layout: home
|
|
48
48
|
* Built-in frontmatter support. Now you can access the variables written into a top YAML block within your templates. In any Rails view, including layouts, you'll have access to the `@frontmatter` ivar which is a merged `HashWithDotAccess::Hash` with data from any part of the view tree (partials, pages, layout).
|
49
49
|
|
50
50
|
For example, you could put `<title>{{ @frontmatter.title }}</title>` in your head partial, and then each page could define `title` frontmatter individually. You can even use Ruby string interpolation within the YAML so titles and other metadata can come from `t` language helpers.
|
51
|
+
* Define macros/helpers which can be imported and used within Serbea templates.
|
51
52
|
|
53
|
+
```serb
|
54
|
+
<!-- _macros.serb -->
|
55
|
+
{% macro :greet do |name:| %}
|
56
|
+
{{ name }}, my old friend!
|
57
|
+
{% end %}
|
58
|
+
|
59
|
+
<!-- tmpl.serb -->
|
60
|
+
{% import "macros" %}
|
61
|
+
|
62
|
+
Hello {{ greet(name: "darkness") }}
|
63
|
+
```
|
52
64
|
|
53
65
|
{% endraw %}
|
54
66
|
|
@@ -70,7 +82,7 @@ layout: home
|
|
70
82
|
{{ wow | prepend: "OMG! " }}
|
71
83
|
```
|
72
84
|
|
73
|
-
|
85
|
+
Use `helper` (alias `macro`) to create ad-hoc filters:
|
74
86
|
|
75
87
|
```serb
|
76
88
|
<p>
|
data/lib/serbea/helpers.rb
CHANGED
@@ -9,11 +9,11 @@ module Serbea
|
|
9
9
|
def capture(*args)
|
10
10
|
previous_buffer_state = @_erbout
|
11
11
|
@_erbout = Serbea::OutputBuffer.new
|
12
|
-
yield(*args)
|
13
|
-
result = @_erbout
|
12
|
+
result = yield(*args)
|
13
|
+
result = @_erbout.presence || result
|
14
14
|
@_erbout = previous_buffer_state
|
15
15
|
|
16
|
-
result
|
16
|
+
Serbea::OutputBuffer === result ? result.html_safe : result
|
17
17
|
end
|
18
18
|
|
19
19
|
def pipeline(context, value)
|
@@ -22,16 +22,19 @@ module Serbea
|
|
22
22
|
|
23
23
|
def helper(name, &helper_block)
|
24
24
|
self.class.define_method(name) do |*args, **kwargs, &block|
|
25
|
-
|
26
|
-
@_erbout = Serbea::OutputBuffer.new
|
27
|
-
result = helper_block.call(*args, **kwargs, &block)
|
28
|
-
@_erbout = previous_buffer_state
|
29
|
-
|
30
|
-
result.is_a?(String) ? result.html_safe : result
|
25
|
+
capture { helper_block.call(*args, **kwargs, &block) }
|
31
26
|
end
|
32
27
|
end
|
33
28
|
alias_method :macro, :helper
|
34
29
|
|
30
|
+
def import(*args, **kwargs, &block)
|
31
|
+
helper_names = %i(partial render)
|
32
|
+
available_helper = helper_names.find { |meth| respond_to?(meth) }
|
33
|
+
raise "Serbea Error: no `render' or `partial' helper available in #{self.class}" unless available_helper
|
34
|
+
available_helper == :partial ? partial(*args, **kwargs, &block) : render(*args, **kwargs, &block)
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
35
38
|
def h(input)
|
36
39
|
ERB::Util.h(input.to_s)
|
37
40
|
end
|
data/lib/serbea/pipeline.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "set"
|
1
2
|
require "active_support/core_ext/string/output_safety"
|
2
3
|
require "active_support/core_ext/object/blank"
|
3
4
|
|
@@ -68,38 +69,21 @@ module Serbea
|
|
68
69
|
@value = value
|
69
70
|
end
|
70
71
|
|
71
|
-
# TODO: clean this up somehow and still support Ruby 2.5..3.0!
|
72
72
|
def filter(name, *args, **kwargs)
|
73
73
|
if @value.respond_to?(name) && !self.class.value_methods_denylist.include?(name)
|
74
74
|
if args.last.is_a?(Proc)
|
75
75
|
real_args = args.take(args.length - 1)
|
76
76
|
block = args.last
|
77
|
-
|
78
|
-
@value = @value.send(name, *real_args, **kwargs, &block)
|
79
|
-
else
|
80
|
-
@value = @value.send(name, *real_args, &block)
|
81
|
-
end
|
77
|
+
@value = @value.send(name, *real_args, **kwargs, &block)
|
82
78
|
else
|
83
|
-
|
84
|
-
@value = @value.send(name, *args, **kwargs)
|
85
|
-
else
|
86
|
-
@value = @value.send(name, *args)
|
87
|
-
end
|
79
|
+
@value = @value.send(name, *args, **kwargs)
|
88
80
|
end
|
89
81
|
elsif @context.respond_to?(name)
|
90
|
-
|
91
|
-
@value = @context.send(name, @value, *args, **kwargs)
|
92
|
-
else
|
93
|
-
@value = @context.send(name, @value, *args)
|
94
|
-
end
|
82
|
+
@value = @context.send(name, @value, *args, **kwargs)
|
95
83
|
elsif @binding.local_variables.include?(name)
|
96
84
|
var = @binding.local_variable_get(name)
|
97
85
|
if var.respond_to?(:call)
|
98
|
-
|
99
|
-
@value = var.call(@value, *args, **kwargs)
|
100
|
-
else
|
101
|
-
@value = var.call(@value, *args)
|
102
|
-
end
|
86
|
+
@value = var.call(@value, *args, **kwargs)
|
103
87
|
else
|
104
88
|
"Serbea warning: Filter #{name} does not respond to call".tap do |warning|
|
105
89
|
self.class.raise_on_missing_filters ? raise(warning) : STDERR.puts(warning)
|
data/lib/serbea.rb
CHANGED
@@ -25,19 +25,3 @@ module Tilt
|
|
25
25
|
end
|
26
26
|
|
27
27
|
Tilt.register Tilt::SerbeaTemplate, "serb"
|
28
|
-
|
29
|
-
if defined?(Rails::Railtie)
|
30
|
-
class Railtie < ::Rails::Railtie
|
31
|
-
initializer :serbea do |app|
|
32
|
-
ActiveSupport.on_load(:action_view) do
|
33
|
-
require "serbea/rails_support"
|
34
|
-
|
35
|
-
ActionController::Base.include Serbea::Rails::FrontmatterControllerActions
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
if defined?(Bridgetown)
|
42
|
-
require "serbea/bridgetown_support"
|
43
|
-
end
|
data/lib/version.rb
CHANGED
data/serbea.gemspec
CHANGED
@@ -11,12 +11,12 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.homepage = "https://github.com/bridgetownrb/serbea"
|
12
12
|
spec.license = "MIT"
|
13
13
|
|
14
|
-
spec.required_ruby_version = ">= 2.
|
14
|
+
spec.required_ruby_version = ">= 2.7"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r!^(test|script|spec|features)/!) }
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
|
-
spec.add_runtime_dependency("activesupport", "
|
19
|
+
spec.add_runtime_dependency("activesupport", ">= 6.0")
|
20
20
|
spec.add_runtime_dependency("erubi", ">= 1.10")
|
21
21
|
spec.add_runtime_dependency("hash_with_dot_access", "~> 1.1")
|
22
22
|
spec.add_runtime_dependency("tilt", "~> 2.0")
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serbea
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bridgetown Team
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '6.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '6.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '13.0'
|
83
|
-
description:
|
83
|
+
description:
|
84
84
|
email: maintainers@bridgetownrb.com
|
85
85
|
executables: []
|
86
86
|
extensions: []
|
@@ -117,12 +117,10 @@ files:
|
|
117
117
|
- docs/sync.js
|
118
118
|
- docs/webpack.config.js
|
119
119
|
- docs/yarn.lock
|
120
|
+
- lib/rouge/lexers/serbea.rb
|
120
121
|
- lib/serbea.rb
|
121
|
-
- lib/serbea/bridgetown_support.rb
|
122
122
|
- lib/serbea/helpers.rb
|
123
123
|
- lib/serbea/pipeline.rb
|
124
|
-
- lib/serbea/rails_support.rb
|
125
|
-
- lib/serbea/rouge_lexer.rb
|
126
124
|
- lib/serbea/template_engine.rb
|
127
125
|
- lib/version.rb
|
128
126
|
- serbea.gemspec
|
@@ -130,7 +128,7 @@ homepage: https://github.com/bridgetownrb/serbea
|
|
130
128
|
licenses:
|
131
129
|
- MIT
|
132
130
|
metadata: {}
|
133
|
-
post_install_message:
|
131
|
+
post_install_message:
|
134
132
|
rdoc_options: []
|
135
133
|
require_paths:
|
136
134
|
- lib
|
@@ -138,15 +136,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
138
136
|
requirements:
|
139
137
|
- - ">="
|
140
138
|
- !ruby/object:Gem::Version
|
141
|
-
version: '2.
|
139
|
+
version: '2.7'
|
142
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
141
|
requirements:
|
144
142
|
- - ">="
|
145
143
|
- !ruby/object:Gem::Version
|
146
144
|
version: '0'
|
147
145
|
requirements: []
|
148
|
-
rubygems_version: 3.
|
149
|
-
signing_key:
|
146
|
+
rubygems_version: 3.1.4
|
147
|
+
signing_key:
|
150
148
|
specification_version: 4
|
151
149
|
summary: Similar to ERB, Except Awesomer
|
152
150
|
test_files: []
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require "serbea/rouge_lexer"
|
2
|
-
require "bridgetown-core"
|
3
|
-
|
4
|
-
module Bridgetown
|
5
|
-
class SerbeaView < ERBView
|
6
|
-
include Serbea::Helpers
|
7
|
-
|
8
|
-
def partial(partial_name, options = {}, &block)
|
9
|
-
options.merge!(options[:locals]) if options[:locals]
|
10
|
-
options[:content] = capture(&block) if block
|
11
|
-
|
12
|
-
partial_segments = partial_name.split("/")
|
13
|
-
partial_segments.last.sub!(%r!^!, "_")
|
14
|
-
partial_name = partial_segments.join("/")
|
15
|
-
|
16
|
-
Tilt::SerbeaTemplate.new(
|
17
|
-
site.in_source_dir(site.config[:partials_dir], "#{partial_name}.serb")
|
18
|
-
).render(self, options)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
module Converters
|
23
|
-
class SerbeaTemplates < Converter
|
24
|
-
priority :highest
|
25
|
-
input :serb
|
26
|
-
|
27
|
-
# Logic to do the Serbea content conversion.
|
28
|
-
#
|
29
|
-
# @param content [String] Content of the file (without front matter).
|
30
|
-
# @param convertible [Bridgetown::Page, Bridgetown::Document, Bridgetown::Layout]
|
31
|
-
# The instantiated object which is processing the file.
|
32
|
-
#
|
33
|
-
# @return [String] The converted content.
|
34
|
-
def convert(content, convertible)
|
35
|
-
return content if convertible.data[:template_engine] != "serbea"
|
36
|
-
|
37
|
-
serb_view = Bridgetown::SerbeaView.new(convertible)
|
38
|
-
|
39
|
-
serb_renderer = Tilt::SerbeaTemplate.new(convertible.relative_path) { content }
|
40
|
-
|
41
|
-
if convertible.is_a?(Bridgetown::Layout)
|
42
|
-
serb_renderer.render(serb_view) do
|
43
|
-
convertible.current_document_output
|
44
|
-
end
|
45
|
-
else
|
46
|
-
serb_renderer.render(serb_view)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def matches(ext, convertible)
|
51
|
-
if convertible.data[:template_engine] == "serbea" ||
|
52
|
-
(convertible.data[:template_engine].nil? &&
|
53
|
-
@config[:template_engine] == "serbea")
|
54
|
-
convertible.data[:template_engine] = "serbea"
|
55
|
-
return true
|
56
|
-
end
|
57
|
-
|
58
|
-
super(ext).tap do |ext_matches|
|
59
|
-
convertible.data[:template_engine] = "serbea" if ext_matches
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def output_ext(ext)
|
64
|
-
ext == ".serb" ? ".html" : ext
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
data/lib/serbea/rails_support.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "hash_with_dot_access"
|
4
|
-
|
5
|
-
module Serbea
|
6
|
-
module Rails
|
7
|
-
module FrontmatterHelpers
|
8
|
-
def set_page_frontmatter=(data)
|
9
|
-
@frontmatter ||= HashWithDotAccess::Hash.new
|
10
|
-
@frontmatter.update(data)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module FrontmatterControllerActions
|
15
|
-
extend ActiveSupport::Concern
|
16
|
-
|
17
|
-
included do
|
18
|
-
Serbea::TemplateEngine.front_matter_preamble = "self.set_page_frontmatter = local_frontmatter = YAML.load"
|
19
|
-
|
20
|
-
before_action { @frontmatter ||= HashWithDotAccess::Hash.new }
|
21
|
-
|
22
|
-
helper Serbea::Rails::FrontmatterHelpers
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class TemplateHandler
|
27
|
-
def handles_encoding?; true; end
|
28
|
-
|
29
|
-
def compile(template, source)
|
30
|
-
"self.class.include(Serbea::Helpers);" + Tilt::SerbeaTemplate.new { source }.precompiled_template([])
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.call(template, source = nil)
|
34
|
-
source ||= template.source
|
35
|
-
|
36
|
-
new.compile(template, source)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
Serbea::TemplateEngine.directive :form, ->(code, buffer) do
|
43
|
-
model_name, space, params = code.lstrip.partition(%r(\s)m)
|
44
|
-
model_name.chomp!(",")
|
45
|
-
model_name = "#{model_name}," unless params.lstrip.start_with?("do", "{")
|
46
|
-
|
47
|
-
buffer << "{%= form_with model: "
|
48
|
-
buffer << model_name << " #{params}"
|
49
|
-
buffer << " %}"
|
50
|
-
end
|
51
|
-
|
52
|
-
Serbea::TemplateEngine.directive :frame, ->(code, buffer) do
|
53
|
-
buffer << "{%= turbo_frame_tag "
|
54
|
-
buffer << code
|
55
|
-
buffer << " %}"
|
56
|
-
end
|
57
|
-
|
58
|
-
%i(append prepend update replace remove).each do |action|
|
59
|
-
Serbea::TemplateEngine.directive action, ->(code, buffer) do
|
60
|
-
buffer << "{%= turbo_stream.#{action} "
|
61
|
-
buffer << code
|
62
|
-
buffer << " %}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
Serbea::TemplateEngine.directive :_, ->(code, buffer) do
|
67
|
-
tag_name, space, params = code.lstrip.partition(%r(\s)m)
|
68
|
-
|
69
|
-
if tag_name.end_with?(":")
|
70
|
-
tag_name.chomp!(":")
|
71
|
-
tag_name = ":#{tag_name}" unless tag_name.start_with?(":")
|
72
|
-
end
|
73
|
-
|
74
|
-
buffer << "{%= tag.tag_string "
|
75
|
-
buffer << tag_name << ", " << params
|
76
|
-
buffer << " %}"
|
77
|
-
end
|
78
|
-
|
79
|
-
ActionView::Template.register_template_handler(:serb, Serbea::Rails::TemplateHandler)
|