[lib] Improve version menu rendering performance.
Project: http://git-wip-us.apache.org/repos/asf/cordova-docs/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-docs/commit/1fcfb55b Tree: http://git-wip-us.apache.org/repos/asf/cordova-docs/tree/1fcfb55b Diff: http://git-wip-us.apache.org/repos/asf/cordova-docs/diff/1fcfb55b Branch: refs/heads/master Commit: 1fcfb55b639aa7f0ac634f0ead9acc31cad6b1bc Parents: 1193c42 Author: Michael Brooks <[email protected]> Authored: Mon Jun 9 16:06:56 2014 -0700 Committer: Michael Brooks <[email protected]> Committed: Mon Jun 9 16:21:33 2014 -0700 ---------------------------------------------------------------------- lib/cordova/version_menu.rb | 68 +++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-docs/blob/1fcfb55b/lib/cordova/version_menu.rb ---------------------------------------------------------------------- diff --git a/lib/cordova/version_menu.rb b/lib/cordova/version_menu.rb index 3c6f613..3cd95b7 100644 --- a/lib/cordova/version_menu.rb +++ b/lib/cordova/version_menu.rb @@ -21,6 +21,9 @@ require 'nokogiri' require 'fileutils' class VersionMenu + @@versions = nil + @@optgroup_set = nil + def initialize(options = {}) @version = options[:version] @language = options[:lang] @@ -40,44 +43,53 @@ class VersionMenu private def generate_set doc - optgroup_set = Nokogiri::XML::NodeSet.new doc docs_path = File.expand_path File.join(__FILE__, '..', '..', '..', 'docs') glob_exp = File.join(docs_path, '*', '*', 'config.json') - versions = {} languages = {} html = [] - # build hash of languages and versions - Dir.glob(glob_exp).each do |file| - version = File.basename(File.dirname file) - lang = File.basename(File.dirname(File.dirname file)) - language = JSON.parse(IO.read(file))['language'] - - if language - versions[language] ||= [] - versions[language].push version - languages[language] = lang - else - puts "Warning: The key 'language' was not defined in #{file}" + # only build versions once for performance + if @@versions.nil? + puts "building menu list" + @@versions = {} + + # build hash of languages and versions + Dir.glob(glob_exp).each do |file| + version = File.basename(File.dirname file) + lang = File.basename(File.dirname(File.dirname file)) + language = JSON.parse(IO.read(file))['language'] + + if language + @@versions[language] ||= [] + @@versions[language].push version + languages[language] = lang + else + puts "Warning: The key 'language' was not defined in #{file}" + end end end - # generate HTML <select> output - versions.keys.sort.each do |language| - optgroup = Nokogiri::XML::Node.new 'optgroup', doc - optgroup['label'] = language - optgroup['value'] = languages[language] - optgroup_set.push optgroup - - versions[language].sort.reverse.each do |v| - option = Nokogiri::XML::Node.new 'option', doc - option['selected'] = 'selected' if @version == v && @language == languages[language] - option['value'] = v; - option.content = v - optgroup.add_child option + if @@optgroup_set.nil? + puts "building opt group" + @@optgroup_set = Nokogiri::XML::NodeSet.new doc + + # generate HTML <select> output + @@versions.keys.sort.each do |language| + optgroup = Nokogiri::XML::Node.new 'optgroup', doc + optgroup['label'] = language + optgroup['value'] = languages[language] + @@optgroup_set.push optgroup + + @@versions[language].sort.reverse.each do |v| + option = Nokogiri::XML::Node.new 'option', doc + option['selected'] = 'selected' if @version == v && @language == languages[language] + option['value'] = v; + option.content = v + optgroup.add_child option + end end end - return optgroup_set + return @@optgroup_set end end
