roda-tags 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ebccb23d95fa9ec3d66cc17bb37eff691b99636d
4
+ data.tar.gz: d818548ad0699a72f7683d6d536f3c77f21aeb4b
5
+ SHA512:
6
+ metadata.gz: e4c391ba728a0dc9848d143591ccb9f64bccb735176992519ee689b1922f8d45bfe9c7a49591e11b511603ff924a6a7806931fd1be947eaf77c622d6b5ef8e66
7
+ data.tar.gz: b1b41384c842744c45483715e3fda84455dda1c17db71e5757ae92802d708c404007ffe973efb71ad200391c748fcb3b58c50773987701a0cded46dc9354e89f
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.3
@@ -0,0 +1,24 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute
4
+ through reporting issues, posting feature requests, updating documentation, submitting pull
5
+ requests or patches, and other activities.
6
+
7
+ We are committed to making participation in this project a harassment-free experience for everyone,
8
+ regardless of level of experience, gender, gender identity and expression, sexual orientation,
9
+ disability, personal appearance, body size, race, ethnicity, age, or religion.
10
+
11
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery,
12
+ derogatory comments or personal attacks, trolling, public or private harassment, insults, or other
13
+ unprofessional conduct.
14
+
15
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits,
16
+ code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct.
17
+ Project maintainers who do not follow the Code of Conduct may be removed from the project team.
18
+
19
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an
20
+ issue or contacting one or more of the project maintainers.
21
+
22
+ This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org),
23
+ version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
24
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in roda-tags.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Kematzy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all 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,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,1083 @@
1
+ # Roda::Tags
2
+
3
+ A [Roda](http://roda.jeremyevans.net/) plugin providing easy creation of flexible HTML tags within Roda apps or Roda plugins.
4
+
5
+ Extensively tested and with 100% code test coverage.
6
+
7
+
8
+ ## Installation
9
+
10
+ To use this gem, just do
11
+
12
+ ```bash
13
+ $ (sudo) gem install roda-tags
14
+ ```
15
+
16
+ or preferably add this to your Gemfile for Bundler
17
+
18
+
19
+ ```ruby
20
+ gem 'roda-tags'
21
+ ```
22
+
23
+ <br>
24
+
25
+ ## Getting Started
26
+
27
+ To use Roda::Tags just ensure the gem is included in the Gemfile and then...
28
+
29
+ ...add the plugin to your app...
30
+
31
+ ```bash
32
+ class MyApp < Roda
33
+
34
+ plugin :tags # see Configurations below for options
35
+ # or
36
+ plugin :tag_helpers # , options
37
+
38
+ # <snip...>
39
+ end
40
+ ```
41
+
42
+ ...or include the plugin in your own Roda plugin.
43
+
44
+ ```ruby
45
+ class Roda
46
+ module RodaPlugins
47
+ module YourPlugin
48
+
49
+ def self.load_dependencies(app, opts={})
50
+ app.plugin :tags, opts
51
+ # or
52
+ app.plugin :tag_helpers, opts
53
+ end
54
+
55
+ # <snip...>
56
+ end
57
+ end
58
+ end
59
+ ```
60
+ <br>
61
+
62
+ ## Usage
63
+
64
+
65
+
66
+ <br>
67
+
68
+ ## Key Methods / Functionality
69
+
70
+
71
+ <br>
72
+
73
+
74
+ Roda::Tags contains two plugins - [`:tags`, `:tag_helpers`] - that can be used independently or together.
75
+
76
+ **Note!** The `:tags` plugin is loaded by the `:tag_helpers` plugin.
77
+
78
+ <br>
79
+
80
+ ## 1. `:tags` Plugin
81
+
82
+
83
+ This plugin have one **key public method** - `tag()`, which supports this **dynamic** syntax:
84
+
85
+
86
+ ### -- `tag(*args, &block)`
87
+
88
+
89
+ ```ruby
90
+ tag(name)
91
+ tag(name, &block)
92
+
93
+ tag(name, content)
94
+ tag(name, content, attributes)
95
+ tag(name, content, attributes, &block)
96
+
97
+ tag(name, attributes)
98
+ tag(name, attributes, &block)
99
+ ```
100
+
101
+ This makes the method very flexible as can be seen below.
102
+
103
+
104
+ #### Self closing tags
105
+
106
+ ```ruby
107
+ tag(:br) #=> <br> or <br/> if XHTML
108
+
109
+ tag(:hr, class: :divider) #=> <hr class="divider">
110
+ ```
111
+
112
+ #### Multi line tags
113
+
114
+ ```ruby
115
+ tag(:div) #=> <div></div>
116
+
117
+ tag(:div, 'content')
118
+ # <div>
119
+ # content
120
+ # </div>
121
+
122
+ tag(:div, 'content', id: 'comment')
123
+ # <div id="comment">
124
+ # content
125
+ # </div>
126
+
127
+
128
+ # NB! no content
129
+ tag(:div, id: :comment)
130
+ #=> <div id="comment"></div>
131
+
132
+ ```
133
+
134
+ #### Single line tags
135
+
136
+ ```ruby
137
+ tag(:h1,'Header') #=> <h1>Header</h1>
138
+
139
+ tag(:abbr, 'UN', title: "United Nations") #=> <abbr title="United Nations">UN</abbr>
140
+ ```
141
+
142
+ #### Working with blocks
143
+
144
+ ```ruby
145
+ tag(:div) do
146
+ tag(:p, 'Hello World')
147
+ end
148
+ # <div>
149
+ # <p>Hello World</p>
150
+ # </div>
151
+
152
+
153
+ <% tag(:ul) do %>
154
+ <li>item 1</li>
155
+ <%= tag(:li, 'item 2') %>
156
+ <li>item 3</li>
157
+ <% end %>
158
+ # <ul>
159
+ # <li>item 1</li>
160
+ # <li>item 2</li>
161
+ # <li>item 3</li>
162
+ # </ul>
163
+
164
+
165
+ # NOTE: ignores tag contents when given a block
166
+ <% tag(:div, 'ignored tag-content') do %>
167
+ <%= tag(:label, 'Comments:', for: :comments) %>
168
+ <%= tag(:textarea,'textarea contents', id: :comments) %>
169
+ <% end %>
170
+ # <div>
171
+ # <label for="comments">Comments:</label>
172
+ # <textarea id="comments">
173
+ # textarea contents
174
+ # </textarea>
175
+ # </div>
176
+ ```
177
+
178
+
179
+ #### Boolean attributes
180
+
181
+ ```ruby
182
+ tag(:input, type: :checkbox, checked: true)
183
+ #=> <input checked="checked" type="checkbox">
184
+
185
+ tag(:option, 'Roda', value: "1" selected: true)
186
+ #=> <option selected="selected" value="1">Roda</option>
187
+
188
+ tag(:option, 'PHP', value: "0" selected: false)
189
+ #=> <option value="0">PHP</option>
190
+ ```
191
+
192
+ <br>
193
+
194
+ The plugin also have a few other public helper methods:
195
+
196
+
197
+ ### -- `merge_attr_classes(attr, *classes)`
198
+
199
+ Updates `attr[:class]` in the hash with the given `classes` and returns `attr`.
200
+
201
+ ```ruby
202
+ attr = { class: 'alert', id: :idval }
203
+
204
+ merge_attr_classes(attr, 'alert-info')
205
+ #=> { class: 'alert alert-info', id: :idval }
206
+
207
+ merge_attr_classes(attr, [:alert, 'alert-info'])
208
+ #=> { class: 'alert alert-info', id: :idval }
209
+ ```
210
+
211
+ <br>
212
+
213
+
214
+
215
+ ### -- `merge_classes(*classes)`
216
+
217
+ Returns an alphabetised string from all given class values.
218
+
219
+ The method correctly handles a combination of `arrays`, `strings` & `symbols` being passed in.
220
+
221
+ ```ruby
222
+ attr = { class: 'alert', id: :idval }
223
+
224
+ merge_classes(attr[:class], ['alert', 'alert-info']) #=> 'alert alert-info'
225
+
226
+ merge_classes(attr[:class], :text) #=> 'alert text'
227
+
228
+ merge_classes(attr[:class], [:text, :'alert-info']) #=> 'alert alert-info text'
229
+ ```
230
+
231
+ <br>
232
+
233
+ ### Included Helper methods
234
+
235
+ The `:tags` plugin also includes a few useful public helper methods for use within other methods or gems.
236
+
237
+
238
+ ### -- `capture(block='')`
239
+
240
+ Captures and returns a captured `ERB` block and restores the buffer afterwards.
241
+
242
+ <br>
243
+
244
+
245
+ ### -- `capture_html(*args, &block)`
246
+
247
+ Captures the HTML from a block of template code for `ERB` or `HAML`.
248
+
249
+ ```ruby
250
+ def some_method(*args, &block)
251
+ # <snip...>
252
+ res = capture_html(&block)
253
+ # <snip...>
254
+ end
255
+ ```
256
+
257
+ <br>
258
+
259
+
260
+ ### -- `concat_content(text="")`
261
+
262
+ Outputs the given content to the buffer directly.
263
+
264
+ ```ruby
265
+ concat_content("This will be concatenated to the buffer")
266
+ ```
267
+
268
+ <br>
269
+
270
+
271
+ ### -- `block_is_template?(block)`
272
+
273
+ Returns `true` if the block is from an `ERB` or `HAML` template; `false` otherwise. Used to determine if contents should be returned or concatenated to output.
274
+
275
+ <br>
276
+
277
+ ---
278
+
279
+ <br>
280
+
281
+
282
+ ## 2. `:tag_helpers` Plugin
283
+
284
+ <br>
285
+
286
+ #### -- `form_tag(action, attrs={}, &block)`
287
+
288
+ Constructs a `<form>` without an object based on options passed.
289
+
290
+ ```ruby
291
+ form_tag('/register') do
292
+ ...
293
+ end
294
+ # <form action="/register" id="register-form" method="post">
295
+ # ...
296
+ # </form>
297
+ ```
298
+ Automatically adds a hidden *faux method* when `:method` is NOT either `POST` or `GET`.
299
+
300
+ ```ruby
301
+ form_tag('/user/1/profile', method: :put, id: 'profile-form')
302
+ ...
303
+ end
304
+ # <form action="/user/1/profile" id="profile-form" method="post" >
305
+ # <input name="_method" type="hidden" value="put"/>
306
+ # ...
307
+ # </form>
308
+ ```
309
+
310
+ Add multipart support via:
311
+
312
+ ```ruby
313
+ form_tag('/upload', multipart: true)
314
+ # or
315
+ form_tag('/upload', multipart: 'multipart/form-data')
316
+ # or
317
+ form_tag('/upload', enctype: 'multipart/form-data')
318
+ # <form enctype="multipart/form-data" method="post" action="/upload">
319
+ # ...
320
+ # </form>
321
+ ```
322
+
323
+ <br>
324
+ ---
325
+
326
+
327
+ ### -- `label_tag(field, attrs={}, &block)`
328
+
329
+ Constructs a `<label>` tag from the given options.
330
+
331
+
332
+ By default appends `':'` to the label name, based upon the plugin config `:tags_label_append ` value.
333
+
334
+ ```ruby
335
+ label_tag(:name)
336
+ #=> <label for="name">Name:</label>
337
+
338
+ label_tag(:name, label: 'Custom label', class: 'sr-only')
339
+ #=> <label class="sr-only" for="name">Custom label:</label>
340
+
341
+ # uses a humanized version of the label name if { label: nil }
342
+ label_tag(:name, label: nil)
343
+ #=> <label for="name">Name:</label>
344
+
345
+ # removes the label text when { label: :false }
346
+ label_tag(:name, label: false)
347
+ #=> <label for="name"></label>
348
+ ```
349
+
350
+ By default adds `'<span>*</span>'` to the label name when `{ required: true }` is passed. Based upon the plugin config `:tags_label_required_str ` value.
351
+
352
+
353
+ ```ruby
354
+ label_tag(:name, required: true)
355
+ #=> <label for="name">Name: <span>*</span></label>
356
+ ```
357
+
358
+ Label tags also supports passing blocks.
359
+
360
+ ```ruby
361
+ <% label_tag(:remember_me) do %>
362
+ <%= checkbox_tag :remember_me %>
363
+ <% end %>
364
+ # <label for="remember_me">Remember Me:
365
+ # <input class="checkbox" id="remember_me" name="remember_me" type="checkbox" value="1">
366
+ # </label>
367
+ ```
368
+
369
+
370
+ <br>
371
+ ---
372
+
373
+ ### -- `hidden_field_tag(name, attrs={})`
374
+
375
+
376
+ Constructs a hidden input field from the given options. Only `[:value, :id, :name]` attributes are allowed.
377
+
378
+
379
+ ```ruby
380
+ hidden_field_tag(:snippet_name)
381
+ #=> <input id="snippet_name" name="snippet_name" type="hidden">
382
+
383
+ hidden_field_tag(:csrf, value: 'tokenval')
384
+ #=> <input id="csrf" name="csrf" type="hidden" value="tokenval">
385
+
386
+ hidden_field_tag(:snippet_id, id: 'some-id')
387
+ #=> <input id="some-id" name="snippet_id" type="hidden">
388
+
389
+ # removing the `:id` attribute completely.
390
+ hidden_field_tag(:snippet_name, id: false)
391
+ #=> <input name="snippet_name" type="hidden">
392
+ ```
393
+
394
+ <br>
395
+ ---
396
+
397
+ ### -- `text_field_tag(name, attrs={}) `
398
+ &nbsp; - *also aliased as* `textfield_tag()`
399
+
400
+ Creates a standard `<input type="text"...>` field from the given options.
401
+
402
+ ```ruby
403
+ text_field_tag(:snippet_name)
404
+ #=> <input class="text" id="snippet_name" name="snippet_name" type="text">
405
+
406
+ text_field_tag(:name, value: 'some-value')
407
+ #=> <input class="text" id="name" name="name" type="text" value="some-value">
408
+
409
+ text_field_tag(:name, id: 'some-id')
410
+ #=> <input class="text" id="some-id" name="name" type="text">
411
+
412
+ # removing the `:id` attribute completely. NB! bad practice.
413
+ text_field_tag(:name, id: false)
414
+ #=> <input class="text" name="name" type="text">
415
+
416
+ # append a CSS class to the existing class.
417
+ text_field_tag(:name, class: :big)
418
+ #=> <input class="big text" id="name" name="name" type="text">
419
+
420
+ # adds a `:title` attribute when passed `:ui_hint`
421
+ text_field_tag(:name, ui_hint: 'a user hint')
422
+ #=> <input class="text" id="name" name="name" title="a user hint" type="text">
423
+
424
+ # supports `:maxlength` & `:size` attributes
425
+ text_field_tag(:ip, maxlength: 15, size: 20)
426
+ #=> <input class="text" id="ip" maxlength="15" name="ip" size="20" type="text">
427
+
428
+ # `:disabled` attribute
429
+ text_field_tag(:name, disabled: true)
430
+ #=> <input class="text" disabled="disabled" id="name" name="name" type="text">
431
+
432
+ # `:readonly` attribute
433
+ text_field_tag(:name, readonly: true)
434
+ #=> <input class="text" id="name" name="name" readonly="readonly" type="text">
435
+ ```
436
+
437
+ <br>
438
+ ---
439
+
440
+ ### -- `password_field_tag(name, attrs={})`
441
+ &nbsp; - *also aliased as* `passwordfield_tag()`
442
+
443
+ Constructs a `<input type="password"...>` field from the given options.
444
+
445
+ ```ruby
446
+ password_field_tag(:snippet_name)
447
+ #=> <input class="text" id="snippet_name" name="snippet_name" type="password">
448
+
449
+ password_field_tag(:snippet_name, value: 'some-value')
450
+ #=> <input class="text" id="snippet_name" name="snippet_name" type="password" value="some-value">
451
+
452
+ password_field_tag(:snippet_name, id: 'some-id')
453
+ #=> <input class="text" id="some-id" name="snippet_name" type="password">
454
+
455
+ password_field_tag(:snippet_name, id: false)
456
+ #=> <input class="text" name="snippet_name" type="password">
457
+
458
+ # append a CSS class to the existing class. Default class: `.text`.
459
+ password_field_tag(:snippet_name, class: :big )
460
+ #=> <input class="big text" id="snippet_name" name="snippet_name" type="password">
461
+
462
+ # adds a `:title` attribute when passed `:ui_hint`
463
+ password_field_tag(:name, ui_hint: 'a user hint')
464
+ #=> <input class="text" id="name" name="name" title="a user hint" type="password">
465
+
466
+ # supports `:maxlength` & `:size` attributes
467
+ password_field_tag(:ip_address, maxlength: 15, size: 20)
468
+ #=> <input class="text" id="ip_address" maxlength="15" name="ip_address" size="20" type="password">
469
+
470
+ # `disabled` attribute
471
+ password_field_tag(:name, disabled: true)
472
+ password_field_tag(:name, disabled: :disabled)
473
+ #=> <input class="text" id="name" disabled="disabled" name="name" type="password">
474
+ ```
475
+
476
+ <br>
477
+ ---
478
+
479
+
480
+ ### -- `file_field_tag(name, attrs={})`
481
+ &nbsp; - *also aliased as* `filefield_tag()`
482
+
483
+ Creates an `<input type="file"...>` field from given options.
484
+
485
+ **NOTE!** If you are using file uploads then you will also need to set the multipart option for the form tag, like this:
486
+
487
+ ```ruby
488
+ <% form_tag('/upload', multipart: true) do %>
489
+ <%= label_tag(:file, label: "File to Upload") %>
490
+ <%= file_field_tag "file" %>
491
+ <%= submit_tag %>
492
+ <% end %>
493
+ ```
494
+
495
+ The specified URL will then be passed a File object containing the selected file, or if the field was left blank, a StringIO object.
496
+
497
+
498
+ ```ruby
499
+ file_field_tag('attachment')
500
+ #=> <input class="file" id="attachment" name="attachment" type="file">
501
+
502
+ # ignores invalid :value attribute.
503
+ file_field_tag(:photo, value: 'some-value')
504
+ #=> <input class="file" id="photo" name="photo" type="file">
505
+
506
+ file_field_tag(:photo, id: 'some-id')
507
+ #=> <input class="file" id="some-id" name="photo" type="file">
508
+
509
+ # removing the `:id` attribute completely. NB! bad practice.
510
+ file_field_tag(:photo, id: false)
511
+ #=> <input class="file" name="photo" type="file">
512
+
513
+ # append a CSS class to the existing class. Default class: `.file`.
514
+ file_field_tag(:photo, class: :big )
515
+ #=> <input class="big file" id="photo" name="photo" type="file">
516
+
517
+ # adds a `:title` attribute when passed `:ui_hint`.
518
+ file_field_tag(:photo, ui_hint: 'a user hint')
519
+ #=> <input class="file" id="photo" name="photo" title="a user hint" type="file">
520
+
521
+ # `:disabled` attribute
522
+ file_field_tag(:photo, disabled: true)
523
+ #=> <input class="file" disabled="disabled" id="photo" name="photo" type="file">
524
+
525
+ # `:accept` attribute is subject to actual browser support.
526
+ file_field_tag(:photo, accept: 'image/png,image/jpeg' )
527
+ #=> <input accept="image/png,image/jpeg" class="file" id="photo" name="photo" type="file">
528
+ ```
529
+
530
+ <br>
531
+ ---
532
+
533
+
534
+ ### -- `textarea_tag(name, attrs={})`
535
+ &nbsp; - *also aliased as* `text_area_tag()`
536
+
537
+ Constructs a textarea input from the given options.
538
+
539
+ **TODO:** enable :escape functionality. How??
540
+
541
+ * `:escape` - By default, the contents of the text input are HTML escaped. If you need unescaped contents, set this to false.
542
+
543
+
544
+ ```ruby
545
+ textarea_tag('post')
546
+ #=> <textarea id="post" name="post">\n</textarea>
547
+
548
+ # add a value
549
+ textarea_tag(:bio, value: @actor.bio)
550
+ #=> <textarea id="bio" name="bio">This is my biography.\n</textarea>
551
+
552
+ # set a different :id
553
+ textarea_tag(:body, id: 'some-id')
554
+ #=> <textarea id="some-id" name="post">...</textarea>
555
+
556
+ # adds a CSS class. NB! :textarea have no default class.
557
+ textarea_tag(:body, class: 'big')
558
+ #=> <textarea class="big" id="post" name="post">...</textarea>
559
+
560
+ # adds a `:title` attribute when passed `:ui_hint`
561
+ textarea_tag(:body, ui_hint: 'a user hint')
562
+ #=> <textarea id="post" name="post" title="a user hint">...</textarea>
563
+
564
+ # supports `:rows` & `:cols` attributes
565
+ textarea_tag('body', rows: 10, cols: 25)
566
+ #=> <textarea cols="25" id="body" name="body" rows="10">...</textarea>
567
+
568
+ # alternative `:size` shortcut to set `:rows` & `:cols`
569
+ textarea_tag('body', size: "25x10")
570
+ #=> <textarea cols="25" id="body" name="body" rows="10">...</textarea>
571
+
572
+ # `:disabled` attribute
573
+ textarea_tag(:description, disabled: true)
574
+ #=> <textarea disabled="disabled" id="description" name="description">...</textarea>
575
+
576
+ # `:readonly` attribute
577
+ textarea_tag(:description, readonly: true)
578
+ #=> <textarea id="description" name="description" readonly="readonly">...</textarea>
579
+ ```
580
+
581
+ <br>
582
+ ---
583
+
584
+ ### -- `field_set_tag(*args, &block)`
585
+ &nbsp; - *also aliased as* `fieldset_tag()`
586
+
587
+ Creates a `<fieldset..>` tag for grouping HTML form elements.
588
+
589
+ ```ruby
590
+ field_set_tag(:actor)
591
+ # <fieldset id="fieldset-actor">
592
+ # <legend>Actor</legend>
593
+ # ...
594
+ # </fieldset>
595
+
596
+ # sets the `<legend>` and `:id` attribute when given a single argument.
597
+ field_set_tag('User Details') do
598
+ ...
599
+ end
600
+ # <fieldset id="fieldset-user-details">
601
+ # <legend>User Details</legend>
602
+ # ...
603
+ # </fieldset>
604
+
605
+ # supports `:legend` attribute
606
+ field_set_tag(:actor, legend: 'Details')
607
+ # <fieldset id="fieldset-actor">
608
+ # <legend>Details</legend>
609
+ # <snip...>
610
+
611
+ # remove `<legend>` tag by `{ legend: false }`
612
+ field_set_tag(:actor, legend: 'Details')
613
+ # <fieldset id="fieldset-actor">
614
+ # <legend>Details</legend>
615
+ # <snip...>
616
+
617
+ # append a CSS class. NB! fieldset has no other class by default.
618
+ field_set_tag(:actor, class: 'legend-class')
619
+ # <fieldset class="legend-class" id="fieldset-actor">
620
+ # <snip...>
621
+
622
+ # default to 'fieldset' when passed `nil` as the first arg
623
+ field_set_tag(nil, class: 'format')
624
+ # <fieldset class="format" id="fieldset">
625
+ # <snip...>
626
+
627
+ # removing the `:id` attribute completely
628
+ field_set_tag('Users', id: false)
629
+ # <fieldset>
630
+ # <legend>Users</legend>
631
+ # <snip...>
632
+ ```
633
+
634
+ <br>
635
+ ---
636
+
637
+ ### -- `legend_tag(contents, attrs={})`
638
+
639
+ Return a legend with _contents_ from the given options.
640
+
641
+
642
+ ```ruby
643
+ legend_tag('User Details')
644
+ #=> <legend>User Details</legend>
645
+
646
+ # adding an :id attribute.
647
+ legend_tag('User', id: 'some-id')
648
+ #=> <legend id="some-id">User</legend>
649
+
650
+ # adds a CSS class. NB! legend tags have no default class
651
+ legend_tag('User', class: 'some-class')
652
+ #=> <legend class="some-class">User</legend>
653
+ ```
654
+
655
+ <br>
656
+ ---
657
+
658
+
659
+ ### -- `check_box_tag(name, attrs={})`
660
+ &nbsp; - also aliased as `checkbox_tag()`
661
+
662
+ Creates an `<input type="checkbox"...>` tag from the given options.
663
+
664
+
665
+ ```ruby
666
+ check_box_tag(:accept) || checkbox_tag(:accept)
667
+ #=> <input class="checkbox" id="accept" name="accept" type="checkbox" value="1">
668
+
669
+ # providing a value
670
+ check_box_tag(:rock, value: 'rock music')
671
+ #=> <input class="checkbox" id="rock" name="rock" type="checkbox" value="rock music">
672
+
673
+ # setting a different :id
674
+ check_box_tag(:rock, :id => 'some-id')
675
+ #=> <input class="checkbox" id="some-id" name="rock" type="checkbox" value="1">
676
+
677
+ # append a CSS class. NB! default class: '.checkbox'
678
+ check_box_tag(:rock, class: 'small')
679
+ #=> <input class="small checkbox" id="rock" name="rock" type="checkbox" value="1">
680
+
681
+ # adds a `:title` attribute when passed `:ui_hint`
682
+ check_box_tag(:rock, ui_hint: 'a user hint')
683
+ #=> <input class="checkbox" id="rock" name="rock" title="a user hint" type="checkbox" value="1">
684
+
685
+ # `checked` attribute
686
+ check_box_tag(:rock, checked: true)
687
+ #=> <input checked="checked" class="checkbox" id="rock" name="rock" type="checkbox" value="1">
688
+
689
+ # `disabled` attribute
690
+ check_box_tag(:rock, disabled: true)
691
+ #=> <input class="checkbox" disabled="disabled" id="rock" name="rock" type="checkbox" value="1">
692
+ ```
693
+
694
+ <br>
695
+ ---
696
+
697
+ ### -- `radio_button_tag(name, attrs={})`
698
+ &nbsp; - *also aliased as* `radiobutton_tag()`
699
+
700
+ Creates a `<input type="radio"...>` tag from the given options.
701
+
702
+ **NOTE!** use groups of radio buttons named the same to allow users to select from a group of options.
703
+
704
+
705
+ ```ruby
706
+ radio_button_tag(:accept) || radiobutton_tag(:accept)
707
+ #=> <input class="radio" id="accept_1" name="accept" type="radio" value="1">
708
+
709
+ radio_button_tag(:rock, value:'rock music')
710
+ #=> <input class="radio" id="rock_rock-music" name="rock" type="radio" value="rock music">
711
+
712
+ # setting a different :id.
713
+ radio_button_tag(:rock, id: 'some-id')
714
+ #=> <input class="radio" id="some-id_1" name="rock" type="radio" value="1">
715
+
716
+ # append a CSS class. NB! default class: '.radio'
717
+ radio_button_tag(:rock, class: 'big')
718
+ #=> <input class="big radio" id="rock_1" name="rock" type="radio" value="1">
719
+
720
+ # adds a `:title` attribute when passed `:ui_hint`
721
+ radio_button_tag(:rock, ui_hint: 'a user hint')
722
+ #=> <input class="radio" id="rock_1" value="1" name="rock" title="a user hint" type="radio">
723
+
724
+ # `checked` attribute
725
+ radio_button_tag(:yes, checked: true)
726
+ #=> <input checked="checked" class="radio" id="yes_1" name="yes" type="radio" value="1">
727
+
728
+ # `disabled` attribute
729
+ radio_button_tag(:yes, disabled: true)
730
+ #=> <input disabled="disabled" class="radio" id="yes_1" name="yes" type="radio" value="1">
731
+ ```
732
+
733
+ <br>
734
+ ---
735
+
736
+
737
+ ### -- `submit_tag(value="Save Form", attrs={})`
738
+ &nbsp; - *also aliased as* **`submit_button()`**
739
+
740
+ Creates a submit button with the text value as the caption.
741
+
742
+ ```ruby
743
+ submit_tag() || submit_button()
744
+ #=> <input name="submit" type="submit" value="Save Form">
745
+
746
+ submit_tag(nil)
747
+ #=> <input name="submit" type="submit" value="">
748
+
749
+ submit_tag('Custom Value')
750
+ #=> <input name="submit" type="submit" value="Custom Value">
751
+
752
+ # adds a CSS class. NB! input[:submit] has no other class by default.
753
+ submit_tag(class: 'some-class')
754
+ #=> <input class="some-class" name="submit" type="submit" value="Save Form">
755
+
756
+ # supports the :disabled attribute.
757
+ submit_tag('disabled: true)
758
+ #=> <input disabled="disabled" name="submit" type="submit" value="Save Form">
759
+
760
+ # adds a `:title` attribute when passed `:ui_hint`.
761
+ submit_tag(ui_hint: 'a user hint')
762
+ #=> <input name="submit" title="a user hint" type="submit" value="Save Form">
763
+ ```
764
+
765
+ <br>
766
+ ---
767
+
768
+ ### -- `image_submit_tag(src, attrs={})`
769
+
770
+ Adds a `<input src=""...>` tag which displays an image.
771
+
772
+
773
+ ```ruby
774
+ @img = '/img/btn.png'
775
+
776
+ image_submit_tag(@img)
777
+ #=> <input src="/img/btn.png" type="image">
778
+
779
+ image_submit_tag(@img, disabled: true)
780
+ #=> <input disabled="disabled" src="/img/btn.png" type="image">
781
+
782
+ image_submit_tag(@img, class 'search-button')
783
+ #=> <input class="search-button" src="/img/btn.png" type="image">
784
+ ```
785
+
786
+ <br>
787
+ ---
788
+
789
+ ### -- `reset_tag(value='Reset Form', attrs={})`
790
+ &nbsp; - *also aliased as* **`reset_button()`**
791
+
792
+ Creates a reset button with the text value as the caption.
793
+
794
+ ```ruby
795
+ reset_tag() || reset_button()
796
+ #=> <input name="reset" type="reset" value="Reset Form">
797
+
798
+ reset_tag(nil)
799
+ #=> <input name="reset" type="reset" value="">
800
+
801
+ reset_tag('Custom Value')
802
+ #=> <input name="reset" type="reset" value="Custom Value">
803
+
804
+ # adds a CSS class. NB! input[:reset] has no other class by default
805
+ reset_tag(class: 'some-class')
806
+ #=> <input class="some-class" name="reset" type="reset" value="Reset Form">
807
+
808
+ # supports the `:disabled` attribute
809
+ reset_tag(disabled: true)
810
+ #=> <input disabled="disabled" name="reset" type="reset" value="Reset Form">
811
+
812
+ # adds a `:title` attribute when passed `:ui_hint`
813
+ reset_tag(ui_hint: 'a user hint')
814
+ #=> <input name="reset" title="a user hint" type="submit" value="Reset Form">
815
+ ```
816
+
817
+ <br>
818
+ ---
819
+
820
+ ### -- `select_tag(name, options, attrs={})`
821
+
822
+ Creates a `<select..>` tag (dropdown menu), including the various select options.
823
+
824
+
825
+ **Note!** the format for the options values must be `[value, key]`.
826
+
827
+ Passing options values as a `Hash`.
828
+
829
+ ```ruby
830
+ select_tag(:letters, {a: 'A', b: 'B' })
831
+ # <select id="letters" name="letters">
832
+ # <option value="a">A</option>
833
+ # <option value="b">B</option>
834
+ # </select>
835
+ ```
836
+
837
+ Passing options values as an `Array`.
838
+
839
+ ```ruby
840
+ @letters = [[:a,'A'], [:b,'B']]
841
+
842
+ select_tag(:letters, @letters)
843
+ # <select id="letters" name="letters">
844
+ # <option value="a">A</option>
845
+ # <option value="b">B</option>
846
+ # </select>
847
+ ```
848
+
849
+ Handling passed options:
850
+
851
+ ```ruby
852
+ select_tag(:letters, @letters, disabled: true)
853
+ # <select id="letters" disabled="disabled" name="letters">
854
+ # <snip...>
855
+
856
+ select_tag(:letters, @letters, id: 'my-letters')
857
+ # <select id="my-letters" name="letters">
858
+ # <snip...>
859
+
860
+ select_tag(:letters, @letters, class: 'funky-select')
861
+ # <select class="funky-select" id="my-letters" name="letters">
862
+ # <snip...>
863
+ ```
864
+
865
+ Handling the prompt value:
866
+
867
+ ```ruby
868
+ select_tag(:letters, @letters, prompt: true)
869
+ # <select id="letters" name="letters">
870
+ # <option selected="selected" value="">- Select -</option>
871
+ # <snip...>
872
+
873
+ # setting a custom prompt
874
+ select_tag(:letters, @letters, prompt: 'Top Letters', selected: 'a')
875
+ # <select id="letters" name="letters">
876
+ # <option value="">Top Letters</option>
877
+ # <option selected="selected" value="a">A</option>
878
+ # <snip...>
879
+ ```
880
+
881
+ Adding `:selected` option.
882
+
883
+ ```ruby
884
+ select_tag(:letters, @letters, selected: :a)
885
+ # <select id="letters" name="letters">
886
+ # <option selected="selected" value="a">A</option>
887
+ # <snip...>
888
+ ```
889
+
890
+
891
+ When passing multiple items to `:selected` option or setting the `{ multiple: true }` option, the select menu automatically becomes a multiple select box.
892
+
893
+ **NOTE!** the `name="letters[]"` attribute.
894
+
895
+ ```ruby
896
+ select_tag(:letters, @letters, selected: [:a,'b'])
897
+ # <select id="letters" multiple="multiple" name="letters[]">
898
+ # <option selected="selected" value="a">A</option>
899
+ # <option selected="selected" value="b">B</option>
900
+ # </select>
901
+
902
+ select_tag(:letters, @letters, multiple: true)
903
+ # <select id="letters" name="letters[]" multiple="multiple">
904
+ # <snip...>
905
+ ```
906
+
907
+ <br>
908
+ ---
909
+
910
+ ### -- `select_option(value, key, attrs={})`
911
+
912
+ Creates an `<option...>` tag for `<select...>` menus.
913
+
914
+ ```ruby
915
+ select_option('a', 'Letter A')
916
+ #=> <option value="a">Letter A</option>
917
+
918
+ select_option('on', '') # , nil)
919
+ #=> <option value="on">On</option>
920
+
921
+ # handling selected options
922
+ select_option('a', 'Letter A', selected: true)
923
+ #=> <option selected="selected" value="a">Letter A</option>
924
+
925
+ select_option('a', 'Letter A', selected: false)
926
+ #=> <option value="a">Letter A</option>
927
+ ```
928
+
929
+ <br>
930
+ ---
931
+
932
+ ### -- `faux_method(method='PUT')`
933
+
934
+
935
+ ```ruby
936
+ faux_method() #=> <input name="_method" type="hidden" value="PUT">
937
+
938
+ # handling DELETE requests
939
+ faux_method(:delete) #=> <input name="_method" type="hidden" value="DELETE">
940
+
941
+ ```
942
+
943
+ <br>
944
+ ---
945
+
946
+ ## Plugin Configurations
947
+
948
+ The default settings should help you get moving quickly, and are fairly common sense based.
949
+
950
+ However the `:tags` plugin supports these config options:
951
+
952
+ #### `:tag_output_format_is_xhtml`
953
+
954
+ Sets the HTML output format, toggling between `HTML 5` (`false`) and `XHTML` (`true`). Default is: `false`.
955
+
956
+ This option is retained for legacy support and in memory of the *"good old days"* ;-).
957
+
958
+ #### `:tag_add_newlines_after_tags`
959
+
960
+ Sets the formatting of the HTML output, whether it should be more compact in nature or slightly better formatted. Default is: `true`.
961
+
962
+
963
+ The `:tag_helpers` plugin supports these config options:
964
+
965
+
966
+ #### `:tags_label_required_str`
967
+
968
+ Sets the formatting of the string appended to required `<label...>` tags. Default is: `'<span>*</span>'`.
969
+
970
+ #### `:tags_label_append_str`
971
+
972
+ Sets the formatting of the string appended to `<label...>` tags. Default is: `':'`.
973
+
974
+
975
+ #### `:tags_forms_default_class`
976
+
977
+ Sets the default class value for form tags. Default is: `''` (empty).
978
+
979
+ This is a shortcut to automatically add something like [Bootstrap](https://getbootstrap.com/) support with `'form-control'`
980
+
981
+
982
+ **NOTE!**
983
+
984
+ Config options set in `:tag_helpers` are passed on to the `:tags` plugin.
985
+
986
+ ```ruby
987
+ # <snip...>
988
+ # support legacy XHTML formatted output
989
+ plugin :tag_helpers, { tag_output_format_is_xhtml: true, ... }
990
+ # <snip...>
991
+ ```
992
+
993
+
994
+
995
+ ## RTFM
996
+
997
+ If the above is not clear enough, please check the specs for a better understanding.
998
+
999
+ <br>
1000
+
1001
+ ## Errors / Bugs
1002
+
1003
+ If something is not behaving intuitively, it is a bug, and should be reported.
1004
+ Report it here: http://github.com/kematzy/roda-tags/issues
1005
+
1006
+ <br>
1007
+
1008
+ ## TODOs
1009
+
1010
+ * Keep it up to date with any changes in `Roda` or `HTML`.
1011
+
1012
+ * Decide on if it's worth it to do validity checks on all attributes passed to tags
1013
+ ie: reject attributes based upon what is allowed for the tag.
1014
+
1015
+ ```ruby
1016
+ tag(:base, href: 'url', target: '_self', id: 'is-ignored')
1017
+ #=> <base href="url", target="_self">
1018
+ ```
1019
+
1020
+ * Decide on whether to add a number of convenience tags (methods), such as:
1021
+
1022
+ - ```meta(name, contents)```
1023
+
1024
+ - ```img(src, attrs={})```
1025
+
1026
+
1027
+ * Any other improvements we may think of.
1028
+
1029
+
1030
+ <br>
1031
+
1032
+ ## Dependencies
1033
+
1034
+ This Gem depends upon the following:
1035
+
1036
+ ### Runtime:
1037
+
1038
+ * roda (>= 2.5.0)
1039
+ * tilt
1040
+ * erubis
1041
+
1042
+
1043
+ ### Development & Tests:
1044
+
1045
+ * bundler (~> 1.10)
1046
+ * rake (~> 10.0)
1047
+ * minitest
1048
+ * minitest-hooks
1049
+ * minitest-rg
1050
+ * rack-test
1051
+ * nokogiri => for the `assert_have_tag()` tests
1052
+
1053
+ * simplecov
1054
+
1055
+
1056
+ <br>
1057
+
1058
+ ## Note on Patches/Pull Requests
1059
+
1060
+ * Fork the project.
1061
+ * Make your feature addition or bug fix.
1062
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
1063
+ * Commit, do not mess with Rakefile, version, or history.
1064
+ * (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
1065
+ * Send me a pull request. Bonus points for topic branches.
1066
+
1067
+
1068
+ <br>
1069
+
1070
+ ## Copyright
1071
+
1072
+ Copyright (c) 2010-2015 Kematzy
1073
+
1074
+ Released under the MIT License. See LICENSE for further details.
1075
+
1076
+ <br>
1077
+
1078
+ ## Code Inspirations:
1079
+
1080
+ * The ActiveSupport gem by DHH & Rails Core Team
1081
+
1082
+
1083
+