class Reloadlive::Render
Attributes
data[RW]
filename[RW]
title[RW]
Public Class Methods
new(filename, data)
click to toggle source
# File lib/reloadlive/render.rb, line 14 def initialize filename, data @filename = filename @data = data @codemap = {} @title = filename end
Public Instance Methods
check_cache(type, id)
click to toggle source
# File lib/reloadlive/render.rb, line 144 def check_cache(type, id) end
extract_code(data)
click to toggle source
# File lib/reloadlive/render.rb, line 49 def extract_code(data) data.gsub!(/^([ \t]*)(~~~+) ?([^\r\n]+)?\r?\n(.+?)\r?\n\1(~~~+)[ \t\r]*$/m) do m_indent = $1 m_start = $2 # ~~~ m_lang = $3 m_code = $4 m_end = $5 # ~~~ # start and finish tilde fence must be the same length return '' if m_start.length != m_end.length lang = m_lang ? m_lang.strip : nil id = Digest::SHA1.hexdigest("#{lang}.#{m_code}") cached = check_cache(:code, id) # extract lang from { .ruby } or { #stuff .ruby .indent } # see http://johnmacfarlane.net/pandoc/README.html#delimited-code-blocks if lang lang = lang.match(/\.([^}\s]+)/) lang = lang[1] unless lang.nil? end @codemap[id] = cached ? { :output => cached } : { :lang => lang, :code => m_code, :indent => m_indent } "#{m_indent}#{id}" # print the SHA1 ID with the proper indentation end data.gsub!(/^([ \t]*)``` ?([^\r\n]+)?\r?\n(.+?)\r?\n\1```[ \t]*\r?$/m) do lang = $2 ? $2.strip : nil id = Digest::SHA1.hexdigest("#{lang}.#{$3}") cached = check_cache(:code, id) @codemap[id] = cached ? { :output => cached } : { :lang => lang, :code => $3, :indent => $1 } "#{$1}#{id}" # print the SHA1 ID with the proper indentation end data end
extract_yaml(data)
click to toggle source
# File lib/reloadlive/render.rb, line 39 def extract_yaml(data) if data =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m @title = YAML.load($1)['title'] data = $' end data rescue => e puts "YAML Exception reading #{@filename}: #{e.message}" end
formatted_data(encoding=nil)
click to toggle source
# File lib/reloadlive/render.rb, line 21 def formatted_data encoding=nil data = @data.dup data = extract_yaml data data = extract_code data begin data = GitHub::Markup.render(@filename, data) rescue => e puts "Exception rendering #{@filename}: #{e.message}" end data = process_code(data, encoding) if data == @data p_lexer = Pygments::Lexer.find_by_extname(File.extname(@filename)) lexer = p_lexer ? p_lexer.aliases.first : nil data = Pygments.highlight(data, :lexer => lexer, :options => {:encoding => encoding.to_s, :startinline => true}) end data end
process_code(data, encoding = nil)
click to toggle source
# File lib/reloadlive/render.rb, line 91 def process_code(data, encoding = nil) return data if data.nil? || data.size.zero? || @codemap.size.zero? blocks = [] @codemap.each do |id, spec| next if spec[:output] # cached code = spec[:code] remove_leading_space(code, /^#{spec[:indent]}/m) remove_leading_space(code, /^( |\t)/m) blocks << [spec[:lang], code] end highlighted = [] blocks.each do |lang, code| encoding ||= 'utf-8' begin # must set startinline to true for php to be highlighted without <? # http://pygments.org/docs/lexers/ hl_code = Pygments.highlight(code, :lexer => lang, :options => {:encoding => encoding.to_s, :startinline => true}) rescue hl_code = code end highlighted << hl_code end @codemap.each do |id, spec| body = spec[:output] || begin if (body = highlighted.shift.to_s).size > 0 update_cache(:code, id, body) body else "<pre><code>#{CGI.escapeHTML(spec[:code])}</code></pre>" end end data.gsub!(id) do body end end data end
remove_leading_space(code, regex)
click to toggle source
# File lib/reloadlive/render.rb, line 136 def remove_leading_space(code, regex) if code.lines.all? { |line| line =~ /\A\r?\n\Z/ || line =~ regex } code.gsub!(regex) do '' end end end
update_cache(type, id, data)
click to toggle source
# File lib/reloadlive/render.rb, line 147 def update_cache(type, id, data) end