Sha256: d6cc330f8e4403834041105227983ae4a33ae3c4b83ba9c7d9c2dbadaad8f16c

Contents?: true

Size: 1.71 KB

Versions: 1

Compression:

Stored size: 1.71 KB

Contents

module Polygon
  class ContentLoader

    def register(*extensions, &loader)
      raise ArgumentError, "Extensions expected" if extensions.empty?
      loaders << [extensions, loader]
      self
    end

    def extensions
      loaders.map(&:first).flatten
    end

    def load(file)
      file = Path(file)
      unless l = loader(file)
        raise "Unable to load #{file.basename} (unrecognized extension)" 
      end
      l.call(file)
    end

    ################################################################### Loaders

    def enable_yaml!(*ext)
      require 'yaml'
      ext = [".yml", ".yaml"] if ext.empty?
      register(*ext) do |f| 
        YAML.load(f.read) 
      end
    end

    def enable_json!(*ext)
      require 'json'
      ext = [".json"] if ext.empty?
      register(*ext) do |f| 
        JSON.load(f.read) 
      end
    end

    def enable_ruby!(*ext)
      ext = [".rb", ".ruby"] if ext.empty?
      register(*ext) do |f| 
        ::Kernel.eval(f.read, TOPLEVEL_BINDING, f.to_s) 
      end
    end

    def enable_yaml_front_matter!(*ext)
      ext = [".md"] if ext.empty?
      register(*ext) do |f| 
        content = f.read.force_encoding(Encoding::UTF_8)
        if content =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
          YAML::load($1).merge("content" => $')
        else
          {"content" => content}
        end
      end
    end

    def enable_all!
      enable_yaml!
      enable_json!
      enable_ruby!
      enable_yaml_front_matter!
    end

    private

    def loaders
      @loaders ||= []
    end

    def loader(file, extname = Path(file).extname)
      loader = loaders.find{|ext,_| ext.include?(extname)}
      loader && loader.last
    end

  end # class ContentLoader
end # module Polygon

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
polygon-0.0.3 lib/polygon/content_loader.rb