2013-08-07 11 views
6

Chciałbym programowo przeanalizować plik .scss, aby wygenerować płaską listę selektorów używanych w tym pliku, głównie jako podstawę do analizy statycznego kodu.Jak użyć SASS do analizy listy wszystkich selektorów CSS w pliku .scss?

W warunkach SASS, szukam sposobu, aby uzyskać listę wszystkich Sass::Tree::RuleNode dla danego pliku .scss.

Do tej pory używam Sass::Engine.for_file do tworzenia drzewa. Następnie, aby użyć Sass::Tree::RuleNode.resolved_rules na poszczególnych węzłach, muszę użyć Tree::Visitors::Cssize, zgodnie z dokumentacją. Ale gdzieś tam jest (prawdopodobnie prosty) błąd.

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 

Jest to błąd i StackTrace Dostaję:

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' 

dziękuję z góry.

+0

Może StackTrace by pomóc komuś pomóc. :) –

+0

Dodano stacktrace. – timme

Odpowiedz

3

nie jestem zbyt obeznany z kodzie Sass gem ale był w stanie uzyskać tej pracy (bez awarii, przynajmniej) przez wzorując kodowej Cssize klasy z Sass gem sass/tree/root_node.rb pliku, który ma:

# 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 

Biorąc ten fragment kodu i wykorzystywanie go do skryptu, otrzymuję:

#!/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 
Powiązane problemy