Class | ConfigOutput |
In: |
app/models/config_output.rb
|
Parent: | ActiveRecord::Base |
出力ファイルの設定のモデル
LABEL_FILE_FORMAT | = | [ [N_("ConfigOutput|file_format|CSV"), "csv"], [N_("ConfigOutput|file_format|PDF"), "pdf"], [N_("ConfigOutput|file_format|XML"), "xml"], ] |
LABEL_EOL_PATTERN | = | [ [N_("ConfigOutput|eol_pattern|none"), "none"], [N_("ConfigOutput|eol_pattern|disabled"), "disabled"], [N_("ConfigOutput|eol_pattern|specified"), "specified"], ] |
LABEL_SEPARATOR_PATTERN | = | [ [N_("ConfigOutput|separator_pattern|tab"), "tab"], [N_("ConfigOutput|separator_pattern|comma"), "comma"], [N_("ConfigOutput|separator_pattern|semicolon"), "semicolon"], [N_("ConfigOutput|separator_pattern|specified"), "specified"], ] |
LABEL_QUOTATION_PATTERN | = | [ [N_("ConfigOutput|quotation|none"), "none"], [N_("ConfigOutput|quotation|single"), "single"], [N_("ConfigOutput|quotation|double"), "double"], [N_("ConfigOutput|quotation|specified"), "specified"], ] |
LABEL_ENCODING | = | [ [N_("ConfigOutput|encoding|UTF-8"), "utf-8"], [N_("ConfigOutput|encoding|Shift_JIS"), "shift_jis"], ] |
設定を初期化する。
# File app/models/config_output.rb, line 130 130: def clear 131: self.attributes = { 132: :name => display_to_list.name, 133: :file_format => "csv", 134: :eol_pattern => "none", 135: :eol_parameter => "", 136: :separator_pattern => "tab", 137: :separator_parameter => "", 138: :quotation_pattern => "none", 139: :quotation_parameter => "", 140: :encoding => "utf-8", 141: } 142: end
ファイル名を返す。
# File app/models/config_output.rb, line 310 310: def file_name(user_agent) 311: if user_agent =~ /MSIE/ 312: conv = Iconv.new('Shift_JIS', 'UTF-8') # FIXME: works only in japanese 313: return "#{conv.iconv(name)}.#{file_format}" 314: end 315: return "#{iconv(name)}.#{file_format}" 316: end
出力を生成する。
# File app/models/config_output.rb, line 185 185: def generate(options={}) 186: case file_format 187: when "csv" 188: require "csv" 189: result = '' 190: CSV::Writer.generate(result, separator, "\r\n") do |csv| 191: csv << iconv(headers) 192: rows(options).each do |row| 193: csv << iconv(row) 194: end 195: end 196: return result 197: when "pdf" 198: header = SimplePDF::TextBox.new("%t", 8, 199: :align => :left, 200: :top_margin => 5.0, 201: :left_margin => 10.0, 202: :right_margin => 10.0) 203: footer = SimplePDF::TextBox.new("%p/%P", 8, 204: :align => :center, 205: :top_margin => -20.0, 206: :left_margin => 10.0, 207: :right_margin => 10.0) 208: 209: table_header_style = SimpleCellStyle.new(:border_color => [0, 0, 0], 210: :text_color => [0, 0, 0], 211: :fill_color => [200, 200, 200], 212: :top_margin => 2.0, 213: :bottom_margin => 2.0, 214: :left_margin => 2.0, 215: :right_margin => 2.0, 216: :align => :center, 217: :font_size => 20.0, 218: :line_height => 8.0) 219: table_cell_style = SimpleCellStyle.new(:border_color => [0, 0, 0], 220: :text_color => [0, 0, 0], 221: :fill_color => nil, 222: :top_margin => 2.0, 223: :bottom_margin => 2.0, 224: :left_margin => 2.0, 225: :right_margin => 2.0, 226: :align => :left, 227: :font_size => 20.0, 228: :line_height => 10.0) 229: 230: contents = [headers.map {|h| {:data => h, :style => table_header_style}}] 231: rows(options, :link => true).each do |row| 232: contents << row.map {|x| x.update(:style => table_cell_style)} 233: end 234: table = SimpleTable.new(contents.size, headers.size) 235: table.set_contents do |row, col| 236: SimpleCell.new(contents[row][col][:data], contents[row][col][:style], contents[row][col][:link]) 237: end 238: 239: pdf = SimpleTablePDF.new(:orientation => "Portrait", 240: :format => "A4", 241: :language => user.person.last_language, 242: :title => name, 243: :author => "PjC", 244: :creator => "PjC", 245: :keywords => ["PjC", "テスト"], # FIXME 246: :subject => "サブタイトル", # FIXME 247: :zoom => "fullpage", 248: :header => header, 249: :footer => footer, 250: :table => table, 251: :top_margin => 25.0, # mm 252: :left_margin => 20.0, # mm 253: :right_margin => 20.0, # mm 254: :bottom_margin => 30.0, # mm 255: :page_order => 0) 256: 257: return pdf.output 258: when "xml" 259: require "rexml/document" 260: doc = REXML::Document.new "<table></table>" 261: root = doc.root 262: 263: thead = REXML::Element.new "thead" 264: tr = REXML::Element.new "tr" 265: headers.each do |header| 266: th = REXML::Element.new "th" 267: th.text = header 268: tr.add_element th 269: end 270: thead.add_element tr 271: root.add_element thead 272: 273: tbody = REXML::Element.new "tbody" 274: rows(options).each do |row| 275: tr = REXML::Element.new "tr" 276: row.each do |d| 277: td = REXML::Element.new "td" 278: td.text = process_eol(d.to_s) 279: tr.add_element td 280: end 281: tbody.add_element tr 282: end 283: root.add_element tbody 284: 285: doc.xml_decl.encoding = encoding 286: output = '' 287: doc.write output 288: 289: return output 290: else 291: raise ArgumentError, "invaild file_format: #{file_format}" 292: end 293: end
表示項目に対応するヘッダを返す。
# File app/models/config_output.rb, line 157 157: def headers 158: result = [] 159: each_item {|config_output_item| result << config_output_item.name} 160: result 161: end
x のエンコーディングを設定に合わせて変換する。
# File app/models/config_output.rb, line 145 145: def iconv(x) 146: return x if file_format == "pdf" 147: return x if encoding == "utf-8" 148: return x.map {|e| iconv(e)} if x.is_a?(Array) 149: if x.is_a?(String) 150: @iconverter ||= Iconv.new(encoding, "UTF-8") 151: return @iconverter.iconv(x) 152: end 153: return x 154: end
出力形式に合わせた MIME type を返す。
# File app/models/config_output.rb, line 296 296: def mime_type 297: case file_format 298: when "csv" 299: "text/csv; charset=#{encoding}; header=present" 300: when "pdf" 301: "application/pdf" 302: when "xml" 303: "text/xml; charset=#{encoding}" 304: else 305: raise ArgumentError, "invalid file_format: #{file_format}" 306: end 307: end
行末文字を返す。
# File app/models/config_output.rb, line 75 75: def process_eol(x) 76: case eol_pattern 77: when "none" 78: x 79: when "disabled" 80: x.gsub(/\r?\n/, '') 81: when "specified" 82: x.gsub(/\r?\n/, eol_parameter) 83: else 84: raise ArgumentError, "invalid eol_pattern; #{eol_pattern}" 85: end 86: end
(CSV 形式で)値を囲む引用符を返す。
# File app/models/config_output.rb, line 105 105: def quotation 106: case quotation_pattern 107: when "none" 108: "" 109: when "single" 110: "'" 111: when "double" 112: '"' 113: when "specified" 114: quotation_parameter 115: else 116: raise ArgumentError, "invalid quotation_pattern: #{quotation_pattern}" 117: end 118: end
(CSV 形式で)引用符で囲まれた値を返す。
# File app/models/config_output.rb, line 121 121: def quote(x) 122: q = quotation 123: y = process_eol(x) 124: return y if q.blank? 125: z = y.gsub(q, "#{q}#{q}") 126: return "#{q}#{z}#{q}" 127: end
出力対象の行の一覧を返す。
# File app/models/config_output.rb, line 164 164: def rows(options, data_options={}) 165: result = [] 166: display_to_list.model_class.find(:all, options).each do |it| 167: row = [] 168: each_item do |config_output_item| 169: begin 170: if data_options[:link] 171: row << {:data => config_output_item.to_data(it), :link => config_output_item.link_url(it)} 172: else 173: row << config_output_item.to_data(it) 174: end 175: rescue NoMethodError 176: # ignored 177: end 178: end 179: result << row 180: end 181: result 182: end
(CSV 形式で)値を区切る文字を返す。
# File app/models/config_output.rb, line 89 89: def separator 90: case separator_pattern 91: when "tab" 92: "\t" 93: when "comma" 94: "," 95: when "semicolon" 96: ";" 97: when "specified" 98: separator_parameter 99: else 100: raise ArgumentError, "invalid separator_pattern: #{separator_pattern}" 101: end 102: end