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