Ruby on Rails: обработка CSS Lint и JS Lint в реальном времени с загруженными файлами - PullRequest
0 голосов
/ 25 января 2012

Наше приложение позволяет пользователям загружать файлы JavaScript, CSS и HTML.Нам нужен способ проверить эти файлы на соответствие CSS и JS lint, а также записать любые ошибки, связанные с ними (имя файла, строка и т. Д.).Это нужно сделать «в реальном времени» или, по крайней мере, передать отложенному процессу работы для работы в фоновом режиме.Требования не позволят нам подключиться к стороннему онлайн-сервису (например, онлайн-валидатору w3c).

Я обнаружил jshint_on_rails и jslint_on_rails, которые, похоже, могут работать.Однако они зависят от задач rake, и я не уверен, как бы получить их вывод в базу данных.До сих пор я не нашел ничего похожего на css lint.Есть ли такие пакеты, к которым я мог бы подключиться?

Спасибо

1 Ответ

0 голосов
/ 01 февраля 2012

В итоге я установил версии 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
...