#custom filters for Octopress require './plugins/backtick_code_block' require 'octopress-hooks' require 'jekyll-sitemap' require 'octopress-date-format' require './plugins/raw' require 'rubypants' module OctopressFilters def self.pre_filter(page) if page.ext.match('html|textile|markdown|md|haml|slim|xml') input = BacktickCodeBlock::render_code_block(page.content) page.content = input.gsub /(.+?<\/figure>)/m do TemplateWrapper::safe_wrap($1) end end end def self.post_filter(page) if page.ext.match('html|textile|markdown|md|haml|slim|xml') page.output = TemplateWrapper::unwrap(page.output) end page.output = RubyPants.new(page.output).to_html end class PageFilters < Octopress::Hooks::Page def pre_render(page) OctopressFilters::pre_filter(page) end def post_render(page) OctopressFilters::post_filter(page) end end class PostFilters < Octopress::Hooks::Post def pre_render(post) OctopressFilters::pre_filter(post) end def post_render(post) OctopressFilters::post_filter(post) end end end module OctopressLiquidFilters # Used on the blog index to split posts on the marker def excerpt(input) if input.index(//i) input.split(//i)[0] else input end end # Checks for excerpts (helpful for template conditionals) def has_excerpt(input) input =~ //i ? true : false end # Summary is used on the Archive pages to return the first block of content from a post. def summary(input) if input.index(/\n\n/) input.split(/\n\n/)[0] else input end end # Extracts raw content DIV from template, used for page description as {{ content }} # contains complete sub-template code on main page level def raw_content(input) /
(?[\s\S]*?)<\/div>\s*<(footer|\/article)>/ =~ input return (content.nil?) ? input : content end # Escapes CDATA sections in post content def cdata_escape(input) input.gsub(//, ']]>') end # Replaces relative urls with full urls def expand_urls(input, url='') url ||= '/' input.gsub /(\s+(href|src|poster)\s*=\s*["|']{1})(\/[^\/>]{1}[^\"'>]*)/ do $1+url+$3 end end # Improved version of Liquid's truncate: # - Doesn't cut in the middle of a word. # - Uses typographically correct ellipsis (…) insted of '...' def truncate(input, length) if input.length > length && input[0..(length-1)] =~ /(.+)\b.+$/im $1.strip + ' …' else input end end # Improved version of Liquid's truncatewords: # - Uses typographically correct ellipsis (…) insted of '...' def truncatewords(input, length) truncate = input.split(' ') if truncate.length > length truncate[0..length-1].join(' ').strip + ' …' else input end end # Condenses multiple spaces and tabs into a single space def condense_spaces(input) input.gsub(/\s{2,}/, ' ') end # Removes trailing forward slash from a string for easily appending url segments def strip_slash(input) if input =~ /(.+)\/$|^\/$/ input = $1 end input end # Returns a url without the protocol (http://) def shorthand_url(input) input.gsub /(https?:\/\/)(\S+)/ do $2 end 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 end end Liquid::Template.register_filter OctopressLiquidFilters