require 'maruku' require 'maruku/ext/math' # Monkey patches to add line numbers to html output require 'omf_base/lobject' require 'omf_web' require 'omf-web/widget/text/maruku/input/parse_block' require 'omf-web/widget/text/maruku/output/to_html' require 'omf-web/widget/text/maruku/helpers' require 'rexml/document' require 'yaml' MaRuKu::Globals[:html_math_engine] = 'ritex' module OMF::Web::Widget::Text module Maruku # # Fetch text and parse it # # # def self.load_content(source) # unless File.readable?(source) # raise "Cannot read text file '#{source}'" # end # content = File.open(source).read # ::Maruku.new(content) # end # Fetch text and parse it # def self.format_content_proxy(content_proxy) unless content_proxy.is_a? OMF::Web::ContentProxy raise "Expected content proxy, but got '#{content_proxy.class}'" end format_content(content_proxy.content) end def self.format_content(content) ::Maruku.new(content) end # The markdown document may have some meta instructions at the # beginning of the document which are formatted like an HTTP header def self.count_header_lines(content) count = 0 match = (content =~ /\A((\w[\w\s\_\-]+: .*\n)+)\s*\n/) return 0 if match != 0 headers = $1 headers.split("\n").length + 1 end class WidgetElement < OMF::Base::LObject @@pre_create_handlers = [] # Register a block which is presented with the # widget description (Hash) we are about to create. The # block is assumed to return a widget description. # def self.on_pre_create(&block) @@pre_create_handlers << block end def self.create(wdescr) wdescr = @@pre_create_handlers.reduce(wdescr) do |wd, block| wd2 = block.call(wd) unless wd2.is_a? Hash raise "Pre_create handler '#{block}' does not return hash, but '#{wd2}'" end wd2 end self.new(wdescr) end attr_reader :widget def initialize(wdescr) debug "Embedding widget - #{wdescr} " @wdescr = wdescr @widget = OMF::Web::Widget.create_widget(wdescr) debug "Created widget - #{@widget.class}" end def to_html content = @widget.content h = content.to_html klass = ['embedded'] if caption = @wdescr[:caption] || @widget.title if mt = @wdescr[:'mime-type'] klass << "embedded-#{mt.gsub('/', '-')}" end if ty = @wdescr[:type] klass << "embedded-#{ty.gsub('/', '-')}" end h += "