2013-08-07 12 views
6

Vorrei analizzare a livello di programmazione un file .scss per generare un elenco semplice di selettori utilizzati in tale file, principalmente come base per l'analisi del codice statico.Come utilizzare SASS per analizzare un elenco di tutti i selettori CSS in un file .scss?

In termini SASS, sto cercando un modo per ottenere un elenco di tutti i Sass::Tree::RuleNode per un determinato file .scss.

Finora sto utilizzando Sass::Engine.for_file per creare un albero. Quindi, per usare Sass::Tree::RuleNode.resolved_rules sui singoli nodi, devo usare Tree::Visitors::Cssize, secondo la documentazione. Ma da qualche parte c'è un errore (probabilmente semplice).

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 

Questo è l'errore e stacktrace sto ottenendo:

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' 

Grazie mille in anticipo.

+0

Forse uno stacktrace sarebbe aiutare qualcuno ad aiutarvi. :) –

+0

Aggiunto stacktrace. – timme

risposta

3

io non sono eccessivamente familiarità con la base di codice Sass gemma, ma era in grado di ottenere questo lavoro (senza schiantarsi, almeno), seguendo il codice di esempio del Cssize classe dal file di gemma sass sass/tree/root_node.rb, che ha:

# 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 

Prendendo questo frammento di codice e la sua applicazione allo script, ottengo:

#!/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 
Problemi correlati