lib/asciidoctor/rfc/v2/blocks.rb
require "htmlentities"
module Asciidoctor
module RFC::V2
module Blocks
# Syntax:
# [discrete]
# == Section
def floating_title(node)
noko do |xml|
xml.t do |xml_t|
xml_t.spanx node.title, style: "strong"
end
end
end
# Syntax:
# [[id]]
# .Name
# [align=left|center|right,alt=alt_text,type] (optional)
# ....
# literal
# ....
def literal(node)
artwork_attributes = {
align: node.attr("align"),
type: node.attr("type"),
name: node.title,
alt: node.attr("alt"),
}
# NOTE: html escaping is performed by Nokogiri
artwork_content = "\n" + node.lines.join("\n") + "\n"
ret = noko do |xml|
if node.parent.context != :example
figure_attributes = {
anchor: node.id,
}
xml.figure **attr_code(figure_attributes) do |xml_figure|
# xml_figure.artwork artwork_content, **attr_code(artwork_attributes)
xml_figure.artwork **attr_code(artwork_attributes) do |a|
a.cdata artwork_content
end
end
else
# xml.artwork artwork_content, **attr_code(artwork_attributes)
xml.artwork **attr_code(artwork_attributes) do |a|
a.cdata artwork_content
end
end
end
ret
end
# stem is treated as literal, but with center alignment
def stem(node)
artwork_attributes = {
align: node.attr("align") || "center",
type: node.attr("type"),
name: node.title,
alt: node.attr("alt"),
}
# NOTE: html escaping is performed by Nokogiri
artwork_content = "\n" + node.lines.join("\n") + "\n"
ret = noko do |xml|
if node.parent.context != :example
figure_attributes = {
anchor: node.id,
}
xml.figure **attr_code(figure_attributes) do |xml_figure|
# xml_figure.artwork artwork_content, **attr_code(artwork_attributes)
xml_figure.artwork **attr_code(artwork_attributes) do |a|
a.cdata artwork_content
end
end
else
# xml.artwork artwork_content, **attr_code(artwork_attributes)
xml.artwork **attr_code(artwork_attributes) do |a|
a.cdata artwork_content
end
end
end
ret
end
# Syntax:
# = Title
# Author
# :HEADER
#
# ABSTRACT
#
# NOTE: note
#
# [NOTE]
# .Title (in preamble)
# ====
# Content
# ====
#
# [NOTE] (in preamble)
# [NOTE,source=name] (in body)
# .Title
# ====
# Content
# ====
#
# @note admonitions within preamble are notes. Elsewhere, they are comments.
def admonition(node)
result = []
if node.parent.context == :preamble
note_attributes = {
# default title provided: title is mandatory
title: (node.title.nil? ? "NOTE" : node.title),
}
note_contents = HTMLEntities.new.decode([paragraph1(node)].flatten.join("\n"))
result << noko do |xml|
xml.note **attr_code(note_attributes) do |xml_note|
xml_note << note_contents
end
end
else
cref_attributes = {
anchor: node.id,
source: node.attr("source"),
}
# remove all formatting: cref content is pure text
cref_contents = flatten_rawtext(node)
cref_contents = [cref_contents].flatten.join("\n")
warn <<~WARNING_MESSAGE if node.blocks?
asciidoctor: WARNING (#{node.lineno}): comment can not contain blocks of text in XML RFC:\n #{node.content}
WARNING_MESSAGE
result << noko do |xml|
if node.parent.context !~ /table|example|paragraph|section/
xml.t do |xml_t|
xml_t.cref **attr_code(cref_attributes) do |xml_cref|
xml_cref << cref_contents
end
end
else
xml.cref **attr_code(cref_attributes) do |xml_cref|
xml_cref << cref_contents
end
end
end
end
result
end
# Syntax:
# [[id]]
# .Title
# [align,alt,suppress-title]
# ====
# Example
# ====
def example(node)
figure_attributes = {
anchor: node.id,
align: node.attr("align"),
alt: node.alt,
title: node.title,
'suppress-title': node.attr("suppress-title"),
# TODO: is 'suppress-title' the correct attribute name?
}
# TODO iref
seen_artwork = false
noko do |xml|
xml.figure **attr_code(figure_attributes) do |xml_figure|
node.blocks.each do |b|
case b.context
when :listing, :image, :literal, :stem
xml_figure << send(b.context, b).join("\n")
seen_artwork = true
else
# we want to see the para text, not its <t> container
if seen_artwork
xml_figure.postamble do |postamble|
postamble << b.content
end
else
xml_figure.preamble do |preamble|
preamble << b.content
end
end
end
end
end
end
end
# Syntax:
# .name
# [source,type,src=uri] (src is mutually exclusive with listing content) (v3)
# [source,type,src=uri,align,alt] (src is mutually exclusive with listing content) (v2)
# ----
# code
# ----
def listing(node)
sourcecode_attributes = {
align: node.attr("align"),
alt: node.alt,
name: node.title,
type: node.attr("language"),
src: node.attr("src"),
}
# NOTE: html escaping is performed by Nokogiri
sourcecode_content =
sourcecode_attributes[:src].nil? ? "\n" + node.lines.join("\n") + "\n" : ""
noko do |xml|
if node.parent.context != :example
figure_attributes = {
anchor: node.id,
}
xml.figure **attr_code(figure_attributes) do |xml_figure|
# xml_figure.artwork sourcecode_content, **attr_code(sourcecode_attributes)
xml_figure.artwork **attr_code(sourcecode_attributes) do |a|
a.cdata sourcecode_content
end
end
else
# xml.artwork sourcecode_content, **attr_code(sourcecode_attributes)
xml.artwork **attr_code(sourcecode_attributes) do |a|
a.cdata sourcecode_content
end
end
end
end
def quote(node)
result = []
if node.blocks?
node.blocks.each do |b|
result << send(b.context, b)
end
else
result = paragraph(node)
end
if node.attr("citetitle") || node.attr("attribution")
cite = node.attr("attribution") || ""
cite += ", " if node.attr("citetitle") && node.attr("attribution")
cite += (node.attr("citetitle") || "")
cite = "-- " + cite
result << "<t>#{cite}</t>"
end
result
end
end
end
end