class JsDuck::Css::Parser
Parses SCSS using the official SASS parser.
Constants
- TYPE
Public Class Methods
new(input, options = {})
click to toggle source
# File lib/jsduck/css/parser.rb, line 11 def initialize(input, options = {}) @input = input @docs = [] end
Public Instance Methods
parse()
click to toggle source
Returns an array of docsets like the Js::Parser
does.
# File lib/jsduck/css/parser.rb, line 17 def parse root = Sass::Engine.new(@input, :syntax => :scss).to_tree find_doc_comments(root.children) @docs end
Private Instance Methods
analyze_code(node)
click to toggle source
# File lib/jsduck/css/parser.rb, line 57 def analyze_code(node) if node.class == Sass::Tree::VariableNode return { :tagname => :css_var, :name => "$" + node.name, :default => node.expr.to_sass, :type => TYPE.detect(node.expr), } elsif node.class == Sass::Tree::MixinDefNode return { :tagname => :css_mixin, :name => node.name, :params => build_params(node.args), } else # Default to property like in Js::Parser. return {:tagname => :property} end end
build_params(mixin_args)
click to toggle source
# File lib/jsduck/css/parser.rb, line 77 def build_params(mixin_args) mixin_args.map do |arg| { :name => "$" + arg[0].name, :default => arg[1] ? arg[1].to_sass : nil, :type => arg[1] ? TYPE.detect(arg[1]) : nil, } end end
find_doc_comments(nodes)
click to toggle source
# File lib/jsduck/css/parser.rb, line 25 def find_doc_comments(nodes) prev_comment = nil nodes.each do |node| if prev_comment @docs << make_docset(prev_comment, node) prev_comment = nil end if node.class == Sass::Tree::CommentNode if node.type == :normal && node.value[0] =~ /\A\/\*\*/ prev_comment = node end end find_doc_comments(node.children) end if prev_comment @docs << make_docset(prev_comment) end end
make_docset(prev_comment, node=nil)
click to toggle source
# File lib/jsduck/css/parser.rb, line 48 def make_docset(prev_comment, node=nil) return { :comment => prev_comment.value[0].sub(/\A\/\*\*/, "").sub(/\*\/\z/, ""), :linenr => prev_comment.line, :code => analyze_code(node), :type => :doc_comment, } end