blob: 7fe56bb6fcbbd7ddaacea46ca6b1e49975137299 [file] [log] [blame]
require 'rouge'
require 'open-uri'
require 'uri'
class RemoteSnippet < Liquid::Tag
def initialize(tag_name, text, tokens)
super
args = text.strip.split(' ', 3)
@path = args[0]
if args.length() > 2
@type = args[1]
@range = args[2]
elsif args.length() > 1
@type = args[1]
@range = "all"
else
@type = "text"
@range = "all"
end
end
def render(context)
title = context.registers[:site].config['title']
prefix = context.registers[:site].config['gitbox_url']
url = "#{prefix};a=blob_plain;hb=HEAD;f=#{@path}"
pretty_url = "#{prefix};a=blob;hb=HEAD;f=#{@path}"
content = ""
if @range == "all"
URI.open(url) {|f| content = f.read }
else
rangenums = @range.split(",", 2)
first = 0
second = 0
if rangenums.length() == 2
first = Integer(rangenums[0])
second = Integer(rangenums[1]) - first
URI.open(url) {|f| content = f.each_line.drop(first).take(second).join() }
else
first = Integer(rangenums[0])
URI.open(url) {|f| content = f.each_line.drop(first).join() }
end
end
snippet_type = "snippet"
if @type == "direct"
content = Kramdown::Document.new(content).to_html
snippet_type = "page"
else
content = content.force_encoding("utf-8")
formatter = Rouge::Formatters::HTMLLegacy.new
lexer = Rouge::Lexer.find_fancy(@type, content)
content = formatter.format(lexer.lex(content))
end
#content = CGI::escapeHTML(content)
return """
#{content}
<p class=\"snippet_footer\">This #{snippet_type} was generated by #{title}'s <strong>source tree docs</strong>:
<a href=\"#{pretty_url}\">#{@path}</a>
</p>
"""
end
end
Liquid::Template.register_tag('remote_snippet', RemoteSnippet)