class Spreadsheet::HTML
Constants
- VERSION
Public Class Methods
gen( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 17 def self.gen ( *args ) self.new.generate( *args ) end
new( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 78 def initialize( *args ) (args[0] || []).each do |key,val| self.instance_eval { class << self; self end }.send(:attr_accessor, key) self.send( "#{key}=", val ) end end
Public Instance Methods
_args( things )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 176 def _args( things ) data = [] args = [] while !things.empty? if things[0].kind_of?(Array) data.push( things.shift() ) if things[0].kind_of?(Array) data.push( things.shift() ) else args.push( things.shift() ) if !things.empty? args.push( things.shift() ) if !things.empty? end else args.push( things.shift() ) if !things.empty? args.push( things.shift() ) if !things.empty? end end params = {} self.instance_variables.each do |attr| params[attr[1..-1]] = self.instance_variable_get attr end (args || []).each do |hash| hash.each do |key,val| params[key] = val end end params['auto'] = Auto::Tag.new( 'indent' => params['indent'], 'level' => params['level'], 'sorted' => params['attr_sort'], ) if !params['data'] and data[0].kind_of?(Array) data = [ data ] if !data[0][0].kind_of?(Array) params['data'] = data[0] end params['data'] = [ [ nil ] ] if params['data'].nil? params['_max_rows'] = params['data'].size || 1 params['_max_cols'] = params['data'][0].size || 1 params['data'] = params['data'].clone if params['fill'] (row,col) = params['fill'].split(/\D/) if row.to_i > 0 && col.to_i > 0 params['_max_rows'] = row.to_i if row.to_i > params['_max_rows'] params['_max_cols'] = col.to_i if col.to_i > params['_max_cols'] end end return params end
_colgroup( params )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 254 def _colgroup( params ) colgroup = Array[] params['col'] = Array[ params['col'] ] if params['col'].kind_of?(Hash) if params['col'].kind_of?(Array) if params['colgroup'].kind_of?(Array) colgroup = params['colgroup'].map{ |cg| { 'tag' => 'colgroup', 'attr' => cg, 'cdata' => params['col'].map{ |attr| { 'tag' => 'col', 'attr' => attr } } } } else colgroup = { 'tag' => 'colgroup', 'attr' => params['colgroup'], 'cdata' => params['col'].map{ |attr| { 'tag' => 'col', 'attr' => attr } } } end else params['colgroup'] = Array[ params['colgroup'] ] if params['colgroup'].kind_of?(Hash) if params['colgroup'].kind_of?(Array) colgroup = params['colgroup'].map{ |attr| { 'tag' => 'colgroup', 'attr' => attr } } end end colgroup = Array[colgroup] if colgroup.kind_of?(Hash) return colgroup end
_extrapolate( cdata, orig_attr, thingy )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 236 def _extrapolate( cdata, orig_attr, thingy ) new_attr = {} thingy = [ thingy ] unless thingy.kind_of?(Array) thingy.each do |t| if t.kind_of?(Hash) new_attr = t elsif t.kind_of?(Proc) cdata = t.call( cdata ) end end attr = {} orig_attr.each { |key,val| attr[key] = val } if orig_attr.kind_of?(Hash) new_attr.each { |key,val| attr[key] = val } return [ cdata, attr ] end
_make_table( params )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 85 def _make_table( params ) cdata = Array[] if params.has_key?( 'caption' ) cdata.push( _tag( 'caption', params['caption'] ) ) end if params.has_key?( 'colgroup' ) or params.has_key?( 'col' ) cdata.concat( _colgroup( params ) ) end if params['tgroups'] && params['tgroups'] > 0 body = params['data'] # TODO: is this a bug? data vs params['data'] head = body.shift() unless params['matrix'] && data.size() > 2 foot = body.pop() if !params['matrix'] && params['tgroups'] > 1 and data.size() > 2 head_row = { 'tag' => 'tr', 'attr' => params['thead.tr'], 'cdata' => head } foot_row = { 'tag' => 'tr', 'attr' => params['tfoot.tr'], 'cdata' => foot } body_rows = body.map{ |r| { 'tag' => 'tr', 'attr' => params['tr'], 'cdata' => r } } cdata.push({ 'tag' => 'thead', 'attr' => params['thead'], 'cdata' => head_row }) if head cdata.push({ 'tag' => 'tfoot', 'attr' => params['tfoot'], 'cdata' => foot_row }) if foot cdata.push({ 'tag' => 'tbody', 'attr' => params['tbody'], 'cdata' => body_rows }) else cdata.concat( params['data'].map { |c| { 'tag' => 'tr', 'attr' => params['tr'], 'cdata' => c } } ) end return params['auto'].tag( 'tag' => 'table', 'attr' => params['table'], 'cdata' => cdata ) end
_process( args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 118 def _process( args ) params = _args( args ) # headings is an alias for _r0 params['_r0'] = params['headings'] index = {} if params['data'][0].size() for i in 0 .. params['data'][0].size() - 1 key = params['data'][0][i] || '' index["_#{key}"] = i end params.keys.grep( /^_/ ) do |key| k = index[key] params["_c#{k}"] = params[key] if index.has_key?( key ) end end empty = params['empty'] || ' ' tag = ( params['matrix'] or params['headless'] ) ? 'td' : 'th' encoder = Enco::Der.new for r in 0 .. params['_max_rows'] - 1 unless params['_layout'] params['data'][r] ||= [] (params['_max_cols'] - params['data'][r].size).times { params['data'][r].push( nil ) } # pad (params['data'][r].size - params['_max_cols']).times { params['data'][r].pop } # truncate end row = [] for c in 0 .. params['_max_cols'] - 1 attr = params[tag] || {} cdata = params['data'][r][c].to_s [ tag, "_c#{c}", "_r#{r}", "_r#{r}c#{c}" ].each do |dyna_param| if params.has_key?( dyna_param ) ( cdata, attr ) = _extrapolate( cdata, attr, params[dyna_param] ); end end cdata = encoder.encode( cdata, params['encodes'] ) if params['encode'] or !params['encodes'].to_s.empty? cdata = cdata.gsub( /^\s*$/, empty.to_s ) row.push( { 'tag' => tag, 'attr' => attr, 'cdata' => cdata } ) end params['data'][r] = row tag = 'td' end params['data'].shift if params['headless'] return params end
_tag( tag, cdata )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 285 def _tag( tag, cdata ) tag = { 'tag' => tag, 'cdata' => cdata } if cdata.kind_of?( Hash ) tag['cdata'] = cdata.keys[0] tag['attr'] = cdata.values[0] end return tag end
east( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 24 def east ( *args ) generate( *args, 'theta' => 90, 'tgroups' => 0, 'pinhead' => 1 ) end
generate( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 27 def generate( *args ) params = _process( args ) if params['theta'] and params['flip'] params['theta'] *= -1 end if !params['theta'] # north if params['flip'] params['data'] = params['data'].map {|a| a.reverse } end elsif params['theta'] == 90 # east if params['pinhead'] and !params['headless'] params['data'] = params['data'].transpose.map{|a| a.push( a.shift ) } else params['data'] = params['data'].transpose.map{|a| a.reverse } end elsif params['theta'] == -90 if params['pinhead'] and !params['headless'] params['data'] = params['data'].transpose.reverse.map {|a| a.push( a.shift ) } else params['data'] = params['data'].transpose.reverse.map {|a| a.reverse } end elsif params['theta'] == 180 if params['pinhead'] and !params['headless'] params['data'] = params['data'].push( params['data'].shift ).map {|a| a.reverse } else params['data'] = params['data'].reverse.map {|a| a.reverse } end elsif params['theta'] == -180 # south if params['pinhead'] and !params['headless'] params['data'] = params['data'].push( params['data'].shift ) else params['data'] = params['data'].reverse end elsif params['theta'] == 270 params['data'] = params['data'].transpose.reverse elsif params['theta'] == -270 # west params['data'] = params['data'].transpose end return _make_table( params ) end
landscape( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 20 def landscape ( *args ) generate( *args, 'theta' => -270, 'tgroups' => 0 ) end
north( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 22 def north ( *args ) generate( *args, 'theta' => 0 ) end
portrait( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 19 def portrait ( *args ) generate( *args, 'theta' => 0 ) end
south( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 25 def south ( *args ) generate( *args, 'theta' => -180, 'tgroups' => 0, 'pinhead' => 1 ) end
west( *args )
click to toggle source
# File lib/Spreadsheet/HTML.rb, line 23 def west ( *args ) generate( *args, 'theta' => -270, 'tgroups' => 0 ) end