class Asciidoctor::Table::Cell
def initialize column, cell_text, attributes = {}, opts = {}
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], inner_document_cursor).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