mork 0.0.3 → 0.0.5
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 +4 -4
- data/Guardfile +5 -5
- data/lib/mork/grid.rb +172 -142
- data/lib/mork/grid_const.rb +83 -13
- data/lib/mork/mimage.rb +2 -2
- data/lib/mork/mimage_list.rb +2 -2
- data/lib/mork/sheet.rb +61 -23
- data/lib/mork/sheet_pdf.rb +71 -30
- data/lib/mork/version.rb +1 -1
- data/lib/mork.rb +1 -2
- data/spec/mork/grid_spec.rb +1 -1
- data/spec/mork/sheet_pdf_spec.rb +122 -12
- data/spec/mork/sheet_spec.rb +36 -17
- data/spec/samples/info.yml +7 -1
- data/spec/samples/qzc006.jpg +0 -0
- data/spec/samples/sample02.jpg +0 -0
- metadata +6 -5
- data/lib/mork/report.rb +0 -39
- data/spec/mork/report_spec.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74b53c108c7a1ae34a090aac3b9380805326ee01
|
4
|
+
data.tar.gz: f34f58ad865ffc0995cf51a21e0c2c163b4f8e27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55f9f4dff569c87008aa9e15a4029172258d0c3998746700188f440695ece40948a0b529d21a3512dd632537cfc123ee8730e8bfb99b7dd31a6c708150f742a4
|
7
|
+
data.tar.gz: 68b53cf1ab3b9adc014b8da070da4e8d16b8706eb3754f735fa596b8025f6b720b803d8a225efacd1db2d9922b1ba98ae1cba2712b714de694c67b9d1c5f6d6c
|
data/Guardfile
CHANGED
@@ -3,8 +3,8 @@ guard 'rspec', all_after_pass: false do
|
|
3
3
|
watch(%r{^lib/mork/(.+)\.rb$}) { |m| "spec/mork/#{m[1]}_spec.rb" }
|
4
4
|
end
|
5
5
|
|
6
|
-
guard :shell do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
6
|
+
# guard :shell do
|
7
|
+
# watch "tmp/code_sample.pdf" do
|
8
|
+
# system "open tmp/code_sample.pdf"
|
9
|
+
# end
|
10
|
+
# end
|
data/lib/mork/grid.rb
CHANGED
@@ -6,10 +6,19 @@ module Mork
|
|
6
6
|
# All returned values are in the arbitrary units given in the configuration file
|
7
7
|
class Grid
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
def initialize(options = {})
|
10
|
+
case options.class.to_s
|
11
|
+
when "Hash"
|
12
|
+
@params = DGRID.merge! options
|
13
|
+
when "String"
|
14
|
+
@params = DGRID.merge! YAML.load_file(options)
|
15
|
+
else
|
16
|
+
raise "Invalid options parameter: #{options.class.inspect}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def options
|
21
|
+
@params
|
13
22
|
end
|
14
23
|
|
15
24
|
def set_page_size(x, y)
|
@@ -17,59 +26,47 @@ module Mork
|
|
17
26
|
@py = y.to_f
|
18
27
|
end
|
19
28
|
|
20
|
-
def default_chlist
|
21
|
-
[@params["responses"]["max_cells"]] * max_questions
|
22
|
-
end
|
23
|
-
|
24
29
|
def max_questions
|
25
30
|
columns * rows
|
26
31
|
end
|
27
32
|
|
28
33
|
def max_choices_per_question
|
29
|
-
@params[
|
34
|
+
@params[:responses][:max_cells]
|
30
35
|
end
|
31
36
|
|
32
37
|
def code_bits
|
33
|
-
|
38
|
+
@params[:code][:bits].to_i
|
34
39
|
end
|
35
40
|
|
36
|
-
|
37
|
-
|
41
|
+
# ====================================================
|
42
|
+
# = Returning {x, y, w, h} hashes for area locations =
|
43
|
+
# ====================================================
|
44
|
+
def reg_mark_tl_search_area
|
45
|
+
reg_mark_search_area 0, 0
|
38
46
|
end
|
39
47
|
|
40
|
-
def
|
41
|
-
|
42
|
-
rmm = REG_MARGIN - REG_SEARCH
|
43
|
-
case n
|
44
|
-
when :top_left
|
45
|
-
reg_mark_sa rmm, rmm
|
46
|
-
when :top_right
|
47
|
-
reg_mark_sa page_width - rmp, rmm
|
48
|
-
when :bottom_right
|
49
|
-
reg_mark_sa page_width - rmp, page_height - rmp
|
50
|
-
when :bottom_left
|
51
|
-
reg_mark_sa rmm, page_height - rmp
|
52
|
-
end
|
48
|
+
def reg_mark_tr_search_area
|
49
|
+
reg_mark_search_area page_width - reg_search, 0
|
53
50
|
end
|
54
|
-
|
55
|
-
def
|
56
|
-
|
57
|
-
ch = @py / page_height
|
58
|
-
{
|
59
|
-
x: (cw * x).round,
|
60
|
-
y: (ch * y).round,
|
61
|
-
w: (cw * REG_SEARCH * 2).round,
|
62
|
-
h: (ch * REG_SEARCH * 2).round
|
63
|
-
}
|
51
|
+
|
52
|
+
def reg_mark_br_search_area
|
53
|
+
reg_mark_search_area page_width - reg_search, page_height - reg_search
|
64
54
|
end
|
65
|
-
|
55
|
+
|
56
|
+
def reg_mark_bl_search_area
|
57
|
+
reg_mark_search_area 0, page_height - reg_search
|
58
|
+
end
|
59
|
+
|
66
60
|
def choice_cell_area(q, c)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
61
|
+
cell_area cell_x(q, c), cell_y(q)
|
62
|
+
end
|
63
|
+
|
64
|
+
def dark_control_cell_area
|
65
|
+
cell_area ctrl_cell_left, ctrl_cell_y
|
66
|
+
end
|
67
|
+
|
68
|
+
def light_control_cell_area
|
69
|
+
cell_area ctrl_cell_left + cell_spacing, ctrl_cell_y
|
73
70
|
end
|
74
71
|
|
75
72
|
def white_calibration_area
|
@@ -92,11 +89,11 @@ module Mork
|
|
92
89
|
end
|
93
90
|
|
94
91
|
def pdf_margins
|
95
|
-
|
92
|
+
reg_margin.mm
|
96
93
|
end
|
97
94
|
|
98
95
|
def pdf_reg_marks
|
99
|
-
r =
|
96
|
+
r = @params[:regmarks][:radius].to_f.mm
|
100
97
|
[
|
101
98
|
{ p: [0, 0 ], r: r },
|
102
99
|
{ p: [0, reg_frame_height.mm], r: r },
|
@@ -111,14 +108,14 @@ module Mork
|
|
111
108
|
|
112
109
|
def pdf_code_areas_for(code)
|
113
110
|
a = []
|
114
|
-
|
111
|
+
code_bits.times do |bit|
|
115
112
|
a << pdf_code_cell_area(bit+1) if code[bit] == 1
|
116
113
|
end
|
117
114
|
a
|
118
115
|
end
|
119
116
|
|
120
117
|
def pdf_code_bit_areas
|
121
|
-
(1..
|
118
|
+
(1..code_bits).collect do |bit|
|
122
119
|
pdf_code_cell_area bit
|
123
120
|
end
|
124
121
|
end
|
@@ -126,8 +123,8 @@ module Mork
|
|
126
123
|
def pdf_code_cell_area(i)
|
127
124
|
{
|
128
125
|
p: [code_cell_x(i).mm, (reg_frame_height - code_y).mm],
|
129
|
-
w:
|
130
|
-
h:
|
126
|
+
w: code_width.mm,
|
127
|
+
h: code_height.mm * 2
|
131
128
|
}
|
132
129
|
end
|
133
130
|
|
@@ -142,25 +139,33 @@ module Mork
|
|
142
139
|
def pdf_choice_letter_xy(q, c)
|
143
140
|
[
|
144
141
|
cell_x(q, c).mm + 2.mm,
|
145
|
-
(reg_frame_height - cell_y(q)).mm -
|
142
|
+
(reg_frame_height - cell_y(q)).mm - (cell_height*2)
|
146
143
|
]
|
147
144
|
end
|
148
145
|
|
149
146
|
def pdf_qnum_xy(q)
|
150
147
|
[
|
151
|
-
cell_x(q, 0).mm - pdf_qnum_width -
|
152
|
-
(reg_frame_height - cell_y(q)).mm -
|
148
|
+
cell_x(q, 0).mm - pdf_qnum_width - @params[:responses][:number_margin].to_f.mm,
|
149
|
+
(reg_frame_height - cell_y(q)).mm - cell_height
|
153
150
|
]
|
154
151
|
end
|
152
|
+
|
153
|
+
def pdf_qnum_size
|
154
|
+
@params[:responses][:number_size].to_f
|
155
|
+
end
|
156
|
+
|
157
|
+
def pdf_chlett_size
|
158
|
+
@params[:responses][:letter_size].to_f
|
159
|
+
end
|
155
160
|
|
156
161
|
def pdf_qnum_width
|
157
|
-
|
162
|
+
@params[:responses][:number_width].to_f.mm
|
158
163
|
end
|
159
164
|
|
160
165
|
def pdf_header_xy(k)
|
161
166
|
[
|
162
|
-
header[k
|
163
|
-
(reg_frame_height - header[k
|
167
|
+
@params[:header][k][:left].to_f.mm,
|
168
|
+
(reg_frame_height - @params[:header][k][:top].to_f).mm
|
164
169
|
]
|
165
170
|
end
|
166
171
|
|
@@ -169,23 +174,69 @@ module Mork
|
|
169
174
|
1.mm,
|
170
175
|
pdf_header_height(k) - 1.mm
|
171
176
|
]
|
172
|
-
|
173
177
|
end
|
174
178
|
|
175
179
|
def pdf_header_width(k)
|
176
|
-
header[k
|
180
|
+
@params[:header][k][:width].to_f.mm
|
177
181
|
end
|
178
182
|
|
179
183
|
def pdf_header_height(k)
|
180
|
-
header[k
|
184
|
+
@params[:header][k][:height].to_f.mm
|
181
185
|
end
|
182
186
|
|
183
187
|
def pdf_header_size(k)
|
184
|
-
header[k
|
188
|
+
@params[:header][k][:size].to_f
|
185
189
|
end
|
186
190
|
|
187
191
|
def pdf_header_boxed?(k)
|
188
|
-
header[k
|
192
|
+
@params[:header][k][:box] == true
|
193
|
+
end
|
194
|
+
|
195
|
+
def pdf_dark_control_cell_area
|
196
|
+
{
|
197
|
+
p: [pdf_control_xy[0]+pdf_control_width+ctrl_margin.mm, pdf_control_xy[1]],
|
198
|
+
w: cell_width.mm,
|
199
|
+
h: cell_height.mm
|
200
|
+
}
|
201
|
+
end
|
202
|
+
|
203
|
+
def pdf_light_control_cell_area
|
204
|
+
{
|
205
|
+
p: [cell_spacing.mm + pdf_control_xy[0]+pdf_control_width+@params[:control][:margin].to_f.mm, pdf_control_xy[1]],
|
206
|
+
w: cell_width.mm,
|
207
|
+
h: cell_height.mm
|
208
|
+
}
|
209
|
+
end
|
210
|
+
|
211
|
+
def pdf_dark_control_letter_xy
|
212
|
+
xy = pdf_dark_control_cell_area[:p]
|
213
|
+
[
|
214
|
+
xy[0] + 2.mm,
|
215
|
+
xy[1] - 4.mm
|
216
|
+
]
|
217
|
+
end
|
218
|
+
|
219
|
+
def pdf_light_control_letter_xy
|
220
|
+
xy = pdf_light_control_cell_area[:p]
|
221
|
+
[
|
222
|
+
xy[0] + 2.mm,
|
223
|
+
xy[1] - 4.mm
|
224
|
+
]
|
225
|
+
end
|
226
|
+
|
227
|
+
def pdf_control_width
|
228
|
+
@params[:control][:width].to_f.mm
|
229
|
+
end
|
230
|
+
|
231
|
+
def pdf_control_xy
|
232
|
+
[
|
233
|
+
@params[:control][:left].to_f.mm,
|
234
|
+
(reg_frame_height - ctrl_cell_y).mm
|
235
|
+
]
|
236
|
+
end
|
237
|
+
|
238
|
+
def pdf_control_size
|
239
|
+
@params[:control][:size]
|
189
240
|
end
|
190
241
|
|
191
242
|
private
|
@@ -198,12 +249,36 @@ module Mork
|
|
198
249
|
@py / reg_frame_height
|
199
250
|
end
|
200
251
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
def
|
206
|
-
|
252
|
+
def cw
|
253
|
+
@px / page_width
|
254
|
+
end
|
255
|
+
|
256
|
+
def ch
|
257
|
+
@py / page_height
|
258
|
+
end
|
259
|
+
|
260
|
+
# {} = cell_area(x, y)
|
261
|
+
#
|
262
|
+
# the 4 values needed to locate a single cell area
|
263
|
+
def cell_area(x,y)
|
264
|
+
{
|
265
|
+
x: (cx * x ).round,
|
266
|
+
y: (cy * y ).round,
|
267
|
+
w: (cx * cell_width ).round,
|
268
|
+
h: (cy * cell_height ).round
|
269
|
+
}
|
270
|
+
end
|
271
|
+
|
272
|
+
# {} = reg_mark_search_area(x, y)
|
273
|
+
#
|
274
|
+
# the 4 values needed to locate a single registration mark
|
275
|
+
def reg_mark_search_area(x, y)
|
276
|
+
{
|
277
|
+
x: (cw * x).round,
|
278
|
+
y: (ch * y).round,
|
279
|
+
w: (cw * reg_search).round,
|
280
|
+
h: (ch * reg_search).round
|
281
|
+
}
|
207
282
|
end
|
208
283
|
|
209
284
|
# cell_y(q)
|
@@ -222,46 +297,6 @@ module Mork
|
|
222
297
|
first_x + column_width * (q / rows) + cell_spacing * c - cell_width / 2
|
223
298
|
end
|
224
299
|
|
225
|
-
def cell_width
|
226
|
-
@params["responses"]["cell_width"].to_f
|
227
|
-
end
|
228
|
-
|
229
|
-
def cell_height
|
230
|
-
@params["responses"]["cell_height"].to_f
|
231
|
-
end
|
232
|
-
|
233
|
-
def cell_spacing
|
234
|
-
@params["responses"]["x_spacing"].to_f
|
235
|
-
end
|
236
|
-
|
237
|
-
def response_spacing
|
238
|
-
@params["responses"]["y_spacing"].to_f
|
239
|
-
end
|
240
|
-
|
241
|
-
def column_width
|
242
|
-
@params["responses"]["column_width"].to_f
|
243
|
-
end
|
244
|
-
|
245
|
-
def row_spacing
|
246
|
-
@params["responses"]["y_spacing"].to_f
|
247
|
-
end
|
248
|
-
|
249
|
-
def first_x
|
250
|
-
@params["responses"]["first_x"].to_f
|
251
|
-
end
|
252
|
-
|
253
|
-
def first_y
|
254
|
-
@params["responses"]["first_y"].to_f
|
255
|
-
end
|
256
|
-
|
257
|
-
def rows
|
258
|
-
@params["responses"]["rows"]
|
259
|
-
end
|
260
|
-
|
261
|
-
def columns
|
262
|
-
@params["responses"]["columns"]
|
263
|
-
end
|
264
|
-
|
265
300
|
# ==============
|
266
301
|
# = sheet code =
|
267
302
|
# ==============
|
@@ -269,55 +304,50 @@ module Mork
|
|
269
304
|
{
|
270
305
|
x: (cx * code_cell_x(i)).round,
|
271
306
|
y: (cy * code_y ).round,
|
272
|
-
w: (cx *
|
273
|
-
h: (cy *
|
307
|
+
w: (cx * code_width ).round,
|
308
|
+
h: (cy * code_height ).round
|
274
309
|
}
|
275
310
|
end
|
276
311
|
|
277
312
|
def code_cell_x(i)
|
278
|
-
|
313
|
+
@params[:code][:left] + @params[:code][:spacing] * i
|
279
314
|
end
|
280
315
|
|
281
316
|
def code_y
|
282
|
-
reg_frame_height -
|
317
|
+
reg_frame_height - code_height
|
283
318
|
end
|
284
319
|
|
285
320
|
# ======================
|
286
321
|
# = registration sides =
|
287
322
|
# ======================
|
288
|
-
def reg_frame_width
|
289
|
-
page_width - REG_MARGIN * 2
|
290
|
-
end
|
291
|
-
|
292
|
-
def reg_frame_height
|
293
|
-
page_height - REG_MARGIN * 2
|
294
|
-
end
|
295
|
-
|
296
|
-
def page_width
|
297
|
-
@params["page_size"]["width"].to_f
|
298
|
-
end
|
299
|
-
|
300
|
-
def page_height
|
301
|
-
@params["page_size"]["height"].to_f
|
302
|
-
end
|
303
|
-
|
304
|
-
# ============
|
305
|
-
# = Header
|
306
|
-
# ============
|
307
|
-
def name_x
|
308
|
-
@params["header"]["name"]["top"].to_f
|
309
|
-
end
|
310
|
-
|
311
|
-
def name_y
|
312
|
-
@params["header"]["name"]["left"].to_f
|
313
|
-
end
|
314
323
|
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
def
|
320
|
-
|
321
|
-
end
|
324
|
+
# ===============================
|
325
|
+
# = Simple parameter extraction =
|
326
|
+
# ===============================
|
327
|
+
def ctrl_cell_left() @params[:control][:left].to_f + @params[:control][:width].to_f + ctrl_margin end
|
328
|
+
def ctrl_margin() @params[:control][:margin].to_f end
|
329
|
+
def ctrl_cell_y() @params[:control][:top].to_f end
|
330
|
+
def code_height() @params[:code][:height].to_f end
|
331
|
+
def code_width() @params[:code][:width].to_f end
|
332
|
+
def page_width() @params[:page_size][:width].to_f end
|
333
|
+
def page_height() @params[:page_size][:height].to_f end
|
334
|
+
def name_x() @params[:header][:name][:top].to_f end
|
335
|
+
def name_y() @params[:header][:name][:left].to_f end
|
336
|
+
def name_w() @params[:header][:name][:width].to_f end
|
337
|
+
def name_size() @params[:header][:name][:size].to_f end
|
338
|
+
def cell_width() @params[:responses][:cell_width].to_f end
|
339
|
+
def cell_height() @params[:responses][:cell_height].to_f end
|
340
|
+
def cell_spacing() @params[:responses][:x_spacing].to_f end
|
341
|
+
def response_spacing() @params[:responses][:y_spacing].to_f end
|
342
|
+
def column_width() @params[:responses][:column_width].to_f end
|
343
|
+
def row_spacing() @params[:responses][:y_spacing].to_f end
|
344
|
+
def first_x() @params[:responses][:first_x].to_f end
|
345
|
+
def first_y() @params[:responses][:first_y].to_f end
|
346
|
+
def rows() @params[:responses][:rows] end
|
347
|
+
def columns() @params[:responses][:columns] end
|
348
|
+
def reg_margin() @params[:regmarks][:margin].to_f end
|
349
|
+
def reg_search() @params[:regmarks][:search].to_f end
|
350
|
+
def reg_frame_width() page_width - reg_margin * 2 end
|
351
|
+
def reg_frame_height() page_height - reg_margin * 2 end
|
322
352
|
end
|
323
353
|
end
|
data/lib/mork/grid_const.rb
CHANGED
@@ -1,14 +1,84 @@
|
|
1
1
|
module Mork
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
2
|
+
# this is the default grid!
|
3
|
+
DGRID = {
|
4
|
+
# default units are millimiters
|
5
|
+
page_size: {
|
6
|
+
# this is A4
|
7
|
+
width: 210.0,
|
8
|
+
height: 297.0
|
9
|
+
}, # page end
|
10
|
+
regmarks: {
|
11
|
+
margin: 10,
|
12
|
+
radius: 2.5,
|
13
|
+
search: 10
|
14
|
+
}, # regmarks end
|
15
|
+
header: {
|
16
|
+
name: {
|
17
|
+
top: 5,
|
18
|
+
left: 7.5,
|
19
|
+
width: 170,
|
20
|
+
size: 14,
|
21
|
+
},
|
22
|
+
title: {
|
23
|
+
top: 15,
|
24
|
+
left: 7.5,
|
25
|
+
width: 180,
|
26
|
+
size: 12
|
27
|
+
},
|
28
|
+
code: {
|
29
|
+
top: 5,
|
30
|
+
left: 165,
|
31
|
+
width: 20,
|
32
|
+
size: 14
|
33
|
+
},
|
34
|
+
signature: {
|
35
|
+
top: 30,
|
36
|
+
left: 7.5,
|
37
|
+
width: 120,
|
38
|
+
height: 15,
|
39
|
+
size: 7,
|
40
|
+
box: true,
|
41
|
+
}
|
42
|
+
}, # header end
|
43
|
+
responses: {
|
44
|
+
columns: 4,
|
45
|
+
column_width: 49,
|
46
|
+
rows: 30,
|
47
|
+
# from the top-left registration mark
|
48
|
+
# to the center of the first choice cell
|
49
|
+
first_x: 10.5,
|
50
|
+
first_y: 55.5,
|
51
|
+
# between choices
|
52
|
+
x_spacing: 7.0,
|
53
|
+
# between rows
|
54
|
+
y_spacing: 7.0,
|
55
|
+
# darkened area
|
56
|
+
cell_width: 6.0,
|
57
|
+
cell_height: 5.0,
|
58
|
+
# the maximum number of choices per question
|
59
|
+
max_cells: 5,
|
60
|
+
# font size for the question number
|
61
|
+
number_size: 10,
|
62
|
+
# distance between right side of q num and left side of first choice cell
|
63
|
+
number_width: 8,
|
64
|
+
# width of question number text box
|
65
|
+
number_margin: 2,
|
66
|
+
# font size for the choice letter
|
67
|
+
letter_size: 8
|
68
|
+
}, # responses end
|
69
|
+
code: {
|
70
|
+
bits: 40,
|
71
|
+
left: 15,
|
72
|
+
width: 3.0,
|
73
|
+
height: 2.5,
|
74
|
+
spacing: 4
|
75
|
+
}, # code end
|
76
|
+
control: {
|
77
|
+
top: 40,
|
78
|
+
left: 123,
|
79
|
+
width: 50,
|
80
|
+
size: 9,
|
81
|
+
margin: 2.5
|
82
|
+
} # control end
|
83
|
+
}
|
84
|
+
end
|
data/lib/mork/mimage.rb
CHANGED
@@ -23,8 +23,8 @@ module Mork
|
|
23
23
|
# = Highlight =
|
24
24
|
# =============
|
25
25
|
def highlight!(c)
|
26
|
-
m = Magick::Image.new(c[:w], c[:h]) { self.background_color = "
|
27
|
-
@image.composite! m, c[:x], c[:y], Magick::
|
26
|
+
m = Magick::Image.new(c[:w], c[:h]) { self.background_color = "yellow" }
|
27
|
+
@image.composite! m, c[:x], c[:y], Magick::CopyYellowCompositeOp
|
28
28
|
end
|
29
29
|
|
30
30
|
# ============
|
data/lib/mork/mimage_list.rb
CHANGED
data/lib/mork/sheet.rb
CHANGED
@@ -20,7 +20,7 @@ module Mork
|
|
20
20
|
|
21
21
|
# code_string
|
22
22
|
#
|
23
|
-
# returns the sheet code as a string of 0s and 1s. The string is
|
23
|
+
# returns the sheet code as a string of 0s and 1s. The string is code_bits
|
24
24
|
# bits long, with most significant bits to the left
|
25
25
|
def code_string
|
26
26
|
cs = (0...@grid.code_bits).inject("") { |c, v| c << code_cell_value(v) }
|
@@ -32,9 +32,11 @@ module Mork
|
|
32
32
|
# returns true if the specified question/choice cell has been darkened
|
33
33
|
# false otherwise
|
34
34
|
def marked?(q, c)
|
35
|
-
shade_of(q, c) <
|
35
|
+
shade_of(q, c) < choice_threshold
|
36
36
|
end
|
37
37
|
|
38
|
+
# TODO: define method ‘mark’ to retrieve the choice array for a single item
|
39
|
+
|
38
40
|
# mark_array(range)
|
39
41
|
#
|
40
42
|
# returns an array of arrays of marked choices.
|
@@ -57,10 +59,40 @@ module Mork
|
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
62
|
+
# ================
|
63
|
+
# = HIGHLIGHTING =
|
64
|
+
# ================
|
65
|
+
|
66
|
+
def highlight_all
|
67
|
+
@grid.max_questions.times do |i|
|
68
|
+
@grid.max_choices_per_question.times do |j|
|
69
|
+
highlight_choice i, j
|
70
|
+
end
|
71
|
+
end
|
72
|
+
@mimage.highlight! @grid.dark_control_cell_area
|
73
|
+
@mimage.highlight! @grid.light_control_cell_area
|
74
|
+
end
|
75
|
+
|
76
|
+
def highlight
|
77
|
+
mark_array.each_with_index do |qa, i|
|
78
|
+
qa.each do |cho|
|
79
|
+
highlight_choice i, cho
|
80
|
+
end
|
81
|
+
end
|
82
|
+
@mimage.highlight! @grid.dark_control_cell_area
|
83
|
+
@mimage.highlight! @grid.light_control_cell_area
|
84
|
+
end
|
85
|
+
|
60
86
|
def highlight_choice(q, c)
|
61
87
|
@mimage.highlight! @grid.choice_cell_area(q, c)
|
62
88
|
end
|
63
89
|
|
90
|
+
def highlight_code
|
91
|
+
@grid.code_bits.times do |bit|
|
92
|
+
@mimage.highlight! @grid.code_bit_area bit
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
64
96
|
def highlight_code_bit(i)
|
65
97
|
@mimage.highlight! @grid.code_bit_area(i)
|
66
98
|
end
|
@@ -77,23 +109,8 @@ module Mork
|
|
77
109
|
@mimage.write(fname)
|
78
110
|
end
|
79
111
|
|
80
|
-
def dark_code_bit_shade
|
81
|
-
NPatch.new(@mimage.crop @grid.black_calibration_area).average
|
82
|
-
end
|
83
|
-
|
84
|
-
def light_code_bit_shade
|
85
|
-
NPatch.new(@mimage.crop @grid.white_calibration_area).average
|
86
|
-
end
|
87
|
-
|
88
112
|
private
|
89
|
-
def shade_of(q, c)
|
90
|
-
NPatch.new(@mimage.crop @grid.choice_cell_area(q, c)).average
|
91
|
-
end
|
92
113
|
|
93
|
-
def dark_threshold
|
94
|
-
50000
|
95
|
-
end
|
96
|
-
|
97
114
|
def question_range(r)
|
98
115
|
if r.nil?
|
99
116
|
(0...@grid.max_questions)
|
@@ -104,12 +121,29 @@ module Mork
|
|
104
121
|
end
|
105
122
|
end
|
106
123
|
|
124
|
+
# =================================
|
125
|
+
# = compute shading with NPatches =
|
126
|
+
# =================================
|
127
|
+
def shade_of(q, c)
|
128
|
+
naverage @grid.choice_cell_area(q, c)
|
129
|
+
end
|
130
|
+
|
107
131
|
def shade_of_code_bit(i)
|
108
|
-
|
132
|
+
naverage @grid.code_bit_area(i)
|
109
133
|
end
|
110
134
|
|
111
135
|
def code_cell_value(i)
|
112
|
-
shade_of_code_bit(i) <
|
136
|
+
shade_of_code_bit(i) < code_threshold ? "1" : "0"
|
137
|
+
end
|
138
|
+
|
139
|
+
def choice_threshold
|
140
|
+
@choice_threshold ||= (naverage(@grid.dark_control_cell_area) +
|
141
|
+
naverage(@grid.light_control_cell_area)) / 2
|
142
|
+
end
|
143
|
+
|
144
|
+
def code_threshold
|
145
|
+
@code_threshold ||= (naverage(@grid.black_calibration_area) +
|
146
|
+
naverage(@grid.white_calibration_area)) / 2
|
113
147
|
end
|
114
148
|
|
115
149
|
# ================
|
@@ -118,10 +152,10 @@ module Mork
|
|
118
152
|
|
119
153
|
def register(img)
|
120
154
|
# find the XY coordinates of the 4 registration marks
|
121
|
-
x1, y1 = reg_centroid_on(img, @grid.
|
122
|
-
x2, y2 = reg_centroid_on(img, @grid.
|
123
|
-
x3, y3 = reg_centroid_on(img, @grid.
|
124
|
-
x4, y4 = reg_centroid_on(img, @grid.
|
155
|
+
x1, y1 = reg_centroid_on(img, @grid.reg_mark_tl_search_area)
|
156
|
+
x2, y2 = reg_centroid_on(img, @grid.reg_mark_tr_search_area)
|
157
|
+
x3, y3 = reg_centroid_on(img, @grid.reg_mark_br_search_area)
|
158
|
+
x4, y4 = reg_centroid_on(img, @grid.reg_mark_bl_search_area)
|
125
159
|
# stretch the 4 points to fit the original size and return the resulting image
|
126
160
|
img.stretch [
|
127
161
|
x1, y1, 0, 0,
|
@@ -138,5 +172,9 @@ module Mork
|
|
138
172
|
return nil, nil if cx.nil?
|
139
173
|
return cx + c[:x], cy + c[:y]
|
140
174
|
end
|
175
|
+
|
176
|
+
def naverage(where)
|
177
|
+
NPatch.new(@mimage.crop where).average
|
178
|
+
end
|
141
179
|
end
|
142
180
|
end
|
data/lib/mork/sheet_pdf.rb
CHANGED
@@ -4,12 +4,36 @@ module Mork
|
|
4
4
|
class SheetPDF < Prawn::Document
|
5
5
|
def initialize(grid, info)
|
6
6
|
@grid = grid
|
7
|
-
@info = info
|
8
7
|
super my_page_params
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
# @info should be an array of hashes, one per page;
|
9
|
+
# convert to array if a single hash was passed
|
10
|
+
@info = info.class == Hash ? [info] : info
|
11
|
+
process
|
12
|
+
end
|
13
|
+
|
14
|
+
def save(fn)
|
15
|
+
render_file fn
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_pdf
|
19
|
+
render
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def process
|
25
|
+
# for each response sheet
|
26
|
+
@info.each_with_index do |info, i|
|
27
|
+
start_new_page if i>0
|
28
|
+
fill_color "000000"
|
29
|
+
stroke_color "000000"
|
30
|
+
line_width 0.3
|
31
|
+
registration_marks
|
32
|
+
calibration_and_code info[:code]
|
33
|
+
header info[:header]
|
34
|
+
control info[:control] if info[:control]
|
35
|
+
questions_and_choices info[:choices]
|
36
|
+
end
|
13
37
|
end
|
14
38
|
|
15
39
|
def my_page_params
|
@@ -20,11 +44,11 @@ module Mork
|
|
20
44
|
end
|
21
45
|
|
22
46
|
def registration_marks
|
23
|
-
fill
|
47
|
+
fill do
|
24
48
|
@grid.pdf_reg_marks.each do |r|
|
25
49
|
circle r[:p], r[:r]
|
26
50
|
end
|
27
|
-
|
51
|
+
end
|
28
52
|
end
|
29
53
|
|
30
54
|
def calibration_and_code(code)
|
@@ -40,8 +64,31 @@ module Mork
|
|
40
64
|
end
|
41
65
|
end
|
42
66
|
|
43
|
-
def
|
44
|
-
@
|
67
|
+
def control(info)
|
68
|
+
font_size @grid.pdf_control_size do
|
69
|
+
text_box info[:string], at: @grid.pdf_control_xy,
|
70
|
+
width: @grid.pdf_control_width,
|
71
|
+
align: :right
|
72
|
+
stroke do
|
73
|
+
font_size
|
74
|
+
stroke_color "ff0000"
|
75
|
+
# dark
|
76
|
+
a = @grid.pdf_dark_control_cell_area
|
77
|
+
rounded_rectangle a[:p], a[:w], a[:h], [a[:h], a[:w]].min / 2
|
78
|
+
fill_color "ff0000"
|
79
|
+
draw_text info[:labels][0], at: @grid.pdf_dark_control_letter_xy
|
80
|
+
# light
|
81
|
+
a = @grid.pdf_light_control_cell_area
|
82
|
+
rounded_rectangle a[:p], a[:w], a[:h], [a[:h], a[:w]].min / 2
|
83
|
+
fill_color "ff0000"
|
84
|
+
draw_text info[:labels][1], at: @grid.pdf_light_control_letter_xy
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def header(info)
|
91
|
+
info.each do |k,v|
|
45
92
|
font_size @grid.pdf_header_size(k) do
|
46
93
|
if @grid.pdf_header_boxed?(k)
|
47
94
|
bounding_box @grid.pdf_header_xy(k), width: @grid.pdf_header_width(k), height: @grid.pdf_header_height(k) do
|
@@ -57,20 +104,19 @@ module Mork
|
|
57
104
|
end
|
58
105
|
end
|
59
106
|
|
60
|
-
def questions_and_choices
|
107
|
+
def questions_and_choices(info)
|
61
108
|
stroke do
|
62
|
-
|
63
|
-
nquestions.times do |q|
|
109
|
+
info.length.times do |q|
|
64
110
|
fill_color "000000"
|
65
111
|
text_box "#{q+1}", at: @grid.pdf_qnum_xy(q),
|
66
|
-
|
67
|
-
|
68
|
-
|
112
|
+
width: @grid.pdf_qnum_width,
|
113
|
+
align: :right,
|
114
|
+
size: @grid.pdf_qnum_size
|
69
115
|
stroke_color "ff0000"
|
70
|
-
font_size
|
71
|
-
|
116
|
+
font_size @grid.pdf_chlett_size
|
117
|
+
info[q].times do |c|
|
72
118
|
a = @grid.pdf_choice_cell_area q, c
|
73
|
-
rounded_rectangle a[:p], a[:w], a[:h], 2
|
119
|
+
rounded_rectangle a[:p], a[:w], a[:h], [a[:h], a[:w]].min / 2
|
74
120
|
fill_color "ff0000"
|
75
121
|
draw_text (65+c).chr, at: @grid.pdf_choice_letter_xy(q, c)
|
76
122
|
end
|
@@ -78,18 +124,13 @@ module Mork
|
|
78
124
|
end
|
79
125
|
end
|
80
126
|
|
81
|
-
def
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
def nchoices(i)
|
91
|
-
@info[:choices][i]
|
92
|
-
end
|
127
|
+
# def nquestions
|
128
|
+
# @info[:choices].length
|
129
|
+
# end
|
130
|
+
#
|
131
|
+
# def nchoices(i)
|
132
|
+
# @info[:choices][i]
|
133
|
+
# end
|
93
134
|
end
|
94
135
|
end
|
95
136
|
|
data/lib/mork/version.rb
CHANGED
data/lib/mork.rb
CHANGED
data/spec/mork/grid_spec.rb
CHANGED
data/spec/mork/sheet_pdf_spec.rb
CHANGED
@@ -2,30 +2,113 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Mork
|
4
4
|
describe SheetPDF do
|
5
|
+
|
5
6
|
it "should create a basic pdf" do
|
6
7
|
info = {
|
7
|
-
code:
|
8
|
-
choices: [5] *
|
8
|
+
code: 1099511627775,
|
9
|
+
choices: [5] * 120,
|
9
10
|
header: {
|
10
|
-
name:
|
11
|
-
title: "Esame di Fondamenti Morfologici e Funzionali della Vita - 18 gennaio 2013
|
11
|
+
name: "Bertini Giuseppe VR123456",
|
12
|
+
title: "Esame di Fondamenti Morfologici e Funzionali della Vita - 18 gennaio 2013",
|
12
13
|
code: "119.27",
|
13
14
|
signature: "Firma"
|
15
|
+
},
|
16
|
+
control: {
|
17
|
+
string: "Annerisci solo la casella ‘V’:",
|
18
|
+
labels: ['V', 'F']
|
14
19
|
}
|
15
20
|
}
|
16
|
-
|
17
|
-
|
21
|
+
|
22
|
+
grid_opts = {
|
23
|
+
regmarks: {
|
24
|
+
margin: 10,
|
25
|
+
radius: 2.5,
|
26
|
+
search: 10
|
27
|
+
},
|
28
|
+
header: {
|
29
|
+
name: {
|
30
|
+
top: 5,
|
31
|
+
left: 7.5,
|
32
|
+
width: 170,
|
33
|
+
size: 14,
|
34
|
+
},
|
35
|
+
title: {
|
36
|
+
top: 15,
|
37
|
+
left: 7.5,
|
38
|
+
width: 180,
|
39
|
+
size: 12
|
40
|
+
},
|
41
|
+
code: {
|
42
|
+
top: 5,
|
43
|
+
left: 165,
|
44
|
+
width: 20,
|
45
|
+
size: 14
|
46
|
+
},
|
47
|
+
signature: {
|
48
|
+
top: 30,
|
49
|
+
left: 7.5,
|
50
|
+
width: 120,
|
51
|
+
height: 15,
|
52
|
+
size: 7,
|
53
|
+
box: true,
|
54
|
+
}
|
55
|
+
}, # header end
|
56
|
+
responses: {
|
57
|
+
columns: 4,
|
58
|
+
column_width: 49,
|
59
|
+
rows: 30,
|
60
|
+
# from the top-left registration mark
|
61
|
+
# to the center of the first choice cell
|
62
|
+
first_x: 10.5,
|
63
|
+
first_y: 55.5,
|
64
|
+
# between choices
|
65
|
+
x_spacing: 7.0,
|
66
|
+
# between rows
|
67
|
+
y_spacing: 7.0,
|
68
|
+
# darkened area
|
69
|
+
cell_width: 6.0,
|
70
|
+
cell_height: 5.0,
|
71
|
+
# the maximum number of choices per question
|
72
|
+
max_cells: 5,
|
73
|
+
# font size for the question number
|
74
|
+
number_size: 10,
|
75
|
+
# distance between right side of q num and left side of first choice cell
|
76
|
+
number_width: 8,
|
77
|
+
# width of question number text box
|
78
|
+
number_margin: 2,
|
79
|
+
# font size for the choice letter
|
80
|
+
letter_size: 8
|
81
|
+
},
|
82
|
+
code: {
|
83
|
+
bits: 40,
|
84
|
+
left: 15,
|
85
|
+
width: 3.0,
|
86
|
+
height: 2.5,
|
87
|
+
spacing: 4
|
88
|
+
},
|
89
|
+
control: {
|
90
|
+
top: 40,
|
91
|
+
left: 123,
|
92
|
+
width: 50,
|
93
|
+
size: 9,
|
94
|
+
margin: 2.5
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
# s = SheetPDF.new(Grid.new(grid_opts), info)
|
99
|
+
# s.save("tmp/f1.pdf")
|
18
100
|
|
19
101
|
info = {
|
20
|
-
code:
|
21
|
-
choices: [5] *
|
102
|
+
code: 5512,
|
103
|
+
choices: [5] * 160,
|
22
104
|
header: {
|
23
|
-
name: "
|
105
|
+
name: "Bonazza Sara vr354320",
|
24
106
|
title: "Esame di Fondamenti Morfologici e Funzionali della Vita - 18 gennaio 2013",
|
25
|
-
code: "
|
107
|
+
code: "201.48",
|
108
|
+
signature: "Firma"
|
26
109
|
}
|
27
110
|
}
|
28
|
-
s = SheetPDF.new(Grid.new
|
111
|
+
s = SheetPDF.new(Grid.new, info)
|
29
112
|
s.save("tmp/f2.pdf")
|
30
113
|
|
31
114
|
info = {
|
@@ -38,9 +121,36 @@ module Mork
|
|
38
121
|
signature: "Firma"
|
39
122
|
}
|
40
123
|
}
|
41
|
-
s = SheetPDF.new(Grid.new
|
124
|
+
s = SheetPDF.new(Grid.new, info)
|
42
125
|
s.save("tmp/f3.pdf")
|
43
126
|
end
|
127
|
+
|
128
|
+
it "should create a multipage pdf" do
|
129
|
+
info = [
|
130
|
+
{
|
131
|
+
code: 18446744073709551615,
|
132
|
+
choices: [5] * 100,
|
133
|
+
header: {
|
134
|
+
name: "Bertini Giuseppe VR123456 Bertini Giuseppe VR123456",
|
135
|
+
title: "Esame di Fondamenti Morfologici e Funzionali della Vita - 18 gennaio 2013 Esame di Fondamenti Morfologici e Funzionali della Vita - 18 gennaio 2013",
|
136
|
+
code: "119.27",
|
137
|
+
signature: "Firma"
|
138
|
+
}
|
139
|
+
},
|
140
|
+
{
|
141
|
+
code: 5512,
|
142
|
+
choices: [5] * 160,
|
143
|
+
header: {
|
144
|
+
name: "Bonazza Sara vr354320",
|
145
|
+
title: "Esame di Fondamenti Morfologici e Funzionali della Vita - 18 gennaio 2013",
|
146
|
+
code: "201.48",
|
147
|
+
signature: "Firma"
|
148
|
+
}
|
149
|
+
}
|
150
|
+
]
|
151
|
+
s = SheetPDF.new(Grid.new, info)
|
152
|
+
s.save("tmp/p2.pdf")
|
153
|
+
end
|
44
154
|
end
|
45
155
|
end
|
46
156
|
|
data/spec/mork/sheet_spec.rb
CHANGED
@@ -4,14 +4,18 @@ module Mork
|
|
4
4
|
describe Sheet do
|
5
5
|
context "describing marked choices" do
|
6
6
|
before(:all) do
|
7
|
-
|
8
|
-
@sheet = Sheet.new(fn, Grid.new)
|
7
|
+
@sheet = Sheet.new('spec/samples/sample02.jpg')
|
9
8
|
end
|
10
9
|
|
11
10
|
describe "#marked?" do
|
12
11
|
it "should return true for a darkened choice" do
|
13
12
|
@sheet.marked?(0,0).should be_true
|
14
13
|
end
|
14
|
+
|
15
|
+
it "should highlight and show" do
|
16
|
+
@sheet.highlight_all
|
17
|
+
@sheet.write 'tmp/all_highlights.jpg'
|
18
|
+
end
|
15
19
|
|
16
20
|
it "should return false for a blank choice" do
|
17
21
|
@sheet.marked?(0,1).should be_false
|
@@ -59,20 +63,20 @@ module Mork
|
|
59
63
|
@cshe = Sheet.new(@smp.filename, Grid.new)
|
60
64
|
end
|
61
65
|
|
62
|
-
describe "#dark_code_bit_shade" do
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "#light_code_bit_shade" do
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
66
|
+
# describe "#dark_code_bit_shade" do
|
67
|
+
# it "should be less than a certain amount" do
|
68
|
+
# v = @cshe.dark_code_bit_shade
|
69
|
+
# v.should < @cshe.send(:dark_threshold)
|
70
|
+
# end
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# describe "#light_code_bit_shade" do
|
74
|
+
# it "should be more than a certain amount" do
|
75
|
+
# v = @cshe.light_code_bit_shade
|
76
|
+
# v.should > @cshe.send(:dark_threshold)
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# end
|
76
80
|
|
77
81
|
describe "#code_string" do
|
78
82
|
it "should read the bit string" do
|
@@ -91,7 +95,7 @@ module Mork
|
|
91
95
|
it "should highlight all high bits in red" do
|
92
96
|
smp = sample_img(:code_sample)
|
93
97
|
s = Sheet.new(smp.filename, Grid.new)
|
94
|
-
|
98
|
+
64.times do |i|
|
95
99
|
if smp.code_int[i] == 1
|
96
100
|
s.highlight_code_bit i
|
97
101
|
end
|
@@ -112,6 +116,21 @@ module Mork
|
|
112
116
|
s.write "tmp/light_bit.pdf"
|
113
117
|
end
|
114
118
|
end
|
119
|
+
|
120
|
+
context "faded, b&w sheet" do
|
121
|
+
before(:all) do
|
122
|
+
@smp = sample_img(:bw_faded_sample)
|
123
|
+
@sheet = Sheet.new(@smp.filename, Grid.new)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return the correct code" do
|
127
|
+
@sheet.code.should == @smp.code_int
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should return the darkened choices" do
|
131
|
+
@sheet.mark_array(12).should == [[2], [3], [4], [0], [1], [2], [0,4], [], [3], [1], [], []]
|
132
|
+
end
|
133
|
+
end
|
115
134
|
|
116
135
|
context "multi-page pdf" do
|
117
136
|
before(:all) do
|
data/spec/samples/info.yml
CHANGED
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Giuseppe Bertini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: narray
|
@@ -173,7 +173,6 @@ files:
|
|
173
173
|
- lib/mork/mimage.rb
|
174
174
|
- lib/mork/mimage_list.rb
|
175
175
|
- lib/mork/npatch.rb
|
176
|
-
- lib/mork/report.rb
|
177
176
|
- lib/mork/sheet.rb
|
178
177
|
- lib/mork/sheet_pdf.rb
|
179
178
|
- lib/mork/version.rb
|
@@ -182,7 +181,6 @@ files:
|
|
182
181
|
- spec/mork/mimage_list_spec.rb
|
183
182
|
- spec/mork/mimage_spec.rb
|
184
183
|
- spec/mork/npatch_spec.rb
|
185
|
-
- spec/mork/report_spec.rb
|
186
184
|
- spec/mork/sheet_pdf_spec.rb
|
187
185
|
- spec/mork/sheet_spec.rb
|
188
186
|
- spec/samples/22161694.pdf
|
@@ -190,9 +188,11 @@ files:
|
|
190
188
|
- spec/samples/code_sample.png
|
191
189
|
- spec/samples/code_zero.pdf
|
192
190
|
- spec/samples/info.yml
|
191
|
+
- spec/samples/qzc006.jpg
|
193
192
|
- spec/samples/reg_mark.jpg
|
194
193
|
- spec/samples/sample.pages
|
195
194
|
- spec/samples/sample01.jpg
|
195
|
+
- spec/samples/sample02.jpg
|
196
196
|
- spec/samples/sheet1.jpg
|
197
197
|
- spec/samples/sheet1.pdf
|
198
198
|
- spec/samples/two_pages.pdf
|
@@ -225,7 +225,6 @@ test_files:
|
|
225
225
|
- spec/mork/mimage_list_spec.rb
|
226
226
|
- spec/mork/mimage_spec.rb
|
227
227
|
- spec/mork/npatch_spec.rb
|
228
|
-
- spec/mork/report_spec.rb
|
229
228
|
- spec/mork/sheet_pdf_spec.rb
|
230
229
|
- spec/mork/sheet_spec.rb
|
231
230
|
- spec/samples/22161694.pdf
|
@@ -233,9 +232,11 @@ test_files:
|
|
233
232
|
- spec/samples/code_sample.png
|
234
233
|
- spec/samples/code_zero.pdf
|
235
234
|
- spec/samples/info.yml
|
235
|
+
- spec/samples/qzc006.jpg
|
236
236
|
- spec/samples/reg_mark.jpg
|
237
237
|
- spec/samples/sample.pages
|
238
238
|
- spec/samples/sample01.jpg
|
239
|
+
- spec/samples/sample02.jpg
|
239
240
|
- spec/samples/sheet1.jpg
|
240
241
|
- spec/samples/sheet1.pdf
|
241
242
|
- spec/samples/two_pages.pdf
|
data/lib/mork/report.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Mork
|
2
|
-
class Report
|
3
|
-
def initialize(im, opts={})
|
4
|
-
grid_type = opts[:grid_type] || :default
|
5
|
-
grid_file = opts[:grid_file] || 'config/grids.yml'
|
6
|
-
@grid = Grid.new grid_type, grid_file
|
7
|
-
@sheet = Sheet.new(im, @grid)
|
8
|
-
@chlist = opts[:chlist] || @grid.default_chlist
|
9
|
-
end
|
10
|
-
|
11
|
-
def sheet_code
|
12
|
-
@sheet.code
|
13
|
-
end
|
14
|
-
|
15
|
-
def selected_choices
|
16
|
-
# sc = []
|
17
|
-
# @chlist.each_with_index do |ch, i|
|
18
|
-
# sc[i] = (0...ch).collect do |x|
|
19
|
-
# puts "Q.#{i} Ch.#{x}"
|
20
|
-
# @mimage.darkened? @ruler.cell(i, x)
|
21
|
-
# end
|
22
|
-
# end
|
23
|
-
# sc
|
24
|
-
end
|
25
|
-
|
26
|
-
def highlight_all_choices
|
27
|
-
@chlist.each_with_index do |ch, i|
|
28
|
-
(0...ch).each do |x|
|
29
|
-
@sheet.highlight_choice(i, x)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
@sheet.highlight_code
|
33
|
-
end
|
34
|
-
|
35
|
-
def write_sheet(fname)
|
36
|
-
@sheet.write(fname)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/spec/mork/report_spec.rb
DELETED