2012-01-24 38 views
0

我們的應用程序允許用戶上傳javascript,CSS和HTML文件。我們需要一種方法來針對CSS和JS lint驗證這些文件,並記錄與它們相關的任何錯誤(文件名,行等)。這需要「實時」完成,或者至少要傳遞給延遲的工作流程才能在後臺工作。這些要求不會讓我們掛鉤到第三方在線服務(如在線w3c驗證器)。Ruby on Rails:通過上傳文件處理CSS Lint和JS Lint「realtime」

我發現jshint_on_rails和jslint_on_rails,這似乎他們可以工作。然而,他們依賴於rake任務,我不知道如何將他們的輸出輸入到數據庫中。迄今爲止,我還沒有發現任何類似的CSS皮棉。有沒有這樣的包裹,我可以掛鉤?

感謝

回答

0

我最終什麼事做的是安裝JSHint和CSSLint的Node.js的版本,然後要求他們通過Rails和解析輸出,就像這樣:

def validate_js(filepath) 
    capture_error = false 
    filename = get_filename(filepath) 
    file_regex = Regexp.new(filepath) 
    lint_config = "--config #{Rails.root}/test/validators/jshint.json" 
    lint_reporter = "--reporter #{Rails.root}/test/validators/jshint-reporter.js" 

    IO.popen("jshint #{filepath} #{lint_config} #{lint_reporter}") do |pipe| 

     pipe.each do |line| 
     if line =~ file_regex 
      # Error detected 
      error_msg = line.split("#{filepath}: ").last.strip 
      @js_error = @instance.parse_warnings.new(:filename => filename, :error_type => 'javascript', 
                 :error_message => error_msg) 
      capture_error = true 
     elsif capture_error 
      # The actual line the error is on 
      @js_error.error_content = line 
      @js_error.save! 

      capture_error = false 
      @js_error = nil # Empty the variable so it isn't hanging around after the last error 
     end 
     end 
    end 
    end 



def validate_css(filepath) 
    filename = get_filename(filepath) 
    dir = File.expand_path(File.dirname(filepath)) # Where we want to dump the results.xml file 

    system("csslint --format=lint-xml > #{dir}/#{filename}-results.xml #{filepath}") # Call CSSLint 

    output = LibXML::XML::Parser.file("#{dir}/#{filename}-results.xml") 
    doc = output.parse # Iterate over the errors 
    doc.find('//issue').each do |issue| 
     error_msg = "line #{issue['line']}, col #{issue['char']}, #{issue['reason']}" 
     error_content = issue['evidence'] 
     @instance.parse_warnings.create!(:filename => filename, :error_type => 'css', :error_message => error_msg, 
              :error_content => error_content) 
    end 
    FileUtils.rm("#{dir}/#{filename}-results.xml") # No need to keep the xml file around 
    end