diff --git a/lib/rdoc/generator/darkfish.rb b/lib/rdoc/generator/darkfish.rb index bd37b60668..2fd6007695 100644 --- a/lib/rdoc/generator/darkfish.rb +++ b/lib/rdoc/generator/darkfish.rb @@ -246,6 +246,7 @@ def generate generate_file_files generate_table_of_contents @json_index.generate + @json_index.generate_gzipped copy_static diff --git a/lib/rdoc/generator/json_index.rb b/lib/rdoc/generator/json_index.rb index c303b2effb..9d6f0d4356 100644 --- a/lib/rdoc/generator/json_index.rb +++ b/lib/rdoc/generator/json_index.rb @@ -1,4 +1,5 @@ require 'json' +require 'zlib' ## # The JsonIndex generator is designed to complement an HTML generator and @@ -152,6 +153,49 @@ def generate end end + ## + # Compress the search_index.js file using gzip + + def generate_gzipped + debug_msg "Compressing generated JSON index" + out_dir = @base_dir + @options.op_dir + + search_index_file = out_dir + SEARCH_INDEX_FILE + outfile = out_dir + "#{search_index_file}.gz" + + debug_msg "Reading the JSON index file from %s" % search_index_file + search_index = search_index_file.read + + debug_msg "Writing gzipped search index to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| + gz.mtime = File.mtime(search_index_file) + gz.orig_name = search_index_file.to_s + gz.write search_index + gz.close + end + + # GZip the rest of the js files + Dir.chdir @template_dir do + Dir['**/*.js'].each do |source| + dest = out_dir + source + outfile = out_dir + "#{dest}.gz" + + debug_msg "Reading the original js file from %s" % dest + data = dest.read + + debug_msg "Writing gzipped file to %s" % outfile + + Zlib::GzipWriter.open(outfile) do |gz| + gz.mtime = File.mtime(dest) + gz.orig_name = dest.to_s + gz.write data + gz.close + end + end + end + end + ## # Adds classes and modules to the index diff --git a/test/test_rdoc_generator_json_index.rb b/test/test_rdoc_generator_json_index.rb index 214e4a0d91..f25ee27d5e 100644 --- a/test/test_rdoc_generator_json_index.rb +++ b/test/test_rdoc_generator_json_index.rb @@ -136,6 +136,61 @@ def test_generate assert_equal expected, index end + def test_generate_gzipped + require 'zlib' + @g.generate + @g.generate_gzipped + + assert_file 'js/searcher.js' + assert_file 'js/searcher.js.gz' + assert_file 'js/navigation.js' + assert_file 'js/navigation.js.gz' + assert_file 'js/search_index.js' + assert_file 'js/search_index.js.gz' + + gzip = File.open 'js/search_index.js.gz' + json = Zlib::GzipReader.new(gzip).read + + json =~ /\Avar search_data = / + + assignment = $& + index = $' + + refute_empty assignment + + index = JSON.parse index + + info = [ + @klass.search_record[2..-1], + @nest_klass.search_record[2..-1], + @meth.search_record[2..-1], + @nest_meth.search_record[2..-1], + @page.search_record[2..-1], + ] + + expected = { + 'index' => { + 'searchIndex' => [ + 'c', + 'd', + 'meth()', + 'meth()', + 'page', + ], + 'longSearchIndex' => [ + 'c', + 'c::d', + 'c#meth()', + 'c::d#meth()', + '', + ], + 'info' => info, + }, + } + + assert_equal expected, index + end + def test_generate_utf_8 skip "Encoding not implemented" unless Object.const_defined? :Encoding