Class: Jekyll::Site

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll/polyglot/patches/jekyll/site.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#active_langObject

Returns the value of attribute active_lang.



5
6
7
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 5

def active_lang
  @active_lang
end

#default_langObject (readonly)

Returns the value of attribute default_lang.



4
5
6
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 4

def default_lang
  @default_lang
end

#exclude_from_localizationObject (readonly)

Returns the value of attribute exclude_from_localization.



4
5
6
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 4

def exclude_from_localization
  @exclude_from_localization
end

#file_langsObject

Returns the value of attribute file_langs.



5
6
7
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 5

def file_langs
  @file_langs
end

#lang_varsObject (readonly)

Returns the value of attribute lang_vars.



4
5
6
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 4

def lang_vars
  @lang_vars
end

#languagesObject (readonly)

Returns the value of attribute languages.



4
5
6
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 4

def languages
  @languages
end

Instance Method Details

#absolute_url_regex(url, disabled = false) ⇒ Object

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.



193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 193

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{#{start}=\"?#{url}#{@baseurl}\/((?:#{regex}[^,'\"\s\/?\.#]+\.?)*(?:\/[^\]\[\)\(\"\'\s]*)?)\"}
end

#coordinate_documents(docs) ⇒ Object

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



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 119

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, '/')
    doc.data['permalink'] = url
    # skip this document if it has already been processed
    next if @file_langs[url] == @active_lang
    # skip this document if it has a fallback and it isn't assigned to the active language
    next if @file_langs[url] == @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[url] = doc
    @file_langs[url] = lang
  end
  approved.values
end

#correct_nonrelativized_absolute_urls(doc, regex, url) ⇒ Object



219
220
221
222
223
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 219

def correct_nonrelativized_absolute_urls(doc, regex, url)
  return if doc.output.nil?

  doc.output.gsub!(regex, "href=\"#{url}#{@baseurl}/" + '\1"')
end

#correct_nonrelativized_urls(doc, regex) ⇒ Object



225
226
227
228
229
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 225

def correct_nonrelativized_urls(doc, regex)
  return if doc.output.nil?

  doc.output.gsub!(regex, "href=\"#{@baseurl}/" + '\1"')
end

#derive_lang_from_path(doc) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 98

def derive_lang_from_path(doc)
  if !@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]
  else
    return nil
  end
end

#document_url_regexObject

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



162
163
164
165
166
167
168
169
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 162

def document_url_regex
  regex = ''
  @languages.each do |lang|
    regex += "([\/\.]#{lang}[\/\.])|"
  end
  regex.chomp! '|'
  %r{#{regex}}
end

#fetch_languagesObject



21
22
23
24
25
26
27
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 21

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

#prepareObject



7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 7

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

#processObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 30

def process
  prepare
  all_langs = (@languages + [@default_lang]).uniq
  if @parallel_localization
    pids = {}
    all_langs.each do |lang|
      pids[lang] = fork do
        process_language lang
      end
    end
    Signal.trap('INT') do
      all_langs.each do |lang|
        puts "Killing #{pids[lang]} : #{lang}"
        kill('INT', pids[lang])
      end
    end
    all_langs.each do |lang|
      waitpid pids[lang]
      detach pids[lang]
    end
  else
    all_langs.each do |lang|
      process_language lang
    end
  end
end

#process_active_languageObject



87
88
89
90
91
92
93
94
95
96
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 87

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_languageObject



81
82
83
84
85
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 81

def process_default_language
  old_include = @include
  process_orig
  @include = old_include
end

#process_documents(docs) ⇒ Object

performs any necesarry operations on the documents before rendering them



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 141

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) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 69

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_origObject



29
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 29

alias_method :process_orig, :process

#relative_url_regex(disabled = false) ⇒ Object

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.



175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 175

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) ⇒ Object



213
214
215
216
217
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 213

def relativize_absolute_urls(doc, regex, url)
  return if doc.output.nil?

  doc.output.gsub!(regex, "href=\"#{url}#{@baseurl}/#{@active_lang}/" + '\1"')
end

#relativize_urls(doc, regex) ⇒ Object



207
208
209
210
211
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 207

def relativize_urls(doc, regex)
  return if doc.output.nil?

  doc.output.gsub!(regex, "href=\"#{@baseurl}/#{@active_lang}/" + '\1"')
end

#site_payloadObject



58
59
60
61
62
63
64
65
66
67
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 58

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

#site_payload_origObject



57
# File 'lib/jekyll/polyglot/patches/jekyll/site.rb', line 57

alias_method :site_payload_orig, :site_payload