resources/asciidoctor/lib/care_admonition/extension.rb (85 lines of code) (raw):
# frozen_string_literal: true
require 'asciidoctor/extensions'
##
# Extensions for marking something as `beta`, `dev`, or technical `preview`.
#
# Usage
#
# beta::[]
# dev::[]
# preview::[]
# Foo beta:[]
# Foo dev:[]
# Foo preview:[]
#
# !! `experimental:[]` is supported as a deprecated alternative to `preview:[]`.
# !! But please use `preview:[]` instead.
#
class CareAdmonition < Asciidoctor::Extensions::Group
BETA_DEFAULT_TEXT = <<~TEXT.strip
This functionality is in beta and is subject to change. The design and code is less mature than official GA features and is being provided as-is with no warranties. Beta features are not subject to the support SLA of official GA features.
TEXT
DEV_DEFAULT_TEXT = <<~TEXT.strip
This functionality is in development and may be changed or removed completely in a future release. These features are unsupported and not subject to the support SLA of official GA features.
TEXT
PREVIEW_DEFAULT_TEXT = <<~TEXT.strip
This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.
TEXT
def activate(registry)
[
[:beta, 'beta', BETA_DEFAULT_TEXT],
[:dev, 'dev', DEV_DEFAULT_TEXT],
[:experimental, 'preview', PREVIEW_DEFAULT_TEXT],
[:preview, 'preview', PREVIEW_DEFAULT_TEXT],
].each do |(name, role, default_text)|
registry.block_macro ChangeAdmonitionBlock.new(role, default_text), name
registry.inline_macro ChangeAdmonitionInline.new(role, default_text), name
end
end
##
# Block care admonition.
class ChangeAdmonitionBlock < Asciidoctor::Extensions::BlockMacroProcessor
use_dsl
name_positional_attributes :passtext, :issue_url
def initialize(role, default_text)
super(nil)
@role = role
@default_text = default_text
end
def generate_text(text, issue_url)
if text&.start_with?('http', '{issue}')
issue_url = text
text = @default_text
else
issue_url = issue_url
text ||= @default_text
end
text = add_issue_text(text, issue_url) if issue_url
text
end
def add_issue_text(text, issue_url)
issue_num = get_issue_num(issue_url)
issue_text = <<~TEXT
For feature status, see #{issue_url}[\##{issue_num}].
TEXT
text + ' ' + issue_text
end
def get_issue_num(url)
return url.split('/').last.chomp('/') if url.start_with?('http')
url.sub('{issue}', '')
end
def process(parent, _target, attrs)
text = generate_text(attrs[:passtext], attrs[:issue_url])
Asciidoctor::Block.new(
parent, :admonition, source: text, attributes: {
'role' => @role,
'name' => 'warning',
'style' => 'warning',
}
)
end
end
##
# Inline care admonition.
class ChangeAdmonitionInline < Asciidoctor::Extensions::InlineMacroProcessor
use_dsl
name_positional_attributes :text
format :short
def initialize(role, default_text)
super(nil)
@role = role
@default_text = default_text
end
def process(parent, _target, attrs)
text = attrs[:text]
text ||= @default_text
Asciidoctor::Inline.new(
parent, :admonition, text, type: @role, attributes: {
'title_type' => 'title',
'title_class' => 'u-mono',
'title' => @role,
}
)
end
end
end