blog/plugins/octopress_filters.rb

143 lines
3.6 KiB
Ruby

#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.+?>.+?<\/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 <!--more--> marker
def excerpt(input)
if input.index(/<!--\s*more\s*-->/i)
input.split(/<!--\s*more\s*-->/i)[0]
else
input
end
end
# Checks for excerpts (helpful for template conditionals)
def has_excerpt(input)
input =~ /<!--\s*more\s*-->/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)
/<div class="entry-content">(?<content>[\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(/<!\[CDATA\[/, '&lt;![CDATA[').gsub(/\]\]>/, ']]&gt;')
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 + ' &hellip;'
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 + ' &hellip;'
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