aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plugins/backtick_code_block.rb42
-rw-r--r--plugins/blockquote.rb82
-rw-r--r--plugins/category_generator.rb193
-rw-r--r--plugins/code_block.rb92
-rw-r--r--plugins/config_tag.rb44
-rw-r--r--plugins/gist_tag.rb130
-rw-r--r--plugins/haml.rb24
-rw-r--r--plugins/image_tag.rb50
-rw-r--r--plugins/include_array.rb58
-rw-r--r--plugins/include_code.rb71
-rw-r--r--plugins/jsfiddle.rb40
-rw-r--r--plugins/octopress_filters.rb142
-rw-r--r--plugins/pullquote.rb45
-rw-r--r--plugins/pygments_code.rb45
-rw-r--r--plugins/raw.rb40
-rw-r--r--plugins/render_partial.rb69
-rw-r--r--plugins/rubypants.rb489
-rw-r--r--plugins/titlecase.rb36
-rw-r--r--plugins/video_tag.rb56
19 files changed, 0 insertions, 1748 deletions
diff --git a/plugins/backtick_code_block.rb b/plugins/backtick_code_block.rb
deleted file mode 100644
index ae4a0472..00000000
--- a/plugins/backtick_code_block.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-require './plugins/pygments_code'
-
-module BacktickCodeBlock
- AllOptions = /([^\s]+)\s+(.+?)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i
- LangCaption = /([^\s]+)\s*(.+)?/i
- def self.render_code_block(input)
- @options = nil
- @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}|\t)/)
- str = str.gsub(/^( {4}|\t)/, '')
- end
- if @lang.nil? || @lang == 'plain'
- code = HighlightCode::tableize_code(str.gsub('<','&lt;').gsub('>','&gt;'))
- "<figure class='code'>#{@caption}#{code}</figure>"
- else
- if @lang.include? "-raw"
- raw = "``` #{@options.sub('-raw', '')}\n"
- raw += str
- raw += "\n```\n"
- else
- code = HighlightCode::highlight(str, @lang)
- "<figure class='code'>#{@caption}#{code}</figure>"
- end
- end
- end
- end
-end
diff --git a/plugins/blockquote.rb b/plugins/blockquote.rb
deleted file mode 100644
index ebdc0e89..00000000
--- a/plugins/blockquote.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# Author: Brandon Mathis
-# A full rewrite based on the work of: Josediaz Gonzalez - https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/blockquote.rb
-#
-# Outputs a string with a given attribution as a quote
-#
-# {% blockquote Bobby Willis http://google.com/search?q=pants the search for bobby's pants %}
-# Wheeee!
-# {% endblockquote %}
-# ...
-# <blockquote>
-# <p>Wheeee!</p>
-# <footer>
-# <strong>Bobby Willis</strong><cite><a href="http://google.com/search?q=pants">The Search For Bobby's Pants</a>
-# </blockquote>
-#
-require './plugins/titlecase.rb'
-
-module Jekyll
-
- class Blockquote < Liquid::Block
- FullCiteWithTitle = /(\S.*)\s+(https?:\/\/)(\S+)\s+(.+)/i
- FullCite = /(\S.*)\s+(https?:\/\/)(\S+)/i
- AuthorTitle = /([^,]+),([^,]+)/
- Author = /(.+)/
-
- def initialize(tag_name, markup, tokens)
- @by = nil
- @source = nil
- @title = nil
- if markup =~ FullCiteWithTitle
- @by = $1
- @source = $2 + $3
- @title = $4.titlecase.strip
- elsif markup =~ FullCite
- @by = $1
- @source = $2 + $3
- elsif markup =~ AuthorTitle
- @by = $1
- @title = $2.titlecase.strip
- elsif markup =~ Author
- @by = $1
- end
- super
- end
-
- def render(context)
- quote = paragraphize(super)
- author = "<strong>#{@by.strip}</strong>" if @by
- if @source
- url = @source.match(/https?:\/\/(.+)/)[1].split('/')
- parts = []
- url.each do |part|
- if (parts + [part]).join('/').length < 32
- parts << part
- end
- end
- source = parts.join('/')
- source << '/&hellip;' unless source == @source
- end
- if !@source.nil?
- cite = " <cite><a href='#{@source}'>#{(@title || source)}</a></cite>"
- elsif !@title.nil?
- cite = " <cite>#{@title}</cite>"
- end
- blockquote = if @by.nil?
- quote
- elsif cite
- "#{quote}<footer>#{author + cite}</footer>"
- else
- "#{quote}<footer>#{author}</footer>"
- end
- "<blockquote>#{blockquote}</blockquote>"
- end
-
- def paragraphize(input)
- "<p>#{input.lstrip.rstrip.gsub(/\n\n/, '</p><p>').gsub(/\n/, '<br/>')}</p>"
- end
- end
-end
-
-Liquid::Template.register_tag('blockquote', Jekyll::Blockquote)
diff --git a/plugins/category_generator.rb b/plugins/category_generator.rb
deleted file mode 100644
index c55d62f4..00000000
--- a/plugins/category_generator.rb
+++ /dev/null
@@ -1,193 +0,0 @@
-# encoding: utf-8
-#
-# Jekyll category page generator.
-# http://recursive-design.com/projects/jekyll-plugins/
-#
-# Version: 0.1.4 (201101061053)
-#
-# Copyright (c) 2010 Dave Perrett, http://recursive-design.com/
-# Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-#
-# A generator that creates category pages for jekyll sites.
-#
-# Included filters :
-# - category_links: Outputs the list of categories as comma-separated <a> links.
-# - date_to_html_string: Outputs the post.date as formatted html, with hooks for CSS styling.
-#
-# Available _config.yml settings :
-# - category_dir: The subfolder to build category pages in (default is 'categories').
-# - category_title_prefix: The string used before the category name in the page title (default is
-# 'Category: ').
-
-require 'stringex'
-
-module Jekyll
-
- # The CategoryIndex class creates a single category page for the specified category.
- class CategoryIndex < Page
-
- # Initializes a new CategoryIndex.
- #
- # +base+ is the String path to the <source>.
- # +category_dir+ is the String path between <source> and the category folder.
- # +category+ is the category currently being processed.
- def initialize(site, base, category_dir, category)
- @site = site
- @base = base
- @dir = category_dir
- @name = 'index.html'
- self.process(@name)
- # Read the YAML data from the layout page.
- self.read_yaml(File.join(base, '_layouts'), 'category_index.html')
- self.data['category'] = category
- # Set the title for this page.
- title_prefix = site.config['category_title_prefix'] || 'Category: '
- self.data['title'] = "#{title_prefix}#{category}"
- # Set the meta-description for this page.
- meta_description_prefix = site.config['category_meta_description_prefix'] || 'Category: '
- self.data['description'] = "#{meta_description_prefix}#{category}"
- end
-
- end
-
- # The CategoryFeed class creates an Atom feed for the specified category.
- class CategoryFeed < Page
-
- # Initializes a new CategoryFeed.
- #
- # +base+ is the String path to the <source>.
- # +category_dir+ is the String path between <source> and the category folder.
- # +category+ is the category currently being processed.
- def initialize(site, base, category_dir, category)
- @site = site
- @base = base
- @dir = category_dir
- @name = 'atom.xml'
- self.process(@name)
- # Read the YAML data from the layout page.
- self.read_yaml(File.join(base, '_includes/custom'), 'category_feed.xml')
- self.data['category'] = category
- # Set the title for this page.
- title_prefix = site.config['category_title_prefix'] || 'Category: '
- self.data['title'] = "#{title_prefix}#{category}"
- # Set the meta-description for this page.
- meta_description_prefix = site.config['category_meta_description_prefix'] || 'Category: '
- self.data['description'] = "#{meta_description_prefix}#{category}"
-
- # Set the correct feed URL.
- self.data['feed_url'] = "#{category_dir}/#{name}"
- end
-
- end
-
- # The Site class is a built-in Jekyll class with access to global site config information.
- class Site
-
- # Creates an instance of CategoryIndex for each category page, renders it, and
- # writes the output to a file.
- #
- # +category_dir+ is the String path to the category folder.
- # +category+ is the category currently being processed.
- def write_category_index(category_dir, category)
- index = CategoryIndex.new(self, self.source, category_dir, category)
- index.render(self.layouts, site_payload)
- index.write(self.dest)
- # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
- self.pages << index
-
- # Create an Atom-feed for each index.
- feed = CategoryFeed.new(self, self.source, category_dir, category)
- feed.render(self.layouts, site_payload)
- feed.write(self.dest)
- # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
- self.pages << feed
- end
-
- # Loops through the list of category pages and processes each one.
- def write_category_indexes
- if self.layouts.key? 'category_index'
- dir = self.config['category_dir'] || 'categories'
- self.categories.keys.each do |category|
- self.write_category_index(File.join(dir, category.to_url), category)
- end
-
- # Throw an exception if the layout couldn't be found.
- else
- raise <<-ERR
-
-
-===============================================
- Error for category_generator.rb plugin
------------------------------------------------
- No 'category_index.html' in source/_layouts/
- Perhaps you haven't installed a theme yet.
-===============================================
-
-ERR
- end
- end
-
- end
-
-
- # Jekyll hook - the generate method is called by jekyll, and generates all of the category pages.
- class GenerateCategories < Generator
- safe true
- priority :low
-
- def generate(site)
- site.write_category_indexes
- end
-
- end
-
-
- # Adds some extra filters used during the category creation process.
- module Filters
-
- # Outputs a list of categories as comma-separated <a> links. This is used
- # to output the category list for each post on a category page.
- #
- # +categories+ is the list of categories to format.
- #
- # Returns string
- #
- def category_links(categories)
- categories = categories.sort!.map { |c| category_link c }
-
- case categories.length
- when 0
- ""
- when 1
- categories[0].to_s
- else
- "#{categories[0...-1].join(', ')}, #{categories[-1]}"
- end
- end
-
- # Outputs a single category as an <a> link.
- #
- # +category+ is a category string to format as an <a> link
- #
- # Returns string
- #
- def category_link(category)
- dir = @context.registers[:site].config['category_dir']
- "<a class='category' href='/#{dir}/#{category.to_url}/'>#{category}</a>"
- end
-
- # Outputs the post.date as formatted html, with hooks for CSS styling.
- #
- # +date+ is the date object to format as HTML.
- #
- # Returns string
- def date_to_html_string(date)
- result = '<span class="month">' + date.strftime('%b').upcase + '</span> '
- result += date.strftime('<span class="day">%d</span> ')
- result += date.strftime('<span class="year">%Y</span> ')
- result
- end
-
- end
-
-end
diff --git a/plugins/code_block.rb b/plugins/code_block.rb
deleted file mode 100644
index 539a3475..00000000
--- a/plugins/code_block.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# Title: Simple Code Blocks for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Write codeblocks with semantic HTML5 <figure> and <figcaption> elements and optional syntax highlighting — all with a simple, intuitive interface.
-#
-# Syntax:
-# {% codeblock [title] [url] [link text] %}
-# code snippet
-# {% endcodeblock %}
-#
-# For syntax highlighting, put a file extension somewhere in the title. examples:
-# {% codeblock file.sh %}
-# code snippet
-# {% endcodeblock %}
-#
-# {% codeblock Time to be Awesome! (awesome.rb) %}
-# code snippet
-# {% endcodeblock %}
-#
-# Example:
-#
-# {% codeblock Got pain? painreleif.sh http://site.com/painreleief.sh Download it! %}
-# $ rm -rf ~/PAIN
-# {% endcodeblock %}
-#
-# Output:
-#
-# <figure class='code'>
-# <figcaption><span>Got pain? painrelief.sh</span> <a href="http://site.com/painrelief.sh">Download it!</a>
-# <div class="highlight"><pre><code class="sh">
-# -- nicely escaped highlighted code --
-# </code></pre></div>
-# </figure>
-#
-# Example 2 (no syntax highlighting):
-#
-# {% codeblock %}
-# <sarcasm>Ooooh, sarcasm... How original!</sarcasm>
-# {% endcodeblock %}
-#
-# <figure class='code'>
-# <pre><code>&lt;sarcasm> Ooooh, sarcasm... How original!&lt;/sarcasm></code></pre>
-# </figure>
-#
-require './plugins/pygments_code'
-require './plugins/raw'
-
-module Jekyll
-
- class CodeBlock < Liquid::Block
- CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i
- Caption = /(\S[\S\s]*)/
- def initialize(tag_name, markup, tokens)
- @title = nil
- @caption = nil
- @filetype = nil
- @highlight = true
- if markup =~ /\s*lang:(\S+)/i
- @filetype = $1
- markup = markup.sub(/\s*lang:(\S+)/i,'')
- end
- if markup =~ CaptionUrlTitle
- @file = $1
- @caption = "<figcaption><span>#{$1}</span><a href='#{$2}'>#{$3 || 'link'}</a></figcaption>"
- elsif markup =~ Caption
- @file = $1
- @caption = "<figcaption><span>#{$1}</span></figcaption>\n"
- end
- if @file =~ /\S[\S\s]*\w+\.(\w+)/ && @filetype.nil?
- @filetype = $1
- end
- super
- end
-
- def render(context)
- output = super
- code = super
- source = "<figure class='code'>"
- source += @caption if @caption
- if @filetype
- source += "#{HighlightCode::highlight(code, @filetype)}</figure>"
- else
- source += "#{HighlightCode::tableize_code(code.lstrip.rstrip.gsub(/</,'&lt;'))}</figure>"
- end
- source = TemplateWrapper::safe_wrap(source)
- source = context['pygments_prefix'] + source if context['pygments_prefix']
- source = source + context['pygments_suffix'] if context['pygments_suffix']
- source
- end
- end
-end
-
-Liquid::Template.register_tag('codeblock', Jekyll::CodeBlock)
diff --git a/plugins/config_tag.rb b/plugins/config_tag.rb
deleted file mode 100644
index 92d1f63c..00000000
--- a/plugins/config_tag.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'json'
-
-class ConfigTag < Liquid::Tag
- def initialize(tag_name, options, tokens)
- super
- options = options.split(' ').map {|i| i.strip }
- @key = options.slice!(0)
- @tag = nil
- @classname = nil
- options.each do |option|
- @tag = $1 if option =~ /tag:(\S+)/
- @classname = $1 if option =~ /classname:(\S+)/
- end
- end
-
- def render(context)
- config_tag(context.registers[:site].config, @key, @tag, @classname)
- end
-end
-
-def config_tag(config, key, tag=nil, classname=nil)
- options = key.split('.').map { |k| config[k] }.last #reference objects with dot notation
- tag ||= 'div'
- classname ||= key.sub(/_/, '-').sub(/\./, '-')
- output = "<#{tag} class='#{classname}'"
-
- if options.respond_to? 'keys'
- options.each do |k,v|
- unless v.nil?
- v = v.join ',' if v.respond_to? 'join'
- v = v.to_json if v.respond_to? 'keys'
- output += " data-#{k.sub'_','-'}='#{v}'"
- end
- end
- elsif options.respond_to? 'join'
- output += " data-value='#{config[key].join(',')}'"
- else
- output += " data-value='#{config[key]}'"
- end
- output += "></#{tag}>"
-end
-
-Liquid::Template.register_tag('config_tag', ConfigTag)
-
diff --git a/plugins/gist_tag.rb b/plugins/gist_tag.rb
deleted file mode 100644
index 51201156..00000000
--- a/plugins/gist_tag.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-# 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(/([a-zA-Z\d]*) (.*)/)
- gist, file = parts[1].strip, parts[2].strip
- else
- gist, file = @text.strip, ""
- end
- if gist.empty?
- ""
- else
- 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
- 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)
- url = "https://gist.github.com/#{gist_id}.js"
- url = "#{url}?file=#{filename}" unless filename.nil? or filename.empty?
- url
- end
-
- def get_gist_url_for(gist, file)
- "https://gist.githubusercontent.com/raw/#{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)
- data = get_web_content(gist_url)
-
- locations = Array.new
- while (data.code.to_i == 301 || data.code.to_i == 302)
- data = handle_gist_redirecting(data)
- break if locations.include? data.header['Location']
- locations << data.header['Location']
- end
-
- if data.code.to_i != 200
- raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}"
- end
-
- cache(gist, file, data.body) unless @cache_disabled
- data.body
- end
-
- def handle_gist_redirecting(data)
- redirected_url = data.header['Location']
- if redirected_url.nil? || redirected_url.empty?
- raise ArgumentError, "GitHub replied with a 302 but didn't provide a location in the response headers."
- end
-
- get_web_content(redirected_url)
- end
-
- def get_web_content(url)
- raw_uri = URI.parse 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
- 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)
diff --git a/plugins/haml.rb b/plugins/haml.rb
deleted file mode 100644
index 7e548dec..00000000
--- a/plugins/haml.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-module Jekyll
- require 'haml'
- class HamlConverter < Converter
- safe true
- priority :low
-
- def matches(ext)
- ext =~ /haml/i
- end
-
- def output_ext(ext)
- ".html"
- end
-
- def convert(content)
- begin
- engine = Haml::Engine.new(content)
- engine.render
- rescue StandardError => e
- puts "!!! HAML Error: " + e.message
- end
- end
- end
-end
diff --git a/plugins/image_tag.rb b/plugins/image_tag.rb
deleted file mode 100644
index 45670007..00000000
--- a/plugins/image_tag.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# Title: Simple Image tag for Jekyll
-# Authors: Brandon Mathis http://brandonmathis.com
-# Felix Schäfer, Frederic Hemberger
-# Description: Easily output images with optional class names, width, height, title and alt attributes
-#
-# Syntax {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | "title text" ["alt text"]] %}
-#
-# Examples:
-# {% img /images/ninja.png Ninja Attack! %}
-# {% img left half http://site.com/images/ninja.png Ninja Attack! %}
-# {% img left half http://site.com/images/ninja.png 150 150 "Ninja Attack!" "Ninja in attack posture" %}
-#
-# Output:
-# <img src="/images/ninja.png">
-# <img class="left half" src="http://site.com/images/ninja.png" title="Ninja Attack!" alt="Ninja Attack!">
-# <img class="left half" src="http://site.com/images/ninja.png" width="150" height="150" title="Ninja Attack!" alt="Ninja in attack posture">
-#
-
-module Jekyll
-
- class ImageTag < Liquid::Tag
- @img = nil
-
- def initialize(tag_name, markup, tokens)
- attributes = ['class', 'src', 'width', 'height', 'title']
-
- if markup =~ /(?<class>\S.*\s+)?(?<src>(?:https?:\/\/|\/|\S+\/)\S+)(?:\s+(?<width>\d+))?(?:\s+(?<height>\d+))?(?<title>\s+.+)?/i
- @img = attributes.reduce({}) { |img, attr| img[attr] = $~[attr].strip if $~[attr]; img }
- if /(?:"|')(?<title>[^"']+)?(?:"|')\s+(?:"|')(?<alt>[^"']+)?(?:"|')/ =~ @img['title']
- @img['title'] = title
- @img['alt'] = alt
- else
- @img['alt'] = @img['title'].gsub!(/"/, '&#34;') if @img['title']
- end
- @img['class'].gsub!(/"/, '') if @img['class']
- end
- super
- end
-
- def render(context)
- if @img
- "<img #{@img.collect {|k,v| "#{k}=\"#{v}\"" if v}.join(" ")}>"
- else
- "Error processing input, expected syntax: {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | \"title text\" [\"alt text\"]] %}"
- end
- end
- end
-end
-
-Liquid::Template.register_tag('img', Jekyll::ImageTag)
diff --git a/plugins/include_array.rb b/plugins/include_array.rb
deleted file mode 100644
index 000040fb..00000000
--- a/plugins/include_array.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# Title: Include Array Tag for Jekyll
-# Author: Jason Woodward http://www.woodwardjd.com
-# Description: Import files on your filesystem as specified in a configuration variable in _config.yml. Mostly cribbed from Jekyll's include tag.
-# Syntax: {% include_array variable_name_from_config.yml %}
-#
-# Example 1:
-# {% include_array asides %}
-#
-# _config.yml snippet:
-# asides: [asides/twitter.html, asides/custom/my_picture.html]
-#
-module Jekyll
-
- class IncludeArrayTag < Liquid::Tag
- Syntax = /(#{Liquid::QuotedFragment}+)/
- def initialize(tag_name, markup, tokens)
- if markup =~ Syntax
- @array_name = $1
- else
- raise SyntaxError.new("Error in tag 'include_array' - Valid syntax: include_array [array from _config.yml]")
- end
-
- super
- end
-
- def render(context)
- includes_dir = File.join(context.registers[:site].source, '_includes')
-
- if File.symlink?(includes_dir)
- return "Includes directory '#{includes_dir}' cannot be a symlink"
- end
-
- rtn = ''
- (context.environments.first['site'][@array_name] || []).each do |file|
- if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./
- rtn = rtn + "Include file '#{file}' contains invalid characters or sequences"
- end
-
- Dir.chdir(includes_dir) do
- choices = Dir['**/*'].reject { |x| File.symlink?(x) }
- if choices.include?(file)
- source = File.read(file)
- partial = Liquid::Template.parse(source)
- context.stack do
- rtn = rtn + partial.render(context)
- end
- else
- rtn = rtn + "Included file '#{file}' not found in _includes directory"
- end
- end
- end
- rtn
- end
- end
-
-end
-
-Liquid::Template.register_tag('include_array', Jekyll::IncludeArrayTag)
diff --git a/plugins/include_code.rb b/plugins/include_code.rb
deleted file mode 100644
index a61d06cf..00000000
--- a/plugins/include_code.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# Title: Include Code Tag for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Import files on your filesystem into any blog post as embedded code snippets with syntax highlighting and a download link.
-# Configuration: You can set default import path in _config.yml (defaults to code_dir: downloads/code)
-#
-# Syntax {% include_code path/to/file %}
-#
-# Example 1:
-# {% include_code javascripts/test.js %}
-#
-# This will import test.js from source/downloads/code/javascripts/test.js
-# and output the contents in a syntax highlighted code block inside a figure,
-# with a figcaption listing the file name and download link
-#
-# Example 2:
-# You can also include an optional title for the <figcaption>
-#
-# {% include_code Example 2 javascripts/test.js %}
-#
-# will output a figcaption with the title: Example 2 (test.js)
-#
-
-require './plugins/pygments_code'
-require './plugins/raw'
-require 'pathname'
-
-module Jekyll
-
- class IncludeCodeTag < Liquid::Tag
- def initialize(tag_name, markup, tokens)
- @title = nil
- @file = nil
- if markup.strip =~ /\s*lang:(\S+)/i
- @filetype = $1
- markup = markup.strip.sub(/lang:\S+/i,'')
- end
- if markup.strip =~ /(.*)?(\s+|^)(\/*\S+)/i
- @title = $1 || nil
- @file = $3
- end
- super
- end
-
- def render(context)
- code_dir = (context.registers[:site].config['code_dir'].sub(/^\//,'') || 'downloads/code')
- code_path = (Pathname.new(context.registers[:site].source) + code_dir).expand_path
- file = code_path + @file
-
- if File.symlink?(code_path)
- return "Code directory '#{code_path}' cannot be a symlink"
- end
-
- unless file.file?
- return "File #{file} could not be found"
- end
-
- Dir.chdir(code_path) do
- code = file.read
- @filetype = file.extname.sub('.','') if @filetype.nil?
- title = @title ? "#{@title} (#{file.basename})" : file.basename
- url = "/#{code_dir}/#{@file}"
- source = "<figure class='code'><figcaption><span>#{title}</span> <a href='#{url}'>download</a></figcaption>\n"
- source += "#{HighlightCode::highlight(code, @filetype)}</figure>"
- TemplateWrapper::safe_wrap(source)
- end
- end
- end
-
-end
-
-Liquid::Template.register_tag('include_code', Jekyll::IncludeCodeTag)
diff --git a/plugins/jsfiddle.rb b/plugins/jsfiddle.rb
deleted file mode 100644
index 815910e2..00000000
--- a/plugins/jsfiddle.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Title: jsFiddle tag for Jekyll
-# Author: Brian Arnold (@brianarn)
-# Description:
-# Given a jsFiddle shortcode, outputs the jsFiddle iframe code.
-# Using 'default' will preserve defaults as specified by jsFiddle.
-#
-# Syntax: {% jsfiddle shorttag [tabs] [skin] [height] [width] %}
-#
-# Examples:
-#
-# Input: {% jsfiddle ccWP7 %}
-# Output: <iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/ccWP7/embedded/js,resources,html,css,result/light/"></iframe>
-#
-# Input: {% jsfiddle ccWP7 js,html,result %}
-# Output: <iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/ccWP7/embedded/js,html,result/light/"></iframe>
-#
-
-module Jekyll
- class JsFiddle < Liquid::Tag
- def initialize(tag_name, markup, tokens)
- if /(?<fiddle>\w+\/?\d?)(?:\s+(?<sequence>[\w,]+))?(?:\s+(?<skin>\w+))?(?:\s+(?<height>\w+))?(?:\s+(?<width>\w+))?/ =~ markup
- @fiddle = fiddle
- @sequence = (sequence unless sequence == 'default') || 'js,resources,html,css,result'
- @skin = (skin unless skin == 'default') || 'light'
- @width = width || '100%'
- @height = height || '300px'
- end
- end
-
- def render(context)
- if @fiddle
- "<iframe style=\"width: #{@width}; height: #{@height}\" frameborder=\"0\" seamless=\"seamless\" src=\"http://jsfiddle.net/#{@fiddle}/embedded/#{@sequence}/#{@skin}/\"></iframe>"
- else
- "Error processing input, expected syntax: {% jsfiddle shorttag [tabs] [skin] [height] [width] %}"
- end
- end
- end
-end
-
-Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle)
diff --git a/plugins/octopress_filters.rb b/plugins/octopress_filters.rb
deleted file mode 100644
index 9c7fa6c5..00000000
--- a/plugins/octopress_filters.rb
+++ /dev/null
@@ -1,142 +0,0 @@
-#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)\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
-
diff --git a/plugins/pullquote.rb b/plugins/pullquote.rb
deleted file mode 100644
index 3c65e66e..00000000
--- a/plugins/pullquote.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Author: Brandon Mathis
-# Based on the semantic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/
-#
-# Outputs a span with a data-pullquote attribute set from the marked pullquote. Example:
-#
-# {% pullquote %}
-# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
-# It is important to note, {" pullquotes are merely visual in presentation and should not appear twice in the text. "} That is why it is prefered
-# to use a CSS only technique for styling pullquotes.
-# {% endpullquote %}
-# ...will output...
-# <p>
-# <span data-pullquote="pullquotes are merely visual in presentation and should not appear twice in the text.">
-# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
-# It is important to note, pullquotes are merely visual in presentation and should not appear twice in the text. This is why a CSS only approach
-# for styling pullquotes is prefered.
-# </span>
-# </p>
-#
-# {% pullquote left %} will create a left-aligned pullquote instead.
-#
-# Note: this plugin now creates pullquotes with the class of pullquote-right by default
-
-module Jekyll
-
- class PullquoteTag < Liquid::Block
- def initialize(tag_name, markup, tokens)
- @align = (markup =~ /left/i) ? "left" : "right"
- super
- end
-
- def render(context)
- output = super
- if output =~ /\{"\s*(.+?)\s*"\}/m
- @quote = RubyPants.new($1).to_html
- "<span class='pullquote-#{@align}' data-pullquote='#{@quote}'>#{output.gsub(/\{"\s*|\s*"\}/, '')}</span>"
- else
- return "Surround your pullquote like this {\" text to be quoted \"}"
- end
- end
- end
-end
-
-Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag)
diff --git a/plugins/pygments_code.rb b/plugins/pygments_code.rb
deleted file mode 100644
index c0f4de92..00000000
--- a/plugins/pygments_code.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'pygments'
-require 'fileutils'
-require 'digest/md5'
-
-PYGMENTS_CACHE_DIR = File.expand_path('../../.pygments-cache', __FILE__)
-FileUtils.mkdir_p(PYGMENTS_CACHE_DIR)
-
-module HighlightCode
- def self.highlight(str, lang)
- lang = 'ruby' if lang == 'ru'
- lang = 'objc' if lang == 'm'
- lang = 'perl' if lang == 'pl'
- lang = 'yaml' if lang == 'yml'
- str = pygments(str, lang).match(/<pre>(.+)<\/pre>/m)[1].to_s.gsub(/ *$/, '') #strip out divs <div class="highlight">
- tableize_code(str, lang)
- end
-
- def self.pygments(code, lang)
- if defined?(PYGMENTS_CACHE_DIR)
- path = File.join(PYGMENTS_CACHE_DIR, "#{lang}-#{Digest::MD5.hexdigest(code)}.html")
- if File.exist?(path)
- highlighted_code = File.read(path)
- else
- begin
- highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true})
- rescue MentosError
- raise "Pygments can't parse unknown language: #{lang}."
- end
- File.open(path, 'w') {|f| f.print(highlighted_code) }
- end
- else
- highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true})
- end
- highlighted_code
- end
- def self.tableize_code (str, lang = '')
- table = '<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers">'
- code = ''
- str.lines.each_with_index do |line,index|
- table += "<span class='line-number'>#{index+1}</span>\n"
- code += "<span class='line'>#{line}</span>"
- end
- table += "</pre></td><td class='code'><pre><code class='#{lang}'>#{code}</code></pre></td></tr></table></div>"
- end
-end
diff --git a/plugins/raw.rb b/plugins/raw.rb
deleted file mode 100644
index e97c9459..00000000
--- a/plugins/raw.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# 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 self.safe_wrap(input)
- "<div class='bogus-wrapper'><notextile>#{input}</notextile></div>"
- end
- # This must be applied after the
- def self.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 %}
-
-module Jekyll
- class RawTag < Liquid::Block
- def parse(tokens)
- @nodelist ||= []
- @nodelist.clear
-
- while token = tokens.shift
- if token =~ FullToken
- if block_delimiter == $1
- end_tag
- return
- end
- end
- @nodelist << token if not token.empty?
- end
- end
- end
-end
-
-Liquid::Template.register_tag('raw', Jekyll::RawTag)
diff --git a/plugins/render_partial.rb b/plugins/render_partial.rb
deleted file mode 100644
index b6ebfe8b..00000000
--- a/plugins/render_partial.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# Title: Render Partial Tag for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Import files on your filesystem into any blog post and render them inline.
-# Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out.
-#
-# Syntax {% render_partial path/to/file %}
-#
-# Example 1:
-# {% render_partial about/_bio.markdown %}
-#
-# This will import source/about/_bio.markdown and render it inline.
-# In this example I used an underscore at the beginning of the filename to prevent Jekyll
-# from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores)
-#
-# Example 2:
-# {% render_partial ../README.markdown %}
-#
-# You can use relative pathnames, to include files outside of the source directory.
-# This might be useful if you want to have a page for a project's README without having
-# to duplicated the contents
-#
-#
-
-require 'pathname'
-require './plugins/octopress_filters'
-
-module Jekyll
-
- class RenderPartialTag < Liquid::Tag
- include OctopressFilters
- def initialize(tag_name, markup, tokens)
- @file = nil
- @raw = false
- if markup =~ /^(\S+)\s?(\w+)?/
- @file = $1.strip
- @raw = $2 == 'raw'
- end
- super
- end
-
- def render(context)
- file_dir = (context.registers[:site].source || 'source')
- file_path = Pathname.new(file_dir).expand_path
- file = file_path + @file
-
- unless file.file?
- return "File #{file} could not be found"
- end
-
- Dir.chdir(file_path) do
- contents = file.read
- if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m
- contents = $1.lstrip
- end
- contents = pre_filter(contents)
- if @raw
- contents
- else
- partial = Liquid::Template.parse(contents)
- context.stack do
- partial.render(context)
- end
- end
- end
- end
- end
-end
-
-Liquid::Template.register_tag('render_partial', Jekyll::RenderPartialTag)
diff --git a/plugins/rubypants.rb b/plugins/rubypants.rb
deleted file mode 100644
index e4f4502f..00000000
--- a/plugins/rubypants.rb
+++ /dev/null
@@ -1,489 +0,0 @@
-#
-# = RubyPants -- SmartyPants ported to Ruby
-#
-# Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com>
-# Copyright (C) 2004 Christian Neukirchen
-#
-# Incooporates ideas, comments and documentation by Chad Miller
-# Copyright (C) 2004 Chad Miller
-#
-# Original SmartyPants by John Gruber
-# Copyright (C) 2003 John Gruber
-#
-
-#
-# = RubyPants -- SmartyPants ported to Ruby
-#
-# == Synopsis
-#
-# RubyPants is a Ruby port of the smart-quotes library SmartyPants.
-#
-# The original "SmartyPants" is a free web publishing plug-in for
-# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII
-# punctuation characters into "smart" typographic punctuation HTML
-# entities.
-#
-#
-# == Description
-#
-# RubyPants can perform the following transformations:
-#
-# * Straight quotes (<tt>"</tt> and <tt>'</tt>) into "curly" quote
-# HTML entities
-# * Backticks-style quotes (<tt>``like this''</tt>) into "curly" quote
-# HTML entities
-# * Dashes (<tt>--</tt> and <tt>---</tt>) into en- and em-dash
-# entities
-# * Three consecutive dots (<tt>...</tt> or <tt>. . .</tt>) into an
-# ellipsis entity
-#
-# This means you can write, edit, and save your posts using plain old
-# ASCII straight quotes, plain dashes, and plain dots, but your
-# published posts (and final HTML output) will appear with smart
-# quotes, em-dashes, and proper ellipses.
-#
-# RubyPants does not modify characters within <tt><pre></tt>,
-# <tt><code></tt>, <tt><kbd></tt>, <tt><math></tt> or
-# <tt><script></tt> tag blocks. Typically, these tags are used to
-# display text where smart quotes and other "smart punctuation" would
-# not be appropriate, such as source code or example markup.
-#
-#
-# == Backslash Escapes
-#
-# If you need to use literal straight quotes (or plain hyphens and
-# periods), RubyPants accepts the following backslash escape sequences
-# to force non-smart punctuation. It does so by transforming the
-# escape sequence into a decimal-encoded HTML entity:
-#
-# \\ \" \' \. \- \`
-#
-# This is useful, for example, when you want to use straight quotes as
-# foot and inch marks: 6'2" tall; a 17" iMac. (Use <tt>6\'2\"</tt>
-# resp. <tt>17\"</tt>.)
-#
-#
-# == Algorithmic Shortcomings
-#
-# One situation in which quotes will get curled the wrong way is when
-# apostrophes are used at the start of leading contractions. For
-# example:
-#
-# 'Twas the night before Christmas.
-#
-# In the case above, RubyPants will turn the apostrophe into an
-# opening single-quote, when in fact it should be a closing one. I
-# don't think this problem can be solved in the general case--every
-# word processor I've tried gets this wrong as well. In such cases,
-# it's best to use the proper HTML entity for closing single-quotes
-# ("<tt>&#8217;</tt>") by hand.
-#
-#
-# == Bugs
-#
-# To file bug reports or feature requests (except see above) please
-# send email to: mailto:chneukirchen@gmail.com
-#
-# If the bug involves quotes being curled the wrong way, please send
-# example text to illustrate.
-#
-#
-# == Authors
-#
-# John Gruber did all of the hard work of writing this software in
-# Perl for Movable Type and almost all of this useful documentation.
-# Chad Miller ported it to Python to use with Pyblosxom.
-#
-# Christian Neukirchen provided the Ruby port, as a general-purpose
-# library that follows the *Cloth API.
-#
-#
-# == Copyright and License
-#
-# === SmartyPants license:
-#
-# Copyright (c) 2003 John Gruber
-# (http://daringfireball.net)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in
-# the documentation and/or other materials provided with the
-# distribution.
-#
-# * Neither the name "SmartyPants" nor the names of its contributors
-# may be used to endorse or promote products derived from this
-# software without specific prior written permission.
-#
-# This software is provided by the copyright holders and contributors
-# "as is" and any express or implied warranties, including, but not
-# limited to, the implied warranties of merchantability and fitness
-# for a particular purpose are disclaimed. In no event shall the
-# copyright owner or contributors be liable for any direct, indirect,
-# incidental, special, exemplary, or consequential damages (including,
-# but not limited to, procurement of substitute goods or services;
-# loss of use, data, or profits; or business interruption) however
-# caused and on any theory of liability, whether in contract, strict
-# liability, or tort (including negligence or otherwise) arising in
-# any way out of the use of this software, even if advised of the
-# possibility of such damage.
-#
-# === RubyPants license
-#
-# RubyPants is a derivative work of SmartyPants and smartypants.py.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in
-# the documentation and/or other materials provided with the
-# distribution.
-#
-# This software is provided by the copyright holders and contributors
-# "as is" and any express or implied warranties, including, but not
-# limited to, the implied warranties of merchantability and fitness
-# for a particular purpose are disclaimed. In no event shall the
-# copyright owner or contributors be liable for any direct, indirect,
-# incidental, special, exemplary, or consequential damages (including,
-# but not limited to, procurement of substitute goods or services;
-# loss of use, data, or profits; or business interruption) however
-# caused and on any theory of liability, whether in contract, strict
-# liability, or tort (including negligence or otherwise) arising in
-# any way out of the use of this software, even if advised of the
-# possibility of such damage.
-#
-#
-# == Links
-#
-# John Gruber:: http://daringfireball.net
-# SmartyPants:: http://daringfireball.net/projects/smartypants
-#
-# Chad Miller:: http://web.chad.org
-#
-# Christian Neukirchen:: http://kronavita.de/chris
-#
-
-
-class RubyPants < String
-
- # Create a new RubyPants instance with the text in +string+.
- #
- # Allowed elements in the options array:
- #
- # 0 :: do nothing
- # 1 :: enable all, using only em-dash shortcuts
- # 2 :: enable all, using old school en- and em-dash shortcuts (*default*)
- # 3 :: enable all, using inverted old school en and em-dash shortcuts
- # -1 :: stupefy (translate HTML entities to their ASCII-counterparts)
- #
- # If you don't like any of these defaults, you can pass symbols to change
- # RubyPants' behavior:
- #
- # <tt>:quotes</tt> :: quotes
- # <tt>:backticks</tt> :: backtick quotes (``double'' only)
- # <tt>:allbackticks</tt> :: backtick quotes (``double'' and `single')
- # <tt>:dashes</tt> :: dashes
- # <tt>:oldschool</tt> :: old school dashes
- # <tt>:inverted</tt> :: inverted old school dashes
- # <tt>:ellipses</tt> :: ellipses
- # <tt>:convertquotes</tt> :: convert <tt>&quot;</tt> entities to
- # <tt>"</tt> for Dreamweaver users
- # <tt>:stupefy</tt> :: translate RubyPants HTML entities
- # to their ASCII counterparts.
- #
- def initialize(string, options=[2])
- super string
- @options = [*options]
- end
-
- # Apply SmartyPants transformations.
- def to_html
- do_quotes = do_backticks = do_dashes = do_ellipses = do_stupify = nil
- convert_quotes = false
-
- if @options.include? 0
- # Do nothing.
- return self
- elsif @options.include? 1
- # Do everything, turn all options on.
- do_quotes = do_backticks = do_ellipses = true
- do_dashes = :normal
- elsif @options.include? 2
- # Do everything, turn all options on, use old school dash shorthand.
- do_quotes = do_backticks = do_ellipses = true
- do_dashes = :oldschool
- elsif @options.include? 3
- # Do everything, turn all options on, use inverted old school
- # dash shorthand.
- do_quotes = do_backticks = do_ellipses = true
- do_dashes = :inverted
- elsif @options.include?(-1)
- do_stupefy = true
- else
- do_quotes = @options.include? :quotes
- do_backticks = @options.include? :backticks
- do_backticks = :both if @options.include? :allbackticks
- do_dashes = :normal if @options.include? :dashes
- do_dashes = :oldschool if @options.include? :oldschool
- do_dashes = :inverted if @options.include? :inverted
- do_ellipses = @options.include? :ellipses
- convert_quotes = @options.include? :convertquotes
- do_stupefy = @options.include? :stupefy
- end
-
- # Parse the HTML
- tokens = tokenize
-
- # Keep track of when we're inside <pre> or <code> tags.
- in_pre = false
-
- # Here is the result stored in.
- result = ""
-
- # This is a cheat, used to get some context for one-character
- # tokens that consist of just a quote char. What we do is remember
- # the last character of the previous text token, to use as context
- # to curl single- character quote tokens correctly.
- prev_token_last_char = nil
-
- tokens.each { |token|
- if token.first == :tag
- result << token[1]
- if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]!
- in_pre = ($1 != "/") # Opening or closing tag?
- end
- else
- t = token[1]
-
- # Remember last char of this token before processing.
- last_char = t[-1].chr
-
- unless in_pre
- t = process_escapes t
-
- t.gsub!(/&quot;/, '"') if convert_quotes
-
- if do_dashes
- t = educate_dashes t if do_dashes == :normal
- t = educate_dashes_oldschool t if do_dashes == :oldschool
- t = educate_dashes_inverted t if do_dashes == :inverted
- end
-
- t = educate_ellipses t if do_ellipses
-
- # Note: backticks need to be processed before quotes.
- if do_backticks
- t = educate_backticks t
- t = educate_single_backticks t if do_backticks == :both
- end
-
- if do_quotes
- if t == "'"
- # Special case: single-character ' token
- if prev_token_last_char =~ /\S/
- t = "&#8217;"
- else
- t = "&#8216;"
- end
- elsif t == '"'
- # Special case: single-character " token
- if prev_token_last_char =~ /\S/
- t = "&#8221;"
- else
- t = "&#8220;"
- end
- else
- # Normal case:
- t = educate_quotes t
- end
- end
-
- t = stupefy_entities t if do_stupefy
- end
-
- prev_token_last_char = last_char
- result << t
- end
- }
-
- # Done
- result
- end
-
- protected
-
- # Return the string, with after processing the following backslash
- # escape sequences. This is useful if you want to force a "dumb" quote
- # or other character to appear.
- #
- # Escaped are:
- # \\ \" \' \. \- \`
- #
- def process_escapes(str)
- str.gsub('\\\\', '&#92;').
- gsub('\"', '&#34;').
- gsub("\\\'", '&#39;').
- gsub('\.', '&#46;').
- gsub('\-', '&#45;').
- gsub('\`', '&#96;')
- end
-
- # The string, with each instance of "<tt>--</tt>" translated to an
- # em-dash HTML entity.
- #
- def educate_dashes(str)
- str.gsub(/--/, '&#8212;')
- end
-
- # The string, with each instance of "<tt>--</tt>" translated to an
- # en-dash HTML entity, and each "<tt>---</tt>" translated to an
- # em-dash HTML entity.
- #
- def educate_dashes_oldschool(str)
- str.gsub(/---/, '&#8212;').gsub(/--/, '&#8211;')
- end
-
- # Return the string, with each instance of "<tt>--</tt>" translated
- # to an em-dash HTML entity, and each "<tt>---</tt>" translated to
- # an en-dash HTML entity. Two reasons why: First, unlike the en- and
- # em-dash syntax supported by +educate_dashes_oldschool+, it's
- # compatible with existing entries written before SmartyPants 1.1,
- # back when "<tt>--</tt>" was only used for em-dashes. Second,
- # em-dashes are more common than en-dashes, and so it sort of makes
- # sense that the shortcut should be shorter to type. (Thanks to
- # Aaron Swartz for the idea.)
- #
- def educate_dashes_inverted(str)
- str.gsub(/---/, '&#8211;').gsub(/--/, '&#8212;')
- end
-
- # Return the string, with each instance of "<tt>...</tt>" translated
- # to an ellipsis HTML entity. Also converts the case where there are
- # spaces between the dots.
- #
- def educate_ellipses(str)
- str.gsub('...', '&#8230;').gsub('. . .', '&#8230;')
- end
-
- # Return the string, with "<tt>``backticks''</tt>"-style single quotes
- # translated into HTML curly quote entities.
- #
- def educate_backticks(str)
- str.gsub("``", '&#8220;').gsub("''", '&#8221;')
- end
-
- # Return the string, with "<tt>`backticks'</tt>"-style single quotes
- # translated into HTML curly quote entities.
- #
- def educate_single_backticks(str)
- str.gsub("`", '&#8216;').gsub("'", '&#8217;')
- end
-
- # Return the string, with "educated" curly quote HTML entities.
- #
- def educate_quotes(str)
- punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
-
- str = str.dup
-
- # Special case if the very first character is a quote followed by
- # punctuation at a non-word-break. Close the quotes by brute
- # force:
- str.gsub!(/^'(?=#{punct_class}\B)/, '&#8217;')
- str.gsub!(/^"(?=#{punct_class}\B)/, '&#8221;')
-
- # Special case for double sets of quotes, e.g.:
- # <p>He said, "'Quoted' words in a larger quote."</p>
- str.gsub!(/"'(?=\w)/, '&#8220;&#8216;')
- str.gsub!(/'"(?=\w)/, '&#8216;&#8220;')
-
- # Special case for decade abbreviations (the '80s):
- str.gsub!(/'(?=\d\ds)/, '&#8217;')
-
- close_class = %![^\ \t\r\n\\[\{\(\-]!
- dec_dashes = '&#8211;|&#8212;'
-
- # Get most opening single quotes:
- str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)'(?=\w)/,
- '\1&#8216;')
- # Single closing quotes:
- str.gsub!(/(#{close_class})'/, '\1&#8217;')
- str.gsub!(/'(\s|s\b|$)/, '&#8217;\1')
- # Any remaining single quotes should be opening ones:
- str.gsub!(/'/, '&#8216;')
-
- # Get most opening double quotes:
- str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)"(?=\w)/,
- '\1&#8220;')
- # Double closing quotes:
- str.gsub!(/(#{close_class})"/, '\1&#8221;')
- str.gsub!(/"(\s|s\b|$)/, '&#8221;\1')
- # Any remaining quotes should be opening ones:
- str.gsub!(/"/, '&#8220;')
-
- str
- end
-
- # Return the string, with each RubyPants HTML entity translated to
- # its ASCII counterpart.
- #
- # Note: This is not reversible (but exactly the same as in SmartyPants)
- #
- def stupefy_entities(str)
- str.
- gsub(/&#8211;/, '-'). # en-dash
- gsub(/&#8212;/, '--'). # em-dash
-
- gsub(/&#8216;/, "'"). # open single quote
- gsub(/&#8217;/, "'"). # close single quote
-
- gsub(/&#8220;/, '"'). # open double quote
- gsub(/&#8221;/, '"'). # close double quote
-
- gsub(/&#8230;/, '...') # ellipsis
- end
-
- # Return an array of the tokens comprising the string. Each token is
- # either a tag (possibly with nested, tags contained therein, such
- # as <tt><a href="<MTFoo>"></tt>, or a run of text between
- # tags. Each element of the array is a two-element array; the first
- # is either :tag or :text; the second is the actual value.
- #
- # Based on the <tt>_tokenize()</tt> subroutine from Brad Choate's
- # MTRegex plugin. <http://www.bradchoate.com/past/mtregex.php>
- #
- # This is actually the easier variant using tag_soup, as used by
- # Chad Miller in the Python port of SmartyPants.
- #
- def tokenize
- tag_soup = /([^<]*)(<[^>]*>)/
-
- tokens = []
-
- prev_end = 0
- scan(tag_soup) {
- tokens << [:text, $1] if $1 != ""
- tokens << [:tag, $2]
-
- prev_end = $~.end(0)
- }
-
- if prev_end < size
- tokens << [:text, self[prev_end..-1]]
- end
-
- tokens
- end
-end
diff --git a/plugins/titlecase.rb b/plugins/titlecase.rb
deleted file mode 100644
index 7648932c..00000000
--- a/plugins/titlecase.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-class String
- def titlecase
- small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
-
- x = split(" ").map do |word|
- # note: word could contain non-word characters!
- # downcase all small_words, capitalize the rest
- small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
- word
- end
- # capitalize first and last words
- x.first.to_s.smart_capitalize!
- x.last.to_s.smart_capitalize!
- # small words are capitalized after colon, period, exclamation mark, question mark
- x.join(" ").gsub(/(:|\.|!|\?)\s?(\W*#{small_words.join("|")}\W*)\s/) { "#{$1} #{$2.smart_capitalize} " }
- end
-
- def titlecase!
- replace(titlecase)
- end
-
- def smart_capitalize
- # ignore any leading crazy characters and capitalize the first real character
- if self =~ /^['"\(\[']*([a-z])/
- i = index($1)
- x = self[i,self.length]
- # word with capitals and periods mid-word are left alone
- self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
- end
- self
- end
-
- def smart_capitalize!
- replace(smart_capitalize)
- end
-end
diff --git a/plugins/video_tag.rb b/plugins/video_tag.rb
deleted file mode 100644
index c6e67b77..00000000
--- a/plugins/video_tag.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# Title: Simple Video tag for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Easily output MPEG4 HTML5 video with a flash backup.
-#
-# Syntax {% video url/to/video [width height] [url/to/poster] %}
-#
-# Example:
-# {% video http://site.com/video.mp4 720 480 http://site.com/poster-frame.jpg %}
-#
-# Output:
-# <video width='720' height='480' preload='none' controls poster='http://site.com/poster-frame.jpg'>
-# <source src='http://site.com/video.mp4' type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'/>
-# </video>
-#
-
-module Jekyll
-
- class VideoTag < Liquid::Tag
- @video = nil
- @poster = ''
- @height = ''
- @width = ''
-
- def initialize(tag_name, markup, tokens)
- if markup =~ /(https?:\S+)(\s+(https?:\S+))?(\s+(https?:\S+))?(\s+(\d+)\s(\d+))?(\s+(https?:\S+))?/i
- @video = [$1, $3, $5].compact
- @width = $7
- @height = $8
- @poster = $10
- end
- super
- end
-
- def render(context)
- output = super
- type = {
- 'mp4' => "type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'",
- 'ogv' => "type='video/ogg; codecs=theora, vorbis'",
- 'webm' => "type='video/webm; codecs=vp8, vorbis'"
- }
- if @video.size > 0
- video = "<video width='#{@width}' height='#{@height}' preload='none' controls poster='#{@poster}'>"
- @video.each do |v|
- t = v.match(/([^\.]+)$/)[1]
- video += "<source src='#{v}' #{type[t]}>"
- end
- video += "</video>"
- else
- "Error processing input, expected syntax: {% video url/to/video [url/to/video] [url/to/video] [width height] [url/to/poster] %}"
- end
- end
- end
-end
-
-Liquid::Template.register_tag('video', Jekyll::VideoTag)
-