hanami-view 2.0.0.alpha8 → 2.1.0.beta2
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 +4 -4
- data/CHANGELOG.md +36 -0
- data/README.md +15 -3
- data/hanami-view.gemspec +5 -3
- data/lib/hanami/view/cache.rb +16 -0
- data/lib/hanami/view/context.rb +15 -55
- data/lib/hanami/view/context_helpers/content_helpers.rb +5 -5
- data/lib/hanami/view/decorated_attributes.rb +2 -2
- data/lib/hanami/view/erb/engine.rb +27 -0
- data/lib/hanami/view/erb/filters/block.rb +44 -0
- data/lib/hanami/view/erb/filters/trimming.rb +42 -0
- data/lib/hanami/view/erb/parser.rb +161 -0
- data/lib/hanami/view/erb/template.rb +30 -0
- data/lib/hanami/view/errors.rb +8 -2
- data/lib/hanami/view/exposure.rb +23 -17
- data/lib/hanami/view/exposures.rb +22 -13
- data/lib/hanami/view/helpers/escape_helper.rb +221 -0
- data/lib/hanami/view/helpers/number_formatting_helper.rb +182 -0
- data/lib/hanami/view/helpers/tag_helper/tag_builder.rb +230 -0
- data/lib/hanami/view/helpers/tag_helper.rb +210 -0
- data/lib/hanami/view/html.rb +104 -0
- data/lib/hanami/view/html_safe_string_buffer.rb +46 -0
- data/lib/hanami/view/part.rb +13 -15
- data/lib/hanami/view/part_builder.rb +68 -108
- data/lib/hanami/view/path.rb +4 -31
- data/lib/hanami/view/rendered.rb +31 -0
- data/lib/hanami/view/renderer.rb +36 -44
- data/lib/hanami/view/rendering.rb +42 -0
- data/lib/hanami/view/{render_environment_missing.rb → rendering_missing.rb} +8 -13
- data/lib/hanami/view/scope.rb +14 -15
- data/lib/hanami/view/scope_builder.rb +42 -78
- data/lib/hanami/view/tilt/haml_adapter.rb +40 -0
- data/lib/hanami/view/tilt/slim_adapter.rb +40 -0
- data/lib/hanami/view/tilt.rb +22 -46
- data/lib/hanami/view/version.rb +1 -1
- data/lib/hanami/view.rb +58 -99
- metadata +64 -26
- data/LICENSE +0 -20
- data/lib/hanami/view/render_environment.rb +0 -62
- data/lib/hanami/view/tilt/erb.rb +0 -26
- data/lib/hanami/view/tilt/erbse.rb +0 -21
- data/lib/hanami/view/tilt/haml.rb +0 -26
data/lib/hanami/view/tilt.rb
CHANGED
@@ -1,69 +1,48 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "dry/core/cache"
|
4
3
|
require "tilt"
|
5
4
|
|
6
5
|
module Hanami
|
7
6
|
class View
|
8
7
|
# @api private
|
9
8
|
module Tilt
|
10
|
-
|
9
|
+
Mapping = ::Tilt.default_mapping.dup.tap { |mapping|
|
10
|
+
# If "slim" has been required before "hanami/view", unregister Slim's non-lazy registered
|
11
|
+
# template, so our own template adapter (using register_lazy below) can take precedence.
|
12
|
+
mapping.unregister "slim"
|
13
|
+
|
14
|
+
# Register our own ERB template.
|
15
|
+
mapping.register_lazy "Hanami::View::ERB::Template", "hanami/view/erb/template", "erb", "rhtml"
|
16
|
+
|
17
|
+
# Register ERB templates for Haml and Slim that set the `use_html_safe: true` option.
|
18
|
+
#
|
19
|
+
# Our template namespaces below have the "Adapter" suffix to work around a bug in Tilt's
|
20
|
+
# `Mapping#const_defined?`, which (if slim was already required) would receive
|
21
|
+
# "Hanami::View::Slim::Template" and return `Slim::Template`, which is the opposite of what
|
22
|
+
# we want.
|
23
|
+
mapping.register_lazy "Hanami::View::Tilt::HamlAdapter::Template", "hanami/view/tilt/haml_adapter", "haml"
|
24
|
+
mapping.register_lazy "Hanami::View::Tilt::SlimAdapter::Template", "hanami/view/tilt/slim_adapter", "slim"
|
25
|
+
}
|
11
26
|
|
12
27
|
class << self
|
13
|
-
def [](path, mapping,
|
14
|
-
|
15
|
-
activate_adapter ext
|
16
|
-
|
17
|
-
with_mapping(mapping).new(path, **options)
|
18
|
-
end
|
19
|
-
|
20
|
-
def default_mapping
|
21
|
-
::Tilt.default_mapping
|
22
|
-
end
|
23
|
-
|
24
|
-
def register_adapter(ext, adapter)
|
25
|
-
adapters[ext] = adapter
|
26
|
-
end
|
27
|
-
|
28
|
-
def deregister_adapter(ext)
|
29
|
-
adapters.delete(ext)
|
28
|
+
def [](path, mapping, options)
|
29
|
+
with_mapping(mapping).new(path, options)
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
-
def adapters
|
35
|
-
@adapters ||= {}
|
36
|
-
end
|
37
|
-
|
38
|
-
def activate_adapter(ext)
|
39
|
-
fetch_or_store(:adapter, ext) {
|
40
|
-
adapter = adapters[ext]
|
41
|
-
return unless adapter
|
42
|
-
|
43
|
-
*requires, error_message = adapter.requirements
|
44
|
-
|
45
|
-
begin
|
46
|
-
requires.each(&method(:require))
|
47
|
-
rescue LoadError => e
|
48
|
-
raise e, "#{e.message}\n\n#{error_message}"
|
49
|
-
end
|
50
|
-
|
51
|
-
adapter.activate
|
52
|
-
}
|
53
|
-
end
|
54
|
-
|
55
34
|
def with_mapping(mapping)
|
56
|
-
fetch_or_store(:
|
35
|
+
View.cache.fetch_or_store(:tilt_mapping, mapping) {
|
57
36
|
if mapping.any?
|
58
37
|
build_mapping(mapping)
|
59
38
|
else
|
60
|
-
|
39
|
+
Mapping
|
61
40
|
end
|
62
41
|
}
|
63
42
|
end
|
64
43
|
|
65
44
|
def build_mapping(mapping)
|
66
|
-
|
45
|
+
Mapping.dup.tap do |new_mapping|
|
67
46
|
mapping.each do |extension, template_class|
|
68
47
|
new_mapping.register template_class, extension
|
69
48
|
end
|
@@ -73,6 +52,3 @@ module Hanami
|
|
73
52
|
end
|
74
53
|
end
|
75
54
|
end
|
76
|
-
|
77
|
-
require_relative "tilt/erb"
|
78
|
-
require_relative "tilt/haml"
|
data/lib/hanami/view/version.rb
CHANGED
data/lib/hanami/view.rb
CHANGED
@@ -1,20 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "dry/configurable"
|
4
|
-
require "dry/core/cache"
|
5
4
|
require "dry/core/equalizer"
|
6
5
|
require "dry/inflector"
|
6
|
+
require "zeitwerk"
|
7
7
|
|
8
|
-
require_relative "view/application_view"
|
9
|
-
require_relative "view/context"
|
10
|
-
require_relative "view/exposures"
|
11
8
|
require_relative "view/errors"
|
12
|
-
require_relative "view/
|
13
|
-
require_relative "view/path"
|
14
|
-
require_relative "view/render_environment"
|
15
|
-
require_relative "view/rendered"
|
16
|
-
require_relative "view/renderer"
|
17
|
-
require_relative "view/scope_builder"
|
9
|
+
require_relative "view/html"
|
18
10
|
|
19
11
|
module Hanami
|
20
12
|
# A standalone, template-based view rendering system that offers everything
|
@@ -31,13 +23,34 @@ module Hanami
|
|
31
23
|
#
|
32
24
|
# @api public
|
33
25
|
class View
|
26
|
+
# @since 2.1.0
|
27
|
+
# @api private
|
28
|
+
def self.gem_loader
|
29
|
+
@gem_loader ||= Zeitwerk::Loader.new.tap do |loader|
|
30
|
+
root = File.expand_path("..", __dir__)
|
31
|
+
loader.tag = "hanami-view"
|
32
|
+
loader.push_dir(root)
|
33
|
+
loader.ignore(
|
34
|
+
"#{root}/hanami-view.rb",
|
35
|
+
"#{root}/hanami/view/version.rb",
|
36
|
+
"#{root}/hanami/view/errors.rb",
|
37
|
+
)
|
38
|
+
loader.inflector = Zeitwerk::GemInflector.new("#{root}/hanami-view.rb")
|
39
|
+
loader.inflector.inflect(
|
40
|
+
"erb" => "ERB",
|
41
|
+
"html" => "HTML",
|
42
|
+
"html_safe_string_buffer" => "HTMLSafeStringBuffer",
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
gem_loader.setup
|
48
|
+
|
34
49
|
# @api private
|
35
50
|
DEFAULT_RENDERER_OPTIONS = {default_encoding: "utf-8"}.freeze
|
36
51
|
|
37
52
|
include Dry::Equalizer(:config, :exposures)
|
38
53
|
|
39
|
-
extend Dry::Core::Cache
|
40
|
-
|
41
54
|
extend Dry::Configurable
|
42
55
|
|
43
56
|
# @!group Configuration
|
@@ -142,6 +155,8 @@ module Hanami
|
|
142
155
|
# @!scope class
|
143
156
|
setting :default_format, default: :html
|
144
157
|
|
158
|
+
setting :part_class, default: Part
|
159
|
+
|
145
160
|
# @overload config.scope_namespace=(namespace)
|
146
161
|
# Set a namespace that will be searched when building scope classes.
|
147
162
|
#
|
@@ -163,6 +178,8 @@ module Hanami
|
|
163
178
|
# @!scope class
|
164
179
|
setting :part_builder, default: PartBuilder
|
165
180
|
|
181
|
+
setting :scope_class, default: Scope
|
182
|
+
|
166
183
|
# @overload config.scope_namespace=(namespace)
|
167
184
|
# Set a namespace that will be searched when building scope classes.
|
168
185
|
#
|
@@ -225,7 +242,7 @@ module Hanami
|
|
225
242
|
# @param mapping [Hash<Symbol, Class>] engine mapping
|
226
243
|
# @api public
|
227
244
|
# @!scope class
|
228
|
-
setting :renderer_engine_mapping
|
245
|
+
setting :renderer_engine_mapping, default: {}
|
229
246
|
|
230
247
|
# @!endgroup
|
231
248
|
|
@@ -451,78 +468,24 @@ module Hanami
|
|
451
468
|
# # <%= copyright(Time.now.utc) %>
|
452
469
|
#
|
453
470
|
# MyView.new.(message: "Hello") # => "HELLO!"
|
454
|
-
def self.scope(
|
455
|
-
config.scope
|
456
|
-
end
|
471
|
+
def self.scope(scope_class = nil, &block)
|
472
|
+
scope_class ||= config.scope || config.scope_class
|
457
473
|
|
458
|
-
|
459
|
-
|
460
|
-
# @!group Render environment
|
461
|
-
|
462
|
-
# Returns a render environment for the view and the given options. This
|
463
|
-
# environment isn't chdir'ed into any particular directory.
|
464
|
-
#
|
465
|
-
# @param format [Symbol] template format to use (defaults to the `default_format` setting)
|
466
|
-
# @param context [Context] context object to use (defaults to the `default_context` setting)
|
467
|
-
#
|
468
|
-
# @see View.template_env render environment for the view's template
|
469
|
-
# @see View.layout_env render environment for the view's layout
|
470
|
-
#
|
471
|
-
# @return [RenderEnvironment]
|
472
|
-
# @api public
|
473
|
-
def self.render_env(format: config.default_format, context: config.default_context)
|
474
|
-
RenderEnvironment.prepare(renderer(format), config, context)
|
474
|
+
config.scope = Class.new(scope_class, &block)
|
475
475
|
end
|
476
476
|
|
477
|
-
#
|
478
|
-
# Returns a render environment for the view and the given options,
|
479
|
-
# chdir'ed into the view's template directory. This is the environment
|
480
|
-
# used when rendering the template, and is useful to to fetch
|
481
|
-
# independently when unit testing Parts and Scopes.
|
482
|
-
#
|
483
|
-
# @param format [Symbol] template format to use (defaults to the `default_format` setting)
|
484
|
-
# @param context [Context] context object to use (defaults to the `default_context` setting)
|
485
|
-
#
|
486
|
-
# @return [RenderEnvironment]
|
487
|
-
# @api public
|
488
|
-
def self.template_env(**args)
|
489
|
-
render_env(**args).chdir(config.template)
|
490
|
-
end
|
491
|
-
|
492
|
-
# @overload layout_env(format: config.default_format, context: config.default_context)
|
493
|
-
# Returns a render environment for the view and the given options,
|
494
|
-
# chdir'ed into the view's layout directory. This is the environment used
|
495
|
-
# when rendering the view's layout.
|
496
|
-
#
|
497
|
-
# @param format [Symbol] template format to use (defaults to the `default_format` setting)
|
498
|
-
# @param context [Context] context object to use (defaults to the `default_context` setting)
|
499
|
-
#
|
500
|
-
# @return [RenderEnvironment] @api public
|
501
|
-
def self.layout_env(**args)
|
502
|
-
render_env(**args).chdir(layout_path)
|
503
|
-
end
|
477
|
+
# @!endgroup
|
504
478
|
|
505
|
-
# Returns renderer for the view and provided format
|
506
|
-
#
|
507
479
|
# @api private
|
508
|
-
def self.
|
509
|
-
|
510
|
-
Renderer.new(
|
511
|
-
config.paths,
|
512
|
-
format: format,
|
513
|
-
engine_mapping: config.renderer_engine_mapping,
|
514
|
-
**config.renderer_options
|
515
|
-
)
|
516
|
-
}
|
480
|
+
def self.layout_path(layout)
|
481
|
+
File.join(*[config.layouts_dir, layout].compact)
|
517
482
|
end
|
518
483
|
|
519
484
|
# @api private
|
520
|
-
def self.
|
521
|
-
|
485
|
+
def self.cache
|
486
|
+
Cache
|
522
487
|
end
|
523
488
|
|
524
|
-
# @!endgroup
|
525
|
-
|
526
489
|
# Returns an instance of the view. This binds the defined exposures to the
|
527
490
|
# view instance.
|
528
491
|
#
|
@@ -532,6 +495,9 @@ module Hanami
|
|
532
495
|
#
|
533
496
|
# @api public
|
534
497
|
def initialize
|
498
|
+
self.class.config.finalize!
|
499
|
+
ensure_config
|
500
|
+
|
535
501
|
@exposures = self.class.exposures.bind(self)
|
536
502
|
end
|
537
503
|
|
@@ -554,63 +520,56 @@ module Hanami
|
|
554
520
|
#
|
555
521
|
# @param format [Symbol] template format to use
|
556
522
|
# @param context [Context] context object to use
|
523
|
+
# @param layout [String, FalseClass, nil] layout name, or false to indicate no layout
|
557
524
|
# @param input input data for preparing exposure values
|
558
525
|
#
|
559
526
|
# @return [Rendered] rendered view object
|
560
527
|
# @api public
|
561
|
-
def call(format: config.default_format, context: config.default_context, **input)
|
562
|
-
|
563
|
-
|
564
|
-
env = self.class.render_env(format: format, context: context)
|
565
|
-
template_env = self.class.template_env(format: format, context: context)
|
528
|
+
def call(format: config.default_format, context: config.default_context, layout: config.layout, **input)
|
529
|
+
rendering = self.rendering(format: format, context: context)
|
566
530
|
|
567
|
-
locals = locals(
|
568
|
-
output =
|
531
|
+
locals = locals(rendering, input)
|
532
|
+
output = rendering.template(config.template, rendering.scope(config.scope, locals))
|
569
533
|
|
570
|
-
if layout
|
571
|
-
layout_env = self.class.layout_env(format: format, context: context)
|
534
|
+
if layout
|
572
535
|
begin
|
573
|
-
output =
|
574
|
-
self.class.layout_path,
|
575
|
-
|
536
|
+
output = rendering.template(
|
537
|
+
self.class.layout_path(layout),
|
538
|
+
rendering.scope(config.scope, layout_locals(locals))
|
576
539
|
) { output }
|
577
540
|
rescue TemplateNotFoundError
|
578
|
-
raise LayoutNotFoundError.new(
|
541
|
+
raise LayoutNotFoundError.new(layout, config.paths)
|
579
542
|
end
|
580
543
|
end
|
581
544
|
|
582
545
|
Rendered.new(output: output, locals: locals)
|
583
546
|
end
|
584
547
|
|
548
|
+
def rendering(format: config.default_format, context: config.default_context)
|
549
|
+
Rendering.new(config: config, format: format, context: context)
|
550
|
+
end
|
551
|
+
|
585
552
|
private
|
586
553
|
|
587
|
-
# @api private
|
588
554
|
def ensure_config
|
589
555
|
raise UndefinedConfigError, :paths unless Array(config.paths).any?
|
590
556
|
raise UndefinedConfigError, :template unless config.template
|
591
557
|
end
|
592
558
|
|
593
|
-
|
594
|
-
|
595
|
-
exposures.(context: render_env.context, **input) do |value, exposure|
|
559
|
+
def locals(rendering, input)
|
560
|
+
exposures.(context: rendering.context, **input) do |value, exposure|
|
596
561
|
if exposure.decorate? && value
|
597
|
-
|
562
|
+
rendering.part(exposure.name, value, as: exposure.options[:as])
|
598
563
|
else
|
599
564
|
value
|
600
565
|
end
|
601
566
|
end
|
602
567
|
end
|
603
568
|
|
604
|
-
# @api private
|
605
569
|
def layout_locals(locals)
|
606
570
|
locals.each_with_object({}) do |(key, value), layout_locals|
|
607
571
|
layout_locals[key] = value if exposures[key].for_layout?
|
608
572
|
end
|
609
573
|
end
|
610
|
-
|
611
|
-
# @api private
|
612
|
-
def layout?
|
613
|
-
!!config.layout # rubocop:disable Style/DoubleNegation
|
614
|
-
end
|
615
574
|
end
|
616
575
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-view
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Riley
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-10-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|
@@ -31,54 +31,68 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '0
|
35
|
-
- - ">="
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 0.13.0
|
34
|
+
version: '1.0'
|
38
35
|
type: :runtime
|
39
36
|
prerelease: false
|
40
37
|
version_requirements: !ruby/object:Gem::Requirement
|
41
38
|
requirements:
|
42
39
|
- - "~>"
|
43
40
|
- !ruby/object:Gem::Version
|
44
|
-
version: '0
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.13.0
|
41
|
+
version: '1.0'
|
48
42
|
- !ruby/object:Gem::Dependency
|
49
43
|
name: dry-core
|
50
44
|
requirement: !ruby/object:Gem::Requirement
|
51
45
|
requirements:
|
52
46
|
- - "~>"
|
53
47
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
55
|
-
|
48
|
+
version: '1.0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: dry-inflector
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
56
61
|
- !ruby/object:Gem::Version
|
57
|
-
version: '0
|
62
|
+
version: '1.0'
|
63
|
+
- - "<"
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '2'
|
58
66
|
type: :runtime
|
59
67
|
prerelease: false
|
60
68
|
version_requirements: !ruby/object:Gem::Requirement
|
61
69
|
requirements:
|
62
70
|
- - "~>"
|
63
71
|
- !ruby/object:Gem::Version
|
64
|
-
version: '0
|
65
|
-
- - "
|
72
|
+
version: '1.0'
|
73
|
+
- - "<"
|
66
74
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
75
|
+
version: '2'
|
68
76
|
- !ruby/object:Gem::Dependency
|
69
|
-
name:
|
77
|
+
name: temple
|
70
78
|
requirement: !ruby/object:Gem::Requirement
|
71
79
|
requirements:
|
72
80
|
- - "~>"
|
73
81
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
82
|
+
version: 0.10.0
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.10.2
|
75
86
|
type: :runtime
|
76
87
|
prerelease: false
|
77
88
|
version_requirements: !ruby/object:Gem::Requirement
|
78
89
|
requirements:
|
79
90
|
- - "~>"
|
80
91
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
92
|
+
version: 0.10.0
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.10.2
|
82
96
|
- !ruby/object:Gem::Dependency
|
83
97
|
name: tilt
|
84
98
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,6 +113,20 @@ dependencies:
|
|
99
113
|
- - ">="
|
100
114
|
- !ruby/object:Gem::Version
|
101
115
|
version: 2.0.6
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: zeitwerk
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "~>"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '2.6'
|
123
|
+
type: :runtime
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '2.6'
|
102
130
|
- !ruby/object:Gem::Dependency
|
103
131
|
name: bundler
|
104
132
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,31 +179,41 @@ extensions: []
|
|
151
179
|
extra_rdoc_files: []
|
152
180
|
files:
|
153
181
|
- CHANGELOG.md
|
154
|
-
- LICENSE
|
155
182
|
- README.md
|
156
183
|
- hanami-view.gemspec
|
157
184
|
- lib/hanami-view.rb
|
158
185
|
- lib/hanami/view.rb
|
159
186
|
- lib/hanami/view/application_view.rb
|
187
|
+
- lib/hanami/view/cache.rb
|
160
188
|
- lib/hanami/view/context.rb
|
161
189
|
- lib/hanami/view/context_helpers/content_helpers.rb
|
162
190
|
- lib/hanami/view/decorated_attributes.rb
|
191
|
+
- lib/hanami/view/erb/engine.rb
|
192
|
+
- lib/hanami/view/erb/filters/block.rb
|
193
|
+
- lib/hanami/view/erb/filters/trimming.rb
|
194
|
+
- lib/hanami/view/erb/parser.rb
|
195
|
+
- lib/hanami/view/erb/template.rb
|
163
196
|
- lib/hanami/view/errors.rb
|
164
197
|
- lib/hanami/view/exposure.rb
|
165
198
|
- lib/hanami/view/exposures.rb
|
199
|
+
- lib/hanami/view/helpers/escape_helper.rb
|
200
|
+
- lib/hanami/view/helpers/number_formatting_helper.rb
|
201
|
+
- lib/hanami/view/helpers/tag_helper.rb
|
202
|
+
- lib/hanami/view/helpers/tag_helper/tag_builder.rb
|
203
|
+
- lib/hanami/view/html.rb
|
204
|
+
- lib/hanami/view/html_safe_string_buffer.rb
|
166
205
|
- lib/hanami/view/part.rb
|
167
206
|
- lib/hanami/view/part_builder.rb
|
168
207
|
- lib/hanami/view/path.rb
|
169
|
-
- lib/hanami/view/render_environment.rb
|
170
|
-
- lib/hanami/view/render_environment_missing.rb
|
171
208
|
- lib/hanami/view/rendered.rb
|
172
209
|
- lib/hanami/view/renderer.rb
|
210
|
+
- lib/hanami/view/rendering.rb
|
211
|
+
- lib/hanami/view/rendering_missing.rb
|
173
212
|
- lib/hanami/view/scope.rb
|
174
213
|
- lib/hanami/view/scope_builder.rb
|
175
214
|
- lib/hanami/view/tilt.rb
|
176
|
-
- lib/hanami/view/tilt/
|
177
|
-
- lib/hanami/view/tilt/
|
178
|
-
- lib/hanami/view/tilt/haml.rb
|
215
|
+
- lib/hanami/view/tilt/haml_adapter.rb
|
216
|
+
- lib/hanami/view/tilt/slim_adapter.rb
|
179
217
|
- lib/hanami/view/version.rb
|
180
218
|
homepage: https://dry-rb.org/gems/hanami-view
|
181
219
|
licenses:
|
@@ -201,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
239
|
- !ruby/object:Gem::Version
|
202
240
|
version: 1.3.1
|
203
241
|
requirements: []
|
204
|
-
rubygems_version: 3.
|
242
|
+
rubygems_version: 3.4.13
|
205
243
|
signing_key:
|
206
244
|
specification_version: 4
|
207
245
|
summary: A complete, standalone view rendering system that gives you everything you
|
data/LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2015-2020 dry-rb team
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
-
this software and associated documentation files (the "Software"), to deal in
|
7
|
-
the Software without restriction, including without limitation the rights to
|
8
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
-
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
-
subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
-
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
-
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "dry/core/equalizer"
|
4
|
-
|
5
|
-
module Hanami
|
6
|
-
class View
|
7
|
-
# @api private
|
8
|
-
class RenderEnvironment
|
9
|
-
def self.prepare(renderer, config, context)
|
10
|
-
new(
|
11
|
-
renderer: renderer,
|
12
|
-
inflector: config.inflector,
|
13
|
-
context: context,
|
14
|
-
scope_builder: config.scope_builder.new(namespace: config.scope_namespace),
|
15
|
-
part_builder: config.part_builder.new(namespace: config.part_namespace)
|
16
|
-
)
|
17
|
-
end
|
18
|
-
|
19
|
-
include Dry::Equalizer(:renderer, :inflector, :context, :scope_builder, :part_builder)
|
20
|
-
|
21
|
-
attr_reader :renderer, :inflector, :context, :scope_builder, :part_builder
|
22
|
-
|
23
|
-
def initialize(renderer:, inflector:, context:, scope_builder:, part_builder:)
|
24
|
-
@renderer = renderer
|
25
|
-
@inflector = inflector
|
26
|
-
@context = context.for_render_env(self)
|
27
|
-
@scope_builder = scope_builder.for_render_env(self)
|
28
|
-
@part_builder = part_builder.for_render_env(self)
|
29
|
-
end
|
30
|
-
|
31
|
-
def format
|
32
|
-
renderer.format
|
33
|
-
end
|
34
|
-
|
35
|
-
def part(name, value, **options)
|
36
|
-
part_builder.(name, value, **options)
|
37
|
-
end
|
38
|
-
|
39
|
-
def scope(name = nil, locals) # rubocop:disable Style/OptionalArguments
|
40
|
-
scope_builder.(name, locals)
|
41
|
-
end
|
42
|
-
|
43
|
-
def template(name, scope, &block)
|
44
|
-
renderer.template(name, scope, &block)
|
45
|
-
end
|
46
|
-
|
47
|
-
def partial(name, scope, &block)
|
48
|
-
renderer.partial(name, scope, &block)
|
49
|
-
end
|
50
|
-
|
51
|
-
def chdir(dirname)
|
52
|
-
self.class.new(
|
53
|
-
renderer: renderer.chdir(dirname),
|
54
|
-
inflector: inflector,
|
55
|
-
context: context,
|
56
|
-
scope_builder: scope_builder,
|
57
|
-
part_builder: part_builder
|
58
|
-
)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
data/lib/hanami/view/tilt/erb.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Hanami
|
4
|
-
class View
|
5
|
-
module Tilt
|
6
|
-
module ERB
|
7
|
-
def self.requirements
|
8
|
-
["hanami/view/tilt/erbse", <<~ERROR]
|
9
|
-
hanami-view requires erbse for full compatibility when rendering .erb templates (e.g. implicitly capturing block content when yielding)
|
10
|
-
|
11
|
-
To ignore this and use another engine for .erb templates, deregister this adapter before calling your views:
|
12
|
-
|
13
|
-
Hanami::View::Tilt.deregister_adapter(:erb)
|
14
|
-
ERROR
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.activate
|
18
|
-
Tilt.default_mapping.register ErbseTemplate, "erb"
|
19
|
-
self
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
register_adapter :erb, ERB
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "tilt/template"
|
4
|
-
require "erbse"
|
5
|
-
|
6
|
-
module Hanami
|
7
|
-
class View
|
8
|
-
module Tilt
|
9
|
-
# Tilt template class copied from cells-erb gem
|
10
|
-
class ErbseTemplate < ::Tilt::Template
|
11
|
-
def prepare
|
12
|
-
@template = ::Erbse::Engine.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def precompiled_template(_locals)
|
16
|
-
@template.call(data)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|