lib/middleman-core/renderers/asciidoc.rb



require 'asciidoctor'

module Middleman
  module Renderers
    module AsciiDoc
      class << self

        def registered(app)
          app.config.define_setting :asciidoc, {
            :safe => :safe,
            :backend => :html5,
            :attributes => %W(showtitle env=middleman env-middleman middleman-version=#{::Middleman::VERSION})
          }, 'AsciiDoc engine options (Hash)'
          app.config.define_setting :asciidoc_attributes, [], 'AsciiDoc custom attributes (Array)'
          app.before_configuration do
            template_extensions :adoc => :html
          end

          app.after_configuration do
            # QUESTION should base_dir be equal to docdir instead?
            config[:asciidoc][:base_dir] = source_dir
            config[:asciidoc][:attributes].concat(config[:asciidoc_attributes] || [])
            config[:asciidoc][:attributes] << %(imagesdir=#{File.join((config[:http_prefix] || '/').chomp('/'), config[:images_dir])})
            sitemap.provides_metadata(/\.adoc$/) do |path|
              # read the AsciiDoc header only to set page options and data
              # header values can be accessed via app.data.page.<name> in the layout
              doc = Asciidoctor.load_file path, :safe => :safe, :parse_header_only => true

              opts = {}
              if doc.attr? 'page-layout'
                case (layout = (doc.attr 'page-layout'))
                when '', 'false'
                  opts[:layout] = false
                else
                  opts[:layout] = layout
                end
              end
              opts[:layout_engine] = (doc.attr 'page-layout-engine') if (doc.attr? 'page-layout-engine')
              # TODO override attributes to set docfile, docdir, docname, etc
              # alternative is to set :renderer_options, which get merged into options by the rendering extension
              #opts[:attributes] = config[:asciidoc][:attributes].dup
              #opts[:attributes].concat %W(docfile=#{path} docdir=#{File.dirname path} docname=#{(File.basename path).sub(/\.adoc$/, '')})

              page = {}
              page[:title] = doc.doctitle
              page[:date] = (doc.attr 'date') unless (doc.attr 'date').nil?
              # TODO grab all the author information
              page[:author] = (doc.attr 'author') unless (doc.attr 'author').nil?

              {:options => opts, :page => ::Middleman::Util.recursively_enhance(page)}
            end
          end
        end

        alias :included :registered
      end
    end
  end
end