Last active
October 13, 2015 03:47
-
-
Save melborne/4134497 to your computer and use it in GitHub Desktop.
Liquid filters for maliq gem to generate xhtml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# A Liquid tag for Maliq that enable adding CSS signatures. | |
# by: Kyo Endo | |
# Source URL: https://gist.github.com/ | |
# | |
# Example usage: | |
# text = <<-EOS | |
# {% csssig h2 id='hello' class='header' %} | |
# ##Hello | |
# this is test. | |
# {% endcsssig %} | |
# | |
# => <h2 id="hello" class="header">Hello</h2> | |
# | |
# <p>this is test.</p> | |
# | |
require "liquid" | |
require "rdiscount" | |
require "nokogiri" | |
class CSSSignature < Liquid::Block | |
def initialize(tag_name, text, token) | |
super | |
@text = text | |
end | |
def render(context) | |
tag, *signs = @text.split | |
_SIG_REG_ = /(\w+)\s*=\s*(?:["']([\w ]*)?["']|(\w+))/ | |
signs = signs.join(' ').scan(_SIG_REG_).map(&:compact) | |
html = Nokogiri::HTML.fragment RDiscount.new(super).to_html | |
if target = html.at_css(tag) | |
signs.each { |attr, val| target[attr] = val } | |
end | |
html.to_html | |
end | |
end | |
Liquid::Template.register_tag('csssig', CSSSignature) | |
if __FILE__ == $0 | |
text = <<-EOS | |
{% csssig h2 id='hello' class='header hi' %} | |
##Hello | |
this is test. | |
{% endcsssig %} | |
EOS | |
puts Liquid::Template.parse(text).render | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# *** ATTENSION *** | |
# This file is NOT for Jekyll. It's modified for adapting Maliq(https://github.com/melborne/maliq) gem | |
# which is a EPUB generator. | |
# 'gem install pygments.rb' required. | |
# By: kyoendo(a.k.a melborne) 2012 | |
# Source URL: https://gist.github.com/4134497#file_gist_tag.rb | |
# ------------------------------------ | |
# A Liquid tag for Jekyll sites that allows embedding Gists and showing code for non-JavaScript enabled browsers and readers. | |
# by: Brandon Tilly | |
# Source URL: https://gist.github.com/1027674 | |
# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html | |
# | |
# Example usage: {% gist 1027674 gist_tag.rb %} //embeds a gist for this plugin | |
require 'cgi' | |
require 'digest/md5' | |
require 'net/https' | |
require 'uri' | |
module Jekyll | |
class GistTag < Liquid::Tag | |
def initialize(tag_name, text, token) | |
super | |
@text = text | |
@cache_disabled = false | |
@cache_folder = File.expand_path "../.gist-cache", File.dirname(__FILE__) | |
FileUtils.mkdir_p @cache_folder | |
end | |
def render(context) | |
if parts = @text.match(/([\d]*) (.*)/) | |
gist, file = parts[1].strip, parts[2].strip | |
script_url = script_url_for gist, file | |
code = get_cached_gist(gist, file) || get_gist_from_web(gist, file) | |
html_output_for script_url, code | |
else | |
"" | |
end | |
end | |
def html_output_for(script_url, code) | |
code = CGI.escapeHTML code | |
<<-HTML | |
<div><script src='#{script_url}'></script> | |
<noscript><pre><code>#{code}</code></pre></noscript></div> | |
HTML | |
end | |
def script_url_for(gist_id, filename) | |
"https://gist.github.com/#{gist_id}.js?file=#{filename}" | |
end | |
def get_gist_url_for(gist, file) | |
"https://raw.github.com/gist/#{gist}/#{file}" | |
end | |
def cache(gist, file, data) | |
cache_file = get_cache_file_for gist, file | |
File.open(cache_file, "w") do |io| | |
io.write data | |
end | |
end | |
def get_cached_gist(gist, file) | |
return nil if @cache_disabled | |
cache_file = get_cache_file_for gist, file | |
File.read cache_file if File.exist? cache_file | |
end | |
def get_cache_file_for(gist, file) | |
bad_chars = /[^a-zA-Z0-9\-_.]/ | |
gist = gist.gsub bad_chars, '' | |
file = file.gsub bad_chars, '' | |
md5 = Digest::MD5.hexdigest "#{gist}-#{file}" | |
File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache" | |
end | |
def get_gist_from_web(gist, file) | |
gist_url = get_gist_url_for gist, file | |
raw_uri = URI.parse gist_url | |
proxy = ENV['http_proxy'] | |
if proxy | |
proxy_uri = URI.parse(proxy) | |
https = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port).new raw_uri.host, raw_uri.port | |
else | |
https = Net::HTTP.new raw_uri.host, raw_uri.port | |
end | |
https.use_ssl = true | |
https.verify_mode = OpenSSL::SSL::VERIFY_NONE | |
request = Net::HTTP::Get.new raw_uri.request_uri | |
data = https.request request | |
data = data.body | |
cache gist, file, data unless @cache_disabled | |
data | |
end | |
end | |
class GistTagNoCache < GistTag | |
def initialize(tag_name, text, token) | |
super | |
@cache_disabled = true | |
end | |
end | |
end | |
# Liquid::Template.register_tag('gist', Jekyll::GistTag) | |
# Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache) | |
# | |
# Followings are added for Maliq gem. | |
# | |
require "pygments" | |
class GistTagEpub < Jekyll::GistTag | |
def render(context) | |
if parts = @text.match(/([\d]*) (.*)/) | |
gist, file = parts[1].strip, parts[2].strip | |
code = get_cached_gist(gist, file) || get_gist_from_web(gist, file) | |
render_pygments(context, code, file) | |
else | |
"" | |
end | |
end | |
def render_pygments(context, code, file) | |
opts = { encoding: 'utf-8' } | |
ext = file[/\.[\w\d]+?$/] | |
lang = detect_lang(ext) | |
output = Pygments.highlight(code, :lexer => lang, :options => opts) | |
output = wrap_with_code_tags(output, lang) | |
output = context["pygments_prefix"] + output if context["pygments_prefix"] | |
output = output + context["pygments_suffix"] if context["pygments_suffix"] | |
output | |
end | |
def detect_lang(ext) | |
Pygments.lexers | |
.detect { |lang, attrs| attrs[:filenames].include? "*#{ext}" } | |
.first.downcase | |
end | |
def wrap_with_code_tags(code, lang) | |
code = code.sub(/<pre>/,'<pre><code class="' + lang + '">') | |
code = code.sub(/<\/pre>/,"</code></pre>") | |
end | |
end | |
Liquid::Template.register_tag('gist', GistTagEpub) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ------------------------------------ | |
# *** ATTENSION *** | |
# This file is NOT for Jekyll. It's modified for adapting Maliq(https://github.com/melborne/maliq) gem | |
# which is a EPUB generator. | |
# 'gem install pygments.rb' required. | |
# The original is from Jekyll 0.11.2(https://github.com/mojombo/jekyll/blob/master/lib/jekyll/tags/highlight.rb) | |
# By: kyoendo(a.k.a melborne) 2012 | |
# Source URL: https://gist.github.com/4134497#file_highlight.rb | |
# ------------------------------------ | |
# | |
module Jekyll | |
class HighlightBlock < Liquid::Block | |
include Liquid::StandardFilters | |
# We need a language, but the linenos argument is optional. | |
SYNTAX = /(\w+)\s?([\w\s=]+)*/ | |
def initialize(tag_name, markup, tokens) | |
super | |
if markup =~ SYNTAX | |
@lang = $1 | |
if defined? $2 | |
tmp_options = {} | |
$2.split.each do |opt| | |
key, value = opt.split('=') | |
if value.nil? | |
if key == 'linenos' | |
value = 'inline' | |
else | |
value = true | |
end | |
end | |
tmp_options[key] = value | |
end | |
tmp_options = tmp_options.to_a.collect { |opt| opt.join('=') } | |
# additional options to pass to Albino | |
@options = { 'O' => tmp_options.join(',') } | |
else | |
@options = {} | |
end | |
else | |
raise SyntaxError.new("Syntax Error in 'highlight' - Valid syntax: highlight <lang> [linenos]") | |
end | |
end | |
def render(context) | |
if context.registers[:site].pygments | |
render_pygments(context, super) | |
else | |
render_codehighlighter(context, super) | |
end | |
end | |
def render_pygments(context, code) | |
output = add_code_tags(Albino.new(code, @lang).to_s(@options), @lang) | |
output = context["pygments_prefix"] + output if context["pygments_prefix"] | |
output = output + context["pygments_suffix"] if context["pygments_suffix"] | |
output | |
end | |
def render_codehighlighter(context, code) | |
#The div is required because RDiscount blows ass | |
<<-HTML | |
<div> | |
<pre><code class='#{@lang}'>#{h(code).strip}</code></pre> | |
</div> | |
HTML | |
end | |
def add_code_tags(code, lang) | |
# Add nested <code> tags to code blocks | |
code = code.sub(/<pre>/,'<pre><code class="' + lang + '">') | |
code = code.sub(/<\/pre>/,"</code></pre>") | |
end | |
end | |
end | |
# | |
# Followings are added for Maliq gem. | |
# | |
require 'pygments' | |
class Jekyll::HighlightBlock | |
def render(context) | |
render_pygments(context, super) | |
end | |
def render_pygments(context, code) | |
@options[:encoding] = 'utf-8' | |
output = add_code_tags(Pygments.highlight(code, :lexer => @lang, :options => @options), @lang) | |
output = context["pygments_prefix"] + output if context["pygments_prefix"] | |
output = output + context["pygments_suffix"] if context["pygments_suffix"] | |
output | |
end | |
end | |
# End of code for Mdpub | |
Liquid::Template.register_tag('highlight', Jekyll::HighlightBlock) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
code { white-space: pre-wrap; } | |
.highlight { | |
background-color: #eeeeff; | |
/*margin: 5px;*/ | |
padding: 0 2px; | |
border-radius: 5px; | |
font-size: 80%; | |
} | |
/*.highlight { background: #ffffff; }*/ | |
.highlight .c { color: #999988; font-style: italic } /* Comment */ | |
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ | |
.highlight .k { font-weight: normal } /* Keyword */ | |
.highlight .o { font-weight: normal } /* Operator */ | |
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ | |
.highlight .cp { color: #999999; font-weight: normal } /* Comment.Preproc */ | |
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ | |
.highlight .cs { color: #999999; font-weight: normal; font-style: italic } /* Comment.Special */ | |
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ | |
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ | |
.highlight .ge { font-style: italic } /* Generic.Emph */ | |
.highlight .gr { color: #aa0000 } /* Generic.Error */ | |
.highlight .gh { color: #999999 } /* Generic.Heading */ | |
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ | |
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ | |
.highlight .go { color: #888888 } /* Generic.Output */ | |
.highlight .gp { color: #555555 } /* Generic.Prompt */ | |
.highlight .gs { font-weight: normal } /* Generic.Strong */ | |
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ | |
.highlight .gt { color: #aa0000 } /* Generic.Traceback */ | |
.highlight .kc { font-weight: normal } /* Keyword.Constant */ | |
.highlight .kd { font-weight: normal } /* Keyword.Declaration */ | |
.highlight .kp { font-weight: normal } /* Keyword.Pseudo */ | |
.highlight .kr { font-weight: normal } /* Keyword.Reserved */ | |
.highlight .kt { color: #445588; font-weight: normal } /* Keyword.Type */ | |
.highlight .m { color: #009999 } /* Literal.Number */ | |
.highlight .s { color: #d14 } /* Literal.String */ | |
.highlight .na { color: #008080 } /* Name.Attribute */ | |
.highlight .nb { color: #0086B3 } /* Name.Builtin */ | |
.highlight .nc { color: #445588; font-weight: normal } /* Name.Class */ | |
.highlight .no { color: #008080 } /* Name.Constant */ | |
.highlight .ni { color: #800080 } /* Name.Entity */ | |
.highlight .ne { color: #990000; font-weight: normal } /* Name.Exception */ | |
.highlight .nf { color: #990000; font-weight: normal } /* Name.Function */ | |
.highlight .nn { color: #555555 } /* Name.Namespace */ | |
.highlight .nt { color: #000080 } /* Name.Tag */ | |
.highlight .nv { color: #008080 } /* Name.Variable */ | |
.highlight .ow { font-weight: normal } /* Operator.Word */ | |
.highlight .w { color: #bbbbbb } /* Text.Whitespace */ | |
.highlight .mf { color: #009999 } /* Literal.Number.Float */ | |
.highlight .mh { color: #009999 } /* Literal.Number.Hex */ | |
.highlight .mi { color: #009999 } /* Literal.Number.Integer */ | |
.highlight .mo { color: #009999 } /* Literal.Number.Oct */ | |
.highlight .sb { color: #d14 } /* Literal.String.Backtick */ | |
.highlight .sc { color: #d14 } /* Literal.String.Char */ | |
.highlight .sd { color: #d14 } /* Literal.String.Doc */ | |
.highlight .s2 { color: #d14 } /* Literal.String.Double */ | |
.highlight .se { color: #d14 } /* Literal.String.Escape */ | |
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ | |
.highlight .si { color: #d14 } /* Literal.String.Interpol */ | |
.highlight .sx { color: #d14 } /* Literal.String.Other */ | |
.highlight .sr { color: #009926 } /* Literal.String.Regex */ | |
.highlight .s1 { color: #d14 } /* Literal.String.Single */ | |
.highlight .ss { color: #990073 } /* Literal.String.Symbol */ | |
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ | |
.highlight .vc { color: #008080 } /* Name.Variable.Class */ | |
.highlight .vg { color: #008080 } /* Name.Variable.Global */ | |
.highlight .vi { color: #008080 } /* Name.Variable.Instance */ | |
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment