resources/asciidoctor/lib/docbook_compat/convert_dlist.rb (185 lines of code) (raw):
# frozen_string_literal: true
require_relative '../log_util'
module DocbookCompat
##
# Methods to convert lists.
module ConvertDList
include LogUtil
def convert_dlist(node)
style = node.style || 'vertical'
node.converter.convert node, "#{style}_dlist"
rescue NoMethodError
warn block: node, message: <<~MESSAGE.strip
Can't convert unknown description list style [#{style}].
MESSAGE
end
def convert_vertical_dlist(node)
[
'<div class="variablelist">',
node.id ? %(<a id="#{node.id}"></a>) : nil,
'<dl class="variablelist">',
node.items.map { |terms, dd| Vertical.convert_dlist_item terms, dd },
'</dl>',
'</div>',
].flatten.compact.join "\n"
end
def convert_horizontal_dlist(node)
node.assign_caption nil, :table # Caption the dlist like a table
[
convert_table_intro(node),
convert_table_tag(node, 0),
Horizontal::INTRO,
node.items.map { |terms, dd| Horizontal.convert_dlist_item terms, dd },
Horizontal::OUTRO,
convert_table_outro(node),
].flatten
end
def convert_qanda_dlist(node)
[
QuestionAndAnswer::INTRO,
node.items.each_with_index.map do |(terms, dd), index|
QuestionAndAnswer.convert_dlist_item index, terms, dd
end,
QuestionAndAnswer::OUTRO,
].flatten
end
def convert_glossary_dlist(node)
[
'<dl>',
node.items.map { |terms, dd| Glossary.convert_dlist_item terms, dd },
'</dl>',
].flatten.compact.join "\n"
end
##
# Creates "vertical" style (the default) dlists.
module Vertical
def self.convert_dlist_item(terms, definition)
[
terms.map { |term| convert_dlist_term term },
convert_dlist_definition(definition),
].flatten
end
def self.convert_dlist_term(term)
[
'<dt>',
'<span class="term">',
term.convert,
'</span>',
'</dt>',
]
end
def self.convert_dlist_definition(definition)
return unless definition
['<dd>', definition.convert, '</dd>']
end
end
##
# Creates "horizontal" style dlists.
module Horizontal
INTRO = [
'<colgroup>',
'<col/>',
'<col/>',
'</colgroup>',
'<tbody valign="top">',
].freeze
OUTRO = [
'</tbody>',
'</table>',
].freeze
def self.convert_dlist_item(terms, definition)
[
'<tr>',
'<td valign="top">',
terms.map { |term| convert_dlist_term term },
'</td>',
convert_dlist_definition(definition),
'</tr>',
].flatten
end
def self.convert_dlist_term(term)
['<p>', term.convert, '</p>']
end
def self.convert_dlist_definition(definition)
[
'<td valign="top">',
'<p>',
definition&.convert,
'</p>',
'</td>',
].compact
end
end
##
# Creates "qanda" style dlists.
module QuestionAndAnswer
INTRO = [
'<div class="qandaset">',
'<table border="0">',
'<colgroup>',
'<col align="left" width="1%"/>',
'<col/>',
'</colgroup>',
'<tbody>',
].freeze
OUTRO = [
'</tbody>',
'</table>',
'</div>',
].freeze
def self.convert_dlist_item(index, terms, answer)
[
terms.map { |question| convert_dlist_question index, question },
convert_dlist_answer(answer),
].flatten
end
def self.convert_dlist_question(index, question)
[
'<tr class="question">',
convert_dlist_index_cell(index),
'<td align="left" valign="top">',
'<p>',
question.convert,
'</p>',
'</td>',
'</tr>',
].flatten
end
def self.convert_dlist_answer(answer)
[
'<tr class="answer">',
convert_dlist_index_cell(nil),
'<td align="left" valign="top">',
'<p>',
answer&.convert,
'</p>',
'</td>',
'</tr>',
].compact
end
def self.convert_dlist_index_cell(index)
[
'<td align="left" valign="top">',
index ? "<p><strong>#{index + 1}.</strong></p>" : nil,
'</td>',
].compact
end
end
##
# Creates "glossary" style dlists.
module Glossary
def self.convert_dlist_item(terms, definition)
[
terms.map { |term| convert_dlist_term term },
convert_dlist_definition(definition),
].flatten
end
def self.convert_dlist_term(term)
[
'<dt>',
'<span class="glossterm">',
term.convert,
'</span>',
'</dt>',
]
end
def self.convert_dlist_definition(definition)
return unless definition
['<dd class="glossdef">', definition.convert, '</dd>']
end
end
end
end