Commit 23fdd261 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Refactor different ClassWriter behaviours into classes.

Added two classes:

- JsonExporter - exports single class to JSON format file.
- JsonPExporter - exports single class to JsonP format file in compact form.
parent 00e1de3c
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ require 'jsduck/class_writer'
require 'jsduck/source_writer'
require 'jsduck/app_data'
require 'jsduck/index_html'
require 'jsduck/json_exporter'
require 'jsduck/json_p_exporter'
require 'fileutils'

module JsDuck
@@ -58,8 +60,8 @@ module JsDuck
          puts JsonDuck.generate(@relations.classes)
        else
          FileUtils.rm_rf(@opts.output_dir)
          cw = ClassWriter.new(@relations, @opts)
          cw.write(@opts.output_dir, ".json")
          cw = ClassWriter.new(JsonExporter, @relations, @opts)
          cw.write(@opts.output_dir)
        end
      else
        FileUtils.rm_rf(@opts.output_dir)
@@ -83,8 +85,8 @@ module JsDuck
        SourceWriter.write_all(parsed_files, @opts.output_dir + "/source")
        format_classes

        cw = ClassWriter.new(@relations, @opts)
        cw.write(@opts.output_dir+"/output", ".js")
        cw = ClassWriter.new(JsonPExporter, @relations, @opts)
        cw.write(@opts.output_dir+"/output")

        @guides.write(@opts.output_dir+"/guides")
        @videos.write(@opts.output_dir+"/videos")
+8 −26
Original line number Diff line number Diff line
require 'jsduck/parallel_wrap'
require 'jsduck/exporter'
require 'jsduck/renderer'
require 'jsduck/doc_formatter'
require 'jsduck/logger'
require 'jsduck/json_duck'
require 'fileutils'

module JsDuck

  # Writes class JSON into files
  # Writes class data into files
  class ClassWriter
    def initialize(relations, opts)
    def initialize(exporter_class, relations, opts)
      @relations = relations
      @opts = opts
      @parallel = ParallelWrap.new(:in_processes => @opts.processes)
      @exporter = exporter_class.new(relations, opts)
      @parallel = ParallelWrap.new(:in_processes => opts.processes)
    end

    # Writes JSON export or JsonP file for each class
    def write(dir, extension=".json")
      exporter = Exporter.new(@relations)
      renderer = Renderer.new
      # Inject formatter to all meta-tags.
      doc_formatter = DocFormatter.new(@relations, @opts)
      @opts.meta_tags.each {|tag| tag.formatter = doc_formatter }
      renderer.meta_tags = @opts.meta_tags

    # Writes class data into given directory
    def write(dir)
      FileUtils.mkdir(dir)
      @parallel.each(@relations.classes) do |cls|
        filename = dir + "/" + cls[:name] + extension
        filename = dir + "/" + cls[:name] + @exporter.extension
        Logger.instance.log("Writing docs", filename)
        data = exporter.export(cls)
        if extension == ".json"
          JsonDuck.write_json(filename, data)
        else
          data[:html] = renderer.render(data)
          data = exporter.compact(data)
          JsonDuck.write_jsonp(filename, cls[:name].gsub(/\./, "_"), data)
        end
        @exporter.write(filename, cls)
      end
    end

+24 −0
Original line number Diff line number Diff line
require 'jsduck/exporter'
require 'jsduck/json_duck'

module JsDuck

  # Exporter for json format
  class JsonExporter
    def initialize(relations, opts)
      @exporter = Exporter.new(relations)
    end

    # Extension for filename
    def extension
      ".json"
    end

    # Writes full class data in JSON format to file
    def write(filename, cls)
      JsonDuck.write_json(filename, @exporter.export(cls))
    end

  end

end
+35 −0
Original line number Diff line number Diff line
require 'jsduck/exporter'
require 'jsduck/json_duck'
require 'jsduck/renderer'
require 'jsduck/doc_formatter'

module JsDuck

  # Exporter for JsonP format
  class JsonPExporter
    def initialize(relations, opts)
      @exporter = Exporter.new(relations)

      @renderer = Renderer.new
      # Inject formatter to all meta-tags.
      doc_formatter = DocFormatter.new(@relations, @opts)
      @opts.meta_tags.each {|tag| tag.formatter = doc_formatter }
      renderer.meta_tags = @opts.meta_tags
    end

    # Extension for filename
    def extension
      ".js"
    end

    # Writes compacted class data in JsonP format to file
    def write(filename, cls)
      data = @exporter.export(cls)
      data[:html] = @renderer.render(data)
      data = @exporter.compact(data)
      JsonDuck.write_jsonp(filename, cls[:name].gsub(/\./, "_"), data)
    end

  end

end