143 lines
3.6 KiB
Ruby
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\[/, '<![CDATA[').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
|
|
|