class Wovnrb::Lang

Constants

LANG

Attributes

lang_code[R]

Public Class Methods

get_code(lang_name) click to toggle source
# File lib/wovnrb/lang.rb, line 95
def self.get_code(lang_name)
  return nil if lang_name.nil?
  return lang_name if LANG[lang_name]

  custom_lang_aliases = Store.instance.settings['custom_lang_aliases']
  custom_lang = LANG[custom_lang_aliases.invert[lang_name]]
  return custom_lang[:code] if custom_lang

  LANG.each do |_k, l|
    return l[:code] if lang_name.casecmp(l[:name]).zero? || lang_name.casecmp(l[:en]).zero? || lang_name.casecmp(l[:code]).zero?
  end
  nil
end
get_lang(lang) click to toggle source
# File lib/wovnrb/lang.rb, line 109
def self.get_lang(lang)
  lang_code = get_code(lang)
  LANG[lang_code]
end
iso_639_1_normalization(lang_code) click to toggle source

Provides the ISO639-1 code for a given lang code. Source: support.google.com/webmasters/answer/189077?hl=en

@param lang_code [String] lang_code Code of the language.

@return [String] The ISO639-1 code of the language.

# File lib/wovnrb/lang.rb, line 91
def self.iso_639_1_normalization(lang_code)
  lang_code.sub(/zh-CHT/i, 'zh-Hant').sub(/zh-CHS/i, 'zh-Hans')
end
new(lang_name) click to toggle source
# File lib/wovnrb/lang.rb, line 114
def initialize(lang_name)
  @lang_code = Lang.get_code(lang_name)
end

Public Instance Methods

add_lang_code(href, pattern, headers) click to toggle source

Adds language code to URL in “href” variable by “pattern” variable and own @lang_code.

When @lang_code is 'ja', add_lang_code('https://wovn.io', 'path', headers) returns 'https://wovn.io/ja/'.

If you want to know more examples, see also test/lib/lang_test.rb.

@param [String] href original URL. @param [String] pattern url_pattern of the settings. ('path', 'subdomain' or 'query') @param [Wovnrb::Header] headers instance of Wovn::Header. It generates new env variable for original request. @return [String] URL added langauge code.

# File lib/wovnrb/lang.rb, line 128
def add_lang_code(href, pattern, headers)
  return href if href =~ /^(#.*)?$/

  settings = Store.instance.settings
  code_to_add = settings['custom_lang_aliases'][@lang_code] || @lang_code
  lang_param_name = settings['lang_param_name']
  # absolute links
  new_href = href
  if href && href =~ /^(https?:)?\/\//i
    # in the future, perhaps validate url rather than using begin rescue
    # "#{url =~ /\// ? 'http:' : ''}#{url}" =~ URI::regexp
    begin
      uri = Addressable::URI.parse(href)
    rescue
      return new_href
    end
    # only add lang if it's an internal link
    # DNS names are case insensitive
    if uri.host.downcase === headers.host.downcase
      case pattern
      when 'subdomain'
        sub_d = href.match(/\/\/([^.]*)\./)[1]
        sub_code = Lang.get_code(sub_d)
        new_href = if sub_code && sub_code.casecmp(code_to_add).zero?
                     href.sub(Regexp.new(code_to_add, 'i'), code_to_add.downcase)
                   else
                     href.sub(/(\/\/)([^.]*)/, "\\1#{code_to_add.downcase}.\\2")
                   end
      when 'query'
        new_href = add_query_lang_code(href, code_to_add, lang_param_name)
      else # path
        new_href = href.sub(/([^.]*\.[^\/]*)(\/|$)/, "\\1/#{code_to_add}/")
      end
    end
  elsif href
    case pattern
    when 'subdomain'
      lang_url = "#{headers.protocol}://#{code_to_add.downcase}.#{headers.host}"
      current_dir = headers.pathname.sub(/[^\/]*\.[^.]{2,6}$/, '')
      new_href = case href
                 when /^\.\..*$/
                   # ../path
                   "#{lang_url}/#{href.gsub(/^\.\.\//, '')}"
                 when /^\..*$/
                   # ./path
                   "#{lang_url}#{current_dir}/#{href.gsub(/^\.\//, '')}"
                 when /^\/.*$/
                   # /path
                   lang_url + href
                 else
                   # path
                   "#{lang_url}#{current_dir}/#{href}"
                 end
    when 'query'
      new_href = add_query_lang_code(href, code_to_add, lang_param_name)
    else # path
      if href =~ /^\//
        new_href = "/#{code_to_add}#{href}"
      else
        current_dir = headers.pathname.sub(/[^\/]*\.[^.]{2,6}$/, '')
        current_dir = '/' if current_dir == ''
        new_href = "/#{code_to_add}#{current_dir}#{href}"
      end
    end
  end

  new_href
end

Private Instance Methods

add_query_lang_code(href, lang_code, lang_param_name) click to toggle source
# File lib/wovnrb/lang.rb, line 252
def add_query_lang_code(href, lang_code, lang_param_name)
  query_separator = href =~ /\?/ ? '&' : '?'

  href.sub(/(#|$)/, "#{query_separator}#{lang_param_name}=#{lang_code}\\1")
end
get_langs(values) click to toggle source
# File lib/wovnrb/lang.rb, line 242
def get_langs(values)
  langs = Set.new
  (values['text_vals'] || {}).merge(values['img_vals'] || {}).each do |_key, index|
    index.each do |l, _val|
      langs.add(l)
    end
  end
  langs
end
index_href_for_encoding_and_decoding(dom) click to toggle source
# File lib/wovnrb/lang.rb, line 199
def index_href_for_encoding_and_decoding(dom)
  result = {}
  dom.xpath('//*[@href]').each do |a_tag|
    url = a_tag['href']
    begin
      encoded_url = Addressable::URI.parse(url).normalize.to_s
      result[encoded_url] = url if encoded_url != url
    rescue Addressable::URI::InvalidURIError => e
      WovnLogger.instance.error("Failed parse url : #{url}#{e.message}")
    end
  end
  result
end
replace_dom_values(dom, values, store, url, headers) click to toggle source
# File lib/wovnrb/lang.rb, line 213
def replace_dom_values(dom, values, store, url, headers)
  text_index = values['text_vals'] || {}
  html_text_index = values['html_text_vals'] || {}
  src_index = values['img_vals'] || {}
  img_src_prefix = values['img_src_prefix'] || ''
  host_aliases = values['host_aliases'] || []

  replacers = []
  # add lang code to anchors href if not default lang
  if @lang_code != store.settings['default_lang']
    pattern = store.settings['url_pattern']
    replacers << LinkReplacer.new(store, pattern, headers)
  end

  replacers << if html_text_index.empty?
                 TextReplacer.new(store, text_index)
               else
                 UnifiedValues::TextReplacer.new(store, html_text_index)
               end
  replacers << MetaReplacer.new(store, text_index, pattern, headers)
  replacers << InputReplacer.new(store, text_index)
  replacers << ImageReplacer.new(store, url, text_index, src_index, img_src_prefix, host_aliases)
  replacers << ScriptReplacer.new(store) if dom.html?

  replacers.each do |replacer|
    replacer.replace(dom, self)
  end
end