【问题标题】:Add exclude option to scss_lint gem for UrlFormat为 UrlFormat 向 scss_lint gem 添加排除选项
【发布时间】:2017-08-03 13:46:13
【问题描述】:

我正在使用 gem scss_lint 进行 scss linting。我遇到的问题是我的一些字符串中的一些变量在 url 的 css 中,所以 linter 报告错误:

我认为应该有一种方法可以在检查中排除某些内容。我看到 data: 已被列入白名单,但我们有时会在 css 中使用变量,因为它已放入 cms 中。

UrlFormat: Invalid URL '/response/${siteId}/artifact/${campaignAndToolPath}/assets/fonts/roboto-light-webfont.woff2': bad URI(is not URI?): /response/${siteId}/artifact/${campaignAndToolPath}/assets/fonts/roboto-light-webfont.woff2

出错的代码是:

@font-face {
  font-family: 'roboto';
  src: url('/response/${siteId}/artifact/${campaignAndToolPath}/assets/fonts/roboto-italic-webfont.woff2') format('woff2'),
       url('/response/${siteId}/artifact/${campaignAndToolPath}/assets/fonts/roboto-italic-webfont.woff') format('woff');
  font-weight: $regular;
  font-style: italic;
}

也许有办法

UrlFormat:
  enabled: true
  ignore or exclude: [
     - '${everythingbetween}'
     - '{{everything between}}'
  ]

我不太熟悉 Ruby,无法编写一些东西来检查这些变量并忽略变量本身或整行。

有人有兴趣解决这个问题吗?

它的 Ruby 代码是。

require 'uri'

module SCSSLint
  # Checks the format of URLs for unnecessary protocols or domains.
  class Linter::UrlFormat < Linter
    include LinterRegistry

  def visit_script_funcall(node)
    return unless node.name == 'url'

    if url_string?(node.args[0])
      url = node.args[0].value.value.to_s
      check_url(url, node)
    end

    yield
  end

  def visit_prop(node)
    if url_literal?(node.value)
      url = node.value.to_sass.sub(/^url\((.*)\)$/, '\\1')
      check_url(url, node)
    end

    yield
  end

  private

    def url_literal?(prop_value)
      return unless prop_value.is_a?(Sass::Script::Tree::Literal)
      return unless prop_value.value.is_a?(Sass::Script::Value::String)
      return unless prop_value.value.type == :identifier

      prop_value.to_sass.start_with?('url(')
    end

    def url_string?(arg)
      return unless arg.is_a?(Sass::Script::Tree::Literal)
      return unless arg.value.is_a?(Sass::Script::Value::String)

      arg.value.type == :string
    end

    def check_url(url, node)
      return if url.start_with?('data:')
      uri = URI(url)

      if uri.scheme || uri.host
        add_lint(node, "URL `#{url}` should not contain protocol or domain")
      end
    rescue URI::Error => ex
      add_lint(node, "Invalid URL `#{url}`: #{ex}")
    end
  end
end

我认为解决方案可能是像 data: 那样忽略变量,而不是错误,除非 UrlFormat 实际上由于缺少引号或其他原因而无效。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby scss-lint


    【解决方案1】:

    这应该有效:我所做的更改是这一行 return if url.include?('${') 。它会忽略包含字符串${ 的网址,就像忽略以data: 开头的网址一样。

    def check_url(url, node)
      return if url.start_with?('data:') || url.include?('${')
      uri = URI(url)
    
      if uri.scheme || uri.host
        add_lint(node, "URL `#{url}` should not contain protocol or domain")
      end
    rescue URI::Error => ex
      add_lint(node, "Invalid URL `#{url}`: #{ex}")
    end
    

    【讨论】:

    • 谢谢!没想到这么简单哈哈。这应该适用于规范吗? context 'when URL contains a variable' do let(:url) { '${' } it { should_not report_lint } end
    • 看起来不错:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2017-09-19
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多