class Zenweb::Config

Provides a hierarchical dictionary made of yaml fragments and files.

Any given page in zenweb can start with a YAML header. All files named “_config.yml” up the directory tree to the top are considered parents of that config. Access a config like you would any hash and you get inherited values.

Constants

Null
UTF_BOM

Attributes

parent[R]

The parent to this config or nil if we’re at the top level _config.yml.

path[R]

The path to this config’s file

site[R]

The shared site instance

Public Class Methods

new(site, path) click to toggle source

Create a new Config for site at a given path.

# File lib/zenweb/config.rb, line 35
def initialize site, path
  @site, @path, @parent = site, path, nil

  File.each_parent path, "_config.yml" do |config|
    next unless File.file? config
    @parent = site.configs[config] unless config == path
    break if @parent
  end

  @parent ||= Config::Null
end
split(path) click to toggle source

Splits a file and returns the yaml header and body, as applicable.

split("_config.yml")   => [config, nil]
split("blah.txt")      => [nil,    content]
split("index.html.md") => [config, content]
# File lib/zenweb/config.rb, line 68
def self.split path
  body, yaml_file = nil, false
  if String === path and File.file? path
    body = File.binread path

    raise ArgumentError, "UTF BOM not supported: #{path}" if
      body.start_with? UTF_BOM

    yaml_file = File.extname(path) == ".yml"

    body.force_encoding "utf-8" if File::RUBY19
  else
    body = path.content
  end

  if yaml_file then
    [body, nil]
  elsif body.start_with? "---" then
    body.split(/^\.\.\.$/, 2)
  else
    [nil, body.valid_encoding? ? body : body.force_encoding('ASCII-8BIT')]
  end

end

Public Instance Methods

[](k) click to toggle source

Access value at k. The value can be inherited from the parent configs.

# File lib/zenweb/config.rb, line 50
def [] k
  h.key?(k.to_s) ? h[k.to_s] : parent[k]
end
key?(k) click to toggle source
# File lib/zenweb/config.rb, line 54
def key? k
  h.key?(k.to_s) or parent.key?(k)
end
maybe_load_yaml(config) click to toggle source
# File lib/zenweb/config.rb, line 104
def maybe_load_yaml config
  if config then
    if YAML.respond_to? :safe_load_file then
      YAML.safe_load config, permitted_classes: [Time]
    else
      YAML.load config
    end
  end
end
wire() click to toggle source

Wire up this config to the rest of the rake dependencies.

# File lib/zenweb/config.rb, line 130
def wire
  @wired ||= false # HACK
  return if @wired
  @wired = true

  file self.path

  file self.path => self.parent.path if self.parent.path # HACK

  self.parent.wire
end