Class: PREP::Core::Prep

Inherits:
Object
  • Object
show all
Defined in:
lib/core/prep.rb

Overview

PREP の中心クラス

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration_file_path = nil) ⇒ Prep

初期化

設定ファイルのパスが与えられれば初期化 無ければブランクの設定をロード



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/core/prep.rb', line 43

def initialize(configuration_file_path = nil)
  if configuration_file_path
    if File.exists?(configuration_file_path)
      load_configuration(configuration_file_path)
    else
      raise "File not found \"#{configuration_file_path}\"."
    end
  else
    init_configuration
  end
end

Instance Attribute Details

#page_pos_xObject (readonly)

Returns the value of attribute page_pos_x.



37
38
39
# File 'lib/core/prep.rb', line 37

def page_pos_x
  @page_pos_x
end

#page_pos_yObject (readonly)

Returns the value of attribute page_pos_y.



37
38
39
# File 'lib/core/prep.rb', line 37

def page_pos_y
  @page_pos_y
end

#pagesObject (readonly)

Returns the value of attribute pages.



37
38
39
# File 'lib/core/prep.rb', line 37

def pages
  @pages
end

#pdfObject (readonly)

Returns the value of attribute pdf.



37
38
39
# File 'lib/core/prep.rb', line 37

def pdf
  @pdf
end

#valuesObject (readonly)

Returns the value of attribute values.



37
38
39
# File 'lib/core/prep.rb', line 37

def values
  @values
end

Instance Method Details

#current_pageObject

現在描画中のページインスタンスを返却



208
209
210
# File 'lib/core/prep.rb', line 208

def current_page
  return @flat_pages[@page_pos_y][@page_pos_x]
end

#current_page=(pos) ⇒ Object

現在のページを強制的に変更

存在しないページへの移動は不可(例外) 引数の形式はハッシュ: Ex.) { :x => 0, :y => 0 }



226
227
228
229
230
231
232
233
234
235
236
# File 'lib/core/prep.rb', line 226

def current_page=(pos)
  if exists_page?(pos[:x], pos[:y])
    puts "[#{@page_pos_x}:#{@page_pos_y}] => [#{pos[:x]}:#{pos[:y]}]" if ENV["DEBUG"]
    @page_pos_x, @page_pos_y = pos[:x], pos[:y]
    print_flat_pages if ENV["DEBUG"]
    return current_page
  else
    print_flat_pages if ENV["DEBUG"]
    raise "Unknown page index [#{pos[:x]},#{pos[:y]}]."
  end
end

#current_page_numberObject

現在の通しページ番号を返却



213
214
215
216
217
218
219
220
# File 'lib/core/prep.rb', line 213

def current_page_number
  @pages.each_with_index do |page, index|
    if page === current_page
      return index + 1
    end
  end
  raise "Unknown Page instance \"#{page}\"."
end

#draw_contents(values) ⇒ Object

コンテンツの埋め込み



111
112
113
114
115
116
# File 'lib/core/prep.rb', line 111

def draw_contents(values)
  content = @content[:content]

  # 描画領域を含めて描画開始
  content.draw(self, page_content_region, values[:content])
end

#draw_footers(values) ⇒ Object

フッタの埋め込み



134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/core/prep.rb', line 134

def draw_footers(values)
  return unless @content.has_identifier?(:footer)

  footer = @content[:footer]

  # 全てのページに対してインデックスを切り替えながら実行
  @flat_pages.each_with_index do |row_pages, y|
    row_pages.each_with_index do |page, x|
      self.current_page = { :x => x, :y => y }
      footer.draw(self, page_footer_region, values[:footer])
    end
  end
end

#draw_headers(values) ⇒ Object

ヘッダの埋め込み



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/core/prep.rb', line 119

def draw_headers(values)
  return unless @content.has_identifier?(:header)

  header = @content[:header]

  # 全てのページに対してインデックスを切り替えながら実行
  @flat_pages.each_with_index do |row_pages, y|
    row_pages.each_with_index do |page, x|
      self.current_page = { :x => x, :y => y }
      header.draw(self, page_header_region, values[:header])
    end
  end
end

#exists_and_drawed_page?(x, y) ⇒ Boolean

指定されたページが存在し描画済みであるかどうかをチェック

Returns:

  • (Boolean)


186
187
188
189
190
191
192
# File 'lib/core/prep.rb', line 186

def exists_and_drawed_page?(x, y)
  if exists_page?(x, y)
    return @flat_pages[y][x].drawed?
  else
    return false
  end
end

#exists_move_to_page?(x, y) ⇒ Boolean

移動先のページが存在するかどうかをチェック

Returns:

  • (Boolean)


167
168
169
170
171
172
# File 'lib/core/prep.rb', line 167

def exists_move_to_page?(x, y)
  x += @page_pos_x
  y += @page_pos_y

  return exists_and_drawed_page?(x, y)
end

#exists_page?(x, y) ⇒ Boolean

指定されたページが存在するかどうかをチェック

Returns:

  • (Boolean)


175
176
177
178
179
180
181
182
183
# File 'lib/core/prep.rb', line 175

def exists_page?(x, y)
  if @flat_pages[y].nil?
    return false
  elsif @flat_pages[y][x].nil?
    return false
  else
    return true
  end
end

#generate(output_file_path, values = { }) ⇒ Object

帳票の生成



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/core/prep.rb', line 71

def generate(output_file_path, values = { })
  # 再描画用に初期値を保持
  @values = values.dup
  @pdf = HPDFDoc.new
  # 日本語対応
  @pdf.use_jp_fonts
  @pdf.use_jp_encodings
  # ページの初期化
  initialize_pages

  draw_contents(values)
  draw_headers(values)
  draw_footers(values)

  # 指定されたファイルへの書込
  @pdf.save_to_file(output_file_path)
rescue => e
  @pdf.save_to_file(output_file_path) if ENV["DEBUG"]
  puts "Error occured!!\n#{e}"
  raise PrepError.new(e)
end

#generate_pageObject

ページオブジェクトの作成とページ設定



195
196
197
198
199
200
# File 'lib/core/prep.rb', line 195

def generate_page
  page = @pdf.add_page
  page.set_size(@page_config.size, @page_config.orientation)

  return page
end

#generate_sample_datasetObject

データセット雛形を生成して返却



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/core/prep.rb', line 56

def generate_sample_dataset
  # ヘッダのデータセット生成
  dataset = { }
  if @content.has_identifier?(:header)
    dataset[:header] = @content[:header].generate_sample_dataset(self)
  end
  dataset[:content] = @content[:content].generate_sample_dataset(self)
  if @content.has_identifier?(:footer)
    dataset[:footer] = @content[:footer].generate_sample_dataset(self)
  end

  return dataset
end

#group(group_identifiy) ⇒ Object

指定されたグループ識別子を検索して返却 存在しない場合は例外発生



354
355
356
# File 'lib/core/prep.rb', line 354

def group(group_identifiy)
  return @content[group_identifiy]
end

#has_group?(group_identifiy) ⇒ Boolean

指定されたグループ識別子の存在確認

Returns:

  • (Boolean)


359
360
361
# File 'lib/core/prep.rb', line 359

def has_group?(group_identifiy)
  return @content.drawables.has_key?(group_identifiy.to_sym)
end

#init_configurationObject

設定の初期化



308
309
310
# File 'lib/core/prep.rb', line 308

def init_configuration
  raise "Need configuration file!"
end

#initialize_pagesObject

ページの初期化



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/core/prep.rb', line 94

def initialize_pages
  # 一次元配列
  @pages = []
  # 二次元配列
  @flat_pages = []
  # ページの作成
  page = generate_page
  # 1ページ目の登録
  @pages << page
  @flat_pages = [[page]] # [0][0] 位置への追加
  # 現在のページの位置情報を初期化
  @page_pos_x, @page_pos_y = 0, 0

  return page
end

#load_configuration(configuration_file_path) ⇒ Object

設定ファイルのロード



313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'lib/core/prep.rb', line 313

def load_configuration(configuration_file_path)
  # YAML からハッシュ形式に変換
  config_values = YAML.load_file(configuration_file_path)

  # ページ設定情報を取り込み
  @page_config = Page.new
  if config_values["page"]
    values = config_values["page"]
    if !values["size"].nil? && values["size"] != ""
      @page_config.size = Page::SIZES[values["size"].to_sym]
    end
    if !values["orientation"].nil? && values["orientation"] != ""
      @page_config.orientation = Page::ORIENTATIONS[values["orientation"].to_sym]
    end
    if !values["margin"].nil?
      margin_values = values["margin"].keys.inject({ }) do |hash, key|
        hash[key.to_sym] = values["margin"][key].mm2pixcel
        next hash
      end
      @page_config.margin = margin_values
    end
    if !values["header_height"].nil?
      @page_config.header_height = values["header_height"].mm2pixcel
    end
    if !values["footer_height"].nil?
      @page_config.footer_height = values["footer_height"].mm2pixcel
    end
  end

  # コンテンツ定義情報を読み込む
  # page 以外について読み込みを実施
  @content = Group.new
  config_values.keys.each do |identifier|
    unless identifier == "page"
      @content.add_drawable(identifier, config_values[identifier], true)
    end
  end
end

#move_page_to(x, y) ⇒ Object

ページの移動および追加

指定された位置への移動に際してページが存在しなければページを追加



151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/core/prep.rb', line 151

def move_page_to(x, y)
  puts "[#{@page_pos_x}:#{@page_pos_y}] => [#{@page_pos_x + x}:#{@page_pos_y + y}]" if ENV["DEBUG"]
  @page_pos_x, @page_pos_y = @page_pos_x + x, @page_pos_y + y

  @flat_pages[@page_pos_y] ||= []
  if @flat_pages[@page_pos_y][@page_pos_x].nil?
    @flat_pages[@page_pos_y][@page_pos_x] = (page = generate_page)
    @pages << page
  end

  print_flat_pages if ENV["DEBUG"]

  return @flat_pages[@page_pos_y][@page_pos_x]
end

#page_content_regionObject

コンテンツ描画領域の取得



254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/core/prep.rb', line 254

def page_content_region
  # 全体の描画領域を取得
  width = current_page.get_width
  height = current_page.get_height
  x = 0
  y = 0
  # マージンを含める
  x += @page_config.margin[:left]
  width -= (@page_config.margin[:left] + @page_config.margin[:right])
  y += @page_config.margin[:top]
  height -= (@page_config.margin[:top] + @page_config.margin[:bottom])
  # ヘッダ、および、フッタ領域を含める
  y += @page_config.header_height
  height -= (@page_config.header_height + @page_config.footer_height)

  return Region.new(x, y, width, height)
end

フッタ領域の取得



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'lib/core/prep.rb', line 290

def page_footer_region
  # 全体の描画領域を取得
  width = current_page.get_width
  height = current_page.get_height
  x = 0
  y = current_page.get_height
  # マージンを含める
  x += @page_config.margin[:left]
  width -= (@page_config.margin[:left] + @page_config.margin[:right])
  # 高さをフッタ領域に変更
  height = @page_config.footer_height
  # フッタの開始 Y 座標を計算
  y -= (@page_config.margin[:bottom] + height)

  return Region.new(x, y, width, height)
end

#page_header_regionObject

ヘッダ領域の取得



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# File 'lib/core/prep.rb', line 273

def page_header_region
  # 全体の描画領域を取得
  width = current_page.get_width
  height = current_page.get_height
  x = 0
  y = 0
  # マージンを含める
  x += @page_config.margin[:left]
  width -= (@page_config.margin[:left] + @page_config.margin[:right])
  y += @page_config.margin[:top]
  # 高さをヘッダ領域に変更
  height = @page_config.header_height

  return Region.new(x, y, width, height)
end

ページ構成を模式印字するデバッグ用メソッド



239
240
241
242
243
244
245
246
247
248
249
250
251
# File 'lib/core/prep.rb', line 239

def print_flat_pages
  @flat_pages.each_with_index do |flat_page, y|
    flat_page.each_with_index do |one_page, x|
      char = one_page.nil? ? "?" : "."
      if x == page_pos_x && y == page_pos_y
        char = '!'
      end
      STDERR.write("[#{char}]")
    end
    STDERR.write("\n")
  end
  gets if ENV["DEBUG"]
end

#total_pagesObject

現在の総ページ数を返却



203
204
205
# File 'lib/core/prep.rb', line 203

def total_pages
  return @pages.size
end