xhtml_report_generator 3.1.1 → 3.1.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
  SHA1:
3
- metadata.gz: ce3899bed47a5746df9f4d52760d89be86406c5a
4
- data.tar.gz: fbbafc73adf8dfaaa48d4f85c0fa39701a623c13
3
+ metadata.gz: 71becd9cbcd9bbc0470db37fbbe6c57c78983eb6
4
+ data.tar.gz: 2771bacf4522614f803f186280723810e2b9a224
5
5
  SHA512:
6
- metadata.gz: bb379c087b9e0d94f7e77a6b01c3852d29523832329e889aaf36ae2a656861e9ac6f6d1f8d88e8c996afe548edf73045ec1204d83a86b9245620d6e232ef923b
7
- data.tar.gz: 369d5b373277e4c198f608c88bee07ac4dd871e8cbaecc1d1a8b3e8d5a4816a39e50192d2bef9a0c8c4554d811bfa4e03a787a77ac18c3022f36f296f101247a
6
+ metadata.gz: ae44b1c93a03773a5e76b3cceee8a6498a8ffb51ed26d6a64eff77d641cb312711fc80827e30d56c2764a4d643d9ca3c400ec268b37c9ed4c6c853d2474f3812
7
+ data.tar.gz: f47caa45144a60e750d7cff960051f92f5f18f97e4234982ac8ea9c6a035e751f5ff0e38c9dec0776a180750fcf3881f2b4377dec0eee540fdb256b284194c09
data/README.md CHANGED
@@ -27,7 +27,12 @@ require 'xhtml_report_generator'
27
27
  gen1 = XhtmlReportGenerator::Generator.new
28
28
  gen1.create_layout("Title")
29
29
  gen1.heading("h1", {"class" => "bothtoc"}) {"titel"}
30
- gen1.content() {"Hello World"}
30
+ gen1.heading("h2") {"subtitel"}
31
+ gen1.heading("h3") {"section"}
32
+ gen1.content({"class"=>"bold"}) {"content function: Hallo welt <br /> html test <span class=\"r\" >red span test</span>"}
33
+ gen1.html("<p class=\"italic\">html function: Hallo welt <br /> html test <span class=\"r\" >red span test</span></p>")
34
+ gen1.highlight(/Ha.*lt/)
35
+ gen1.link("https://rubygems.org/gems/xhtml_report_generator/") {"download the gem"}
31
36
  # browser will parse this as html (based on file extension)
32
37
  gen1.write("myreport.html")
33
38
  # browser will parse this as xhtml (based on file extension)
@@ -229,4 +234,3 @@ heading -> heading(tag_type="h1", attrs={}, &block)
229
234
  headingTop -> heading\_top(tag_type="h1", attrs={}, &block)
230
235
 
231
236
  </pre>
232
-
@@ -3,7 +3,7 @@ require 'base64'
3
3
  # The module name doesn't matter, just make sure at the end to 'extend' it
4
4
  # because it will be 'eval'ed by the initialize method of the XhtmlReportGenerator::Generator class.
5
5
  module Custom
6
-
6
+
7
7
  # creates the basic page layout and sets the current Element to the main content area (middle div)
8
8
  # @example The middle div is matched by the following xPath
9
9
  # //body/div[@id='middle']
@@ -12,21 +12,21 @@ module Custom
12
12
  # 1 means only left toc, 2 means only right toc, and 3 means full layout with left and right toc.
13
13
  def create_layout(title, layout=3)
14
14
  raise "invalid layout selector, choose from 0..3" if (layout < 0) || (layout > 3)
15
-
15
+
16
16
  @body = @document.elements["//body"]
17
17
  # only add the layout if it is not already there
18
18
  if !@layout
19
19
  head = @body.add_element("div", {"class" => "head", "id" => "head"})
20
20
  head.add_element("button", {"id" => "pre_toggle_linewrap"}).add_text("Toggle Linewrap")
21
-
21
+
22
22
  if (layout & 0x1) != 0
23
23
  div = @body.add_element("div", {"class" => "lefttoc split split-horizontal", "id" => "ltoc"})
24
24
  div.add_text("Table of Contents")
25
25
  div.add_element("br")
26
26
  end
27
-
27
+
28
28
  @div_middle = @body.add_element("div", {"class" => "middle split split-horizontal", "id" => "middle"})
29
-
29
+
30
30
  if (layout & 0x2) != 0
31
31
  div = @body.add_element("div", {"class" => "righttoc split split-horizontal", "id" => "rtoc"})
32
32
  div.add_text("Quick Links")
@@ -34,14 +34,14 @@ module Custom
34
34
  end
35
35
 
36
36
  @body.add_element("p", {"class" => "#{layout}", "id" => "layout"}).add_text("this text should be hidden")
37
-
37
+
38
38
  @layout = true
39
39
  end
40
40
  @current = @document.elements["//body/div[@id='middle']"]
41
41
  set_title(title)
42
42
  end
43
43
 
44
- # sets the title of the document in the <head> section as well as in the layout header div
44
+ # sets the title of the document in the <head> section as well as in the layout header div
45
45
  # create_layout must be called before!
46
46
  # @param title [String] the text which will be insertead
47
47
  def set_title(title)
@@ -69,7 +69,7 @@ module Custom
69
69
  @current = xpath
70
70
  elsif xpath.is_a?(String)
71
71
  @current = @document.elements[xpath]
72
- else
72
+ else
73
73
  raise "xpath is neither a String nor a REXML::Element"
74
74
  end
75
75
  end
@@ -79,7 +79,7 @@ module Custom
79
79
  def get_current()
80
80
  return @current
81
81
  end
82
-
82
+
83
83
  # returns the plain text without any xml tags of the specified element and all its children
84
84
  # @param el [REXML::Element] The element from which to fetch the text children. Defaults to @current
85
85
  # @param recursive [Boolean] whether or not to recurse into the children of the given "el"
@@ -91,7 +91,7 @@ module Custom
91
91
  out << child.value()
92
92
  else
93
93
  if recursive
94
- out << get_element_text(child, true)
94
+ out << get_element_text(child, true)
95
95
  end
96
96
  end
97
97
  }
@@ -106,7 +106,7 @@ module Custom
106
106
  f.write(elem, out)
107
107
  return out
108
108
  end
109
-
109
+
110
110
  # @see #code
111
111
  # Instead of adding content to the report, this method returns the produced html code as a string.
112
112
  # This can be used to insert code into #custom_table (with the option data_is_xhtml: true)
@@ -119,10 +119,10 @@ module Custom
119
119
  temp.add_text(text)
120
120
  element_to_string(temp)
121
121
  end
122
-
122
+
123
123
  # Appends a <pre> node after the @current node
124
124
  # @param attrs [Hash] attributes for the <pre> element. The following classes can be passed as attributes and are predefined with a different
125
- # background for your convenience !{"class" => "code0"} (light-blue), !{"class" => "code1"} (red-brown),
125
+ # background for your convenience !{"class" => "code0"} (light-blue), !{"class" => "code1"} (red-brown),
126
126
  # !{"class" => "code2"} (light-green), !{"class" => "code3"} (light-yellow). You may also specify your own background
127
127
  # as follows: !{"style" => "background: #FF00FF;"}.
128
128
  # @yieldreturn [String] the text to be added to the <pre> element
@@ -150,7 +150,7 @@ module Custom
150
150
  temp.add_text(text)
151
151
  element_to_string(temp)
152
152
  end
153
-
153
+
154
154
  # Appends a <p> node after the @current node
155
155
  # @param attrs [Hash] attributes for the <p> element
156
156
  # @yieldreturn [String] the text to be added to the <p> element
@@ -168,9 +168,9 @@ module Custom
168
168
 
169
169
  # insert arbitrary xml code after the @current element in the content pane (div middle)
170
170
  # @param text [String] valid xhtml code which is included into the document
171
- # @return [REXML::Element] the Element which was just added
171
+ # @return [REXML::Element] the Element which was just added
172
172
  def html(text)
173
- # we need to create a new document with a pseudo root becaus having multiple nodes at top
173
+ # we need to create a new document with a pseudo root becaus having multiple nodes at top
174
174
  # level is not valid xml
175
175
  doc = REXML::Document.new("<root>"+text+"</root>")
176
176
  # then we move all children of root to the actual div middle element and insert after current
@@ -180,7 +180,7 @@ module Custom
180
180
  end
181
181
  return @current
182
182
  end
183
-
183
+
184
184
  # @see #link
185
185
  # Instead of adding content to the report, this method returns the produced html code as a string.
186
186
  # This can be used to insert code into #custom_table (with the option data_is_xhtml: true)
@@ -194,13 +194,13 @@ module Custom
194
194
  temp.add_text(text)
195
195
  element_to_string(temp)
196
196
  end
197
-
197
+
198
198
  # Appends a <a href = > node after the @current nodes
199
199
  # @param href [String] this is the
200
200
  # @param attrs [Hash] attributes for the <a> element
201
201
  # @yieldreturn [String] the text to be added to the <a> element
202
202
  # @return [REXML::Element] the Element which was just added
203
- def link(href, attrs={}, &block)
203
+ def link(href, attrs={}, &block)
204
204
  temp = REXML::Element.new("a")
205
205
  attrs.merge!({"href" => href})
206
206
  temp.add_attributes(attrs)
@@ -211,7 +211,7 @@ module Custom
211
211
  @current.add_text(text)
212
212
  return @current
213
213
  end
214
-
214
+
215
215
  # @see #image
216
216
  # Instead of adding content to the report, this method returns the produced html code as a string.
217
217
  # This can be used to insert code into #custom_table (with the option data_is_xhtml: true)
@@ -227,7 +227,7 @@ module Custom
227
227
  temp.add_attributes(attributes)
228
228
  element_to_string(temp)
229
229
  end
230
-
230
+
231
231
  # @param path [String] absolute or relative path to the image that should be inserted into the report
232
232
  # @param attributes [Hash] attributes for the <img> element, any valid html attributes can be specified
233
233
  # you may specify attributes such "alt", "height", "width"
@@ -246,10 +246,10 @@ module Custom
246
246
  @current = temp
247
247
  return @current
248
248
  end
249
-
249
+
250
250
  # Scans all REXML::Text children of an REXML::Element for any occurrences of regex.
251
251
  # The text will be matched as one, not line by line as you might think.
252
- # If you want to write a regexp matching multiple lines keep in mind that the dot "." by default doesn't
252
+ # If you want to write a regexp matching multiple lines keep in mind that the dot "." by default doesn't
253
253
  # match newline characters. Consider using the "m" option (e.g. /regex/m ) which makes dot match newlines
254
254
  # or match newlines explicitly.
255
255
  # highlight_captures then puts a <span> </span> tag around all captures of the regex
@@ -301,7 +301,7 @@ module Custom
301
301
 
302
302
  # Scans all REXML::Text children of an REXML::Element for any occurrences of regex.
303
303
  # The text will be matched as one, not line by line as you might think.
304
- # If you want to write a regexp matching multiple lines keep in mind that the dot "." by default doesn't
304
+ # If you want to write a regexp matching multiple lines keep in mind that the dot "." by default doesn't
305
305
  # match newline characters. Consider using the "m" option (e.g. /regex/m ) which makes dot match newlines
306
306
  # or match newlines explicitly.
307
307
  # highlight then puts a <span> </span> tag around all matches of regex
@@ -348,11 +348,11 @@ module Custom
348
348
  end
349
349
 
350
350
  # creates a html table from two dimensional array of the form Array [row] [col]
351
- # @param table_data [Array<Array>] of the form Array [row] [col] containing all data, the '.to_s' method will be called on each element,
351
+ # @param table_data [Array<Array>] of the form Array [row] [col] containing all data, the '.to_s' method will be called on each element,
352
352
  # @param headers [Number] either of 0, 1, 2, 3. Where 0 is no headers (<th>) at all, 1 is only the first row,
353
353
  # 2 is only the first column and 3 is both, first row and first column as <th> elements. Every other number
354
354
  # is equivalent to the bitwise AND of the two least significant bits with 1, 2 or 3
355
- # @return [REXML::Element] the Element which was just added
355
+ # @return [REXML::Element] the Element which was just added
356
356
  def table(table_data, headers=0, table_attrs={}, tr_attrs={}, th_attrs={}, td_attrs={})
357
357
  opts = {
358
358
  headers: headers,
@@ -364,9 +364,9 @@ module Custom
364
364
  }
365
365
  custom_table(table_data, opts)
366
366
  end
367
-
367
+
368
368
  # creates a html table from two dimensional array of the form Array [row] [col]
369
- # @param table_data [Array<Array>] of the form Array [row] [col] containing all data, the '.to_s' method will be called on each element,
369
+ # @param table_data [Array<Array>] of the form Array [row] [col] containing all data, the '.to_s' method will be called on each element,
370
370
  # @option opts [Number] :headers either of 0, 1, 2, 3. Where 0 is no headers (<th>) at all, 1 is only the first row,
371
371
  # 2 is only the first column and 3 is both, first row and first column as <th> elements. Every other number
372
372
  # is equivalent to the bitwise AND of the two least significant bits with 1, 2 or 3
@@ -376,19 +376,19 @@ module Custom
376
376
  # @option opts [Hash] :th_attrs html attributes for the <th> tag
377
377
  # @option opts [Hash] :tr_attrs html attributes for the <tr> tag
378
378
  # @option opts [Hash] :td_attrs html attributes for the <td> tag
379
- # @option opts [Array<Hash>] :special Array of hashes for custom attributes on specific cells (<td> only) of the table
379
+ # @option opts [Array<Hash>] :special Array of hashes for custom attributes on specific cells (<td> only) of the table
380
380
  # @example Example of the :special attributes
381
381
  # opts[:special] = [
382
382
  # {
383
383
  # col_title: 'rx_DroppedFrameCount', # string or regexp or nil # if neither title nor index are present, the condition is evaluated for all <td> cells
384
384
  # col_index: 5..7, # Fixnum, Range or nil # index has precedence over title
385
385
  # row_title: 'D_0_BE_iMix', # string or regexp or nil
386
- # row_index: 6, # Fixnum, Range or nil
386
+ # row_index: 6, # Fixnum, Range or nil
387
387
  # condition: Proc.new { |e| Integer(e) != 0 }, # a proc
388
388
  # attributes: {"style" => "background-color: #DB7093;"},
389
389
  # },
390
390
  # ]
391
- # @return [REXML::Element] the Element which was just added
391
+ # @return [REXML::Element] the Element which was just added
392
392
  def custom_table(table_data, opts = {})
393
393
  defaults = {
394
394
  headers: 0,
@@ -400,7 +400,7 @@ module Custom
400
400
  special: [],
401
401
  }
402
402
  o = defaults.merge(opts)
403
-
403
+
404
404
  temp = REXML::Element.new("table")
405
405
  temp.add_attributes(o[:table_attrs])
406
406
  row_titles = table_data.collect{|row| row[0].to_s}
@@ -441,7 +441,7 @@ module Custom
441
441
  elsif !h[:row_title].nil?
442
442
  next if !row_titles[i].match(h[:row_title])
443
443
  end
444
-
444
+
445
445
  # here we are a candidate for special, so we check if we meet the condition
446
446
  # puts h[:attributes].inspect
447
447
  # puts "cell value row #{i} col #{j}: #{table_data[i][j]}"
@@ -460,28 +460,33 @@ module Custom
460
460
  }
461
461
  end
462
462
  end
463
-
463
+
464
464
  col = row.add_element("td", _td_attrs)
465
465
  end
466
466
  if o[:data_is_xhtml]
467
- # we need to create a new document with a pseudo root because having multiple nodes at top
467
+ # we need to create a new document with a pseudo root because having multiple nodes at top
468
468
  # level is not valid xml
469
469
  doc = REXML::Document.new("<root>" + table_data[i][j].to_s + "</root>")
470
470
  # then we move all children of root to the actual div middle element and insert after current
471
471
  for elem in doc.root.to_a do
472
- col.add_element(elem) # add the td element
472
+ if elem.is_a?(REXML::Text)
473
+ # due to reasons unclear to me, text needs special treatment
474
+ col.add_text(elem)
475
+ else
476
+ col.add_element(elem) # add the td element
477
+ end
473
478
  end
474
479
  else
475
480
  col.add_text(table_data[i][j].to_s)
476
481
  end
477
- end
478
- end
482
+ end # for j in 0..table_data[i].length-1 do # column
483
+ end # for i in 0..table_data.length-1 do # row
479
484
 
480
485
  @div_middle.insert_after(@current, temp)
481
486
  @current = temp
482
487
  return @current
483
488
  end
484
-
489
+
485
490
 
486
491
  # Appends a new heading element to body, and sets current to this new heading
487
492
  # @param tag_type [String] specifiy "h1", "h2", "h3" for the heading, defaults to "h1"
@@ -512,8 +517,8 @@ module Custom
512
517
  def heading_top(tag_type="h1", attrs={}, &block)
513
518
  temp = REXML::Element.new(tag_type)
514
519
  temp.add_attributes(attrs)
515
-
516
- # check if there are any child elements
520
+
521
+ # check if there are any child elements
517
522
  if @div_middle.has_elements?()
518
523
  # insert before the first child of div middle
519
524
  @div_middle.insert_before("//div[@id='middle']/*[1]", temp)
@@ -521,7 +526,7 @@ module Custom
521
526
  # middle is empty, just insert the heading
522
527
  @div_middle.insert_after(@current, temp)
523
528
  end
524
-
529
+
525
530
  @current = temp
526
531
  raise "Block argument is mandatory" unless block_given?
527
532
  text = encoding_fixer(block.call())
@@ -536,7 +541,7 @@ module Custom
536
541
  # some arbitrary
537
542
  # text child content
538
543
  # </test>
539
- # now we call replace_text_with_elements to place <span> around the word "arbitrary"
544
+ # now we call replace_text_with_elements to place <span> around the word "arbitrary"
540
545
  # =>
541
546
  # <test>
542
547
  # some <span>arbitrary</span>
@@ -559,7 +564,7 @@ module Custom
559
564
  # text = REXML::Text.new(element.value()[ last_end, j[0] - last_end ])
560
565
  # parent.add_text(text)
561
566
  # add text without creating a textnode, textnode screws up formatting (e.g. all whitespace are condensed into one)
562
- parent.add_text( element.value()[ last_end, j[0] - last_end ] )
567
+ parent.add_text( element.value()[ last_end, j[0] - last_end ] )
563
568
  end
564
569
  #create the tag node with attributes and add the text to it
565
570
  tag = parent.add_element(REXML::Element.new(tagname), attribs)
@@ -594,4 +599,4 @@ extend Custom
594
599
  # include XhtmlReportGenerator::Custom
595
600
  #
596
601
  #end
597
- #puts Test.new.header()
602
+ #puts Test.new.header()
@@ -1,5 +1,5 @@
1
1
  module XhtmlReportGenerator
2
- VERSION = '3.1.1'
2
+ VERSION = '3.1.2'
3
3
  end
4
4
 
5
- # puts XhtmlReportGenerator::VERSION
5
+ # puts XhtmlReportGenerator::VERSION
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xhtml_report_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Widmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-11 00:00:00.000000000 Z
11
+ date: 2017-03-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: "The generator can be used to create html or xhtml files. It comes with
14
14
  many utility functions.\n \nThe javascript to render the table of contents, the
@@ -51,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
51
  version: '0'
52
52
  requirements: []
53
53
  rubyforge_project:
54
- rubygems_version: 2.4.5.1
54
+ rubygems_version: 2.6.10
55
55
  signing_key:
56
56
  specification_version: 4
57
57
  summary: A simple html or xhtml generator or logger to create human readable reports