Sha256: 397e9b31e3204e9cfd140a7ca924814fb8f575c54e172db2923e939819c3e551

Contents?: true

Size: 1.99 KB

Versions: 30

Compression:

Stored size: 1.99 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|
      value = values[$1]
      if value
        value.gsub(/\\\\k<(.+?)>/) do
          replace_group_values($1, option_values)
        end
      else
        match
      end
    end
    result
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
narou-1.4.5 lib/sitesetting.rb
narou-1.4.4 lib/sitesetting.rb
narou-1.4.3 lib/sitesetting.rb
narou-1.4.2.rc2 lib/sitesetting.rb
narou-1.4.2.rc1 lib/sitesetting.rb
narou-1.4.1.1 lib/sitesetting.rb
narou-1.4.1 lib/sitesetting.rb
narou-1.4.0 lib/sitesetting.rb
narou-1.3.5.1 lib/sitesetting.rb
narou-1.3.5 lib/sitesetting.rb
narou-1.3.4 lib/sitesetting.rb
narou-1.3.3 lib/sitesetting.rb
narou-1.3.2 lib/sitesetting.rb
narou-1.3.1 lib/sitesetting.rb
narou-1.3.0.1 lib/sitesetting.rb
narou-1.3.0 lib/sitesetting.rb
narou-1.2.9 lib/sitesetting.rb
narou-1.2.9.rc1 lib/sitesetting.rb
narou-1.2.8 lib/sitesetting.rb
narou-1.2.7 lib/sitesetting.rb