require "htmlentities"
require "uri"
module Asciidoctor
module RFC::V3
module Blocks
# Syntax:
# [discrete]
# == Section
def floating_title(node)
noko do |xml|
xml.t { |xml_t| xml_t.strong node.title }
end
end
# Syntax:
# [[id]]
# .name
# [align=left|center|right,alt=alt_text] (optional)
# ....
# literal
# ....
def literal(node)
artwork_attributes = {
anchor: node.id,
align: node.attr("align"),
type: "ascii-art",
name: node.title,
alt: node.attr("alt"),
}
# NOTE: html escaping is performed by Nokogiri
artwork_content = "\n" + node.lines.join("\n") + "\n"
noko do |xml|
if node.parent.context != :example
xml.figure 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
end
# stem is treated as literal, but with center alignment
def stem(node)
artwork_attributes = {
anchor: node.id,
align: node.attr("align") || "center",
type: "ascii-art",
name: node.title,
alt: node.attr("alt"),
}
# NOTE: html escaping is performed by Nokogiri
artwork_content = "\n" + node.lines.join("\n") + "\n"
noko do |xml|
if node.parent.context != :example
xml.figure 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
end
# Syntax:
# [[id]]
# [quote, attribution, citation info] # citation info limited to URL
# Text
def quote(node)
cite_value = node.attr("citetitle")
cite_value = nil unless cite_value.to_s =~ URI::DEFAULT_PARSER.make_regexp
blockquote_attributes = {
anchor: node.id,
quotedFrom: node.attr("attribution"),
cite: cite_value,
}
noko do |xml|
xml.blockquote **attr_code(blockquote_attributes) do |xml_blockquote|
xml_blockquote << node.content
end
end
end
# realise as quote() ;
in v3 does not have the applicability of ,
# it is restricted to tables
def verse(node)
quote(node)
end
# Syntax:
# = Title
# Author
# :HEADER
#
# ABSTRACT
#
# NOTE: note
#
# [NOTE]
# .Title (in preamble)
# ====
# Content
# ====
#
# [NOTE,removeInRFC=true] (in preamble)
# [NOTE,display=true|false,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 = {
removeInRFC: node.attr("remove-in-rfc"),
}
result << noko do |xml|
xml.note **attr_code(note_attributes) do |xml_note|
xml_note.name node.title unless node.title.nil?
xml_note << HTMLEntities.new.decode([paragraph1(node)].flatten.join("\n"))
end
end
else
cref_attributes = {
anchor: node.id,
display: node.attr("display"),
source: node.attr("source"),
}
cref_contents = node.blocks? ? flatten(node) : node.content
cref_contents = [cref_contents].flatten.join("\n")
warn <<~WARNING_MESSAGE if node.blocks?
asciidoctor: WARNING (#{current_location(node)}): comment can not contain blocks of text in XML RFC:\n #{node.content}
WARNING_MESSAGE
result << noko do |xml|
xml.cref **attr_code(cref_attributes) do |xml_cref|
xml_cref << cref_contents
end
end
end
result
end
# Syntax:
# [[id]]
# ****
# Sidebar
# ****
def sidebar(node)
aside_attributes = {
anchor: node.id,
}
noko do |xml|
xml.aside **attr_code(aside_attributes) do |xml_aside|
xml_aside << node.content
end
end
end
# Syntax:
# .Title
# ====
# Example
# ====
def example(node)
node.blocks.each do |b|
unless %i{listing image literal stem}.include? b.context
warn "asciidoctor: WARNING (#{current_location(b)}): examples (figures) should only contain listings (sourcecode), images (artwork), or literal (artwork):\n#{b.lines}"
end
end
figure_attributes = {
anchor: node.id,
}
noko do |xml|
xml.figure **attr_code(figure_attributes) do |xml_figure|
xml_figure.name node.title if node.title?
# TODO iref
xml_figure << node.content
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 = {
anchor: node.id,
align: nil,
alt: nil,
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
xml.figure do |xml_figure|
# xml_figure.sourcecode sourcecode_content, **attr_code(sourcecode_attributes)
xml_figure.sourcecode **attr_code(sourcecode_attributes) do |a|
a.cdata sourcecode_content
end
end
else
# xml.sourcecode sourcecode_content, **attr_code(sourcecode_attributes)
xml.sourcecode **attr_code(sourcecode_attributes) do |a|
a.cdata sourcecode_content
end
end
end
end
end
end
end