Sha256: f7d4f2fb1f831f5d1d471d8f6c01b909ddaeba7fcb57e04802f02117d214d0f7

Contents?: true

Size: 1.84 KB

Versions: 3

Compression:

Stored size: 1.84 KB

Contents

# -*- coding: UTF-8 -*-
#
# Copyright 2013 whiteleaf. All rights reserved.
#

require "yaml"

class SiteSetting
  def self.load_file(path)
    new(path)
  end

  def [](key)
    replace_group_values(key)
  end

  def []=(key, value)
    @match_values[key] = value
  end

  def clear
    @match_values.clear
  end

  def initialize(path)
    @match_values = {}
    @yaml_setting = YAML.load_file(path)
  end

  def multi_match(source, *keys)
    match_data = nil
    keys.each do |key|
      setting_value = self[key] or next
      (setting_value.kind_of?(Array) ? setting_value : [setting_value]).each do |value|
        match_data = source.match(/#{value}/m)
        if match_data
          @match_values[key] = value       # yamlのキーでもmatch_valuesに設定しておくが、
          update_match_values(match_data)  # ←ここで同名のグループ名が定義されていたら上書きされるので注意
                                           # 例えば、title: <title>(?<title>.+?)</title> と定義されていた場合、
                                           # @match_values["title"] には (?<title>.+?) 部分の要素が反映される
          break
        end
      end
    end
    match_data
  end

  def update_match_values(match_data)
    match_data.names.each do |name|
      @match_values[name] = match_data[name] || ""
    end
  end

  def replace_group_values(key, option_values = {})
    dest = option_values[key] || @match_values[key] || @yaml_setting[key]
    if dest.kind_of?(TrueClass) || dest.kind_of?(FalseClass)
      return dest
    end
    return nil unless dest
    values = @yaml_setting.merge(@match_values).merge(option_values)
    result = dest.dup
    result.gsub!(/\\\\k<(.+?)>/) do |match|
      values[$1] || match
    end
    result
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
narou-1.1.1 lib/sitesetting.rb
narou-1.1.0 lib/sitesetting.rb
narou-1.1.0.rc2 lib/sitesetting.rb