Commit 029f5e45 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract BatchFormatter class from App.

This new class encapsulates the formatting of all classes.

Also, while formatting, we now create a new class_formatter for each
class that we process.  That's because otherwise the list of images
detected in one class will be added to the images detected from the next
one, and so on and on...  This wasn't really a problem because we
stripped away the duplicate images anyway, but it wasn't really the
right way to do it.
parent c31e3a10
Loading
Loading
Loading
Loading
+2 −27
Original line number Diff line number Diff line
@@ -2,8 +2,7 @@ require 'rubygems'
require 'jsduck/aggregator'
require 'jsduck/source/file'
require 'jsduck/source/writer'
require 'jsduck/doc_formatter'
require 'jsduck/class_formatter'
require 'jsduck/batch_formatter'
require 'jsduck/class'
require 'jsduck/relations'
require 'jsduck/inherit_doc'
@@ -165,31 +164,7 @@ module JsDuck

    # Formats each class
    def format_classes
      doc_formatter = DocFormatter.new(@opts)
      doc_formatter.relations = @relations
      doc_formatter.img_path = "images"
      class_formatter = ClassFormatter.new(@relations, doc_formatter)
      # Don't format types when exporting
      class_formatter.include_types = !@opts.export
      # Format all doc-objects in parallel
      formatted_classes = Util::Parallel.map(@relations.classes) do |cls|
        files = cls[:files].map {|f| f[:filename] }.join(" ")
        Logger.log("Markdown formatting #{cls[:name]}", files)
        begin
          {
            :doc => class_formatter.format(cls.internal_doc),
            :images => doc_formatter.images
          }
        rescue
          Logger.fatal_backtrace("Error while formatting #{cls[:name]} #{files}", $!)
          exit(1)
        end
      end
      # Then merge the data back to classes sequentially
      formatted_classes.each do |cls|
        @relations[cls[:doc][:name]].internal_doc = cls[:doc]
        cls[:images].each {|img| @assets.images.add(img) }
      end
      BatchFormatter.format_all!(@relations, @assets, @opts)
    end

  end
+54 −0
Original line number Diff line number Diff line
require 'jsduck/util/parallel'
require 'jsduck/class_formatter'
require 'jsduck/doc_formatter'
require 'jsduck/logger'

module JsDuck

  # Performs the formatting of the doc-object of all classes.
  class BatchFormatter

    # Formats all classes.
    # Also registers found images in assets.
    def self.format_all!(relations, assets, opts)
      # Format all doc-objects in parallel
      formatted_classes = Util::Parallel.map(relations.classes) do |cls|

        files = cls[:files].map {|f| f[:filename] }.join(" ")
        Logger.log("Markdown formatting #{cls[:name]}", files)

        formatter = create_class_formatter(relations, opts)
        begin
          {
            :doc => formatter.format(cls.internal_doc),
            :images => formatter.images
          }
        rescue
          Logger.fatal_backtrace("Error while formatting #{cls[:name]} #{files}", $!)
          exit(1)
        end
      end

      # Then merge the data back to classes sequentially
      formatted_classes.each do |cls|
        relations[cls[:doc][:name]].internal_doc = cls[:doc]
        cls[:images].each {|img| assets.images.add(img) }
      end
    end

    # Factory method to create new ClassFormatter instances.
    def self.create_class_formatter(relations, opts)
      doc_formatter = DocFormatter.new(opts)
      doc_formatter.relations = relations
      doc_formatter.img_path = "images"

      class_formatter = ClassFormatter.new(relations, doc_formatter)
      # Don't format types when exporting
      class_formatter.include_types = !opts.export

      class_formatter
    end

  end

end
+7 −0
Original line number Diff line number Diff line
@@ -32,6 +32,13 @@ module JsDuck
      cls
    end

    # Returns the images detected by doc-formatter
    def images
      @formatter.images
    end

    private

    def format_member(m)
      @formatter.doc_context = m[:files][0]
      m[:doc] = @formatter.format(m[:doc]) if m[:doc]