Sha256: 35dfd0730a5fdfbd09b0a62b943ccfe8aa8bc6798ac687d0dc708fff18a967a9

Contents?: true

Size: 1.56 KB

Versions: 23

Compression:

Stored size: 1.56 KB

Contents

require 'jsduck/lexer'
require 'jsduck/doc_parser'

module JsDuck

  class CssParser
    def initialize(input, options = {})
      @lex = Lexer.new(input)
      @doc_parser = DocParser.new
      @docs = []
    end

    # Parses the whole CSS block and returns same kind of structure
    # that JavaScript parser does.
    def parse
      while !@lex.empty? do
        if look(:doc_comment)
          comment = @lex.next(true)
          @docs << {
            :comment => @doc_parser.parse(comment[:value]),
            :linenr => comment[:linenr],
            :code => code_block
          }
        else
          @lex.next
        end
      end
      @docs
    end

    # <code-block> := <mixin> | <nop>
    def code_block
      if look("@", "mixin")
        mixin
      else
        {:type => :nop}
      end
    end

    # <mixin> := "@mixin" <css-ident>
    def mixin
      match("@", "mixin")
      return {
        :type => :css_mixin,
        :name => look(:ident) ? css_ident : nil,
      }
    end

    # <css-ident> := <ident>  [ "-" <ident> ]*
    def css_ident
      chain = [match(:ident)]
      while look("-", :ident) do
        chain << match("-", :ident)
      end
      return chain.join("-")
    end

    # Matches all arguments, returns the value of last match
    # When the whole sequence doesn't match, throws exception
    def match(*args)
      if look(*args)
        last = nil
        args.length.times { last = @lex.next }
        last
      else
        throw "Expected: " + args.join(", ")
      end
    end

    def look(*args)
      @lex.look(*args)
    end
  end

end

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
jsduck-3.10.5 lib/jsduck/css_parser.rb
jsduck-3.10.4 lib/jsduck/css_parser.rb
jsduck-3.10.3 lib/jsduck/css_parser.rb
jsduck-3.10.2 lib/jsduck/css_parser.rb
jsduck-3.10.1 lib/jsduck/css_parser.rb
jsduck-3.10.0 lib/jsduck/css_parser.rb
jsduck-3.9.1 lib/jsduck/css_parser.rb
jsduck-3.9.0 lib/jsduck/css_parser.rb
jsduck-3.9.0.pre lib/jsduck/css_parser.rb
jsduck-3.8.4 lib/jsduck/css_parser.rb
jsduck-3.8.3 lib/jsduck/css_parser.rb
jsduck-3.8.2 lib/jsduck/css_parser.rb
jsduck-3.8.1 lib/jsduck/css_parser.rb
jsduck-3.8.0 lib/jsduck/css_parser.rb
jsduck-3.7.0 lib/jsduck/css_parser.rb
jsduck-3.6.1 lib/jsduck/css_parser.rb
jsduck-3.6.0 lib/jsduck/css_parser.rb
jsduck-3.5.0 lib/jsduck/css_parser.rb
jsduck-3.4.1 lib/jsduck/css_parser.rb
jsduck-3.4.0 lib/jsduck/css_parser.rb