corrade-nucleus-nucleons – Blame information for rev 20
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
20 | office | 1 | module Jekyll |
2 | @parsedlangs = {} |
||
3 | def self.langs |
||
4 | @parsedlangs |
||
5 | end |
||
6 | def self.setlangs(l) |
||
7 | @parsedlangs = l |
||
8 | end |
||
9 | class Site |
||
10 | alias :process_org :process |
||
11 | def process |
||
12 | if !self.config['baseurl'] |
||
13 | self.config['baseurl'] = "" |
||
14 | end |
||
15 | #Variables |
||
16 | config['baseurl_root'] = self.config['baseurl'] |
||
17 | baseurl_org = self.config['baseurl'] |
||
18 | languages = self.config['languages'] |
||
19 | exclude_org = self.exclude |
||
20 | dest_org = self.dest |
||
21 | |||
22 | #Loop |
||
23 | self.config['lang'] = self.config['default_lang'] = languages.first |
||
24 | puts |
||
25 | puts "Building site for default language: \"#{self.config['lang']}\" to: #{self.dest}" |
||
26 | process_org |
||
27 | languages.drop(1).each do |lang| |
||
28 | |||
29 | # Build site for language lang |
||
30 | @dest = @dest + "/" + lang |
||
31 | self.config['baseurl'] = self.config['baseurl'] + "/" + lang |
||
32 | self.config['lang'] = lang |
||
33 | |||
34 | # exclude folders or files from beeing copied to all the language folders |
||
35 | exclude_from_localizations = self.config['exclude_from_localizations'] || [] |
||
36 | @exclude = @exclude + exclude_from_localizations |
||
37 | |||
38 | puts "Building site for language: \"#{self.config['lang']}\" to: #{self.dest}" |
||
39 | process_org |
||
40 | |||
41 | #Reset variables for next language |
||
42 | @dest = dest_org |
||
43 | @exclude = exclude_org |
||
44 | |||
45 | self.config['baseurl'] = baseurl_org |
||
46 | end |
||
47 | Jekyll.setlangs({}) |
||
48 | puts 'Build complete' |
||
49 | end |
||
50 | |||
51 | alias :read_posts_org :read_posts |
||
52 | def read_posts(dir) |
||
53 | if dir == '' |
||
54 | read_posts("_i18n/#{self.config['lang']}/") |
||
55 | else |
||
56 | read_posts_org(dir) |
||
57 | end |
||
58 | end |
||
59 | end |
||
60 | |||
61 | class LocalizeTag < Liquid::Tag |
||
62 | |||
63 | def initialize(tag_name, key, tokens) |
||
64 | super |
||
65 | @key = key.strip |
||
66 | end |
||
67 | |||
68 | def render(context) |
||
69 | if "#{context[@key]}" != "" #Check for page variable |
||
70 | key = "#{context[@key]}" |
||
71 | else |
||
72 | key = @key |
||
73 | end |
||
74 | lang = context.registers[:site].config['lang'] |
||
75 | unless Jekyll.langs.has_key?(lang) |
||
76 | puts "Loading translation from file #{context.registers[:site].source}/_i18n/#{lang}.yml" |
||
77 | Jekyll.langs[lang] = YAML.load_file("#{context.registers[:site].source}/_i18n/#{lang}.yml") |
||
78 | end |
||
79 | translation = Jekyll.langs[lang].access(key) if key.is_a?(String) |
||
80 | if translation.nil? or translation.empty? |
||
81 | translation = Jekyll.langs[context.registers[:site].config['default_lang']].access(key) |
||
82 | puts "Missing i18n key: #{lang}:#{key}" |
||
83 | puts "Using translation '%s' from default language: %s" %[translation, context.registers[:site].config['default_lang']] |
||
84 | end |
||
85 | translation |
||
86 | end |
||
87 | end |
||
88 | |||
89 | module Tags |
||
90 | class LocalizeInclude < IncludeTag |
||
91 | def render(context) |
||
92 | if "#{context[@file]}" != "" #Check for page variable |
||
93 | file = "#{context[@file]}" |
||
94 | else |
||
95 | file = @file |
||
96 | end |
||
97 | |||
98 | includes_dir = File.join(context.registers[:site].source, '_i18n/' + context.registers[:site].config['lang']) |
||
99 | |||
100 | if File.symlink?(includes_dir) |
||
101 | return "Includes directory '#{includes_dir}' cannot be a symlink" |
||
102 | end |
||
103 | if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./ |
||
104 | return "Include file '#{file}' contains invalid characters or sequences" |
||
105 | end |
||
106 | |||
107 | Dir.chdir(includes_dir) do |
||
108 | choices = Dir['**/*'].reject { |x| File.symlink?(x) } |
||
109 | if choices.include?(file) |
||
110 | source = File.read(file) |
||
111 | partial = Liquid::Template.parse(source) |
||
112 | |||
113 | context.stack do |
||
114 | context['include'] = parse_params(context) if @params |
||
115 | contents = partial.render(context) |
||
116 | site = context.registers[:site] |
||
117 | ext = File.extname(file) |
||
118 | |||
119 | converter = site.converters.find { |c| c.matches(ext) } |
||
120 | contents = converter.convert(contents) unless converter.nil? |
||
121 | |||
122 | contents |
||
123 | end |
||
124 | else |
||
125 | "Included file '#{file}' not found in #{includes_dir} directory" |
||
126 | end |
||
127 | end |
||
128 | end |
||
129 | end |
||
130 | end |
||
131 | end |
||
132 | |||
133 | unless Hash.method_defined? :access |
||
134 | class Hash |
||
135 | def access(path) |
||
136 | ret = self |
||
137 | path.split('.').each do |p| |
||
138 | if p.to_i.to_s == p |
||
139 | ret = ret[p.to_i] |
||
140 | else |
||
141 | ret = ret[p.to_s] || ret[p.to_sym] |
||
142 | end |
||
143 | break unless ret |
||
144 | end |
||
145 | ret |
||
146 | end |
||
147 | end |
||
148 | end |
||
149 | |||
150 | Liquid::Template.register_tag('t', Jekyll::LocalizeTag) |
||
151 | Liquid::Template.register_tag('translate', Jekyll::LocalizeTag) |
||
152 | Liquid::Template.register_tag('tf', Jekyll::Tags::LocalizeInclude) |
||
153 | Liquid::Template.register_tag('translate_file', Jekyll::Tags::LocalizeInclude) |