html_tags 0.1.183

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.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +456 -0
  3. data/USAGE.md +17 -0
  4. data/doc/README.gen +256 -0
  5. data/html_tags.gemspec +48 -0
  6. data/images/logo_for_the_html_tags_project.png +0 -0
  7. data/lib/html_tags/array_registered_html_tags.rb +126 -0
  8. data/lib/html_tags/autoinclude.rb +2 -0
  9. data/lib/html_tags/autoinclude_base_module.rb +7 -0
  10. data/lib/html_tags/base/README.md +3 -0
  11. data/lib/html_tags/base/base.rb +11 -0
  12. data/lib/html_tags/base/base_module.rb +271 -0
  13. data/lib/html_tags/base/prototype.rb +19 -0
  14. data/lib/html_tags/checks.rb +58 -0
  15. data/lib/html_tags/closing_tag/closing_tag.rb +76 -0
  16. data/lib/html_tags/constants/array_strip_newlines.rb +14 -0
  17. data/lib/html_tags/constants/misc.rb +21 -0
  18. data/lib/html_tags/constants.rb +26 -0
  19. data/lib/html_tags/html_closing_tags.rb +36 -0
  20. data/lib/html_tags/html_comment.rb +29 -0
  21. data/lib/html_tags/html_tags.rb +118 -0
  22. data/lib/html_tags/html_tags_constants.rb +14 -0
  23. data/lib/html_tags/individual_tags/a.rb +646 -0
  24. data/lib/html_tags/individual_tags/abbr.rb +44 -0
  25. data/lib/html_tags/individual_tags/address.rb +50 -0
  26. data/lib/html_tags/individual_tags/area.rb +60 -0
  27. data/lib/html_tags/individual_tags/article.rb +48 -0
  28. data/lib/html_tags/individual_tags/aside.rb +80 -0
  29. data/lib/html_tags/individual_tags/audio.rb +54 -0
  30. data/lib/html_tags/individual_tags/b.rb +22 -0
  31. data/lib/html_tags/individual_tags/bdo.rb +50 -0
  32. data/lib/html_tags/individual_tags/blockquote.rb +19 -0
  33. data/lib/html_tags/individual_tags/body.rb +19 -0
  34. data/lib/html_tags/individual_tags/br.rb +28 -0
  35. data/lib/html_tags/individual_tags/button.rb +143 -0
  36. data/lib/html_tags/individual_tags/canvas.rb +19 -0
  37. data/lib/html_tags/individual_tags/caption.rb +107 -0
  38. data/lib/html_tags/individual_tags/cite.rb +78 -0
  39. data/lib/html_tags/individual_tags/code.rb +105 -0
  40. data/lib/html_tags/individual_tags/del.rb +112 -0
  41. data/lib/html_tags/individual_tags/details.rb +79 -0
  42. data/lib/html_tags/individual_tags/dialog.rb +108 -0
  43. data/lib/html_tags/individual_tags/div.rb +99 -0
  44. data/lib/html_tags/individual_tags/em.rb +99 -0
  45. data/lib/html_tags/individual_tags/fieldset.rb +88 -0
  46. data/lib/html_tags/individual_tags/figure.rb +42 -0
  47. data/lib/html_tags/individual_tags/footer.rb +61 -0
  48. data/lib/html_tags/individual_tags/form.rb +93 -0
  49. data/lib/html_tags/individual_tags/h1.rb +48 -0
  50. data/lib/html_tags/individual_tags/h2.rb +46 -0
  51. data/lib/html_tags/individual_tags/h3.rb +78 -0
  52. data/lib/html_tags/individual_tags/h4.rb +36 -0
  53. data/lib/html_tags/individual_tags/h5.rb +36 -0
  54. data/lib/html_tags/individual_tags/h6.rb +40 -0
  55. data/lib/html_tags/individual_tags/head.rb +47 -0
  56. data/lib/html_tags/individual_tags/header.rb +54 -0
  57. data/lib/html_tags/individual_tags/hgroup.rb +78 -0
  58. data/lib/html_tags/individual_tags/html.rb +61 -0
  59. data/lib/html_tags/individual_tags/i.rb +47 -0
  60. data/lib/html_tags/individual_tags/iframe.rb +131 -0
  61. data/lib/html_tags/individual_tags/img.rb +135 -0
  62. data/lib/html_tags/individual_tags/input.rb +96 -0
  63. data/lib/html_tags/individual_tags/ins.rb +102 -0
  64. data/lib/html_tags/individual_tags/kbd.rb +109 -0
  65. data/lib/html_tags/individual_tags/keygen.rb +90 -0
  66. data/lib/html_tags/individual_tags/label.rb +77 -0
  67. data/lib/html_tags/individual_tags/legend.rb +48 -0
  68. data/lib/html_tags/individual_tags/li.rb +74 -0
  69. data/lib/html_tags/individual_tags/link.rb +58 -0
  70. data/lib/html_tags/individual_tags/main.rb +29 -0
  71. data/lib/html_tags/individual_tags/map.rb +95 -0
  72. data/lib/html_tags/individual_tags/mark.rb +78 -0
  73. data/lib/html_tags/individual_tags/menu.rb +79 -0
  74. data/lib/html_tags/individual_tags/nav.rb +64 -0
  75. data/lib/html_tags/individual_tags/object.rb +76 -0
  76. data/lib/html_tags/individual_tags/ol.rb +50 -0
  77. data/lib/html_tags/individual_tags/p.rb +92 -0
  78. data/lib/html_tags/individual_tags/pre.rb +16 -0
  79. data/lib/html_tags/individual_tags/progress.rb +114 -0
  80. data/lib/html_tags/individual_tags/script.rb +22 -0
  81. data/lib/html_tags/individual_tags/source.rb +42 -0
  82. data/lib/html_tags/individual_tags/span.rb +95 -0
  83. data/lib/html_tags/individual_tags/strong.rb +17 -0
  84. data/lib/html_tags/individual_tags/style.rb +29 -0
  85. data/lib/html_tags/individual_tags/summary.rb +77 -0
  86. data/lib/html_tags/individual_tags/sup.rb +57 -0
  87. data/lib/html_tags/individual_tags/table.rb +90 -0
  88. data/lib/html_tags/individual_tags/tbody.rb +19 -0
  89. data/lib/html_tags/individual_tags/td.rb +30 -0
  90. data/lib/html_tags/individual_tags/textarea.rb +72 -0
  91. data/lib/html_tags/individual_tags/th.rb +50 -0
  92. data/lib/html_tags/individual_tags/thead.rb +53 -0
  93. data/lib/html_tags/individual_tags/time.rb +50 -0
  94. data/lib/html_tags/individual_tags/title.rb +59 -0
  95. data/lib/html_tags/individual_tags/tr.rb +50 -0
  96. data/lib/html_tags/individual_tags/track.rb +59 -0
  97. data/lib/html_tags/individual_tags/u.rb +47 -0
  98. data/lib/html_tags/individual_tags/ul.rb +23 -0
  99. data/lib/html_tags/individual_tags/var.rb +46 -0
  100. data/lib/html_tags/individual_tags/video.rb +70 -0
  101. data/lib/html_tags/module.rb +5 -0
  102. data/lib/html_tags/opening_tag/opening_tag.rb +288 -0
  103. data/lib/html_tags/project/project_base_directory.rb +23 -0
  104. data/lib/html_tags/requires/require_the_html_tags_project.rb +9 -0
  105. data/lib/html_tags/requires/require_the_img_tag.rb +7 -0
  106. data/lib/html_tags/shared.rb +23 -0
  107. data/lib/html_tags/stag.rb +54 -0
  108. data/lib/html_tags/toplevel_methods/add.rb +22 -0
  109. data/lib/html_tags/toplevel_methods/full_output.rb +33 -0
  110. data/lib/html_tags/toplevel_methods/newline_or_empty.rb +21 -0
  111. data/lib/html_tags/toplevel_methods/strip_newlines.rb +27 -0
  112. data/lib/html_tags/version/version.rb +17 -0
  113. data/lib/html_tags/yaml/available_html_tags.yml +135 -0
  114. data/lib/html_tags/yaml/valid_tags_in_a_head_tag.yml +16 -0
  115. data/lib/html_tags.rb +5 -0
  116. data/test/testing_html_tags.rb +158 -0
  117. data/test/testing_the_a_tag.rb +162 -0
  118. data/test/testing_the_button_tag.rb +37 -0
  119. data/test/testing_the_details_tag.rb +38 -0
  120. metadata +171 -0
@@ -0,0 +1,646 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'html_tags/individual_tags/a.rb'
6
+ # =========================================================================== #
7
+ module HtmlTags
8
+
9
+ require 'html_tags/closing_tag/closing_tag.rb'
10
+ require 'html_tags/toplevel_methods/add.rb'
11
+
12
+ # ========================================================================= #
13
+ # === HtmlTags.a (a tag)
14
+ #
15
+ # This tag will attempt to create a HTML link. It follows all other
16
+ # conventions as well. The first argument called `i` is the target
17
+ # URL to use.
18
+ #
19
+ # In plain HTML, this would be create a string such as the following one:
20
+ #
21
+ # <a href="url">Test</a>
22
+ #
23
+ # The first argument `i` is the hyperref-target.
24
+ #
25
+ # Usage examples:
26
+ #
27
+ # a('connect')
28
+ # a('connect', :make_newline)
29
+ # a('connect', 'marl1em','great_link','color: blue')
30
+ # a('LINUX_DESIGNING.cgi', :copy_description)
31
+ # a('https://de.wikipedia.org/wiki/Lampensockel#Edisonsockel', 'SELF', :make_newline)
32
+ # a('local_ruby_c', description: 'Ruby C Seite', css_style: 'margin-left: 2em')
33
+ # a(
34
+ # remote_url: remote_url,
35
+ # text: title?.to_s,
36
+ # css_style: 'font-weight: bold; color: darkblue'
37
+ # )
38
+ # HtmlTags.a('https://en.wikipedia.org/wiki/Gramicidin', { :remote_URL=>'gramicidin' })
39
+ # HtmlTags.a('https://en.wikipedia.org/wiki/Gramicidin', { remote_URL: 'gramicidin', open_new_tab: true })
40
+ #
41
+ # ========================================================================= #
42
+ def self.a(
43
+ hyperref_target = '',
44
+ link_description = :use_hyperref_as_the_target,
45
+ css_class = '',
46
+ the_id = '',
47
+ css_style = '',
48
+ javascript = ''
49
+ )
50
+ # ======================================================================= #
51
+ # The following Hash can be used to store data into, such as :tooltip.
52
+ # ======================================================================= #
53
+ internal_hash = {}
54
+ title = nil
55
+ # ======================================================================= #
56
+ # The next variable determines whether we will use target="_blank" or
57
+ # whether we will not.
58
+ # ======================================================================= #
59
+ target_is_blank = false
60
+ # ======================================================================= #
61
+ # Store the generated String in the local variable called result.
62
+ # ======================================================================= #
63
+ result = ''.dup
64
+ # ======================================================================= #
65
+ # If make_newline is set to true then we will append a <br> tag.
66
+ # ======================================================================= #
67
+ make_newline = false
68
+ close_me = close(__method__) # Default. Must come before case css_class.
69
+ # ======================================================================= #
70
+ # Since as of December 2015 we will check whether we have passed an
71
+ # Array.
72
+ #
73
+ # This may look like that way:
74
+ #
75
+ # ["https://de.wikipedia.org/wiki/Lampensockel#Edisonsockel",
76
+ # {:content=>"SELF", :css_class=>"mars2em"}]
77
+ #
78
+ # or
79
+ #
80
+ # ["http://geizhals.at/philips-voice-tracer-dvt3600-digitales-diktiergeraet-a992644.html?hloc=at", "SELF", 1]
81
+ #
82
+ # So we have to stay flexible here.
83
+ # ======================================================================= #
84
+ if hyperref_target.is_a? Array
85
+ if hyperref_target.size > 1
86
+ hash = hyperref_target[1] # This may not have to be a Hash, though.
87
+ if hash.is_a? Hash
88
+ link_description = hash
89
+ hyperref_target = hyperref_target[0]
90
+ elsif hash.is_a? Array
91
+ if hash[1]
92
+ link_description = hash[1]
93
+ end
94
+ if hash[2] and (hash[2] == 1)
95
+ make_newline = true
96
+ end
97
+ # ================================================================= #
98
+ # Finally, assign the first entry to hyperref_target.
99
+ # ================================================================= #
100
+ hyperref_target = hyperref_target.first
101
+ end
102
+ end
103
+ if hyperref_target.is_a? Array
104
+ hyperref_target = hyperref_target.first
105
+ end
106
+ end
107
+ case css_class
108
+ # ======================================================================= #
109
+ # === :copy_description
110
+ # ======================================================================= #
111
+ when :copy_description
112
+ css_class = ''
113
+ link_description = hyperref_target
114
+ # ======================================================================= #
115
+ # === :make_newline
116
+ # ======================================================================= #
117
+ when :make_newline
118
+ css_class = ''
119
+ close_me = close(__method__) {{ make_newline: true }}
120
+ # ======================================================================= #
121
+ # === :no_newline
122
+ # ======================================================================= #
123
+ when :no_newline
124
+ css_class = ''
125
+ close_me = close(__method__) {{ make_newline: false }}
126
+ else # Else do not make a newline, simply pass through..
127
+ end
128
+ # ======================================================================= #
129
+ # === Check for hyperref_target being a Hash
130
+ # ======================================================================= #
131
+ if hyperref_target.is_a? Hash
132
+ # ===================================================================== #
133
+ # === :open_new_tab
134
+ # ===================================================================== #
135
+ if hyperref_target.has_key? :open_new_tab
136
+ target_is_blank = hyperref_target.delete(:open_new_tab)
137
+ # ===================================================================== #
138
+ # === :new_tab
139
+ # ===================================================================== #
140
+ elsif hyperref_target.has_key? :new_tab
141
+ target_is_blank = hyperref_target.delete(:new_tab)
142
+ # ===================================================================== #
143
+ # === :open_in_new_tab
144
+ # ===================================================================== #
145
+ elsif hyperref_target.has_key? :open_in_new_tab
146
+ target_is_blank = hyperref_target.delete(:open_in_new_tab)
147
+ # ===================================================================== #
148
+ # === :open_in_a_new_tab
149
+ #
150
+ # This is an "alias" to the above entry point.
151
+ # ===================================================================== #
152
+ elsif hyperref_target.has_key? :open_in_a_new_tab
153
+ target_is_blank = hyperref_target.delete(:open_in_a_new_tab)
154
+ # ===================================================================== #
155
+ # === :new_tab
156
+ # ===================================================================== #
157
+ elsif hyperref_target.has_key? :new_tab
158
+ target_is_blank = hyperref_target.delete(:new_tab)
159
+ # ===================================================================== #
160
+ # === :open_new_tab
161
+ # ===================================================================== #
162
+ elsif hyperref_target.has_key? :open_new_tab
163
+ target_is_blank = hyperref_target.delete(:open_new_tab)
164
+ end
165
+ # ===================================================================== #
166
+ # === :link_description
167
+ # ===================================================================== #
168
+ if hyperref_target.has_key? :link_description
169
+ link_description = hyperref_target.delete(:link_description)
170
+ # ===================================================================== #
171
+ # === :description
172
+ # ===================================================================== #
173
+ elsif hyperref_target.has_key? :description
174
+ link_description = hyperref_target.delete(:description)
175
+ end
176
+ # ===================================================================== #
177
+ # === :id
178
+ # ===================================================================== #
179
+ if hyperref_target.has_key? :id
180
+ the_id = hyperref_target.delete(:id)
181
+ # ===================================================================== #
182
+ # === :the_id
183
+ # ===================================================================== #
184
+ elsif hyperref_target.has_key? :the_id
185
+ the_id = hyperref_target.delete(:the_id)
186
+ end
187
+ # ===================================================================== #
188
+ # === :make_newline
189
+ # ===================================================================== #
190
+ if hyperref_target.has_key? :make_newline
191
+ make_newline = hyperref_target.delete(:make_newline)
192
+ # ===================================================================== #
193
+ # === :linebreak
194
+ # ===================================================================== #
195
+ elsif hyperref_target.has_key? :linebreak
196
+ make_newline = hyperref_target.delete(:linebreak)
197
+ end
198
+ # ===================================================================== #
199
+ # === :css_class
200
+ #
201
+ # Handle :css_class early on, as it is a very unproblematic entry.
202
+ # ===================================================================== #
203
+ if hyperref_target.has_key? :css_class
204
+ css_class = hyperref_target.delete(:css_class)
205
+ end
206
+ # ===================================================================== #
207
+ # === :css_style
208
+ #
209
+ # This entry point allows us to handle css-styles for a given
210
+ # HTML tag.
211
+ # ===================================================================== #
212
+ if hyperref_target.has_key? :css_style
213
+ css_style = hyperref_target.delete(:css_style)
214
+ end
215
+ # ===================================================================== #
216
+ # === :content
217
+ #
218
+ # Rewrite :content to the more correctly named :link_description.
219
+ # ===================================================================== #
220
+ if hyperref_target.has_key? :content
221
+ link_description = hyperref_target.delete(:content)
222
+ # ===================================================================== #
223
+ # === :text
224
+ # ===================================================================== #
225
+ elsif hyperref_target.has_key? :text
226
+ link_description = hyperref_target.delete(:text)
227
+ end
228
+ # ===================================================================== #
229
+ # === :link_description
230
+ #
231
+ # This entry point ought to come last.
232
+ # ===================================================================== #
233
+ if hyperref_target.has_key?(:link_description) and
234
+ (hyperref_target[:link_description] == 'SELF')
235
+ link_description = hyperref_target.delete(:link_description)
236
+ end
237
+ # ===================================================================== #
238
+ # The next four checks should come last, since they will modify
239
+ # hyperref_target.
240
+ # ===================================================================== #
241
+ # ===================================================================== #
242
+ # === :remote_url
243
+ # ===================================================================== #
244
+ if hyperref_target.has_key? :remote_url
245
+ hyperref_target = hyperref_target.delete(:remote_url)
246
+ # ===================================================================== #
247
+ # === :remote_URL
248
+ # ===================================================================== #
249
+ elsif hyperref_target.has_key? :remote_URL
250
+ hyperref_target = hyperref_target.delete(:remote_URL)
251
+ # ===================================================================== #
252
+ # === :href
253
+ # ===================================================================== #
254
+ elsif hyperref_target.has_key? :href
255
+ hyperref_target = hyperref_target.delete(:href)
256
+ # ===================================================================== #
257
+ # === :href_target
258
+ # ===================================================================== #
259
+ elsif hyperref_target.has_key? :href_target
260
+ hyperref_target = hyperref_target.delete(:href_target)
261
+ end if hyperref_target.is_a?(Hash)
262
+ end
263
+ # ======================================================================= #
264
+ # === Intercept Hash for the link_description variable
265
+ #
266
+ # The hash can contain entries such as linebreak: true, but also
267
+ # entries such as content: :self.
268
+ # ======================================================================= #
269
+ if link_description.is_a? Hash
270
+ # ===================================================================== #
271
+ # === :remote_url
272
+ # ===================================================================== #
273
+ if link_description.has_key? :remote_url
274
+ hyperref_target = link_description.delete(:remote_url)
275
+ # ===================================================================== #
276
+ # === :remote_URL
277
+ # ===================================================================== #
278
+ elsif link_description.has_key? :remote_URL
279
+ hyperref_target = link_description.delete(:remote_URL)
280
+ end
281
+ # ===================================================================== #
282
+ # === :tooltip
283
+ # ===================================================================== #
284
+ if link_description.has_key? :tooltip
285
+ internal_hash[:tooltip] = link_description.delete(:tooltip)
286
+ end
287
+ # ===================================================================== #
288
+ # === :onclick
289
+ #
290
+ # This may look like so:
291
+ #
292
+ # onclick: 'change_the_colour_to()'
293
+ #
294
+ # ===================================================================== #
295
+ if link_description.has_key? :onclick
296
+ javascript = ' onclick="'+link_description.delete(:onclick)+'"'
297
+ end
298
+ # ===================================================================== #
299
+ # === :css_style
300
+ # ===================================================================== #
301
+ if link_description.has_key? :css_style
302
+ css_style = link_description.delete(:css_style)
303
+ end
304
+ # ===================================================================== #
305
+ # === :id
306
+ # ===================================================================== #
307
+ if link_description.has_key? :id
308
+ the_id = link_description.delete(:id)
309
+ # ===================================================================== #
310
+ # === :the_id
311
+ # ===================================================================== #
312
+ elsif link_description.has_key? :the_id
313
+ the_id = link_description.delete(:the_id)
314
+ end
315
+ # ===================================================================== #
316
+ # === :open_new_tab
317
+ # ===================================================================== #
318
+ if link_description.has_key? :open_new_tab
319
+ target_is_blank = link_description.delete(:open_new_tab)
320
+ # ===================================================================== #
321
+ # === :open_in_new_tab
322
+ # ===================================================================== #
323
+ elsif link_description.has_key? :open_in_new_tab
324
+ target_is_blank = link_description.delete(:open_in_new_tab)
325
+ # ===================================================================== #
326
+ # === :open_in_a_new_tab
327
+ #
328
+ # This is an "alias" to the above entry point.
329
+ # ===================================================================== #
330
+ elsif link_description.has_key? :open_in_a_new_tab
331
+ target_is_blank = link_description.delete(:open_in_a_new_tab)
332
+ # ===================================================================== #
333
+ # === :new_tab
334
+ # ===================================================================== #
335
+ elsif link_description.has_key? :new_tab
336
+ target_is_blank = link_description.delete(:new_tab)
337
+ # ===================================================================== #
338
+ # === :open_new_tab
339
+ # ===================================================================== #
340
+ elsif link_description.has_key? :open_new_tab
341
+ target_is_blank = link_description.delete(:open_new_tab)
342
+ end
343
+ # ===================================================================== #
344
+ # === css_class
345
+ # ===================================================================== #
346
+ if link_description.has_key? :css_class
347
+ css_class = link_description.delete(:css_class)
348
+ end
349
+ # ===================================================================== #
350
+ # === :css_style
351
+ # ===================================================================== #
352
+ if link_description.has_key? :css_style
353
+ css_style = link_description.delete(:css_style)
354
+ end
355
+ # ===================================================================== #
356
+ # === :title
357
+ #
358
+ # Support the :title attribute here.
359
+ #
360
+ # The :title attribute is to enable a short tooltip, on our
361
+ # <a> tag.
362
+ # ===================================================================== #
363
+ if link_description.has_key? :title
364
+ title = link_description.delete(:title)
365
+ end
366
+ # ===================================================================== #
367
+ # Rewrite :link_description into :description.
368
+ # ===================================================================== #
369
+ if link_description.has_key? :description
370
+ link_description = link_description.delete(:description)
371
+ # ===================================================================== #
372
+ # Rewrite :link_description into :text.
373
+ # ===================================================================== #
374
+ elsif link_description.has_key? :text
375
+ link_description = link_description.delete(:text)
376
+ # ===================================================================== #
377
+ # ==== :content
378
+ # ===================================================================== #
379
+ elsif link_description.has_key? :content
380
+ link_description = link_description.delete(:content)
381
+ # ===================================================================== #
382
+ # Rewrite :link_description into :link_description.
383
+ # ===================================================================== #
384
+ elsif link_description.has_key? :link_description
385
+ link_description = link_description.delete(:link_description)
386
+ # ===================================================================== #
387
+ # === :content
388
+ #
389
+ # Rewrite :content into :link_description.
390
+ #
391
+ # This entry point is for input such as:
392
+ #
393
+ # a('http://rubyreports.org/', content: '<b>Link</b>')
394
+ #
395
+ # ===================================================================== #
396
+ elsif link_description.has_key? :content
397
+ link_description = link_description.delete(:content).to_s
398
+ hyperref_target = hyperref_target.to_s.dup
399
+ if link_description and link_description.start_with?('→ ')
400
+ hyperref_target.sub!(/^→ /,'')
401
+ end
402
+ # =================================================================== #
403
+ # Next, we must both check for 'SELF' 'self', second variant
404
+ # could also be the Symbol :self.
405
+ # =================================================================== #
406
+ if link_description.include?('SELF') or (link_description.to_s == 'self')
407
+ if link_description.frozen?
408
+ link_description = link_description.dup
409
+ end
410
+ # ================================================================= #
411
+ # Must replace it with the proper target next.
412
+ # ================================================================= #
413
+ link_description = link_description.to_s.sub( # Ensure we have a String.
414
+ /^SELF/i, hyperref_target
415
+ )
416
+ end
417
+ else
418
+ # =================================================================== #
419
+ # We don't have a link_description entry, so we will simply use
420
+ # the value from hyperref_target..
421
+ # =================================================================== #
422
+ if link_description.is_a?(Hash) and link_description.empty?
423
+ link_description = hyperref_target.to_s.dup
424
+ end
425
+ end
426
+ end
427
+ if link_description.empty?
428
+ link_description = hyperref_target # This simulates "abr_self".
429
+ end
430
+ # ======================================================================= #
431
+ # Work on link_description next, assuming it is a String at this point.
432
+ # ======================================================================= #
433
+ case link_description.to_s
434
+ when /^→ / # If it starts with a right-arrow.
435
+ if link_description.to_s == :self
436
+ link_description = hyperref_target.dup.sub(/^→ /,'')
437
+ end
438
+ when /^SELF$/i
439
+ link_description = link_description.dup if link_description.frozen?
440
+ link_description = link_description.to_s.sub!(
441
+ /^SELF/i, hyperref_target.dup # .sub(/^→ /,'')
442
+ )
443
+ end
444
+ case hyperref_target
445
+ # Remove leading right-arrows.
446
+ when /^→ /
447
+ hyperref_target = hyperref_target.dup if hyperref_target.frozen?
448
+ hyperref_target.sub!(/^→ /,'')
449
+ end
450
+ # ======================================================================= #
451
+ # === :make_newline is treated in a special manner, as the id.
452
+ # Same for the number 1, which stands for newline too, due
453
+ # to historic reasons.
454
+ # ======================================================================= #
455
+ case the_id
456
+ when :make_newline, 1
457
+ make_newline = true
458
+ the_id = '' # Reset it here in this case.
459
+ end
460
+ if css_class and css_class.is_a?(String) and (css_class == 'SELF')
461
+ css_class = ''.dup
462
+ end
463
+ if css_class.is_a? Hash
464
+ # ===================================================================== #
465
+ # === Intercept key :css_style next, on the css_class variable
466
+ #
467
+ # This entry point is for input such as:
468
+ #
469
+ # a(@target, css_style: 'color:red; margin-left:2em')
470
+ #
471
+ # ===================================================================== #
472
+ if css_class.has_key? :css_style
473
+ css_style = css_class.delete :css_style
474
+ end if css_class.is_a? Hash # Must check again due to the earlier resetting.
475
+ # ===================================================================== #
476
+ # === Intercept key :css_class next
477
+ # ===================================================================== #
478
+ if css_class.has_key? :css_class
479
+ # =================================================================== #
480
+ # Must assign to css_class variable in this case:
481
+ # =================================================================== #
482
+ css_class = css_class.delete :css_class
483
+ end if css_class.is_a? Hash # See above explanation.
484
+ # ===================================================================== #
485
+ # === Intercept key :url next
486
+ # ===================================================================== #
487
+ if css_class.has_key? :url
488
+ i = css_class.delete :url
489
+ end if css_class.is_a? Hash # See above explanation.
490
+ # ===================================================================== #
491
+ # === Intercept key :linebreak next
492
+ # ===================================================================== #
493
+ if css_class.has_key? :linebreak
494
+ i = css_class.delete :linebreak
495
+ close_me = close(__method__) {{ make_newline: i }}
496
+ end if css_class.is_a? Hash # See above explanation.
497
+ if css_class.is_a?(Hash) and css_class.empty?
498
+ css_class = ''
499
+ end
500
+ end
501
+ # ======================================================================= #
502
+ # === Handle blocks next
503
+ #
504
+ # Append a pre-defined content to it, unless we also use a block.
505
+ # ======================================================================= #
506
+ if block_given?
507
+ yielded = yield
508
+ case yielded # Intercept some Symbols.
509
+ when :strip
510
+ hyperref_target.strip!
511
+ close_me.strip! if close_me
512
+ when :only_basename
513
+ if hyperref_target.has_key? :link_description
514
+ link_description = File.basename(hyperref_target[:link_description])
515
+ end
516
+ when :smaller
517
+ _ = link_description
518
+ link_description = '<span style="font-size:smaller">'+_+'</span>'
519
+ else
520
+ # =================================================================== #
521
+ # Assume that it could be a HTML colour, such as :slateblue:
522
+ # =================================================================== #
523
+ if yielded.is_a? Symbol
524
+ begin
525
+ require 'colours/html/html_colours.rb'
526
+ if Colours.is_this_html_colour_included?(yielded)
527
+ if css_style.nil?
528
+ css_style = ''.dup
529
+ end
530
+ css_style = css_style.dup if css_style.frozen?
531
+ css_style << " color: #{yielded};"
532
+ end
533
+ rescue LoadError
534
+ end
535
+ end
536
+ end
537
+ hyperref_target.merge!(yielded) unless yielded.is_a? Symbol
538
+ end
539
+ # ======================================================================= #
540
+ # === Copy the content of hyperref_target onto link_description
541
+ #
542
+ # This should come fairly late, though.
543
+ # ======================================================================= #
544
+ case link_description
545
+ when :use_hyperref_as_the_target
546
+ link_description = hyperref_target.dup
547
+ end
548
+ # ======================================================================= #
549
+ # Finally we will build-up the result-String next.
550
+ # ======================================================================= #
551
+ result = '<a'.dup
552
+ if hyperref_target.is_a?(Hash) and hyperref_target.empty? and
553
+ !link_description.empty?
554
+ hyperref_target = link_description.dup
555
+ end
556
+ hyperref_target = hyperref_target.to_s
557
+ result << ' href="'+hyperref_target+'"'
558
+ if css_class and !css_class.to_s.empty?
559
+ result << ' class="'+css_class.to_s+'"'
560
+ end
561
+ if the_id and !the_id.empty?
562
+ result << ' id="'+the_id.to_s+'"'
563
+ end
564
+ if css_style and !css_style.empty?
565
+ result << ' style="'+css_style.to_s+'"'
566
+ end
567
+ if javascript and !javascript.empty?
568
+ # The next lines exist to use "onclick" javascript directly.
569
+ unless javascript.lstrip.start_with? 'onclick'
570
+ result << ' javascript="'
571
+ end
572
+ result << javascript
573
+ unless javascript.lstrip.start_with? 'onclick'
574
+ result << '"'
575
+ end
576
+ end
577
+ # ======================================================================= #
578
+ # === Handle tooltips next, via data-tip
579
+ # ======================================================================= #
580
+ if internal_hash.is_a?(Hash) and internal_hash.has_key?(:tooltip)
581
+ result << " data-tip=\"#{internal_hash[:tooltip]}\""
582
+ end
583
+ if target_is_blank
584
+ result << ' target="_blank"'
585
+ end
586
+ if title
587
+ result << ' title="'+title.to_s+'"'
588
+ end
589
+ result << '>' # Close that tag here.
590
+ # result << N
591
+ result << link_description.to_s # Could be a Symbol after all.
592
+ result << close_me
593
+ if make_newline
594
+ result << '<br>'
595
+ end
596
+ # ======================================================================= #
597
+ # Must add it onto the main String too.
598
+ # ======================================================================= #
599
+ return HtmlTags.add(result)
600
+ end; self.instance_eval { alias slink a } # === HtmlTags.slink
601
+ self.instance_eval { alias link a } # === HtmlTags.link
602
+
603
+ # ========================================================================= #
604
+ # === a
605
+ #
606
+ # Wrapper towards HtmlTags.a().
607
+ # ========================================================================= #
608
+ def a(
609
+ hyperref_target = '',
610
+ link_description = :use_hyperref_as_the_target,
611
+ css_class = '',
612
+ the_id = '',
613
+ css_style = '',
614
+ javascript = '',
615
+ &block
616
+ )
617
+ HtmlTags.a(
618
+ hyperref_target,
619
+ link_description,
620
+ css_class,
621
+ the_id,
622
+ css_style,
623
+ javascript,
624
+ &block
625
+ )
626
+ end; alias slink a # === slink
627
+ alias link a # === link
628
+
629
+ end
630
+
631
+ if __FILE__ == $PROGRAM_NAME
632
+ alias e puts
633
+ e HtmlTags.a(
634
+ 'https://geizhals.at/diverse-cr2032-knopfzelle-a134716.html',
635
+ css_style: 'margin-left: 4em',
636
+ # The title attribute on an <a> tag adds a tooltip with title
637
+ # text to the anchor tag.
638
+ title: 'This is a tooltip.'
639
+ )
640
+ e
641
+ e HtmlTags.a(
642
+ 'https://foobar.com',
643
+ css_style: 'font-size: 1.1em;',
644
+ description: 'https://foobar com'
645
+ )
646
+ end
@@ -0,0 +1,44 @@
1
+ # =========================================================================== #
2
+ # Documentation for the <abbr> tag can be found here:
3
+ # http://www.w3schools.com/tags/tag_abbr.asp
4
+ # =========================================================================== #
5
+ module HtmlTags
6
+
7
+ # ========================================================================= #
8
+ # === HtmlTags.abbr
9
+ #
10
+ # To test this method, try:
11
+ #
12
+ # HtmlTags.abbr 'WHO','World Health Organization'
13
+ # ========================================================================= #
14
+ def self.abbr(abbreviation_to_use = '', long_name = '')
15
+ if long_name.empty? and !abbreviation_to_use.empty?
16
+ # ===================================================================== #
17
+ # In this case, we simply copy to the long name.
18
+ # ===================================================================== #
19
+ long_name = abbreviation_to_use.to_s.dup
20
+ end
21
+ if block_given?
22
+ return HtmlTags.add(
23
+ opening_tag(__method__, title: long_name.to_s)+
24
+ abbreviation_to_use+
25
+ yield+
26
+ close(__method__)
27
+ )
28
+ else
29
+ return HtmlTags.add(
30
+ opening_tag(__method__, title: long_name.to_s)+
31
+ abbreviation_to_use+
32
+ close(__method__)
33
+ )
34
+ end
35
+ end
36
+
37
+ # ========================================================================= #
38
+ # === abbr
39
+ # ========================================================================= #
40
+ def abbr(abbreviation_to_use = '', long_name = '')
41
+ HtmlTags.abbr(abbreviation_to_use, long_name)
42
+ end
43
+
44
+ end