2013-08-07 44 views
6

Tôi muốn phân tích cú pháp một tệp .scss theo chương trình để tạo danh sách bộ chọn phẳng được sử dụng trong tệp đó, chủ yếu làm cơ sở cho một số phân tích mã tĩnh.Cách sử dụng SASS để phân tích cú pháp danh sách tất cả các bộ chọn CSS trong tệp .scss?

Trong thuật ngữ SASS, tôi đang tìm cách lấy danh sách tất cả Sass::Tree::RuleNode cho tệp .scss đã cho.

Cho đến nay tôi đang sử dụng Sass::Engine.for_file để tạo một cây. Sau đó, để sử dụng Sass::Tree::RuleNode.resolved_rules trên các Nút riêng lẻ, tôi phải sử dụng Tree::Visitors::Cssize, theo tài liệu. Nhưng một nơi nào đó trong đó là một lỗi (có thể đơn giản).

require 'sass' 

sass_engine = Sass::Engine.for_file('files/examples.scss',{ 
    :style => :compact, 
    :load_paths => ['files'], 
    :syntax => :scss, 
}) 

tree = sass_engine.to_tree 

Sass::Tree::Visitors::Cssize.visit(tree) 

tree.each do |node| 
    if node.is_a? Sass::Tree::RuleNode 
    puts node.resolved_rules 
    end 
end 

Đây là lỗi và stacktrace tôi nhận được:

ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:186:in `visit_prop': undefined method `empty?' for nil:NilClass (NoMethodError) 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:37:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:21:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:53:in `block in visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:53:in `map' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:53:in `visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:30:in `block in visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:52:in `with_parent' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:29:in `visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:37:in `block in visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:201:in `visit_rule' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:37:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:21:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:53:in `block in visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:53:in `map' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:53:in `visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:30:in `block in visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:52:in `with_parent' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:29:in `visit_children' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:37:in `block in visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:65:in `visit_root' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:37:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:21:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/base.rb:24:in `visit' 
    ruby-1.9.3-p362/gems/sass-3.2.10/lib/sass/tree/visitors/cssize.rb:6:in `visit' 

Thanks a lot trước.

+0

có lẽ một stacktrace sẽ giúp một người nào đó để giúp bạn. :) –

+0

Đã thêm stacktrace. – timme

Trả lời

3

Tôi không quá quen thuộc với các codebase Sass đá quý nhưng đã có thể làm việc này (mà không bị rơi, ít nhất) bằng cách làm theo ví dụ mã của lớp Cssize từ file sass/tree/root_node.rb sass đá quý, mà có:

# Runs the dynamic Sass code *and* computes the CSS for the tree. 
    # @see #to_s 
    def render 
    Visitors::CheckNesting.visit(self) 
    result = Visitors::Perform.visit(self) 
    Visitors::CheckNesting.visit(result) # Check again to validate mixins 
    result, extends = Visitors::Cssize.visit(result) 
    Visitors::Extend.visit(result, extends) 
    result.to_s 
    end 

lấy đoạn mã này và áp dụng nó vào kịch bản của bạn, tôi nhận được:

#!/usr/bin/env ruby 

require 'sass' 

sass_engine = Sass::Engine.for_file('files/examples.scss',{ 
    :style => :compact, 
    :load_paths => ['files'], 
    :syntax => :scss, 
}) 

tree = sass_engine.to_tree 

Sass::Tree::Visitors::CheckNesting.visit(tree) 
result = Sass::Tree::Visitors::Perform.visit(tree) 
Sass::Tree::Visitors::CheckNesting.visit(result) 
result, extends = Sass::Tree::Visitors::Cssize.visit(result) 
Sass::Tree::Visitors::Extend.visit(result, extends) 

result.each do |node| 
    if node.is_a? Sass::Tree::RuleNode 
    puts node.resolved_rules 
    end 
end