papercraft 0.17 → 0.18

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: 31c80224c2a9dc3a6d594d923e9a16ccd8127284bce501f1d7f1dc25386bf25c
4
- data.tar.gz: 45dc43d353bc1f3c06e62d1b439751570ce7d46a915b0a72f1ce3ea182b0c225
3
+ metadata.gz: a887e5946cfe19b6874046cb4ef173a1de4deb11509ea4c7dca5c6434e0d710d
4
+ data.tar.gz: 3bdd374b54c72dac9f8137f5878cd43f0415c84eadebfef50fc90eb30029bf3b
5
5
  SHA512:
6
- metadata.gz: 67529d1336456dded5d911548941c1accc695bd017b889b378ed008e177707b100e11e90b1adbe887d45530cfb94950808e21257955999d795b388dbeb13206e
7
- data.tar.gz: 1caca448eb2a317b1616a529e82803f6571e26e8b0f36a19e771b2b4a9a96cabb8695ad5a01148acfa7481b016742e9c546c794fd2a9017ec54d299184d36c94
6
+ metadata.gz: 8d4a911c94bb39ab8da06e3f61a965a7db13725b143a2cf38feae44cbb1ac0ae0a8d79b899008a14c87d890ba5ebff61fb3616b5a2014bd84049da8af95a9029
7
+ data.tar.gz: fe798bfc67006d21e6bc62cfa32d50141720f44d0089d9da58b7b7406b8d1386e8f77d10f4a34863dad05968e0342acd9d94be68afeca98955189853b367a8e0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.18 2022-02-04
2
+
3
+ - Cleanup and update examples
4
+ - Fix behaviour of #emit with block
5
+ - Improve README
6
+
1
7
  ## 0.17 2022-01-23
2
8
 
3
9
  - Refactor markdown code, add `Papercraft.markdown` method (#8)
data/README.md CHANGED
@@ -24,35 +24,63 @@
24
24
 
25
25
  ## What is Papercraft?
26
26
 
27
+ Papercraft is a templating engine for dynamically producing HTML, XML or JSON.
28
+ Papercraft templates are expressed in plain Ruby, leading to easier debugging,
29
+ better protection against HTML/XML injection attacks, and better code reuse.
30
+
31
+ Papercraft templates can be composed in a variety of ways, facilitating the
32
+ usage of layout templates, and enabling a component-oriented approach to
33
+ building complex web interfaces.
34
+
35
+ In Papercraft, dynamic data is passed explicitly to the template as block
36
+ arguments, making the data flow easy to follow and understand. Papercraft also
37
+ lets developers create derivative templates using full or partial parameter
38
+ application.
39
+
40
+ Papercraft includes built-in support for rendering Markdown (using
41
+ [Kramdown](https://github.com/gettalong/kramdown/)), as well as support for
42
+ creating template extensions in order to allow the creation of component
43
+ libraries.
44
+
27
45
  ```ruby
28
46
  require 'papercraft'
29
47
 
30
48
  page = Papercraft.html { |*args|
31
49
  html {
32
- head { }
50
+ head { title 'Title' }
33
51
  body { emit_yield *args }
34
52
  }
35
53
  }
36
54
  page.render { p 'foo' }
37
- #=> "<html><head/><body><p>foo</p></body></html>"
55
+ #=> "<html><head><title>Title</title></head><body><p>foo</p></body></html>"
38
56
 
39
57
  hello = page.apply { |name| h1 "Hello, #{name}!" }
40
58
  hello.render('world')
41
- #=> "<html><head/><body><h1>Hello, world!</h1></body></html>"
42
- ```
43
-
44
- Papercraft is a templating engine for Ruby that offers the following features:
45
-
46
- - HTML, XML and JSON templating using plain Ruby syntax
47
- - Minimal boilerplate
48
- - Mix logic and tags freely
49
- - Automatic HTML and XML escaping
50
- - Composable components
51
- - Standard or custom MIME types
52
- - Explicit parameter passing to nested components
53
- - Higher order components
54
- - Built-in support for rendering [Markdown](#emitting-markdown)
55
- - Support for namespaced extensions
59
+ #=> "<html><head><title>Title</title></head><body><h1>Hello, world!</h1></body></html>"
60
+ ```
61
+
62
+ ## Table of content
63
+
64
+ - [Installing papercraft](#installing-papercraft)
65
+ - [Basic usage](#basic-usage)
66
+ - [Adding tags](#adding-tags)
67
+ - [Template parameters](#template-parameters)
68
+ - [Template logic](#template-logic)
69
+ - [Template blocks](#template-blocks)
70
+ - [Plain procs as templates](#plain-procs-as-templates)
71
+ - [Template composition](#template-composition)
72
+ - [Parameter and block application](#parameter-and-block-application)
73
+ - [Higher-order components](#higher-order-components)
74
+ - [Layout template composition](#layout-template-composition)
75
+ - [Emitting raw HTML](#emitting-raw-html)
76
+ - [Emitting a string with HTML Encoding](#emitting-a-string-with-html-encoding)
77
+ - [Emitting Markdown](#emitting-markdown)
78
+ - [Working with MIME types](#working-with-mime-types)
79
+ - [Deferred evaluation](#deferred-evaluation)
80
+ - [Papercraft extensions](#papercraft-extensions)
81
+ - [XML templates](#xml-templates)
82
+ - [JSON templates](#json-templates)
83
+ - [API Reference](#api-reference)
56
84
 
57
85
  ## Installing Papercraft
58
86
 
@@ -68,9 +96,9 @@ Or manually:
68
96
  $ gem install papercraft
69
97
  ```
70
98
 
71
- ## Getting started
99
+ ## Basic usage
72
100
 
73
- To create a template use the global method `Kernel#H`:
101
+ To create an HTML template use `Papercraft.html`:
74
102
 
75
103
  ```ruby
76
104
  require 'papercraft'
@@ -80,13 +108,16 @@ html = Papercraft.html {
80
108
  }
81
109
  ```
82
110
 
111
+ (You can also use `Papercraft.xml` and `Papercraft.json` to create XML and JSON
112
+ templates, respectively.)
113
+
83
114
  Rendering a template is done using `#render`:
84
115
 
85
116
  ```ruby
86
117
  html.render #=> "<div id="greeter"><p>Hello!</p></div>"
87
118
  ```
88
119
 
89
- ## All about tags
120
+ ## Adding tags
90
121
 
91
122
  Tags are added using unqualified method calls, and can be nested using blocks:
92
123
 
@@ -141,7 +172,7 @@ greeting = Papercraft.html { |name:| h1 "Hello, #{name}!" }
141
172
  greeting.render(name: 'world') #=> "<h1>Hello, world!</h1>"
142
173
  ```
143
174
 
144
- ## Logic in templates
175
+ ## Template logic
145
176
 
146
177
  Since Papercraft templates are just a bunch of Ruby, you can easily write your
147
178
  view logic right in the template:
@@ -171,10 +202,10 @@ page = Papercraft.html {
171
202
  page.render { h1 'hi' }
172
203
  ```
173
204
 
174
- ## Plain procs as components
205
+ ## Plain procs as templates
175
206
 
176
207
  With Papercraft you can write a template as a plain Ruby proc, and later render
177
- it by passing it as a block to `H`:
208
+ it by passing it as a block to `Papercraft.html`:
178
209
 
179
210
  ```ruby
180
211
  greeting = proc { |name| h1 "Hello, #{name}!" }
@@ -188,7 +219,7 @@ greeting = ->(name) { h1 "Hello, #{name}!" }
188
219
  Papercraft.html(&greeting).render('world')
189
220
  ```
190
221
 
191
- ## Component composition
222
+ ## Template composition
192
223
 
193
224
  Papercraft makes it easy to compose multiple components into a whole HTML
194
225
  document. A Papercraft component can contain other components, as the following
@@ -384,6 +415,22 @@ The deafult options can be configured by accessing
384
415
  Papercraft.default_kramdown_options[:auto_ids] = false
385
416
  ```
386
417
 
418
+ ## Working with MIME types
419
+
420
+ Papercraft lets you set and interrogate a template's MIME type, in order to be
421
+ able to dynamically set the `Content-Type` HTTP response header. A template's
422
+ MIME type can be set when creating the template, e.g. `Papercraft.xml(mime_type:
423
+ 'application/rss+xml')`. You can interrogate the template's MIME type using
424
+ `#mime_type`:
425
+
426
+ ```ruby
427
+ # using Qeweney (https://github.com/digital-fabric/qeweney)
428
+ def serve_template(req, template)
429
+ body = template.render
430
+ respond(body, 'Content-Type' => template.mime_type)
431
+ end
432
+ ```
433
+
387
434
  ## Deferred evaluation
388
435
 
389
436
  Deferred evaluation allows deferring the rendering of parts of a template until
@@ -502,11 +549,47 @@ Papercraft.html {
502
549
  }
503
550
  ```
504
551
 
505
- ## JSON templating
506
552
 
507
- You can create a JSON template using the same API used for HTML and XML
508
- templating. The only difference is that for adding array items you'll need to
509
- use the `#item` method:
553
+
554
+ ## XML templates
555
+
556
+ XML templates behave largely the same as HTML templates, with a few minor
557
+ differences. XML templates employ a different encoding algorithm, and lack some
558
+ specific HTML functionality, such as emitting Markdown.
559
+
560
+ Here's an example showing how to create an RSS feed:
561
+
562
+ ```ruby
563
+ rss = Papercraft.xml(mime_type: 'text/xml; charset=utf-8') { |resource:, **props|
564
+ rss(version: '2.0', 'xmlns:atom' => 'http://www.w3.org/2005/Atom') {
565
+ channel {
566
+ title 'Noteflakes'
567
+ link 'https://noteflakes.com/'
568
+ description 'A website by Sharon Rosner'
569
+ language 'en-us'
570
+ pubDate Time.now.httpdate
571
+ emit '<atom:link href="https://noteflakes.com/feeds/rss" rel="self" type="application/rss+xml" />'
572
+
573
+ article_entries = resource.page_list('/articles').reverse
574
+
575
+ article_entries.each { |e|
576
+ item {
577
+ title e[:title]
578
+ link "https://noteflakes.com#{e[:url]}"
579
+ guid "https://noteflakes.com#{e[:url]}"
580
+ pubDate e[:date].to_time.httpdate
581
+ description e[:html_content]
582
+ }
583
+ }
584
+ }
585
+ }
586
+ }
587
+ ```
588
+
589
+ ## JSON templates
590
+
591
+ JSON templates behave largely the same as HTML and XML templates. The only major
592
+ difference is that for adding array items you'll need to use the `#item` method:
510
593
 
511
594
  ```ruby
512
595
  Papercraft.json {
@@ -531,7 +614,8 @@ Papercraft.json {
531
614
  }.render #=> "{\"foo\":{\"bar\":[null,true,123.456]}}"
532
615
  ```
533
616
 
534
- Papercraft uses the [JSON gem](https://rubyapi.org/3.1/o/json) under the hood.
617
+ Papercraft uses the [JSON gem](https://rubyapi.org/3.1/o/json) under the hood in
618
+ order to generate actual JSON.
535
619
 
536
620
  ## API Reference
537
621
 
@@ -223,10 +223,11 @@ module Papercraft
223
223
  # @param *a [Array<any>] arguments to pass to a proc
224
224
  # @param **b [Hash] named arguments to pass to a proc
225
225
  # @return [void]
226
- def emit(o, *a, **b)
226
+ def emit(o, *a, **b, &block)
227
227
  case o
228
228
  when ::Proc
229
229
  Renderer.verify_proc_parameters(o, a, b)
230
+ push_emit_yield_block(block) if block
230
231
  instance_exec(*a, **b, &o)
231
232
  when nil
232
233
  else
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Papercraft
4
- VERSION = '0.17'
4
+ VERSION = '0.18'
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.17'
4
+ version: '0.18'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-23 00:00:00.000000000 Z
11
+ date: 2022-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils