Move renderers into core, but don't require gems and only register templates if gems present

This commit is contained in:
Thomas Reynolds 2012-05-28 13:19:40 -07:00
parent c3c662cf44
commit 67e78f20c7
13 changed files with 174 additions and 175 deletions

View file

@ -1,5 +1,3 @@
require "middleman-core/renderers/erb"
# Shutup Tilt Warnings
# @private
class Tilt::Template
@ -22,7 +20,47 @@ module Middleman
app.send :include, InstanceMethods
# Activate custom renderers
require "middleman-core/renderers/erb"
app.register Middleman::Renderers::ERb
# CoffeeScript Support
begin
require "middleman-core/renderers//coffee_script"
app.register Middleman::Renderers::CoffeeScript
rescue LoadError
end
# Haml Support
begin
require "middleman-core/renderers//haml"
app.register Middleman::Renderers::Haml
rescue LoadError
end
# Sass Support
begin
require "middleman-core/renderers//sass"
app.register Middleman::Renderers::Sass
rescue LoadError
end
# Markdown Support
require "middleman-core/renderers//markdown"
app.register Middleman::Renderers::Markdown
# Liquid Support
begin
require "middleman-core/renderers//liquid"
app.register Middleman::Renderers::Liquid
rescue LoadError
end
# Slim Support
begin
require "middleman-core/renderers//slim"
app.register Middleman::Renderers::Slim
rescue LoadError
end
end
alias :included :registered

View file

@ -0,0 +1,41 @@
# Require gem
require "coffee_script"
module Middleman
module Renderers
# CoffeeScript Renderer
module CoffeeScript
# Setup extension
class << self
# Once registered
def registered(app)
app.before_configuration do
template_extensions :coffee => :js
end
# Tell Tilt to use it as well (for inline scss blocks)
::Tilt.register 'coffee', DebuggingCoffeeScriptTemplate
::Tilt.prefer(DebuggingCoffeeScriptTemplate)
end
alias :included :registered
end
# A Template for Tilt which outputs debug messages
class DebuggingCoffeeScriptTemplate < ::Tilt::CoffeeScriptTemplate
# Add exception messaging
# @param [Class] context
# @param [Hash] locals
# @return [String]
def evaluate(context, locals, &block)
begin
super
rescue ::ExecJS::RuntimeError=> e
e.to_s
end
end
end
end
end
end

View file

@ -0,0 +1,30 @@
# Require gem
require "haml"
module Middleman
module Renderers
# Haml Renderer
module Haml
# Setup extension
class << self
# Once registered
def registered(app)
app.before_configuration do
template_extensions :haml => :html
end
# Add haml helpers to context
app.send :include, ::Haml::Helpers
# Setup haml helper paths
app.ready do
init_haml_helpers
end
end
alias :included :registered
end
end
end
end

View file

@ -0,0 +1,35 @@
# Require Gem
require "liquid"
module Middleman
module Renderers
# Liquid Renderer
module Liquid
# Setup extension
class << self
# Once registerd
def registered(app)
app.before_configuration do
template_extensions :liquid => :html
end
# After config, setup liquid partial paths
app.after_configuration do
::Liquid::Template.file_system = ::Liquid::LocalFileSystem.new(source_dir)
# Convert data object into a hash for liquid
sitemap.provides_metadata %r{\.liquid$} do |path|
{ :locals => { :data => data.to_h } }
end
end
end
alias :included :registered
end
end
end
end

View file

@ -0,0 +1,57 @@
module Middleman
module Renderers
# Markdown renderer
module Markdown
# Setup extension
class << self
# Once registered
def registered(app)
# Set our preference for a markdown engine
# TODO: Find a JRuby-compatible version
app.set :markdown_engine, :maruku
app.set :markdown_engine_prefix, ::Tilt
app.before_configuration do
template_extensions :markdown => :html,
:mdown => :html,
:md => :html,
:mkd => :html,
:mkdn => :html
end
# Once configuration is parsed
app.after_configuration do
begin
# Look for the user's preferred engine
if markdown_engine == :redcarpet
require "middleman-core/renderers//redcarpet"
::Tilt.prefer(::Middleman::Renderers::RedcarpetTemplate)
elsif markdown_engine.nil?
# Map symbols to classes
markdown_engine_klass = if markdown_engine.is_a? Symbol
engine = markdown_engine.to_s
engine = engine == "rdiscount" ? "RDiscount" : engine.camelize
markdown_engine_prefix.const_get("#{engine}Template")
else
markdown_engine_prefix
end
# Tell tilt to use that engine
::Tilt.prefer(markdown_engine_klass)
end
rescue LoadError
$stderr.puts "Requested Markdown engine (#{markdown_engine}) not found. Maybe the gem needs to be installed and required?"
end
end
end
alias :included :registered
end
end
end
end

View file

@ -0,0 +1,38 @@
require "redcarpet"
module Middleman
module Renderers
class RedcarpetTemplate < ::Tilt::RedcarpetTemplate::Redcarpet2
# Overwrite built-in Tilt version.
# Don't overload :renderer option with smartypants
# Supper renderer-level options
def generate_renderer
return options.delete(:renderer) if options.has_key?(:renderer)
# Pick a renderer
renderer = ::Redcarpet::Render::HTML
# Support SmartyPants
if options.delete(:smartypants)
renderer = Class.new(renderer) do
include ::Redcarpet::Render::SmartyPants
end
end
# Renderer Options
possible_render_opts = [:filter_html, :no_images, :no_links, :no_styles, :safe_links_only, :with_toc_data, :hard_wrap, :xhtml]
render_options = possible_render_opts.inject({}) do |sum, opt|
sum[opt] = options.delete(opt) if options.has_key?(opt)
sum
end
renderer.new(render_options)
end
end
::Tilt.register RedcarpetTemplate, 'markdown', 'mkd', 'md'
end
end

View file

@ -0,0 +1,85 @@
require "sass"
module Middleman
module Renderers
# Sass renderer
module Sass
# Setup extension
class << self
# Once registered
def registered(app)
# Default sass options
app.set :sass, {}
app.before_configuration do
template_extensions :scss => :css,
:sass => :css
end
# Tell Tilt to use it as well (for inline sass blocks)
::Tilt.register 'sass', SassPlusCSSFilenameTemplate
::Tilt.prefer(SassPlusCSSFilenameTemplate)
# Tell Tilt to use it as well (for inline scss blocks)
::Tilt.register 'scss', ScssPlusCSSFilenameTemplate
::Tilt.prefer(ScssPlusCSSFilenameTemplate)
end
alias :included :registered
end
# A SassTemplate for Tilt which outputs debug messages
class SassPlusCSSFilenameTemplate < ::Tilt::SassTemplate
# Define the expected syntax for the template
# @return [Symbol]
def syntax
:sass
end
def prepare; end
# Add exception messaging
# @param [Class] context
# @param [Hash] locals
# @return [String]
def evaluate(context, locals, &block)
@context = context
@engine = ::Sass::Engine.new(data, sass_options)
begin
@engine.render
rescue ::Sass::SyntaxError => e
::Sass::SyntaxError.exception_to_css(e, :full_exception => true)
end
end
private
# Change Sass path, for url functions, to the build folder if we're building
# @return [Hash]
def sass_options
location_of_sass_file = File.expand_path(@context.source, @context.root)
parts = basename.split('.')
parts.pop
css_filename = File.join(location_of_sass_file, @context.css_dir, parts.join("."))
options.merge(:filename => eval_file, :line => line, :syntax => syntax, :css_filename => css_filename)
end
end
# SCSS version of the above template
class ScssPlusCSSFilenameTemplate < SassPlusCSSFilenameTemplate
# Define the expected syntax for the template
# @return [Symbol]
def syntax
:scss
end
end
end
end
end

View file

@ -0,0 +1,30 @@
# Load gem
require "slim"
module Middleman
module Renderers
# Slim renderer
module Slim
# Setup extension
class << self
# Once registered
def registered(app)
app.before_configuration do
template_extensions :slim => :html
end
# Setup Slim options to work with partials
::Slim::Engine.set_default_options(
:buffer => '@_out_buf',
:generator => ::Temple::Generators::StringBuffer
)
end
alias :included :registered
end
end
end
end