Commit 2b778ff8 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Rename Source::FileParser to just Parser.

This is really the main parsing class and shouldn't be buried deep
inside source/ dir.
parent 66ce7c58
Loading
Loading
Loading
Loading

lib/jsduck/parser.rb

0 → 100644
+76 −0
Original line number Diff line number Diff line
require 'jsduck/js/parser'
require 'jsduck/js/ast'
require 'jsduck/css/parser'
require 'jsduck/doc/parser'
require 'jsduck/doc/processor'
require 'jsduck/doc/map'
require 'jsduck/merger'
require 'jsduck/base_type'
require 'jsduck/class_doc_expander'

module JsDuck
  # Performs the actual parsing of CSS or JS source.
  #
  # This is the class that brings together all the different steps of
  # parsing the source.
  class Parser

    def initialize
      @doc_parser = Doc::Parser.new
      @class_doc_expander = ClassDocExpander.new
      @doc_processor = Doc::Processor.new
      @merger = Merger.new
      @filename = ""
    end

    # Parses file into final docset that can be fed into Aggregator
    def parse(contents, filename="", options={})
      @doc_processor.filename = @filename = filename

      parse_js_or_css(contents, filename, options).map do |docset|
        expand(docset)
      end.flatten.map do |docset|
        merge(docset)
      end
    end

    private

    # Parses the file depending on filename as JS or CSS
    def parse_js_or_css(contents, filename, options)
      if filename =~ /\.s?css$/
        docs = Css::Parser.new(contents, options).parse
      else
        docs = Js::Parser.new(contents, options).parse
        docs = Js::Ast.new(docs).detect_all!
      end
    end

    # Parses the docs, detects tagname and expands class docset
    def expand(docset)
      docset[:comment] = @doc_parser.parse(docset[:comment], @filename, docset[:linenr])
      docset[:doc_map] = Doc::Map.build(docset[:comment])
      docset[:tagname] = BaseType.detect(docset[:doc_map], docset[:code])

      if docset[:tagname] == :class
        # expand class into several docsets, and rebuild doc-maps for all of them.
        @class_doc_expander.expand(docset).map do |ds|
          ds[:doc_map] = Doc::Map.build(ds[:comment])
          ds
        end
      else
        docset
      end
    end

    # Merges comment and code parts of docset
    def merge(docset)
      @doc_processor.linenr = docset[:linenr]
      docset[:comment] = @doc_processor.process(docset[:tagname], docset[:doc_map])
      docset.delete(:doc_map)

      @merger.merge(docset)
    end
  end

end
+2 −2
Original line number Diff line number Diff line
require 'jsduck/source/file_parser'
require 'jsduck/parser'
require 'jsduck/util/html'

module JsDuck
@@ -20,7 +20,7 @@ module JsDuck
        @html_filename = ""
        @links = {}

        @docs = Source::FileParser.new.parse(@contents, @filename, options)
        @docs = Parser.new.parse(@contents, @filename, options)

        @docs.map do |docset|
          link(docset[:linenr], docset)

lib/jsduck/source/file_parser.rb

deleted100644 → 0
+0 −79
Original line number Diff line number Diff line
require 'jsduck/js/parser'
require 'jsduck/js/ast'
require 'jsduck/css/parser'
require 'jsduck/doc/parser'
require 'jsduck/doc/processor'
require 'jsduck/doc/map'
require 'jsduck/merger'
require 'jsduck/base_type'
require 'jsduck/class_doc_expander'

module JsDuck
  module Source

    # Performs the actual parsing of CSS or JS source.
    #
    # This is the class that brings together all the different steps of
    # parsing the source.
    class FileParser

      def initialize
        @doc_parser = Doc::Parser.new
        @class_doc_expander = ClassDocExpander.new
        @doc_processor = Doc::Processor.new
        @merger = Merger.new
        @filename = ""
      end

      # Parses file into final docset that can be fed into Aggregator
      def parse(contents, filename="", options={})
        @doc_processor.filename = @filename = filename

        parse_js_or_css(contents, filename, options).map do |docset|
          expand(docset)
        end.flatten.map do |docset|
          merge(docset)
        end
      end

      private

      # Parses the file depending on filename as JS or CSS
      def parse_js_or_css(contents, filename, options)
        if filename =~ /\.s?css$/
          docs = Css::Parser.new(contents, options).parse
        else
          docs = Js::Parser.new(contents, options).parse
          docs = Js::Ast.new(docs).detect_all!
        end
      end

      # Parses the docs, detects tagname and expands class docset
      def expand(docset)
        docset[:comment] = @doc_parser.parse(docset[:comment], @filename, docset[:linenr])
        docset[:doc_map] = Doc::Map.build(docset[:comment])
        docset[:tagname] = BaseType.detect(docset[:doc_map], docset[:code])

        if docset[:tagname] == :class
          # expand class into several docsets, and rebuild doc-maps for all of them.
          @class_doc_expander.expand(docset).map do |ds|
            ds[:doc_map] = Doc::Map.build(ds[:comment])
            ds
          end
        else
          docset
        end
      end

      # Merges comment and code parts of docset
      def merge(docset)
        @doc_processor.linenr = docset[:linenr]
        docset[:comment] = @doc_processor.process(docset[:tagname], docset[:doc_map])
        docset.delete(:doc_map)

        @merger.merge(docset)
      end
    end

  end
end