Commit f161aa8b authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Layer for handling all JSON parsing/generation.

Added --pretty-json option to turn on pretty-printing of JSON.
Defaulting to off, but useful for debugging.
parent af13ceeb
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -16,9 +16,8 @@ require 'jsduck/logger'
require 'jsduck/guides'
require 'jsduck/videos'
require 'jsduck/categories'
require 'jsduck/jsonp'
require 'jsduck/json_duck'
require 'jsduck/lint'
require 'json'
require 'fileutils'

module JsDuck
@@ -35,6 +34,8 @@ module JsDuck
      # Sets warnings and verbose mode on or off
      Logger.instance.warnings = @opts.warnings
      Logger.instance.verbose = @opts.verbose
      # Turn JSON pretty-printing on/off
      JsonDuck.pretty = @opts.pretty_json
    end

    # Call this after input parameters set
@@ -65,7 +66,7 @@ module JsDuck

      clear_output_dir unless @opts.export == :stdout
      if @opts.export == :stdout
        @timer.time(:generating) { puts JSON.generate(@relations.classes) }
        @timer.time(:generating) { puts JsonDuck.generate(@relations.classes) }
      elsif @opts.export == :json
        FileUtils.mkdir(@opts.output_dir)
        init_output_dirs
@@ -132,10 +133,10 @@ module JsDuck
    def write_tree
      tree = Tree.new.create(@relations.classes)
      icons = TreeIcons.new.extract_icons(tree)
      js = "Docs.classData = " + JSON.generate( tree ) + ";"
      js += "Docs.icons = " + JSON.generate( icons ) + ";"
      js += "Docs.guides = " + JSON.generate( @guides.to_array ) + ";"
      js += "Docs.videos = " + JSON.generate( @videos.to_array ) + ";"
      js = "Docs.classData = " + JsonDuck.generate( tree ) + ";"
      js += "Docs.icons = " + JsonDuck.generate( icons ) + ";"
      js += "Docs.guides = " + JsonDuck.generate( @guides.to_array ) + ";"
      js += "Docs.videos = " + JsonDuck.generate( @videos.to_array ) + ";"
      File.open(@opts.output_dir+"/output/tree.js", 'w') {|f| f.write(js) }
    end

@@ -143,7 +144,7 @@ module JsDuck
    # in JSON form into a file.
    def write_search_data
      search_data = SearchData.new.create(@relations.classes)
      js = "Docs.searchData = " + JSON.generate( {:data => search_data} ) + ";"
      js = "Docs.searchData = " + JsonDuck.generate( {:data => search_data} ) + ";"
      File.open(@opts.output_dir+"/output/searchData.js", 'w') {|f| f.write(js) }
    end

@@ -155,9 +156,9 @@ module JsDuck
        Logger.instance.log("Writing to #{filename} ...")
        data = exporter.export(cls)
        if @opts.export
          File.open(filename, 'w') {|f| f.write(JSON.pretty_generate(data)) }
          JsonDuck.write_json(filename, data)
        else
          JsonP.write(filename, cls[:name].gsub(/\./, "_"), data)
          JsonDuck.write_jsonp(filename, cls[:name].gsub(/\./, "_"), data)
        end
      end
    end
+2 −2
Original line number Diff line number Diff line
require 'jsduck/logger'
require 'json'
require 'jsduck/json_duck'

module JsDuck

@@ -13,7 +13,7 @@ module JsDuck

    # Parses categories in JSON file
    def parse(path)
      @categories = JSON.parse(IO.read(path))["categories"]
      @categories = JsonDuck.read(path)["categories"]
    end

    # Prints warnings for missing classes in categories file
+4 −5
Original line number Diff line number Diff line
require 'jsduck/jsonp'
require 'jsduck/logger'
require 'jsduck/json_duck'
require 'fileutils'
require 'json'

module JsDuck

@@ -15,7 +14,7 @@ module JsDuck
    # Parses guides config file
    def parse(filename)
      @path = File.dirname(filename)
      @guides = JSON.parse(IO.read(filename))
      @guides = JsonDuck.read(filename)
    end

    # Writes all guides to given dir in JsonP format
@@ -26,7 +25,7 @@ module JsDuck
      @guides.each {|group| group["items"].each {|g| write_guide(g, dir) } }
      # Write the JSON to output dir, so it's available in released
      # version of docs and people can use it with JSDuck by themselves.
      File.open(dir+"/guides.json", 'w') {|f| f.write(JSON.generate(@guides)) }
      JsonDuck.write_json(dir+"/guides.json", @guides)
    end

    def write_guide(guide, dir)
@@ -45,7 +44,7 @@ module JsDuck
      name = File.basename(in_dir)
      html.gsub!(/<img src="/, "<img src=\"guides/#{name}/")

      JsonP.write(out_dir+"/README.js", name, {:guide => html})
      JsonDuck.write_jsonp(out_dir+"/README.js", name, {:guide => html})
    end

    # Returns all guides as array
+45 −0
Original line number Diff line number Diff line
require 'json'

module JsDuck

  # Wrapper around the json gem for use in JsDuck.
  #
  # The main benefit of it is that we have a central place for
  # controlling how the JSON is created (pretty-formatted or not).
  class JsonDuck
    @@pretty = false

    # Set to true to turn on pretty-formatting of JSON
    def self.pretty=(pretty)
      @@pretty = pretty
    end

    # Turns object into JSON, places it inside JavaScript that calls the
    # given callback name, and writes the result to file.
    def self.write_jsonp(filename, callback_name, data)
      jsonp = "Ext.data.JsonP." + callback_name + "(" + self.generate(data) + ");"
      File.open(filename, 'w') {|f| f.write(jsonp) }
    end

    # Turns object into JSON and writes inside a file
    def self.write_json(filename, data)
      File.open(filename, 'w') {|f| f.write(self.generate(data)) }
    end

    # Generates JSON from object
    def self.generate(data)
      @@pretty ? JSON.pretty_generate(data) : JSON.generate(data)
    end

    # Reads and parses JSON from file
    def self.read(filename)
      self.parse(IO.read(filename))
    end

    # Parses JSON string
    def self.parse(string)
      JSON.parse(string)
    end
  end

end

lib/jsduck/jsonp.rb

deleted100644 → 0
+0 −17
Original line number Diff line number Diff line
require 'json'

module JsDuck

  # Utility class for writing JsonP files
  class JsonP

    # Turns hash into JSON and writes inside JavaScript that calls the
    # given callback name
    def self.write(filename, callback_name, data)
      jsonp = "Ext.data.JsonP." + callback_name + "(" + JSON.pretty_generate(data) + ");"
      File.open(filename, 'w') {|f| f.write(jsonp) }
    end

  end

end
Loading