require 'kramdown' require 'govspeak/header_extractor' module Govspeak class Document @@extensions = [] def self.to_html(source, options = {}) new(source, options).to_html end def initialize(source, options = {}) source ||= "" options[:entity_output] ||= :symbolic @doc = Kramdown::Document.new(preprocess(source), options) super() end def to_html @doc.to_html end def headers Govspeak::HeaderExtractor.convert(@doc).first end def preprocess(source) @@extensions.each do |title,regexp,block| source.gsub!(regexp) {|match| block.call($1) } end source end def self.extension(title, regexp = nil, &block) regexp ||= %r${::#{title}}(.*?){:/#{title}}$m @@extensions << [title, regexp, block] end def self.surrounded_by(open, close=nil) open = Regexp::escape(open) if close close = Regexp::escape(close) %r+(?:\r|\n|^)#{open}(.*?)#{close}(\r|\n|$)?+m else %r+(?:\r|\n|^)#{open}(.*?)#{open}?(\r|\n|$)+m end end def self.wrap_with_div(class_name, character, parser=Kramdown::Document) extension(class_name, surrounded_by(character)) { |body| content = parser ? parser.new("#{body.strip}\n").to_html : body.strip %{
\n#{body.sub("\n", "").gsub("\n", "
")}\n
This section applies to #{v}