[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

Reply via email to