blob: 87f4f2a2731ba900b0e70e96a4ee9e7c5a13b76e [file] [log] [blame]
require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
include Asciidoctor
# An inline macro that generates links to related man pages.
#
# Usage
#
# man:gittutorial[7]
#
class ManInlineMacro < Extensions::InlineMacroProcessor
use_dsl
named :man
name_positional_attributes 'volnum'
def process parent, target, attrs
manname = target
suffix = if (volnum = attrs['volnum'])
"(#{volnum})"
else
nil
end
text = %(#{manname}#{suffix})
if parent.document.basebackend? 'html'
parent.document.register :links, target
if manname == 'rustc'
html_target = 'https://doc.rust-lang.org/rustc/index.html'
elsif manname == 'rustdoc'
html_target = 'https://doc.rust-lang.org/rustdoc/index.html'
elsif manname == 'cargo'
html_target = 'index.html'
else
html_target = %(#{manname}.html)
end
%(#{(create_anchor parent, text, type: :link, target: html_target).render})
elsif parent.document.backend == 'manpage'
%(\x1b\\fB#{manname}\x1b\\fP#{suffix})
else
text
end
end
end
# Creates a link to something in the cargo documentation.
#
# For HTML this creates a relative link. For the man page it gives a direct
# link to doc.rust-lang.org.
#
# Usage
#
# linkcargo:reference/manifest.html[the manifest]
#
class LinkCargoInlineMacro < Extensions::InlineMacroProcessor
use_dsl
named :linkcargo
name_positional_attributes 'text'
def process parent, target, attrs
text = attrs['text']
if parent.document.basebackend? 'html'
target = %(../#{target})
parent.document.register :links, target
%(#{(create_anchor parent, text, type: :link, target: target).render})
elsif parent.document.backend == 'manpage'
target = %(https://doc.rust-lang.org/cargo/#{target})
%(#{(create_anchor parent, text, type: :link, target: target).render})
else
%(#{text} <#{target}>)
end
end
end
# Backticks in the manpage renderer use the CR font (courier), but in most
# cases in a terminal this doesn't look any different. Instead, use bold which
# should follow man page conventions better.
class MonoPostprocessor < Extensions::Postprocessor
def process document, output
if document.basebackend? 'manpage'
output = output.gsub(/\\f\(CR/, '\\fB')
end
output
end
end
# General utility for converting text. Example:
#
# convert:lowercase[{somevar}]
class ConvertInlineMacro < Extensions::InlineMacroProcessor
use_dsl
named :convert
name_positional_attributes 'text'
def process parent, target, attrs
text = attrs['text']
case target
when 'lowercase'
text.downcase
end
end
end
Extensions.register :uri_schemes do
inline_macro ManInlineMacro
inline_macro LinkCargoInlineMacro
inline_macro ConvertInlineMacro
postprocessor MonoPostprocessor
end