This module groups all functions related to HTML export.
Escape text for use in HTML (content or attributes) by running it through standard XML escaping (quotes and angle brackets and ampersands)
# File lib/maruku/output/to_html.rb, line 9 def self.escapeHTML(text) CGI.escapeHTML(text) # TODO: When we drop Rubies < 1.9.3, re-add .gsub(/[^[:print:]\n\r\t]/, '') to # get rid of non-printable control characters. end
# File lib/maruku/output/to_html.rb, line 634 def add_class_to(el, cl) el['class'] = if already = el['class'] already + " " + cl else cl end end
# File lib/maruku/output/to_html.rb, line 231 def add_css_to(head) if css_list = self.attributes[:css] css_list.split.each do |css| # <link type="text/css" rel="stylesheet" href="..." /> link = xelem('link') link['type'] = 'text/css' link['rel'] = 'stylesheet' link['href'] = css head << link << xml_newline end end end
# File lib/maruku/output/to_html.rb, line 682 def add_ws(e) [xml_newline, e, xml_newline] end
# File lib/maruku/ext/math/to_html.rb, line 79 def adjust_png(png, use_depth) src = png.src height_in_px = png.height depth_in_px = png.depth height_in_ex = height_in_px / pixels_per_ex depth_in_ex = depth_in_px / pixels_per_ex total_height_in_ex = height_in_ex + depth_in_ex style = "" style << "vertical-align: -#{depth_in_ex}ex;" if use_depth style << "height: #{total_height_in_ex}ex;" img = xelem('img') img['src'] = src img['style'] = style img['alt'] = "$#{self.math.strip}$" img['class'] = 'maruku-png' img end
# File lib/maruku/output/to_html.rb, line 877 def array_to_html(array) e = [] array.each do |c| if c.kind_of?(String) e << xtext(c) else if c.kind_of?(HTMLElement) e << c next end method = c.kind_of?(MaRuKu::MDElement) ? "to_html_#{c.node_type}" : "to_html" next unless c.respond_to?(method) h = c.send(method) unless h raise "Nil html created by method #{method}:\n#{h.inspect}\n" + " for object #{c.inspect[0,300]}" end if h.kind_of? Array e.concat h else e << h end end end e end
Convert each child to html
# File lib/maruku/output/to_html.rb, line 873 def children_to_html array_to_html(@children) end
# File lib/maruku/ext/math/mathml_engines/blahtex.rb, line 59 def convert_to_mathml_blahtex(kind, tex) result = run_blahtex(tex, %w[--mathml]) doc = REXML::Document.new(result) mathml = doc.get_elements('//markup').to_a.first unless mathml maruku_error "Blahtex error: \n#{doc}" return nil end mathml.name = 'math' mathml.attributes['xmlns'] = "http://www.w3.org/1998/Math/MathML" mathml.attributes['display'] = (kind == :inline) ? :inline : :block MaRuKu::HTMLFragment.new(mathml.to_s) rescue => e maruku_error "Error: #{e}" nil end
# File lib/maruku/ext/math/mathml_engines/itex2mml.rb, line 2 def convert_to_mathml_itex2mml(kind, tex) return if $already_warned_itex2mml begin require 'itextomml' rescue LoadError => e maruku_error "Could not load package 'itex2mml'.\nPlease install it." unless $already_warned_itex2mml $already_warned_itex2mml = true return nil end begin require 'instiki_stringsupport' rescue LoadError require 'itex_stringsupport' end parser = Itex2MML::Parser.new mathml = case kind when :equation parser.block_filter(tex) when :inline parser.inline_filter(tex) else maruku_error "Unknown itex2mml kind: #{kind}" return end MaRuKu::HTMLFragment.new(mathml.to_utf8) rescue => e maruku_error "Invalid MathML TeX: \n#{tex.gsub(/^/, 'tex>')}\n\n #{e.inspect}" nil end
# File lib/maruku/ext/math/mathml_engines/none.rb, line 2 def convert_to_mathml_none(kind, tex) code = xelem('code') tex_node = xtext(tex) code << tex_node end
# File lib/maruku/ext/math/mathml_engines/ritex.rb, line 2 def convert_to_mathml_ritex(kind, tex) begin if not $ritex_parser require 'ritex' $ritex_parser = Ritex::Parser.new end mathml = $ritex_parser.parse(tex.strip) doc = Document.new(mathml, {:respect_whitespace =>:all}).root return doc rescue LoadError => e maruku_error "Could not load package 'ritex'.\n"+ "Please install it using:\n"+ " $ gem install ritex\n\n"+e.inspect rescue Racc::ParseError => e maruku_error "Could not parse TeX: \n#{tex}"+ "\n\n #{e.inspect}" end nil end
# File lib/maruku/ext/math/mathml_engines/blahtex.rb, line 8 def convert_to_png_blahtex(kind, tex) FileUtils.mkdir_p get_setting(:html_png_dir) # first, we check whether this image has already been processed md5sum = Digest::MD5.hexdigest(tex + " params: ") result_file = File.join(get_setting(:html_png_dir), md5sum + ".txt") if File.exists?(result_file) result = File.read(result_file) else args = [ '--png', '--use-preview-package', '--shell-dvipng', "dvipng -D #{Shellwords.shellescape(get_setting(:html_png_resolution).to_s)}", "--temp-directory #{Shellwords.shellescape(get_setting(:html_png_dir))}", "--png-directory #{Shellwords.shellescape(get_setting(:html_png_dir))}" ] args << '--displaymath' if kind == :equation result = run_blahtex(tex, args) end if result.nil? || result.empty? maruku_error "Blahtex error: empty output" return end doc = REXML::Document.new(result) png = doc.root.elements.to_a.first if png.name != 'png' maruku_error "Blahtex error: \n#{doc}" return end raise "No depth element in:\n #{doc}" unless depth = png.xpath('//depth')[0] raise "No height element in:\n #{doc}" unless height = png.xpath('//height')[0] raise "No md5 element in:\n #{doc}" unless md5 = png.xpath('//md5')[0] depth = depth.text.to_f height = height.text.to_f raise "Height or depth was 0! in \n #{doc}" if height == 0 || depth == 0 md5 = md5.text PNG.new("#{get_setting(:html_png_url)}#{md5}.png", depth, height) rescue => e maruku_error "Error: #{e}" nil end
# File lib/maruku/ext/math/mathml_engines/none.rb, line 8 def convert_to_png_none(kind, tex) nil end
returns “st”,“nd”,“rd” or “th” as appropriate
# File lib/maruku/output/to_html.rb, line 245 def day_suffix(day) s = { 1 => 'st', 2 => 'nd', 3 => 'rd', 21 => 'st', 22 => 'nd', 23 => 'rd', 31 => 'st' } s[day] || 'th'; end
Pretty much the same as the HTMLElement constructor except it copies standard attributes out of the Maruku Element's attributes hash.
# File lib/maruku/output/to_html.rb, line 396 def html_element(name, content="", attributes={}) attributes = content if attributes.empty? && content.is_a?(Hash) Array(HTML4Attributes[name]).each do |att| if v = @attributes[att] attributes[att.to_s] = MaRuKu::Out::HTML.escapeHTML(v.to_s) end end content = yield if block_given? HTMLElement.new(name, attributes, content) end
# File lib/maruku/output/to_html.rb, line 265 def maruku_html_signature div = xelem('div') div['class'] = 'maruku_signature' div << xelem('hr') span = xelem('span') span['style'] = 'font-size: small; font-style: italic' div << span << xtext('Created by ') a = xelem('a') a['href'] = MaRuKu::MARUKU_URL a['title'] = 'Maruku: a Markdown-superset interpreter for Ruby' a << xtext('Maruku') span << xtext(nice_date + ".") div end
formats a nice date
# File lib/maruku/output/to_html.rb, line 259 def nice_date Time.now.strftime(" at %H:%M on %A, %B %d") + day_suffix(t.day) + t.strftime(", %Y") end
Email address
# File lib/maruku/output/to_html.rb, line 688 def obfuscate(s) s.bytes.inject('') do |res, char| res << "&#%03d;" % char end end
# File lib/maruku/ext/math/to_html.rb, line 75 def pixels_per_ex $pixels_per_ex ||= render_png(:inline, "x").height end
# File lib/maruku/output/to_html.rb, line 280 def render_footnotes div = xelem('div') div['class'] = 'footnotes' div << xelem('hr') ol = xelem('ol') @doc.footnotes_order.each_with_index do |fid, i| num = i + 1 if f = self.footnotes[fid] li = f.wrap_as_element('li') li['id'] = "#{get_setting(:doc_prefix)}fn:#{num}" a = xelem('a') a['href'] = "\##{get_setting(:doc_prefix)}fnref:#{num}" a['rev'] = 'footnote' a << xtext([8617].pack('U*')) last = nil li.children.reverse_each do |child| if child.is_a?(HTMLElement) last = child break end end if last && last.name == "p" last << xtext(' ') << a else li.children << a end ol << li else maruku_error "Could not find footnote id '#{fid}' among [#{self.footnotes.keys.inspect}]." end end div << ol end
Creates an xml Mathml document of this node's TeX code.
@return [MaRuKu::Out::HTML::HTMLElement]
# File lib/maruku/ext/math/to_html.rb, line 47 def render_mathml(kind, tex) engine = get_setting(:html_math_engine) method = "convert_to_mathml_#{engine}" if self.respond_to? method mathml = self.send(method, kind, tex) return mathml || convert_to_mathml_none(kind, tex) end # TODO: Warn here raise "A method called #{method} should be defined." convert_to_mathml_none(kind, tex) end
Renders a PNG image of this node's TeX code. Returns
@return [MaRuKu::Out::HTML::PNG, nil]
A struct describing the location and size of the image, or nil if no library is loaded that can render PNGs.
# File lib/maruku/ext/math/to_html.rb, line 66 def render_png(kind, tex) engine = get_setting(:html_png_engine) method = "convert_to_png_#{engine}".to_sym return self.send(method, kind, tex) if self.respond_to? method raise "A method called #{method} should be defined." nil end
nil if not applicable, else SPAN element
# File lib/maruku/output/to_html.rb, line 465 def render_section_number return nil unless section_number && !section_number.empty? # if we are bound to a section, add section number span = xelem('span') span['class'] = 'maruku_section_number' span << xtext(section_number) end
nil if not applicable, else string
# File lib/maruku/output/to_html.rb, line 455 def section_number return nil unless get_setting(:use_numbered_headers) n = Array(@attributes[:section_number]) return nil if n.empty? n.join('.') + ". " end
Render as an HTML fragment (no head, just the content of BODY). (returns a string)
# File lib/maruku/output/to_html.rb, line 68 def to_html(context={}) output = "" children_to_html.each do |e| output << e.to_s end # render footnotes unless @doc.footnotes_order.empty? output << render_footnotes end output end
# File lib/maruku/output/to_html.rb, line 756 def to_html_abbr abbr = xelem('abbr') abbr << xtext(children[0]) abbr['title'] = self.title if self.title abbr end
# File lib/maruku/output/to_html.rb, line 837 def to_html_cell if @attributes[:scope] wrap_as_element('th') else wrap_as_element('td') end end
# File lib/maruku/output/to_html.rb, line 519 def to_html_code source = self.raw_code code_lang = self.lang || self.attributes[:lang] || @doc.attributes[:code_lang] code_lang = 'xml' if code_lang == 'html' code_lang = 'css21' if code_lang == 'css' use_syntax = get_setting :html_use_syntax element = if use_syntax && code_lang begin unless $syntax_loaded require 'rubygems' require 'syntax' require 'syntax/convertors/html' $syntax_loaded = true end convertor = Syntax::Convertors::HTML.for_syntax code_lang # eliminate trailing newlines otherwise Syntax crashes source = source.sub(/\n*\z/, '') html = convertor.convert(source) html.gsub!(/\'|'/,''') # IE bug d = MaRuKu::HTMLFragment.new(html) highlighted = d.to_html.sub(/\A<pre>(.*)<\/pre>\z/, '\1') code = HTMLElement.new('code', { :class => code_lang }, highlighted) pre = xelem('pre') # add a class here, too, for compatibility with existing implementations pre['class'] = code_lang pre << code pre rescue LoadError => e maruku_error "Could not load package 'syntax'.\n" + "Please install it, for example using 'gem install syntax'." to_html_code_using_pre(source, code_lang) rescue => e maruku_error "Error while using the syntax library for code:\n#{source.inspect}" + "Lang is #{code_lang} object is: \n" + self.inspect + "\nException: #{e.class}: #{e.message}" tell_user("Using normal PRE because the syntax library did not work.") to_html_code_using_pre(source, code_lang) end else to_html_code_using_pre(source, code_lang) end color = get_setting(:code_background_color) if color != MaRuKu::Globals[:code_background_color] element['style'] = "background-color: #{color};" end add_ws element end
Attribute: code_background_color Scope: global, document, element Summary: Background color for code blocks. The format is either a named color (`green`, `red`) or a CSS color of the form `#ff00ff`. * for **HTML output**, the value is put straight in the `background-color` CSS property of the block. * for **LaTeX output**, if it is a named color, it must be a color accepted by the LaTeX `color` packages. If it is of the form `#ff00ff`, Maruku defines a color using the `\color[rgb]{r,g,b}` macro. For example, for `#0000ff`, the macro is called as: `\color[rgb]{0,0,1}`.
# File lib/maruku/output/to_html.rb, line 600 def to_html_code_using_pre(source, code_lang=nil) code = xelem('code') pre = xelem('pre') pre << code if get_setting(:code_show_spaces) # 187 = raquo # 160 = nbsp # 172 = not source = source.gsub(/\t/,'»' + ' ' * 3).gsub(/ /,'¬') end code << xtext(source) code_lang ||= self.attributes[:lang] if code_lang pre['class'] = code['class'] = code_lang end pre end
# File lib/maruku/output/to_html.rb, line 793 def to_html_definition children_to_html end
# File lib/maruku/output/to_html.rb, line 801 def to_html_definition_data add_ws wrap_as_element('dd') end
Definition lists ###
# File lib/maruku/output/to_html.rb, line 789 def to_html_definition_list add_ws wrap_as_element('dl') end
# File lib/maruku/output/to_html.rb, line 797 def to_html_definition_term add_ws wrap_as_element('dt') end
# File lib/maruku/ext/div.rb, line 120 def to_html_div add_ws wrap_as_element('div') end
# File lib/maruku/ext/math/to_html.rb, line 162 def to_html_divref unless hash = self.doc.refid2ref.values.find {|h| h.has_key?(self.refid)} maruku_error "Cannot find div #{self.refid.inspect}" return xtext("\\ref{#{self.refid}}") end ref= hash[self.refid] a = xelem('a') a['class'] = 'maruku-ref' a['href'] = "#" + self.refid a << xtext(ref.num.to_s) a end
Render to a complete HTML document (returns a string)
# File lib/maruku/output/to_html.rb, line 90 def to_html_document(context={}) doc = to_html_document_tree xml = doc.to_s Xhtml11_mathml2_svg11 + xml end
Render to a complete HTML document (returns an HTMLElement document tree)
# File lib/maruku/output/to_html.rb, line 164 def to_html_document_tree root = xelem('html') root['xmlns'] = 'http://www.w3.org/1999/xhtml' root['xmlns:svg'] = "http://www.w3.org/2000/svg" root['xml:lang'] = self.attributes[:lang] || 'en' root << xml_newline head = xelem('head') root << head #<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> me = xelem('meta') me['http-equiv'] = 'Content-type' me['content'] = 'application/xhtml+xml;charset=utf-8' head << me %w(description keywords author revised).each do |m| if value = self.attributes[m.to_sym] meta = xelem('meta') meta['name'] = m meta['content'] = value.to_s head << meta end end self.attributes.each do |k,v| if k.to_s =~ /\Ameta-(.*)\z/ meta = xelem('meta') meta['name'] = $1 meta['content'] = v.to_s head << meta end end # Create title element doc_title = self.attributes[:title] || self.attributes[:subject] || "" begin title_content = MaRuKu::HTMLFragment.new(doc_title).to_html rescue title_content = xtext(doc_title) end title = xelem('title') << title_content head << title add_css_to(head) root << xml_newline body = xelem('body') children_to_html.each do |e| body << e.to_s end # render footnotes unless @doc.footnotes_order.empty? body << render_footnotes end # When we are rendering a whole document, we add a signature # at the bottom. if get_setting(:maruku_signature) body << maruku_html_signature end root << body end
# File lib/maruku/output/to_html.rb, line 694 def to_html_email_address obfuscated = obfuscate(self.email) html_element('a', obfuscated, :href => "mailto:#{obfuscated}") end
# File lib/maruku/output/to_html.rb, line 439 def to_html_emphasis wrap_as_element('em') end
# File lib/maruku/output/to_html.rb, line 845 def to_html_entity entity_name = self.entity_name if entity = MaRuKu::Out::EntityTable.instance.entity(entity_name) entity_name = entity.html_num end if entity_name.kind_of? Fixnum # Convert numeric entities to unicode characters xtext([entity_name].pack('U*')) else "&#{entity_name};" end end
# File lib/maruku/ext/math/to_html.rb, line 149 def to_html_eqref unless eq = self.doc.eqid2eq[self.eqid] maruku_error "Cannot find equation #{self.eqid.inspect}" return xtext("(eq:#{self.eqid})") end a = xelem('a') a['class'] = 'maruku-eqref' a['href'] = "#eq:#{self.eqid}" a << xtext("(#{eq.num})") a end
# File lib/maruku/ext/math/to_html.rb, line 116 def to_html_equation mathml = get_setting(:html_math_output_mathml) && render_mathml(:equation, self.math) png = get_setting(:html_math_output_png) && render_png(:equation, self.math) div = xelem('div') div['class'] = 'maruku-equation' if mathml if self.label # then numerate span = xelem('span') span['class'] = 'maruku-eq-number' span << xtext("(#{self.num})") div << span div['id'] = "eq:#{self.label}" end mathml.add_class('maruku-mathml') div << mathml.to_html end if png img = adjust_png(png, false) div << img if self.label # then numerate span = xelem('span') span['class'] = 'maruku-eq-number' span << xtext("(#{self.num})") div << span div['id'] = "eq:#{self.label}" end end div end
# File lib/maruku/output/to_html.rb, line 763 def to_html_footnote_reference id = self.footnote_id # save the order of used footnotes order = @doc.footnotes_order # footnote has already been used return [] if order.include?(id) return [] unless @doc.footnotes[id] # take next number order << id num = order.index(id) + 1 sup = xelem('sup') sup['id'] = "#{get_setting(:doc_prefix)}fnref:#{num}" a = xelem('a') a << xtext(num.to_s) a['href'] = "\##{get_setting(:doc_prefix)}fn:#{num}" a['rel'] = 'footnote' sup << a end
# File lib/maruku/output/to_html.rb, line 833 def to_html_head_cell wrap_as_element('th') end
# File lib/maruku/output/to_html.rb, line 474 def to_html_header element_name = "h#{self.level}" h = wrap_as_element element_name if span = render_section_number h.children.unshift(span) end add_ws h end
# File lib/maruku/output/to_html.rb, line 319 def to_html_hrule xelem('hr') end
# File lib/maruku/output/to_html.rb, line 717 def to_html_im_image if self.url attrs = {} attrs['src'] = self.url.to_s attrs['alt'] = children_to_s attrs['title'] = self.title.to_s if self.title html_element('img', nil, attrs) else maruku_error "Image with no url: #{self.inspect}" tell_user "Could not create image without a source URL;" + " Using SPAN element as replacement." wrap_as_element('span') end end
# File lib/maruku/output/to_html.rb, line 669 def to_html_im_link if self.url a = {} a['href'] = self.url a['title'] = self.title if self.title wrap_as_element('a', a) else maruku_error "Could not find url in #{self.inspect}" tell_user "Not creating a link for ref_id = #{id.inspect}." wrap_as_element('span') end end
Images
# File lib/maruku/output/to_html.rb, line 701 def to_html_image a = {} id = self.ref_id if ref = @doc.refs[sanitize_ref_id(id)] || @doc.refs[sanitize_ref_id(children_to_s)] a['src'] = ref[:url].to_s a['alt'] = children_to_s a['title'] = ref[:title].to_s if ref[:title] html_element('img', nil, a) else maruku_error "Could not find id = #{id.inspect} for\n #{self.inspect}" tell_user "Could not create image with ref_id = #{id.inspect};" + " Using SPAN element as replacement." wrap_as_element('span') end end
# File lib/maruku/output/to_html.rb, line 643 def to_html_immediate_link text = self.url.gsub(/^mailto:/, '') # don't show mailto html_element('a', text, 'href' => self.url) end
# File lib/maruku/output/to_html.rb, line 622 def to_html_inline_code code_attrs = {} source = xtext(self.raw_code) color = get_setting(:code_background_color) if color != MaRuKu::Globals[:code_background_color] code_attrs['style'] = "background-color: #{color};" + (code_attrs['style'] || "") end html_element('code', source, code_attrs) end
# File lib/maruku/ext/math/to_html.rb, line 99 def to_html_inline_math mathml = get_setting(:html_math_output_mathml) && render_mathml(:inline, self.math) if mathml mathml.add_class('maruku-mathml') return mathml.to_html end png = get_setting(:html_math_output_png) && render_png(:inline, self.math) HTMLElement.new 'span', 'class' => 'maruku-inline' do # TODO: It seems weird that we output an empty span if there's no PNG if png adjust_png(png, true) end end end
# File lib/maruku/output/to_html.rb, line 427 def to_html_li add_ws wrap_as_element('li') end
# File lib/maruku/output/to_html.rb, line 323 def to_html_linebreak xelem('br') end
# File lib/maruku/output/to_html.rb, line 648 def to_html_link a = {} id = self.ref_id || children_to_s if ref = @doc.refs[sanitize_ref_id(id)] || @doc.refs[sanitize_ref_id(children_to_s)] a['href'] = ref[:url] if ref[:url] a['title'] = ref[:title] if ref[:title] else maruku_error "Could not find ref_id = #{id.inspect} for #{self.inspect}\n" + "Available refs are #{@doc.refs.keys.inspect}" tell_user "Not creating a link for ref_id = #{id.inspect}.\n" if (self.ref_id) return "[#{children_to_s}][#{id}]" else return "[#{children_to_s}]" end end wrap_as_element('a', a) end
# File lib/maruku/output/to_html.rb, line 423 def to_html_ol add_ws wrap_as_element('ol') end
# File lib/maruku/output/to_html.rb, line 419 def to_html_paragraph add_ws wrap_as_element('p') end
# File lib/maruku/output/to_html.rb, line 431 def to_html_quote add_ws wrap_as_element('blockquote') end
Attribute: filter_html Scope: document If true, raw HTML is discarded from the output.
# File lib/maruku/output/to_html.rb, line 740 def to_html_raw_html return [] if get_setting(:filter_html) return parsed_html.to_html if parsed_html # If there's no parsed HTML raw_html = self.raw_html # Creates red box with offending HTML tell_user "Wrapping bad html in a PRE with class 'markdown-html-error'\n" + raw_html.gsub(/^/, '|') pre = xelem('pre') pre['style'] = 'border: solid 3px red; background-color: pink' pre['class'] = 'markdown-html-error' pre << xtext("Maruku could not parse this XML/HTML: \n#{raw_html}") end
# File lib/maruku/output/to_html.rb, line 908 def to_html_ref_definition [] end
# File lib/maruku/output/to_html.rb, line 435 def to_html_strong wrap_as_element('strong') end
# File lib/maruku/output/to_html.rb, line 805 def to_html_table num_columns = self.align.size # The table data is passed as a multi-dimensional array # we just need to split the head from the body head, *rows = @children table = html_element('table') thead = xelem('thead') tr = xelem('tr') array_to_html(head).inject(tr, &:<<) thead << tr table << thead tbody = xelem('tbody') rows.each do |row| tr = xelem('tr') array_to_html(row).each_with_index do |x, i| x['style'] ="text-align: #{self.align[i].to_s};" tr << x end tbody << tr << xml_newline end table << tbody end
# File lib/maruku/output/to_html.rb, line 410 def to_html_ul if @attributes[:toc] # render toc @doc.toc.to_html else add_ws wrap_as_element('ul') end end
# File lib/maruku/output/to_html.rb, line 860 def to_html_xml_instr target = self.target || '' code = self.code || '' # A blank target is invalid XML. Just create a text node? if target.empty? xtext("<?#{code}?>") else "<?#{target} #{code}?>" end end
# File lib/maruku/output/to_html.rb, line 912 def to_latex_ref_definition [] end
renders children as html and wraps into an element of given name
Sets 'id' if meta is set
# File lib/maruku/output/to_html.rb, line 330 def wrap_as_element(name, attributes={}) html_element name, children_to_html, attributes end
Helper to create an element
# File lib/maruku/output/to_html.rb, line 103 def xelem(type) HTMLElement.new(type) end
# File lib/maruku/output/to_html.rb, line 107 def xml_newline "\n" end
Helper to create a text node
# File lib/maruku/output/to_html.rb, line 98 def xtext(text) MaRuKu::Out::HTML.escapeHTML(text) end
Run blahtex, return output
# File lib/maruku/ext/math/mathml_engines/blahtex.rb, line 82 def run_blahtex(tex, args) IO.popen(['blahtex', *args].join(' '), 'w+') do |blahtex| blahtex.write tex blahtex.close_write output = blahtex.read blahtex.close_read raise "Error running blahtex" unless $?.success? output end end