Sha256: 51fb5c2918b0e30cea318e561063df4667c71ad88df5ea347f8088003eae64e7

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

require 'erubis'
require 'erubis/auto'
require 'sass'
require 'tilt'
require 'slim'
require 'builder'
require 'flutterby/markdown_formatter'

module Flutterby
  module Filters
    def self.apply!(node)
      node.body = node.source.try(:html_safe)

      # Apply all filters
      node.filters.each do |filter|
        meth = "process_#{filter}!"

        if Filters.respond_to?(meth)
          Filters.send(meth, node)
        elsif template = tilt(filter, node.body)
          node.body = template.render(node.view).html_safe
        else
          Flutterby.logger.warn "Unsupported filter '#{filter}' for #{node.url}"
        end
      end
    end

    def self.add(fmts, &blk)
      Array(fmts).each do |fmt|
        define_singleton_method("process_#{fmt}!", &blk)
      end
    end

    def self.tilt(format, body, options = {})
      default_options = {
        "erb" => { engine_class: Erubis::Auto::EscapedEruby }
      }

      options = default_options.fetch(format, {}).merge(options)

      t = Tilt[format] and t.new(options) { body }
    end
  end
end

Flutterby::Filters.add("rb") do |node|
  node.instance_eval(node.body)
end

Flutterby::Filters.add(["md", "markdown"]) do |node|
  node.body = Flutterby::MarkdownFormatter.new(node.body).complete.to_s.html_safe
end

Flutterby::Filters.add("scss") do |node|
  sass_options = {
    syntax: :scss,
    load_paths: []
  }

  if node.fs_path
    sass_options[:load_paths] << File.dirname(node.fs_path)
  end

  node.body = Sass::Engine.new(node.body, sass_options).render
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
flutterby-0.4.0 lib/flutterby/filters.rb
flutterby-0.3.1 lib/flutterby/filters.rb