Sha256: 9b28cfc6255b8743252b13f5a3dbd4741ac4ccb6e8a1fca42b23e3ea6402f2fc

Contents?: true

Size: 1.75 KB

Versions: 1

Compression:

Stored size: 1.75 KB

Contents

require 'slodown'
require 'sass'
require 'tilt'
require 'slim'
require 'toml'
require 'mime-types'
require 'json'

module Flutterby
  class File < Entity
    attr_accessor :source, :body

    def reload!
      @body = nil
      super
    end

    def read
      @source = ::File.read(fs_path)

      # Extract date from name
      if name =~ %r{^(\d\d\d\d\-\d\d?\-\d\d?)\-}
        @data['date'] = Time.parse($1)
      end

      # Read remaining data from frontmatter. Data in frontmatter
      # will always have precedence!
      @data.merge! parse_frontmatter

      # Do some extra processing depending on extension
      meth = "read_#{ext}"
      send(meth) if respond_to?(meth)
    end

    def parse_frontmatter
      data = {}

      # YAML Front Matter
      if @source.sub!(/\A\-\-\-\n(.+)\n\-\-\-\n/m, "")
        data.merge! YAML.load($1)
      end

      # TOML Front Matter
      if @source.sub!(/\A\+\+\+\n(.+)\n\+\+\+\n/m, "")
        data.merge! TOML.parse($1)
      end

      data
    end

    def body
      Filters.apply!(self) if @body.nil?
      @body
    end

    def page?
      ext == "html"
    end

    def view
      @view ||= View.for(self)
    end

    def read_json
      data.merge!(JSON.parse(@source))
    end

    def read_yaml
      data.merge!(YAML.load(@source))
    end

    def apply_layout(input)
      walk_up(input) do |e, current|
        if layout = e.sibling("_layout")
          tilt = Tilt[layout.ext].new { layout.source }
          tilt.render(view) { current }
        else
          current
        end
      end
    end

    def apply_layout?
      page?
    end

    def render(layout: true)
      (layout && apply_layout?) ? apply_layout(body) : body
    end

    def write_static(path)
      ::File.write(path, render)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
flutterby-0.0.10 lib/flutterby/file.rb