class Liquid::LocalFileSystem

This implements an abstract file system which retrieves template files named in a manner similar to Rails partials, ie. with the template name prefixed with an underscore. The extension “.liquid” is also added.

For security reasons, template paths are only allowed to contain letters, numbers, and underscore.

Example:

file_system = ::new(“/some/path”)

file_system.full_path(“mypartial”) # => “/some/path/_mypartial.liquid” file_system.full_path(“dir/mypartial”) # => “/some/path/dir/_mypartial.liquid”

Optionally in the second argument you can specify a custom pattern for template filenames. The Kernel::sprintf format specification is used. Default pattern is “_%s.liquid”.

Example:

file_system = ::new(“/some/path”, “%s.html”)

file_system.full_path(“index”) # => “/some/path/index.html”

Attributes

root[RW]

Public Class Methods

new(root, pattern = "_%s.liquid".freeze) click to toggle source
# File lib/liquid/file_system.rb, line 47
def initialize(root, pattern = "_%s.liquid".freeze)
  @root = root
  @pattern = pattern
end

Public Instance Methods

full_path(template_path) click to toggle source
# File lib/liquid/file_system.rb, line 59
def full_path(template_path)
  raise FileSystemError, "Illegal template name '#{template_path}'" unless template_path =~ /\A[^.\/][a-zA-Z0-9_\/]+\z/

  full_path = if template_path.include?('/'.freeze)
    File.join(root, File.dirname(template_path), @pattern % File.basename(template_path))
  else
    File.join(root, @pattern % template_path)
  end

  raise FileSystemError, "Illegal template path '#{File.expand_path(full_path)}'" unless File.expand_path(full_path) =~ /\A#{File.expand_path(root)}/

  full_path
end
read_template_file(template_path, context) click to toggle source
# File lib/liquid/file_system.rb, line 52
def read_template_file(template_path, context)
  full_path = full_path(template_path)
  raise FileSystemError, "No such template '#{template_path}'" unless File.exists?(full_path)

  File.read(full_path)
end