treemap21 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f562d64f657a93585417e8bb8c374d0ccc2b6c7236c27084a9de461428038a28
4
- data.tar.gz: 6b51234302c3c93ac22907af27909bd6a9ef117153b523ae123fc42500191b63
3
+ metadata.gz: c0c0ef895191c2b9096739debe2f5fc0587e0de4cd1e79353d476fa5d8f9511f
4
+ data.tar.gz: 4275d68e6f555f9b523238e418551fcdf3ac9e9d6e2c481d38b06399cd625c2d
5
5
  SHA512:
6
- metadata.gz: '08fc8fb6bd4e647760d2534e137d0af8d3e4fd176b08e8dff20955a9c916cec0c4813141b58b7d73c03fd777c2f87ff6733905f5ea2c0a9d549e61396013a81e'
7
- data.tar.gz: 316f46ef980904be39d77cdfd87e6ba244d345a5e153be7c7b86c004f82574c64d4b2be4122fb3ecaf08548fc743ee45d16ef1fac867c71a56d2d023e8128698
6
+ metadata.gz: 89e4ef858bb13e906b729720e0bea919959b464c8e662b421cad97c9ccdf0d010b1aa31453a8cd1d8e7d91838aa5b85256c8bd19b9364c0dfca29d32d953cbc0
7
+ data.tar.gz: af28c7e0cae6d56c98b03b3d328a27d0c4c724b739df29dc0a1ce0721849356072731f98efd70ea07c2711ab347f79cf907d567efb11b775ab16e262395f0dc0
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/treemap21.rb CHANGED
@@ -2,84 +2,115 @@
2
2
 
3
3
  # file: treemap21.rb
4
4
 
5
-
5
+ require 'c32'
6
6
  require 'rexle'
7
+ require 'weblet'
8
+ require 'polyrex'
7
9
 
8
10
 
9
11
  class Treemap21
12
+ using ColouredText
13
+
14
+ attr_reader :to_html, :title
15
+
16
+ def initialize(obj, orientation: :landscape, title: 'Treemap',
17
+ weblet_file: nil, debug: false)
18
+
19
+ @orientation, @title, @debug = orientation, title, debug
20
+
21
+ @a = case obj
22
+ when Array
23
+ a
24
+ when String
25
+
26
+ if obj.lstrip =~ /<?polyrex / then
27
+
28
+ px = Polyrex.new obj
29
+ doc = Rexle.new(px.to_tree)
30
+ scan_xml(doc.root)
31
+
32
+ elsif obj.lstrip =~ /</ then
33
+
34
+ doc = Rexle.new(obj)
35
+ scan_xml(doc.root)
36
+
37
+ else
38
+
39
+ # most likely a raw polyrex document without the processing
40
+ # instruction or header
41
+
42
+ head = "<?polyrex schema='items[title, description]/item[title," +
43
+ " pct, url]' delimiter=' # '?>\ntitle: Unititled\ndescription: " +
44
+ "Treemap record data"
45
+
46
+ s = head + "\n\n" + obj.lstrip
47
+ px = Polyrex.new s
48
+ doc = Rexle.new(px.to_tree)
49
+ scan_xml(doc.root)
50
+
51
+ end
52
+
53
+ end
10
54
 
11
- def initialize(a, orientation: :landscape, debug: false)
12
-
13
- @a, @orientation, @debug = a, orientation, debug
14
-
55
+ weblet_file ||= File.join(File.dirname(__FILE__), '..', 'data',
56
+ 'treemap21.txt')
57
+ @to_html = build_html(weblet_file)
58
+
15
59
  end
60
+
61
+ private
16
62
 
17
- def to_html()
18
-
19
- doc3 = Rexle.new("<div class='cbox'/>")
63
+ def build_html(weblet_file)
64
+
65
+ # used for the box id
66
+ @counter, @count = 2, 1
67
+
68
+ doc3 = Rexle.new("<div id='box1' class='cbox'/>")
20
69
  doc = mapper(doc3, @a, orientation: @orientation)
70
+
71
+ cbox_css = doc.root.xpath('//div[@class="cbox1"]').map do |e|
72
+ hex = 3.times.map { rand(60..250).to_s(16) }.join
73
+ "#%s { background-color: #%s}" % [e.attributes[:id], hex]
74
+ end
75
+
21
76
  boxes = doc.root.xml pretty: true
77
+ w = Weblet.new(weblet_file)
22
78
 
23
- <<EOF
24
- <html>
25
- <head>
26
- <style>
27
-
28
- .cbox, .long, .cbox1 {
29
- width: 100%;
30
- height: 100%;
31
- }
32
- .cbox1 ~.long, .cbox1 {
33
- float: left;
34
- }
35
- .cbox1 {
36
- display: flex;
37
- justify-content: center;
38
- align-items: center;
39
- }
40
-
41
- .cbox1 span { background-color: transparent;}
42
-
43
- .c10 {font-size: 8em}
44
- .c9 {font-size: 7.5em}
45
- .c8 {font-size: 6em}
46
- .c7 {font-size: 5.0em}
47
- .c6 {font-size: 4.9em}
48
- .c5 {font-size: 4.5em}
49
- .c4 {font-size: 3.2em}
50
- .c3 {font-size: 2.1em}
51
- .c2 {font-size: 1.9em}
52
- .c1 {font-size: 1.6em}
53
- .c0 {font-size: 1.1em}
54
-
55
- </style>
56
- </head>
57
- <body>
58
-
59
-
60
- #{boxes}
61
-
62
- </body>
63
- </html>
64
- EOF
79
+ w.render :html, binding
80
+
65
81
  end
66
82
 
67
- private
68
-
69
- def add_box(text, attr={}, cfont)
70
-
71
- a = attr.map {|key, value| "%s: %s" % [key, value]}
72
- h = {class: 'cbox1 ' + cfont, style: a.join('; ')}
83
+ def add_box(text, url=nil, attr={})
84
+
73
85
  span = Rexle::Element.new('span', value: text)
86
+
87
+ #a = attr.map {|key, value| "%s: %s" % [key, value]}
88
+
89
+ h = {
90
+ id: 'cbox' + @count.to_s,
91
+ class: 'cbox1 '
92
+ }
93
+ @count = @count + 1
94
+
74
95
  doc = Rexle::Element.new('div', attributes: h)
75
- doc.root.add span
96
+
97
+ if url then
98
+ anchor = Rexle::Element.new('a', attributes: {href: url, draggable: 'false'})
99
+ anchor.root.add span
100
+ doc.root.add anchor.root
101
+ else
102
+ doc.root.add span
103
+
104
+ end
105
+
76
106
  doc.root
77
-
107
+
78
108
  end
79
109
 
80
110
  def mapper(doc, a, orientation: :landscape, total: 100)
81
-
111
+
82
112
  if @debug then
113
+ puts 'a: ' + a.inspect
83
114
  puts 'orientation: ' + orientation.inspect
84
115
  puts 'total: ' + total.inspect
85
116
  end
@@ -91,52 +122,134 @@ EOF
91
122
  @canvas_height = 100; @canvas_width = @canvas_height / 2
92
123
  'cbox'
93
124
  end
94
-
95
- bgcolor = 3.times.map { rand(60..250).to_s(16) }.join
125
+
126
+ a.map! do |x|
127
+ x[1] = x[1].nil? ? 1 : x[1].to_f
128
+ x
129
+ end
96
130
 
97
131
  # find the largest box
98
- a2 = a.sort_by(&:last).reverse
99
- puts 'a2.first: ' + a2.first.inspect if @debug
100
- title, percent = a2.first
132
+ a2 = a.sort_by {|_, val, _| val}
133
+
134
+ # get the total value
135
+ total = a2.sum {|x| x[1]}
136
+ puts 'total ; ' + total.inspect if @debug
137
+
138
+
139
+ # calculate the percentages
140
+ a3 = a2.map do |title, val, url, list|
141
+ apct = 100 / (total / val.to_f)
142
+ [title, val, url, list, apct]
143
+ end
144
+ puts 'a3: ' + a3.inspect if @debug
101
145
 
146
+ puts 'a3.first: ' + a3.first.inspect if @debug
147
+ item = a3.pop
148
+
149
+ percent = item[1]
102
150
  remainder = total - percent
103
151
  # how much space does the largest box take?
104
- rem = 100 / (total / percent.to_f)
105
- rem2 = 100 - rem
152
+ rpct = 100 / (total / percent.to_f)
153
+ rem_pct = 100 - rpct
106
154
 
107
- new_orientation = if rem <= 30 then
155
+ new_orientation = if rpct.round <= 133 and rpct.round >= 9993 then
108
156
  orientation
109
157
  else
110
158
  orientation == :landscape ? :portrait : :landscape
111
159
  end
112
160
 
113
161
  puts 'new_orientation: ' + new_orientation.inspect if @debug
114
-
115
- dimension = orientation == :landscape ? :width : :height
116
162
 
117
- style = {
118
- :"background-color" => '#' + bgcolor,
119
- dimension => rem.round.to_s + '%'
163
+ dimension = orientation == :landscape ? :width : :height
164
+ hstyle = { dimension => rpct.round.to_s + '%' }
165
+ style = hstyle.map {|key, value| "%s: %s" % [key, value]}.join(';')
166
+
167
+ h = {
168
+ class: klass,
169
+ style: style
120
170
  }
121
171
 
122
- e = add_box(title, style, ("c%02d" % percent).to_s[0..-2])
123
- puts 'e: ' + e.inspect if @debug
172
+ div = Rexle::Element.new('div', attributes: h)
173
+
174
+
175
+ if item[3].is_a? Array then
176
+
177
+ # it's a group item
178
+ group_name, url = item.values_at(0, 2)
179
+ #<div class='glabel'> <span>Group A</span> </div>
180
+ group = Rexle::Element.new('div', attributes: {style: style, class: 'glabel'})
181
+ span = Rexle::Element.new('span', value: group_name)
182
+
183
+ if url then
184
+
185
+ anchor = Rexle::Element.new('a', attributes: {href: url})
186
+ anchor.root.add span
187
+ group.add anchor.root
188
+
189
+ else
190
+
191
+ group.add span
192
+
193
+ end
194
+
195
+ div.add group
196
+
197
+ style = "%s: %s%%; font-size: %s%%" % [ dimension, rem_pct.round,
198
+ rem_pct.round]
199
+ doc4 = Rexle.new("<div id='box%s' class='%s' style='%s'/>" % \
200
+ [@counter, klass, style])
201
+ puts ('rem_pct: ' + rem_pct.inspect).debug if @debug
202
+ mapper(div, item[3], orientation: orientation)
203
+
204
+ #group_foot = Rexle::Element.new('div', attributes: {class: 'gfoot'})
205
+ #div.add group_foot
206
+
207
+ else
208
+
209
+ title, value, url, list, percent = item
210
+
211
+
212
+ if @debug then
213
+ puts 'percent: ' + percent.inspect
214
+ end
215
+
216
+ #e = add_box(title, url, {}, ("c%02d" % factor).to_s[0..-2])
217
+ e = add_box(title, url, {})
218
+ puts 'e: ' + e.inspect if @debug
219
+
220
+ end
221
+
222
+ div.add e
223
+ doc.root.add div
124
224
 
125
- doc.root.add e
225
+ if a3.any? then
126
226
 
127
- if a2.length > 1 then
227
+ style = "%s: %s%%; font-size: %s%%" % [ dimension, rem_pct.round,
228
+ rem_pct.round + 15]
229
+ doc3 = Rexle.new("<div id='box%s' class='%s' style='%s'/>" % \
230
+ [@counter, klass, style])
231
+ @counter += 1
128
232
 
129
- dim2 = orientation == :landscape ? 'width' : 'height'
130
- doc3 = Rexle.new("<div class='%s' style='%s: %s%%'/>" % [klass, dim2,
131
- rem2.round.to_s])
233
+ puts ('_rem_pct: ' + rem_pct.inspect).debug if @debug
234
+ doc2 = mapper(doc3, a3, orientation: new_orientation, total: remainder)
235
+ doc.root.add doc2.root
132
236
 
133
- doc2 = mapper(doc3, a2[1..-1], orientation: new_orientation, total: remainder)
237
+ end
238
+
239
+ return doc
134
240
 
135
- doc.root.add doc2.root
241
+ end
242
+
243
+ def scan_xml(e)
136
244
 
137
- end
245
+ e.xpath('item').map do |node|
138
246
 
139
- return doc
247
+ title, pct, url = node.attributes.values
248
+
249
+ r = [title, pct, url]
250
+ r << scan_xml(node) if node.children.any?
251
+ r
252
+ end
140
253
 
141
254
  end
142
255
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: treemap21
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,28 +35,48 @@ cert_chain:
35
35
  12lnvOZUZbofT7ctIMQL18INESoDYcmiH9r34KV6UCK9H/Ifm5CPKEYee8nilRM+
36
36
  yIv4TcA8Psh7eTn7IAvLK4C0
37
37
  -----END CERTIFICATE-----
38
- date: 2021-05-10 00:00:00.000000000 Z
38
+ date: 2021-05-18 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
- name: rexle
41
+ name: polyrex
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.5'
46
+ version: '1.3'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 1.5.11
49
+ version: 1.3.1
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '1.5'
56
+ version: '1.3'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 1.5.11
59
+ version: 1.3.1
60
+ - !ruby/object:Gem::Dependency
61
+ name: weblet
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '0.3'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.3.5
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.3'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.3.5
60
80
  description:
61
81
  email: digital.robertson@gmail.com
62
82
  executables: []
@@ -87,5 +107,5 @@ rubyforge_project:
87
107
  rubygems_version: 2.7.10
88
108
  signing_key:
89
109
  specification_version: 4
90
- summary: Experimental treemapping gem which generates an HTML document.
110
+ summary: Treemapping gem which generates an HTML document.
91
111
  test_files: []
metadata.gz.sig CHANGED
Binary file