class Asciidoctor::Table::Cell

Public: Methods for managing the a cell in an AsciiDoc table.

Constants

DOUBLE_LF

Attributes

colspan[RW]

Public: An Integer of the number of columns this cell will span (default: nil)

inner_document[R]

Public: Returns the nested Document in an AsciiDoc table cell (only set when style is :asciidoc)

rowspan[RW]

Public: An Integer of the number of rows this cell will span (default: nil)

text[W]

Public: Set the String text for this cell.

This method shouldn’t be used for cells that have the AsciiDoc style.

Public Class Methods

new(column, cell_text, attributes = {}) click to toggle source
Calls superclass method Asciidoctor::AbstractBlock::new
# File lib/asciidoctor/table.rb, line 235
def initialize column, cell_text, attributes = {}, opts = {}
  super column, :table_cell
  @cursor = @reinitialize_args = nil
  @source_location = opts[:cursor].dup if @document.sourcemap
  # NOTE: column is always set when parsing; may not be set when building table from the API
  if column
    if (in_header_row = column.table.header_row?)
      if in_header_row == :implicit && (cell_style = column.style || (attributes && attributes['style']))
        @reinitialize_args = [column, cell_text, attributes && attributes.merge, opts] if cell_style == :asciidoc || cell_style == :literal
        cell_style = nil
      end
    else
      cell_style = column.style
    end
    # REVIEW feels hacky to inherit all attributes from column
    update_attributes column.attributes
  end
  # NOTE if attributes is defined, we know this is a psv cell; implies text needs to be stripped
  if attributes
    if attributes.empty?
      @colspan = @rowspan = nil
    else
      @colspan, @rowspan = (attributes.delete 'colspan'), (attributes.delete 'rowspan')
      # TODO delete style attribute from @attributes if set
      cell_style = attributes['style'] || cell_style unless in_header_row
      update_attributes attributes
    end
    case cell_style
    when :asciidoc
      asciidoc = true
      inner_document_cursor = opts[:cursor]
      if (cell_text = cell_text.rstrip).start_with? LF
        lines_advanced = 1
        lines_advanced += 1 while (cell_text = cell_text.slice 1, cell_text.length).start_with? LF
        # NOTE this only works if we remain in the same file
        inner_document_cursor.advance lines_advanced
      else
        cell_text = cell_text.lstrip
      end
    when :literal
      literal = true
      cell_text = cell_text.rstrip
      # QUESTION should we use same logic as :asciidoc cell? strip leading space if text doesn't start with newline?
      cell_text = cell_text.slice 1, cell_text.length while cell_text.start_with? LF
    else
      normal_psv = true
      # NOTE AsciidoctorJ uses nil cell_text to create an empty cell
      cell_text = cell_text ? cell_text.strip : ''
    end
  else
    @colspan = @rowspan = nil
    if cell_style == :asciidoc
      asciidoc = true
      inner_document_cursor = opts[:cursor]
    end
  end
  # NOTE only true for non-header rows
  if asciidoc
    # FIXME hide doctitle from nested document; temporary workaround to fix
    # nested document seeing doctitle and assuming it has its own document title
    parent_doctitle = @document.attributes.delete('doctitle')
    # NOTE we need to process the first line of content as it may not have been processed
    # the included content cannot expect to match conditional terminators in the remaining
    # lines of table cell content, it must be self-contained logic
    # QUESTION should we reset cell_text to nil?
    # QUESTION is is faster to check for :: before splitting?
    inner_document_lines = cell_text.split LF, -1
    if (unprocessed_line1 = inner_document_lines[0]).include? '::'
      preprocessed_lines = (PreprocessorReader.new @document, [unprocessed_line1]).readlines
      unless unprocessed_line1 == preprocessed_lines[0] && preprocessed_lines.size < 2
        inner_document_lines.shift
        inner_document_lines.unshift(*preprocessed_lines) unless preprocessed_lines.empty?
      end
    end unless inner_document_lines.empty?
    @inner_document = Document.new inner_document_lines, standalone: false, parent: @document, cursor: inner_document_cursor
    @document.attributes['doctitle'] = parent_doctitle unless parent_doctitle.nil?
    @subs = nil
  elsif literal
    @content_model = :verbatim
    @subs = BASIC_SUBS
  else
    if normal_psv
      if in_header_row
        @cursor = opts[:cursor] # used in deferred catalog_inline_anchor call
      else
        catalog_inline_anchor cell_text, opts[:cursor]
      end
    end
    @content_model = :simple
    @subs = NORMAL_SUBS
  end
  @text = cell_text
  @style = cell_style
end

Public Instance Methods

catalog_inline_anchor(cell_text = @text, cursor = nil) click to toggle source
# File lib/asciidoctor/table.rb, line 342
def catalog_inline_anchor cell_text = @text, cursor = nil
  cursor, @cursor = @cursor, nil unless cursor
  if (cell_text.start_with? '[[') && LeadingInlineAnchorRx =~ cell_text
    Parser.catalog_inline_anchor $1, $2, self, cursor, @document
  end
end
content() click to toggle source

Public: Handles the body data (tbody, tfoot), applying styles and partitioning into paragraphs

This method should not be used for cells in the head row or that have the literal style.

Returns the converted String for this Cell

# File lib/asciidoctor/table.rb, line 371
def content
  if (cell_style = @style) == :asciidoc
    @inner_document.convert
  elsif @text.include? DOUBLE_LF
    (text.split BlankLineRx).map do |para|
      cell_style && cell_style != :header ? (Inline.new parent, :quoted, para, type: cell_style).convert : para
    end
  elsif (subbed_text = text).empty?
    []
  elsif cell_style && cell_style != :header
    [(Inline.new parent, :quoted, subbed_text, type: cell_style).convert]
  else
    [subbed_text]
  end
end
file() click to toggle source

Public: Get the source file where this block started

# File lib/asciidoctor/table.rb, line 396
def file
  @source_location && @source_location.file
end
lineno() click to toggle source

Public: Get the source line number where this block started

# File lib/asciidoctor/table.rb, line 401
def lineno
  @source_location && @source_location.lineno
end
lines() click to toggle source
# File lib/asciidoctor/table.rb, line 387
def lines
  @text.split LF
end
reinitialize(has_header) click to toggle source
# File lib/asciidoctor/table.rb, line 330
def reinitialize has_header
  if has_header
    @reinitialize_args = nil
  elsif @reinitialize_args
    return Table::Cell.new(*@reinitialize_args)
  else
    @style = @attributes['style']
  end
  catalog_inline_anchor if @cursor
  self
end
source() click to toggle source
# File lib/asciidoctor/table.rb, line 391
def source
  @text
end
text() click to toggle source

Public: Get the String text of this cell with substitutions applied.

Used for cells in the head row as well as text-only (non-AsciiDoc) cells in the foot row and body.

This method shouldn’t be used for cells that have the AsciiDoc style.

Returns the converted String text for this Cell

# File lib/asciidoctor/table.rb, line 357
def text
  apply_subs @text, @subs
end
to_s() click to toggle source
# File lib/asciidoctor/table.rb, line 405
def to_s
  %(#{super} - [text: #{@text}, colspan: #{@colspan || 1}, rowspan: #{@rowspan || 1}, attributes: #{@attributes}])
end