class Jekyll::Site

Attributes

active_lang[RW]
default_lang[R]
exclude_from_localization[R]
file_langs[RW]
lang_vars[R]
languages[R]

Public Instance Methods

absolute_url_regex(url, disabled = false) click to toggle source

a regex that matches absolute urls in a html document matches href=“baseurl/foo/bar-baz” and others like it avoids matching excluded files. prepare makes sure that all @exclude dirs have a trailing slash.

# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 241
def absolute_url_regex(url, disabled = false)
  regex = ''
  unless disabled
    @exclude.each do |x|
      regex += "(?!#{x})"
    end
    @languages.each do |x|
      regex += "(?!#{x}\/)"
    end
  end
  start = disabled ? 'ferh' : 'href'
  %r{(?<!hreflang="#{@default_lang}" )#{start}="?#{url}#{@baseurl}/((?:#{regex}[^,'"\s/?.]+\.?)*(?:/[^\]\[)("'\s]*)?)"}
end
assignPageRedirects(doc, docs) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 160
def assignPageRedirects(doc, docs)
  pageId = doc.data['page_id']
  if !pageId.nil? && !pageId.empty?
    lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
    langPrefix = lang === @default_lang ? '' : "#{lang}/"
    redirectDocs = docs.select do |dd|
      doclang = dd.data['lang'] || derive_lang_from_path(dd) || @default_lang
      dd.data['page_id'] == pageId && doclang != lang && dd.data['permalink'] != doc.data['permalink']
    end
    redirects = redirectDocs.map { |dd| dd.data['permalink'] }
    doc.data['redirect_from'] = redirects
  end
end
coordinate_documents(docs) click to toggle source

assigns natural permalinks to documents and prioritizes documents with active_lang languages over others. If lang is not set in front matter, then this tries to derive from the path, if the lang_from_path is set. otherwise it will assign the document to the default_lang

# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 133
def coordinate_documents(docs)
  regex = document_url_regex
  approved = {}
  docs.each do |doc|
    lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
    lang_exclusive = doc.data['lang-exclusive'] || []
    url = doc.url.gsub(regex, '/')
    page_id = doc.data['page_id'] || url
    doc.data['permalink'] = url if doc.data['permalink'].to_s.empty? && !doc.data['lang'].to_s.empty?

    # skip entirely if nothing to check
    next if @file_langs.nil?
    # skip this document if it has already been processed
    next if @file_langs[page_id] == @active_lang
    # skip this document if it has a fallback and it isn't assigned to the active language
    next if @file_langs[page_id] == @default_lang && lang != @active_lang
    # skip this document if it has lang-exclusive defined and the active_lang is not included
    next if !lang_exclusive.empty? && !lang_exclusive.include?(@active_lang)

    approved[page_id] = doc
    @file_langs[page_id] = lang
  end
  approved.values.each {|doc| assignPageRedirects(doc, docs) }
  approved.values.each {|doc| assignPageLanguagePermalinks(doc, docs) }
  approved.values
end
correct_nonrelativized_absolute_urls(doc, regex, url) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 271
def correct_nonrelativized_absolute_urls(doc, regex, url)
  return if doc.output.nil?

  modified_output = doc.output.dup
  modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/" + '\1"')
  doc.output = modified_output
end
correct_nonrelativized_urls(doc, regex) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 279
def correct_nonrelativized_urls(doc, regex)
  return if doc.output.nil?

  modified_output = doc.output.dup
  modified_output.gsub!(regex, "href=\"#{@baseurl}/" + '\1"')
  doc.output = modified_output
end
derive_lang_from_path(doc) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 111
def derive_lang_from_path(doc)
  unless @lang_from_path
    return nil
  end

  segments = doc.relative_path.split('/')
  if doc.relative_path[0] == '_' \
    && segments.length > 2 \
    && segments[1] =~ /^[a-z]{2,3}(:?[_-](:?[A-Za-z]{2}){1,2}){0,2}$/
    return segments[1]
  elsif segments.length > 1 \
    && segments[0] =~ /^[a-z]{2,3}(:?[_-](:?[A-Za-z]{2}){1,2}){0,2}$/
    return segments[0]
  end

  nil
end
document_url_regex() click to toggle source

a regex that matches urls or permalinks with i18n prefixes or suffixes matches /en/foo , .en/foo , foo.en/ and other simmilar default urls made by jekyll when parsing documents without explicitly set permalinks

# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 210
def document_url_regex
  regex = ''
  (@languages || []).each do |lang|
    regex += "([\/\.]#{lang}[\/\.])|"
  end
  regex.chomp! '|'
  /#{regex}/
end
fetch_languages() click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 23
def fetch_languages
  @default_lang = config.fetch('default_lang', 'en')
  @languages = config.fetch('languages', ['en']).uniq
  @keep_files += (@languages - [@default_lang])
  @active_lang = @default_lang
  @lang_vars = config.fetch('lang_vars', [])
end
prepare() click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 9
def prepare
  @file_langs = {}
  fetch_languages
  @parallel_localization = config.fetch('parallel_localization', true)
  @lang_from_path = config.fetch('lang_from_path', false)
  @exclude_from_localization = config.fetch('exclude_from_localization', []).map do |e|
    if File.directory?(e) && e[-1] != '/'
      "#{e}/"
    else
      e
    end
  end
end
process() click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 32
def process
  prepare
  all_langs = (@languages + [@default_lang]).uniq
  if @parallel_localization
    nproc = Etc.nprocessors
    pids = {}
    begin
      all_langs.each do |lang|
        pids[lang] = fork do
          process_language lang
        end
        while pids.length >= (lang == all_langs[-1] ? 1 : nproc)
          sleep 0.1
          pids.map do |lang, pid|
            next unless waitpid pid, Process::WNOHANG

            pids.delete lang
            raise "Polyglot subprocess #{pid} (#{lang}) failed (#{$?.exitstatus})" unless $?.success?
          end
        end
      end
    rescue Interrupt
      all_langs.each do |lang|
        next unless pids.key? lang

        puts "Killing #{pids[lang]} : #{lang}"
        kill('INT', pids[lang])
      end
    end
  else
    all_langs.each do |lang|
      process_language lang
    end
  end
  Jekyll::Hooks.trigger :polyglot, :post_write
end
Also aliased as: process_orig
process_active_language() click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 100
def process_active_language
  old_dest = @dest
  old_exclude = @exclude
  @file_langs = {}
  @dest = "#{@dest}/#{@active_lang}"
  @exclude += @exclude_from_localization
  process_orig
  @dest = old_dest
  @exclude = old_exclude
end
process_default_language() click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 94
def process_default_language
  old_include = @include
  process_orig
  @include = old_include
end
process_documents(docs) click to toggle source

performs any necessary operations on the documents before rendering them

# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 189
def process_documents(docs)
  # return if @active_lang == @default_lang

  url = config.fetch('url', false)
  rel_regex = relative_url_regex(false)
  abs_regex = absolute_url_regex(url, false)
  non_rel_regex = relative_url_regex(true)
  non_abs_regex = absolute_url_regex(url, true)
  docs.each do |doc|
    unless @active_lang == @default_lang then relativize_urls(doc, rel_regex) end
    correct_nonrelativized_urls(doc, non_rel_regex)
    if url
      unless @active_lang == @default_lang then relativize_absolute_urls(doc, abs_regex, url) end
      correct_nonrelativized_absolute_urls(doc, non_abs_regex, url)
    end
  end
end
process_language(lang) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 81
def process_language(lang)
  @active_lang = lang
  config['active_lang'] = @active_lang
  lang_vars.each do |v|
    config[v] = @active_lang
  end
  if @active_lang == @default_lang
  then process_default_language
  else
    process_active_language
  end
end
process_orig()
Alias for: process
relative_url_regex(disabled = false) click to toggle source

a regex that matches relative urls in a html document matches href=“baseurl/foo/bar-baz” href=“/foo/bar-baz” and others like it avoids matching excluded files. prepare makes sure that all @exclude dirs have a trailing slash.

# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 223
def relative_url_regex(disabled = false)
  regex = ''
  unless disabled
    @exclude.each do |x|
      regex += "(?!#{x})"
    end
    @languages.each do |x|
      regex += "(?!#{x}\/)"
    end
  end
  start = disabled ? 'ferh' : 'href'
  %r{#{start}="?#{@baseurl}/((?:#{regex}[^,'"\s/?.]+\.?)*(?:/[^\]\[)("'\s]*)?)"}
end
relativize_absolute_urls(doc, regex, url) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 263
def relativize_absolute_urls(doc, regex, url)
  return if doc.output.nil?

  modified_output = doc.output.dup
  modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/#{@active_lang}/" + '\1"')
  doc.output = modified_output
end
relativize_urls(doc, regex) click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 255
def relativize_urls(doc, regex)
  return if doc.output.nil?

  modified_output = doc.output.dup
  modified_output.gsub!(regex, "href=\"#{@baseurl}/#{@active_lang}/" + '\1"')
  doc.output = modified_output
end
site_payload() click to toggle source
# File lib/jekyll/polyglot/patches/jekyll/site.rb, line 70
def site_payload
  payload = site_payload_orig
  payload['site']['default_lang'] = default_lang
  payload['site']['languages'] = languages
  payload['site']['active_lang'] = active_lang
  lang_vars.each do |v|
    payload['site'][v] = active_lang
  end
  payload
end
Also aliased as: site_payload_orig
site_payload_orig()
Alias for: site_payload