class Jekyll::Locale::Handler

Constants

DEFAULT_CONFIG

Attributes

available_locales[R]
config[R]
content_dirname[R]
current_locale[W]
default_locale[R]
locale_data[R]
locale_dates[R]
site[R]
user_locales[R]

Public Class Methods

new(site) click to toggle source
# File lib/jekyll/locale/handler.rb, line 18
def initialize(site)
  @site   = site
  config  = site.config["localization"]
  @config = if config.is_a?(Hash)
              Jekyll::Utils.deep_merge_hashes(DEFAULT_CONFIG, config)
            else
              DEFAULT_CONFIG
            end
  initialize_locales
  @content_dirname = mode == "auto" ? "" : fetch("content_dir")
  @snakeified_keys = {}
end

Public Instance Methods

current_locale() click to toggle source
# File lib/jekyll/locale/handler.rb, line 51
def current_locale
  @current_locale ||= default_locale
end
data() click to toggle source
# File lib/jekyll/locale/handler.rb, line 42
def data
  locale_data[snakeified_keys(current_locale)] ||
    locale_data[snakeified_keys(default_locale)] || {}
end
inspect() click to toggle source
# File lib/jekyll/locale/handler.rb, line 55
def inspect
  "#<#{self.class} @site=#{site}>"
end
read() click to toggle source
# File lib/jekyll/locale/handler.rb, line 47
def read
  mode == "auto" ? auto_localization : manual_localization
end
reset() click to toggle source
# File lib/jekyll/locale/handler.rb, line 31
def reset
  @locale_data  = {}
  @locale_dates = {}
  @portfolio = nil
end
setup() click to toggle source
# File lib/jekyll/locale/handler.rb, line 37
def setup
  Locale::DateTimeHandler.bootstrap(self)
  setup_data if @locale_data.empty?
end

Private Instance Methods

append_document(klass, canon_doc, locale) click to toggle source
# File lib/jekyll/locale/handler.rb, line 176
def append_document(klass, canon_doc, locale)
  locale_doc = klass.new(canon_doc, locale)
  return unless locale_doc.publish?

  canon_doc.locale_pages    << locale_doc
  canon_doc.collection.docs << locale_doc
  site.docs_to_write        << locale_doc
  site.docs_to_write.uniq!
end
append_page(klass, canon_page, locale) click to toggle source
# File lib/jekyll/locale/handler.rb, line 167
def append_page(klass, canon_page, locale)
  locale_page = klass.new(canon_page, locale)
  return unless locale_page.publish?

  canon_page.locale_pages << locale_page
  site.pages              << locale_page
  site.pages.uniq!
end
auto_localization() click to toggle source
# File lib/jekyll/locale/handler.rb, line 141
def auto_localization
  user_locales.each do |locale|
    portfolio.each do |canon_doc|
      next if canon_doc.relative_path =~ exclusion_regex
      append_page(Locale::AutoPage, canon_doc, locale)
    end
  end
end
configure_locale_date(date_defaults, data) click to toggle source
# File lib/jekyll/locale/handler.rb, line 120
def configure_locale_date(date_defaults, data)
  return date_defaults unless data.is_a?(Hash)

  Jekyll::Utils.deep_merge_hashes(
    date_defaults, Utils.recursive_symbolize_hash_keys(data)
  )
end
exclusion_regex() click to toggle source
# File lib/jekyll/locale/handler.rb, line 206
def exclusion_regex
  @exclusion_regex ||= Regexp.new("\\A(?:#{Regexp.union(Array(config["exclude_set"]))})")
end
fetch(key) click to toggle source
# File lib/jekyll/locale/handler.rb, line 197
def fetch(key)
  value   = config[key]
  default = DEFAULT_CONFIG[key]
  return default unless value.class == default.class
  return default if value.to_s.empty?

  value
end
initialize_locales() click to toggle source
# File lib/jekyll/locale/handler.rb, line 76
def initialize_locales
  default_locale_id  = fetch("locale")
  default_metadata   = {}
  @available_locales = [default_locale_id]
  @user_locales      = []

  locales_set_config = @config["locales_set"]
  locales_set_config = case locales_set_config
                       when Array
                         Hash[locales_set_config.map { |locale| [locale, {}] }]
                       when Hash
                         locales_set_config
                       else
                         {}
                       end

  locales_set_config.each do |locale_id, metadata|
    if locale_id == default_locale_id
      default_metadata = metadata
      next
    end

    @available_locales << locale_id
    @user_locales << Locale::Identity.new(locale_id, metadata)
  end

  @default_locale = Locale::Identity.new(default_locale_id, default_metadata)
end
manual_localization() click to toggle source
# File lib/jekyll/locale/handler.rb, line 150
def manual_localization
  user_locales.each do |locale|
    portfolio.each do |canon_doc|
      loc_page_path = site.in_source_dir(content_dirname, locale.id, canon_doc.relative_path)
      next unless File.exist?(loc_page_path)
      next unless Jekyll::Utils.has_yaml_header?(loc_page_path)

      case canon_doc
      when Jekyll::Page
        append_page(Locale::Page, canon_doc, locale)
      when Jekyll::Document
        append_document(Locale::Document, canon_doc, locale)
      end
    end
  end
end
mode() click to toggle source
# File lib/jekyll/locale/handler.rb, line 190
def mode
  @mode ||= begin
    value = config["mode"]
    value == "auto" ? value : DEFAULT_CONFIG["mode"]
  end
end
portfolio() click to toggle source

Instances of Jekyll class that include `Jekyll::Locale::Support` mixin (which are simply Jekyll::Page and Jekyll::Document)

# File lib/jekyll/locale/handler.rb, line 130
def portfolio
  @portfolio ||= begin
    html_pages = site.site_payload["site"]["html_pages"] || []
    html_pages.reject! { |page| page.name == "404.html" }

    (site.docs_to_write + html_pages).select do |doc|
      doc.is_a?(Jekyll::Locale::Support)
    end
  end
end
process_locale_data(loc, data_hash) click to toggle source
# File lib/jekyll/locale/handler.rb, line 105
def process_locale_data(loc, data_hash)
  locale = snakeified_keys(loc)
  @locale_data[locale] = {}

  date_data = Locale::DateTimeHandler::DATETIME_DEFAULTS
  data_hash.each do |key, value|
    if key == "locale_date"
      date_data = configure_locale_date(date_data, value)
    else
      @locale_data[locale][snakeified_keys(key)] = value
    end
  end
  @locale_dates[loc] = date_data
end
setup_data() click to toggle source
# File lib/jekyll/locale/handler.rb, line 63
def setup_data
  locales_dir = fetch("data_dir")
  base_data   = site.site_data[locales_dir]
  return @locale_data unless base_data.is_a?(Hash)

  base_data.each do |locale_id, data|
    next unless data.is_a?(Hash)
    process_locale_data(locale_id, data)
  end

  nil
end
snakeified_keys(key) click to toggle source
# File lib/jekyll/locale/handler.rb, line 186
def snakeified_keys(key)
  @snakeified_keys[key] ||= Utils.snakeify(key)
end