blob: 715d33d11ddcb416f34bd5c13a6d49a3e71cded1 [file] [log] [blame]
# MIT License
#
# Copyright (C) 2012-2020 Dan Allen, Sarah White, Ryan Waldron, and the
# individual contributors to Asciidoctor.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
require 'asciidoctor'
require 'asciidoctor/extensions'
require 'set'
include Asciidoctor
class TabsBlock < Asciidoctor::Extensions::BlockProcessor
use_dsl
named :tabs
on_context :open
parse_content_as :simple
def render_tab(parent, name, options, tab_content, use_xml)
if (options == 'unsupported')
content = Asciidoctor.convert "[source]\n----\nThis API is not presently available for #{name}."+( use_xml ? " You can use XML configuration." : "")+"\n----", parent: parent.document
return "<code-tab data-tab='#{name}' data-unavailable='true'>#{content}</code-tab>"
else
if tab_content.empty?
warn "There is an empty tab (#{name}) on the " + parent.document.attributes['doctitle'] + " page: " + parent.document.attributes['docfile']
# File.write("log.txt", "There is an empty tab (#{name}) on the " + parent.document.attributes['doctitle'] + " page: " + parent.document.attributes['docfile'] + "\n", mode: "a")
end
content = Asciidoctor.convert tab_content, parent: parent.document
return "<code-tab data-tab='#{name}'>#{content}</code-tab>"
end
end
def process parent, reader, attrs
lines = reader.lines
html = ''
tab_content = ''
name = ''
options = ''
tabs = Set.new
lines.each do |line|
if (line =~ /^tab:.*\[.*\]/ )
# render the previous tab if there is one
unless name.empty?
html = html + render_tab(parent, name, options, tab_content, tabs.include?("XML"))
end
tab_content = '';
name = line[/tab:(.*)\[.*/,1]
tabs << name
options = line[/tab:.*\[(.*)\]/,1]
else
tab_content = tab_content + "\n" + line;
end
end
unless name.empty?
html = html + render_tab(parent, name, options, tab_content, tabs.include?("XML"))
end
html = %(<code-tabs>#{html}</code-tabs>)
create_pass_block parent, html, attrs
end
end
Asciidoctor::Extensions.register do
block TabsBlock
end
class JavadocUrlMacro < Extensions::InlineMacroProcessor
use_dsl
named :javadoc
name_positional_attributes 'text'
def process parent, target, attrs
parts = target.split('.')
if attrs['text'] == nil
text = parts.last();
else
text = attrs['text']
end
target = parent.document.attributes['javadoc_base_url'] + '/' + parts.join('/') + ".html"
attrs.store('window', '_blank')
(create_anchor parent, text, type: :link, target: target, attributes: attrs).render
end
end
Asciidoctor::Extensions.register do
inline_macro JavadocUrlMacro
end
Extensions.register do
inline_macro do
named :link
parse_content_as :text
process do |parent, target, attrs|
# if(parent.document.attributes['latest'])
# base_url = parent.document.attributes['base_url'] + '/latest'
# else
# base_url = parent.document.attributes['base_url'] + '/' + parent.document.attributes['version']
# end
# print parent.document.attributes
base_url = parent.document.attributes['base_url'] # + '/' + parent.document.attributes['version']
if (text = attrs['text']).empty?
text = target
end
if text =~ /(\^|, *window=_?blank *)$/
text = text.sub(/\^$/,'')
text = text.sub(/, *window=_?blank *$/,'')
attrs.store('window', '_blank')
end
if target.start_with? 'http','ftp', '/', '#'
else
target = base_url + '/' + %(#{target})
end
(create_anchor parent, text, type: :link, target: target, attributes: attrs).render
end
end
end
class ImageTreeProcessor < Extensions::Treeprocessor
def process document
image_width = (document.attr 'image_width', "")
imagedir = document.attributes['docdir']
#scan for images
(document.find_by context: :image).each do |img|
imagefile = imagedir + '/' + img.attributes['target']
if !File.file?(imagefile)
warn 'Image does not exist: ' +imagefile
end
if !(img.attributes['width'] || image_width.empty?)
img.attributes['width'] = image_width
end
end
end
end
Extensions.register do
treeprocessor ImageTreeProcessor
end