diff options
-rw-r--r-- | .themes/classic/source/_layouts/default.html | 2 | ||||
-rw-r--r-- | plugins/backtick_code_block.rb | 42 | ||||
-rw-r--r-- | plugins/code_block.rb | 11 | ||||
-rw-r--r-- | plugins/include_code.rb | 7 | ||||
-rw-r--r-- | plugins/octopress_filters.rb | 81 | ||||
-rw-r--r-- | plugins/raw.rb | 16 | ||||
-rw-r--r-- | plugins/render_partial.rb | 3 |
7 files changed, 107 insertions, 55 deletions
diff --git a/.themes/classic/source/_layouts/default.html b/.themes/classic/source/_layouts/default.html index 5523ac1b..629468d3 100644 --- a/.themes/classic/source/_layouts/default.html +++ b/.themes/classic/source/_layouts/default.html @@ -5,7 +5,7 @@ <nav role=navigation>{% include navigation.html %}</nav> <div id="main"> <div id="content"> - {{ content | expand_urls: root_url | backtick_codeblock | smart_quotes }} + {{ content | expand_urls: root_url }} </div> </div> <footer>{% include footer.html %}</footer> diff --git a/plugins/backtick_code_block.rb b/plugins/backtick_code_block.rb new file mode 100644 index 00000000..c7a83435 --- /dev/null +++ b/plugins/backtick_code_block.rb @@ -0,0 +1,42 @@ +require './plugins/pygments_code' + +module BacktickCodeBlock + include HighlightCode + AllOptions = /([^\s]+)\s+(.+?)(https?:\/\/\S+)\s*(.+)?/i + LangCaption = /([^\s]+)\s*(.+)?/i + def render_code_block(input) + @caption = nil + @lang = nil + @url = nil + @title = nil + input.gsub /^`{3} *([^\n]+)?\n(.+?)\n`{3}/m do + options = $1 + str = $2 + + if options =~ AllOptions + @lang = $1 + @caption = "<figcaption><span>#{$2}</span><a href='#{$3}'>#{$4 || 'link'}</a></figcaption>" + elsif options =~ LangCaption + @lang = $1 + @caption = "<figcaption><span>#{$2}</span></figcaption>" + end + + if str.match(/\A {4}/) + str = str.gsub /^ {4}/, '' + end + if @lang.nil? || @lang == 'plain' + code = tableize_code(str.gsub('<','<').gsub('>','>')) + "<figure role=code>#{@caption}#{code}</figure>" + else + if @lang.include? "-raw" + raw = "``` #{@lang.sub('-raw', '')}\n" + raw += str + raw += "\n```\n" + else + code = highlight(str, @lang) + "<figure role=code>#{@caption}#{code}</figure>" + end + end + end + end +end diff --git a/plugins/code_block.rb b/plugins/code_block.rb index 9c971bf5..00b0b438 100644 --- a/plugins/code_block.rb +++ b/plugins/code_block.rb @@ -42,11 +42,13 @@ # </figure> # require './plugins/pygments_code' +require './plugins/raw' module Jekyll class CodeBlock < Liquid::Block include HighlightCode + include TemplateWrapper CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/)(\S+)\s+(.+)/i CaptionUrl = /(\S[\S\s]*)\s+(https?:\/\/)(\S+)/i Caption = /(\S[\S\s]*)/ @@ -78,14 +80,15 @@ module Jekyll def render(context) output = super code = super.join - source = "<div><figure role=code>" + source = "<figure role=code>" source += @caption if @caption - source = context['pygments_prefix'] + source if context['pygments_prefix'] if @filetype - source += " #{highlight(code, @filetype)}</figure></div>" + source += " #{highlight(code, @filetype)}</figure>" else - source += "#{tableize_code(code.lstrip.rstrip.gsub(/</,'<'))}</figure></div>" + source += "#{tableize_code(code.lstrip.rstrip.gsub(/</,'<'))}</figure>" end + source = safe_wrap(source) + source = context['pygments_prefix'] + source if context['pygments_prefix'] source = source + context['pygments_suffix'] if context['pygments_suffix'] end end diff --git a/plugins/include_code.rb b/plugins/include_code.rb index 70d5f138..80951cb5 100644 --- a/plugins/include_code.rb +++ b/plugins/include_code.rb @@ -21,12 +21,14 @@ # require './plugins/pygments_code' +require './plugins/raw' require 'pathname' module Jekyll class IncludeCodeTag < Liquid::Tag include HighlightCode + include TemplateWrapper def initialize(tag_name, markup, tokens) @title = nil @file = nil @@ -59,8 +61,9 @@ module Jekyll @filetype = file.extname.sub('.','') if @filetype.nil? title = @title ? "#{@title} (#{file.basename})" : file.basename url = "/#{code_dir}/#{@file}" - source = "<div><figure role=code><figcaption><span>#{title}</span> <a href='#{url}'>download</a></figcaption>\n" - source += " #{highlight(code, @filetype)}</figure></div>" + source = "<figure role=code><figcaption><span>#{title}</span> <a href='#{url}'>download</a></figcaption>\n" + source += " #{highlight(code, @filetype)}</figure>" + safe_wrap(source) end end end diff --git a/plugins/octopress_filters.rb b/plugins/octopress_filters.rb index a63c43ab..1a959892 100644 --- a/plugins/octopress_filters.rb +++ b/plugins/octopress_filters.rb @@ -1,8 +1,38 @@ #custom filters for Octopress -require './plugins/pygments_code' +require './plugins/backtick_code_block' +require './plugins/post_filters' +require './plugins/raw' +require 'rubypants' module OctopressFilters - include HighlightCode + include BacktickCodeBlock + include TemplateWrapper + def pre_filter(input) + input = render_code_block(input) + input.gsub /(<figure.+?>.+?<\/figure>)/m do + safe_wrap($1) + end + end + def post_filter(input) + input = unwrap(input) + RubyPants.new(input).to_html + end +end + +module Jekyll + class ContentFilters < PostFilter + include OctopressFilters + def pre_render(post) + post.content = pre_filter(post.content) + end + def post_render(post) + post.content = post_filter(post.content) + end + end +end + + +module OctopressLiquidFilters # Used on the blog index to split posts on the <!--more--> marker def excerpt(input) if input.index(/<!--\s*more\s*-->/i) @@ -26,45 +56,6 @@ module OctopressFilters end end - # for Github style codeblocks eg. - # ``` ruby - # code snippet - # ``` - def backtick_codeblock(input) - code = nil - # Markdown support - input = input.gsub /<p>`{3}\s*(\w+)?<\/p>\s*<pre><code>\s*(.+?)\s*<\/code><\/pre>\s*<p>`{3}<\/p>/m do - lang = $1 - if lang != '' - str = $2.gsub('<','<').gsub('>','>').gsub('&','&') - code = highlight(str, lang) - "<figure role=code>#{code}</figure>" - else - code = tableize_code($2) - "<figure role=code>#{code}</figure>" - end - end - - # Textile warning - input = input.gsub /<p>`{3}\s*(\w+)?<br\s*\/>\n(.+?)`{3}<\/p>/m do - lang = $1 - "<pre><code>Back tick code blocks are not supported for Textile.\nTry HTML or Markdown instead or use the codeblock tag.\n\n{% codeblock #{lang} %}\nYour code snippet\n{% endcodeblock %}</code></pre>" - end - - # Regular HTML support - input.gsub /^`{3}\s*(\w+)?\n(.+?)\n`{3}/m do - lang = $1 - str = $2.gsub(/^\s{4}/, '') - if lang != '' - code = highlight(str, lang) - "<figure role=code>#{code}</figure>" - else - code = tableize_code($2.gsub('<','<').gsub('>','>')) - "<figure role=code>#{code}</figure>" - end - end - end - # Replaces relative urls with full urls def expand_urls(input, url='') url ||= '/' @@ -88,12 +79,6 @@ module OctopressFilters end end - # replaces primes with smartquotes using RubyPants - def smart_quotes(input) - require 'rubypants' - RubyPants.new(input).to_html - end - # Returns a title cased string based on John Gruber's title case http://daringfireball.net/2008/08/title_case_update def titlecase(input) input.titlecase @@ -127,5 +112,5 @@ module OctopressFilters end end end -Liquid::Template.register_filter OctopressFilters +Liquid::Template.register_filter OctopressLiquidFilters diff --git a/plugins/raw.rb b/plugins/raw.rb index 2deb5d10..4b002625 100644 --- a/plugins/raw.rb +++ b/plugins/raw.rb @@ -1,3 +1,19 @@ +# Author: Brandon Mathis +# Description: Provides plugins with a method for wrapping and unwrapping input to prevent Markdown and Textile from parsing it. +# Purpose: This is useful for preventing Markdown and Textile from being too aggressive and incorrectly parsing in-line HTML. +module TemplateWrapper + # Wrap input with a <div> + def safe_wrap(input) + "<div class='bogus-wrapper'><notextile>#{input}</notextile></div>" + end + # This must be applied after the + def unwrap(input) + input.gsub /<div class='bogus-wrapper'><notextile>(.+?)<\/notextile><\/div>/m do + $1 + end + end +end + # Author: phaer, https://github.com/phaer # Source: https://gist.github.com/1020852 # Description: Raw tag for jekyll. Keeps liquid from parsing text betweeen {% raw %} and {% endraw %} diff --git a/plugins/render_partial.rb b/plugins/render_partial.rb index 9f665644..b6ebfe8b 100644 --- a/plugins/render_partial.rb +++ b/plugins/render_partial.rb @@ -22,10 +22,12 @@ # require 'pathname' +require './plugins/octopress_filters' module Jekyll class RenderPartialTag < Liquid::Tag + include OctopressFilters def initialize(tag_name, markup, tokens) @file = nil @raw = false @@ -50,6 +52,7 @@ module Jekyll if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m contents = $1.lstrip end + contents = pre_filter(contents) if @raw contents else |