module Asciidoctor::Revealjs::Converter::Helpers

This module gets mixed in to every node (the context of the template) at the time the node is being converted. The properties and methods in this module effectively become direct members of the template.

Constants

DEFAULT_SECTNUMLEVELS
DEFAULT_TOCLEVELS

Defaults

EOL
SliceHintRx
VOID_ELEMENTS

Public Instance Methods

bool_data_attr(val) click to toggle source

bool_data_attr If the AsciiDoc attribute doesn't exist, no HTML attribute is added If the AsciiDoc attribute exist and is a true value, HTML attribute is enabled (bool) If the AsciiDoc attribute exist and is a false value, HTML attribute is a false string Ex: a feature is enabled globally but can be disabled using a data- attribute on individual items :revealjs_previewlinks: True then :example.com[Link text, preview=false] Here the template must have data-preview-link=“false” not just no data-preview-link attribute

# File lib/asciidoctor-revealjs/converter.rb, line 42
def bool_data_attr val
  return false unless attr?(val)
  if attr(val).downcase == 'false' || attr(val) == '0'
    'false'
  else
    true
  end
end
clear_slide_footnotes() click to toggle source
# File lib/asciidoctor-revealjs/converter.rb, line 175
def clear_slide_footnotes
  @@slide_footnotes = {}
end
content_for(key, opts = {}) click to toggle source

Capture nested template content and register it with the specified key, to be executed at a later time.

This method must be invoked using the control code directive (i.e., -). By using a control code directive, the block is set up to append the result directly to the output buffer. (Integrations often hide the distinction between a control code directive and an output directive in this context).

key - The Symbol under which to save the template block. opts - A Hash of options to control processing (default: {}):

* :append  - A Boolean that indicates whether to append this block
             to others registered with this key (default: false).
* :content - String content to be used if template content is not
             provided (optional).

block - The template content (in Slim template syntax).

Examples

- content_for :body
  p content
- content_for :body, append: true
  p more content

Returns nothing.

# File lib/asciidoctor-revealjs/converter.rb, line 252
def content_for key, opts = {}, &block
  @content = {} unless defined? @content
  (opts[:append] ? (@content[key] ||= []) : (@content[key] = [])) << (block_given? ? block : lambda { opts[:content] })
  nil
end
content_for?(key) click to toggle source

Checks whether deferred template content has been registered for the specified key.

key - The Symbol under which to look for saved template blocks.

Returns a Boolean indicating whether content has been registered for this key.

# File lib/asciidoctor-revealjs/converter.rb, line 263
def content_for? key
  (defined? @content) && (@content.key? key)
end
data_attrs(attributes) click to toggle source

Extracts data- attributes from the attributes. @param attributes [Hash] (default: {}) @return [Hash] a Hash that contains only data- attributes

# File lib/asciidoctor-revealjs/converter.rb, line 104
def data_attrs(attributes)
  # key can be an Integer (for positional attributes)
  attributes.map { |key, value| (key == 'step') ? ['data-fragment-index', value] : [key, value] }
            .to_h
            .select { |key, _| key.to_s.start_with?('data-') }
end
html_tag(name, attributes = {}, content = nil) { || ... } click to toggle source

Creates an HTML tag with the given name and optionally attributes. Can take a block that will run between the opening and closing tags.

@param name [#to_s] the name of the tag. @param attributes [Hash] (default: {}) @param content [#to_s] the content; nil to call the block. (default: nil). @yield The block of Slim/HTML code within the tag (optional). @return [String] a rendered HTML element.

# File lib/asciidoctor-revealjs/converter.rb, line 82
def html_tag(name, attributes = {}, content = nil)
  attrs = attributes.inject([]) do |attrs, (k, v)|
    next attrs unless v && (v == true || !v.nil_or_empty?)
    v = v.compact.join(' ') if v.is_a? Array
    attrs << (v == true ? k : %(#{k}="#{v}"))
  end
  attrs_str = attrs.empty? ? '' : ' ' + attrs.join(' ')

  if VOID_ELEMENTS.include? name.to_s
    %(<#{name}#{attrs_str}>)
  else
    content ||= (yield if block_given?)
    %(<#{name}#{attrs_str}>#{content}</#{name}>)
  end
end
inline_text_container(content = nil) { || ... } click to toggle source

Wrap an inline text in a <span> element if the node contains a role, an id or data- attributes. @param content [#to_s] the content; nil to call the block. (default: nil). @return [String] the content or the content wrapped in a <span> element as string

# File lib/asciidoctor-revealjs/converter.rb, line 117
def inline_text_container(content = nil)
  data_attrs = data_attrs(@attributes)
  classes = [role, ('fragment' if (option? :step) || (attr? 'step') || (roles.include? 'step'))].compact
  if !roles.empty? || !data_attrs.empty? || !@id.nil?
    html_tag('span', { :id => @id, :class => classes }.merge(data_attrs), (content || (yield if block_given?)))
  else
    content || (yield if block_given?)
  end
end
resolve_content() click to toggle source

Between delimiters (–) is code taken from asciidoctor-bespoke 1.0.0.alpha.1 Licensed under MIT, Copyright (C) 2015-2016 Dan Allen and the Asciidoctor Project

# File lib/asciidoctor-revealjs/converter.rb, line 224
def resolve_content
  @content_model == :simple ? %(<p>#{content}</p>) : content
end
revealjs_dependencies(document, node, revealjsdir) click to toggle source
# File lib/asciidoctor-revealjs/converter.rb, line 201
def revealjs_dependencies(document, node, revealjsdir)
  dependencies = []
  dependencies << "{ src: '#{revealjsdir}/plugin/zoom-js/zoom.js', async: true }" unless (node.attr? 'revealjs_plugin_zoom', 'disabled')
  dependencies << "{ src: '#{revealjsdir}/plugin/notes/notes.js', async: true }" unless (node.attr? 'revealjs_plugin_notes', 'disabled')
  dependencies << "{ src: '#{revealjsdir}/plugin/markdown/marked.js', async: true }" if (node.attr? 'revealjs_plugin_marked', 'enabled')
  dependencies << "{ src: '#{revealjsdir}/plugin/markdown/markdown.js', async: true }" if (node.attr? 'revealjs_plugin_markdown', 'enabled')
  if (node.attr? 'revealjs_plugins') &&
      !(revealjs_plugins_file = (node.attr 'revealjs_plugins', '').strip).empty? &&
      !(revealjs_plugins_content = (File.read revealjs_plugins_file).strip).empty?
    dependencies << revealjs_plugins_content
  end
  dependencies.join(",\n      ")
end
section_level(sec = self) click to toggle source

Returns corrected section level.

@param sec [Asciidoctor::Section] the section node (default: self). @return [Integer]

# File lib/asciidoctor-revealjs/converter.rb, line 134
def section_level(sec = self)
  @_section_level ||= (sec.level == 0 && sec.special) ? 1 : sec.level
end
section_title(sec = self) click to toggle source

Returns the captioned section's title, optionally numbered.

@param sec [Asciidoctor::Section] the section node (default: self). @return [String]

# File lib/asciidoctor-revealjs/converter.rb, line 191
def section_title(sec = self)
  sectnumlevels = document.attr(:sectnumlevels, DEFAULT_SECTNUMLEVELS).to_i

  if sec.numbered && !sec.caption && sec.level <= sectnumlevels
    [sec.sectnum, sec.captioned_title].join(' ')
  else
    sec.captioned_title
  end
end
slice_text(str, active = nil) click to toggle source
# File lib/asciidoctor-revealjs/converter.rb, line 22
def slice_text str, active = nil
  if (active || (active.nil? && (option? :slice))) && (str.include? '  ')
    (str.split SliceHintRx).map {|line| %(<span class="line">#{line}</span>) }.join EOL
  else
    str
  end
end
slide_footnote(footnote) click to toggle source
# File lib/asciidoctor-revealjs/converter.rb, line 144
def slide_footnote(footnote)
  footnote_parent = footnote.parent
  # footnotes declared on the section title are processed during the parsing/substitution.
  # as a result, we need to store them to display them on the right slide/section
  if footnote_parent.instance_of?(::Asciidoctor::Section)
    footnote_parent_object_id = footnote_parent.object_id
    section_footnotes = (@@section_footnotes[footnote_parent_object_id] || [])
    footnote_index = section_footnotes.length + 1
    attributes = footnote.attributes.merge({ 'index' => footnote_index })
    inline_footnote = Asciidoctor::Inline.new(footnote_parent, footnote.context, footnote.text, :attributes => attributes)
    section_footnotes << Asciidoctor::Document::Footnote.new(inline_footnote.attr(:index), inline_footnote.id, inline_footnote.text)
    @@section_footnotes[footnote_parent_object_id] = section_footnotes
    inline_footnote
  else
    parent = footnote.parent
    until parent == nil || parent.instance_of?(::Asciidoctor::Section)
      parent = parent.parent
    end
    # check if there is any footnote attached on the section title
    section_footnotes = parent != nil ? @@section_footnotes[parent.object_id] || [] : []
    initial_index = footnote.attr(:index)
    # reset the footnote numbering to 1 on each slide
    # make sure that if a footnote is used more than once it will use the same index/number
    slide_index = (existing_footnote = @@slide_footnotes[initial_index]) ? existing_footnote.index : @@slide_footnotes.length + section_footnotes.length + 1
    attributes = footnote.attributes.merge({ 'index' => slide_index })
    inline_footnote = Asciidoctor::Inline.new(footnote_parent, footnote.context, footnote.text, :attributes => attributes)
    @@slide_footnotes[initial_index] = Asciidoctor::Document::Footnote.new(inline_footnote.attr(:index), inline_footnote.id, inline_footnote.text)
    inline_footnote
  end
end
slide_footnotes(section) click to toggle source
# File lib/asciidoctor-revealjs/converter.rb, line 179
def slide_footnotes(section)
  section_object_id = section.object_id
  section_footnotes = @@section_footnotes[section_object_id] || []
  section_footnotes + @@slide_footnotes.values
end
to_boolean(val) click to toggle source
# File lib/asciidoctor-revealjs/converter.rb, line 30
def to_boolean val
  val && val != 'false' && val.to_s != '0' || false
end
to_valid_slidenumber(val) click to toggle source

false needs to be verbatim everything else is a string. Calling side isn't responsible for quoting so we are doing it here

# File lib/asciidoctor-revealjs/converter.rb, line 53
def to_valid_slidenumber val
  # corner case: empty is empty attribute which is true
  return true if val == ""
  # using to_s here handles both the 'false' string and the false boolean
  val.to_s == 'false' ? false : "'#{val}'"
end
yield_content(key, opts = {}) click to toggle source

Evaluates the deferred template content registered with the specified key.

When the corresponding content_for method is invoked using a control code directive, the block is set up to append the result to the output buffer directly.

key - The Symbol under which to look for template blocks to yield. opts - A Hash of options to control processing (default: {}):

* :drain - A Boolean indicating whether to drain the key of blocks
           after calling them (default: true).

Examples

- yield_content :body

Returns nothing (assuming the content has been captured in the context of control code).

# File lib/asciidoctor-revealjs/converter.rb, line 283
def yield_content key, opts = {}
  if (defined? @content) && (blks = (opts.fetch :drain, true) ? (@content.delete key) : @content[key])
    blks.map {|b| b.call }.join
  end
  nil
end