papercraft 0.8.1 → 0.8.2

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: 944fb4023202a5fb15158b4dcd455eb12f37c5abff353f5ea63e3b605204f52b
4
- data.tar.gz: 618aea8b154aff252af187bca43cdc569fae80a6c7a3ec6489b168d61a5ab7e4
3
+ metadata.gz: 309174da790e301142b03cc8aad3e966c6b1482d514da8d3910c2e84f6981af6
4
+ data.tar.gz: 64fb5b791fce05c0347ba21ccf70160323f70ad708ece9c14222b8544efdf8e0
5
5
  SHA512:
6
- metadata.gz: d622166425334b096158ee425e75f4e4ad9c16c466db5aa7f45b51774137def33b4e4f891425bc917ee56b81fb91e39adc15c6f2476e009f3a4be4a73b295c74
7
- data.tar.gz: 8546f39f7f6b08cc49049fae52db77891f7664b6ac6d8bce9c0a1a41f19bc0f8a92c59909ab4778cf15d6ef958f756bc6b6f392aa0c028a8d9ddd54bbee67afa
6
+ metadata.gz: d1f56c25e4854cb6b0ffce1d149d831d51d4141159a44fd6a962c27d9e0878b33e9438d9ad621c0c30a42dfa853b96a26b20c6ebe42243844be2b42d4e2901ef
7
+ data.tar.gz: 46952658d3e237f784cfd9b608c82b001fdd188b788c931f0a1a3669d5800d8ed3ef89623f88ff9a617237fbfbbd3a0f9f5b30bfc693b2e6f0b5659f66afa41b
@@ -3,13 +3,14 @@
3
3
  require_relative './html'
4
4
 
5
5
  module Papercraft
6
+
6
7
  # Component represents a distinct, reusable HTML template. A component can
7
8
  # include other components, and also be nested inside other components.
8
9
  #
9
10
  # Since in Papercraft HTML is expressed using blocks (or procs,) the Component
10
11
  # class is simply a special kind of Proc, which has some enhanced
11
12
  # capabilities, allowing it to be easily composed in a variety of ways.
12
-
13
+ #
13
14
  # Components are usually created using the global methods `H` or `X`, for HTML
14
15
  # or XML templates, respectively:
15
16
  #
@@ -23,9 +24,64 @@ module Papercraft
23
24
  #
24
25
  # In the component block, HTML elements are created by simply calling
25
26
  # unqualified methods:
27
+ #
28
+ # page_layout = H { html5 { head { title 'foo'
29
+ # }
30
+ # body {
31
+ # h1 "Hello, world!"
32
+ # }
33
+ # }
34
+ # }
35
+ #
36
+ # Papercraft components can take explicit parameters in order to render
37
+ # dynamic content. This can be in the form of regular or named parameters. The
38
+ # `greeter` template shown above takes a single `name` parameter. Here's how a
39
+ # anchor component could be implemented with named parameters:
40
+ #
41
+ # anchor = H { |uri: , text: | a(text, href: uri) }
42
+ #
43
+ # The above component could later be rendered by passing the needed arguments:
44
+ #
45
+ # anchor.render(uri: 'https://example.com', text: 'Example')
46
+ #
47
+ # ## Component Composition
48
+ #
49
+ # A component can be included in another component using the `emit` method:
50
+ #
51
+ # links = H {
52
+ # emit anchor, uri: '/posts', text: 'Posts'
53
+ # emit anchor, uri: '/archive', text: 'Archive'
54
+ # emit anchor, uri: '/about', text: 'About'
55
+ # }
56
+ #
57
+ # Another way of composing components is to pass the components themselves as
58
+ # parameters:
59
+ #
60
+ # links = H { |anchors|
61
+ # anchors.each { |a| emit a }
62
+ # }
63
+ # links.render([
64
+ # anchor.apply(uri: '/posts', text: 'Posts'),
65
+ # anchor.apply(uri: '/archive', text: 'Archive'),
66
+ # anchor.apply(uri: '/about', text: 'About')
67
+ # ])
68
+ #
69
+ # The `#apply` method creates a new component, applying the given parameters
70
+ # such that the component can be rendered without parameters:
71
+ #
72
+ # links_with_anchors = links.apply([
73
+ # anchor.apply(uri: '/posts', text: 'Posts'),
74
+ # anchor.apply(uri: '/archive', text: 'Archive'),
75
+ # anchor.apply(uri: '/about', text: 'About')
76
+ # ])
77
+ # links_with_anchors.render
26
78
  class Component < Proc
27
- # Initializes a component with the given block
28
- # @param mode [Symbol] local context
79
+
80
+ # Initializes a component with the given block. The rendering mode (HTML or
81
+ # XML) can be passed in the `mode:` parameter. If `mode:` is not specified,
82
+ # the component defaults to HTML.
83
+ #
84
+ # @param mode [:html, :xml] rendering mode
29
85
  # @param block [Proc] nested HTML block
30
86
  def initialize(mode: :html, &block)
31
87
  @mode = mode
@@ -34,7 +90,9 @@ module Papercraft
34
90
 
35
91
  H_EMPTY = {}.freeze
36
92
 
37
- # Renders the associated block and returns the string result
93
+ # Renders the template with the given parameters and or block, and returns
94
+ # the string result.
95
+ #
38
96
  # @param context [Hash] context
39
97
  # @return [String]
40
98
  def render(*a, **b, &block)
@@ -51,6 +109,24 @@ module Papercraft
51
109
  raise Papercraft::Error, e.message
52
110
  end
53
111
 
112
+ # Creates a new component, applying the given parameters and or block to the
113
+ # current one. Application is one of the principal methods of composing
114
+ # components, particularly when passing inner components as blocks:
115
+ #
116
+ # article_wrapper = H {
117
+ # article {
118
+ # emit_yield
119
+ # }
120
+ # }
121
+ # wrapped_article = article_wrapper.apply {
122
+ # h1 'Article title'
123
+ # }
124
+ # wrapped_article.render #=> "<article><h1>Article title</h1></article>"
125
+ #
126
+ # @param *a [<any>] normal parameters
127
+ # @param **b [Hash] named parameters
128
+ # @param &block [Proc] inner block
129
+ # @return [Papercraft::Component] applied component
54
130
  def apply(*a, **b, &block)
55
131
  template = self
56
132
  if block
@@ -64,6 +140,10 @@ module Papercraft
64
140
  end
65
141
  end
66
142
 
143
+ # Returns the Renderer class used for rendering the templates, according to
144
+ # the component's mode.
145
+ #
146
+ # @return [Papercraft::Renderer] Renderer used for rendering the component
67
147
  def renderer_class
68
148
  case @mode
69
149
  when :html
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Papercraft
4
- VERSION = '0.8.1'
4
+ VERSION = '0.8.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: papercraft
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-22 00:00:00.000000000 Z
11
+ date: 2021-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils