Module: Infoboxer::Parser::Table
Overview
Instance Method Summary collapse
- #table ⇒ Object
- #table_caption(table) ⇒ Object
- 
  
    
      #table_cell_cont(table)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Good news, everyone! Table can be IMPLICITLY closed when it's not "cell" context. 
- #table_cells(table, cell_class = TableCell) ⇒ Object
- #table_next_line(table) ⇒ Object
- #table_params ⇒ Object
- #table_row(table, param_str) ⇒ Object
- #table_template(table) ⇒ Object
Instance Method Details
#table ⇒ Object
| 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # File 'lib/infoboxer/parser/table.rb', line 9 def table @context.current =~ /^\s*{\|/ or @context.fail!('Something went wrong: trying to parse not a table') log 'Starting to parse table' prms = table_params log "Table params found #{prms}" table = Tree::Table.new(Nodes[], **prms) @context.next! guarded_loop do table_next_line(table) or break log 'Next table row' @context.next! end # FIXME: not the most elegant way, huh? table.children.reject! { |r| r.children.empty? } table end | 
#table_caption(table) ⇒ Object
| 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | # File 'lib/infoboxer/parser/table.rb', line 71 def table_caption(table) log 'Table caption found' @context.skip(/^\s*\|\+\s*/) params = if @context.check(/[^|{\[]+\|([^|]|$)/) parse_params(@context.scan_until(/\|/)) else {} end children = inline(/^\s*([|!]|{\|)/) if @context.matched @context.unscan_matched! @context.prev! # compensate next! which will be done in table() end table.push_children(TableCaption.new(children.strip, **params)) end | 
#table_cell_cont(table) ⇒ Object
Good news, everyone! Table can be IMPLICITLY closed when it's not "cell" context.
Unless it's empty row, which is just skipped.
| 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | # File 'lib/infoboxer/parser/table.rb', line 127 def table_cell_cont(table) container = case (last = table.children.last) when TableRow last.children.last when TableCaption last else nil end unless container # return "table not continued" unless row is empty return true if @context.current.empty? @context.prev! return false end container.push_children(paragraph(/^\s*([|!]|{\|)/)) table.push_children(container) unless container.parent true end | 
#table_cells(table, cell_class = TableCell) ⇒ Object
| 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | # File 'lib/infoboxer/parser/table.rb', line 89 def table_cells(table, cell_class = TableCell) log 'Table cells found' table.push_children(TableRow.new) unless table.children.last.is_a?(TableRow) row = table.children.last @context.skip(/\s*[!|]\s*/) guarded_loop do params = if @context.check(/[^|{\[]+\|([^|]|$)/) parse_params(@context.scan_until(/\|/)) else {} end content = short_inline(/(\|\||!!)/) row.push_children(cell_class.new(content, **params)) break if @context.eol? end end | 
#table_next_line(table) ⇒ Object
| 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # File 'lib/infoboxer/parser/table.rb', line 38 def table_next_line(table) case @context.current when /^\s*\|}(.*)$/ # table end @context.scan(/^\s*\|}/) return false when /^\s*!/ # heading (th) in a row table_cells(table, TableHeading) when /^\s*\|\+/ # caption table_caption(table) when /^\s*\|-(.*)$/ # row start table_row(table, Regexp.last_match(1)) when /^\s*\|/ # cell in row table_cells(table) when /^\s*{{/ # template can be at row level table_template(table) when nil return false when /^(?<level>={2,})\s*(?<text>.+?)\s*\k<level>$/ # heading implicitly closes the table @context.prev! return false else return table_cell_cont(table) end true # should continue parsing end | 
#table_params ⇒ Object
| 33 34 35 36 | # File 'lib/infoboxer/parser/table.rb', line 33 def table_params @context.skip(/\s*{\|/) parse_params(@context.rest) end | 
#table_row(table, param_str) ⇒ Object
| 66 67 68 69 | # File 'lib/infoboxer/parser/table.rb', line 66 def table_row(table, param_str) log 'Table row found' table.push_children(TableRow.new(Nodes[], **parse_params(param_str))) end | 
#table_template(table) ⇒ Object
| 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | # File 'lib/infoboxer/parser/table.rb', line 107 def table_template(table) contents = paragraph(/^\s*([|!]|{\|)/).to_templates? # Note: in fact, without full template parsing, we CAN'T know what level to insert it: # Template can be something like <tr><td>Foo</td></tr> # But for consistency, we insert all templates inside the <td>, forcing this <td> # to exist. table.push_children(TableRow.new) unless table.children.last.is_a?(TableRow) row = table.children.last row.push_children(TableCell.new) unless row.children.last.is_a?(BaseCell) cell = row.children.last cell.push_children(*contents) end |