dash-docs/_plugins/alphab_for.rb
2013-10-21 23:45:57 -04:00

79 lines
2.4 KiB
Ruby

#alphab_for allows to loop in an array sorted by the translated value of
#each key using appropriate collation for the current language. In short,
#this is used to generate translated table of contents.
#Example:
#{% alphab_for v in page.voc %}
# ..
#{% endalphab_for %}
require 'yaml'
require 'ffi-icu'
module Jekyll
module AlphabForImpl
def render(context)
#load translations files
site = context.registers[:site].config
if !site.has_key?("loc")
site['loc'] = {}
site['langs'].each do |key,value|
site['loc'][key] = YAML.load_file('_translations/'+key+'.yml')[key]
end
end
#load collection and context variables
sorted_collection = collection_to_sort context
return if sorted_collection.empty?
lang = Liquid::Template.parse('{{page.lang}}').render context
page = Liquid::Template.parse('{{page.id}}').render context
#build translated array and associative hash
translated = []
assoc = {}
for key in sorted_collection do
next if !site['loc'][lang].has_key?(page) || !site['loc'][lang][page].has_key?(key) || site['loc'][lang][page][key].nil? || site['loc'][lang][page][key] == ' '
t = site['loc'][lang][page][key]
translated.push(t)
assoc[key] = t
end
#sort translated array using appropriate collation
translated = ICU::Collation.collate(lang, translated)
#recreate collection with new ordering
sorted_collection = []
for va in translated do
val = assoc.select{|k,v| v == va}
#compatibility with old ruby versions that return an Array
if val.is_a?(Array)
val = { val[0][0] => va }
end
val = val.keys[0]
sorted_collection.push(val)
end
#return modified array
original_name = @collection_name
result = nil
context.stack do
sorted_collection_name = "#{@collection_name}_sorted".sub('.', '_')
context[sorted_collection_name] = sorted_collection
@collection_name = sorted_collection_name
result = super
@collection_name = original_name
end
result
end
end
class AlphabForTag < Liquid::For
include AlphabForImpl
def collection_to_sort(context)
return context[@collection_name].dup
end
def end_tag
'endalphab_for'
end
end
end
Liquid::Template.register_tag('alphab_for', Jekyll::AlphabForTag)