require 'kramdown' require 'htmlentities' require_relative 'mastalk/extensions' module Mastalk # Document class to preprocess # mastalk specific syntax class Document include Mastalk::Extensions attr_reader :source def initialize(source) @source = source.dup end def to_html(options = {}) options[:auto_id] = options[:auto_id].nil? ? true : options[:auto_id] ::HTMLEntities.new.decode( kramdown(options).to_html() ) end private def kramdown(options = {}) options[:auto_id] = options[:auto_id].nil? ? true : options[:auto_id] Kramdown::Document.new(preprocess(source), :auto_ids => options[:auto_id]) end def preprocess(source) extensions.map do |regex, block| if source.match(regex) source.sub!(regex, block.call(Regexp.last_match.captures.first).strip) end end preprocess(source) if extensions.any? {|regex, _| source.match(regex)} source end end end