为 UrlFormat 添加排除选项到 scss_lint gem
Add exclude option to scss_lint gem for UrlFormat
我正在使用 gem scss_lint
进行 scss 检测。我遇到的问题是 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
实际上由于缺少引号或其他原因而无效。
如有任何帮助,我们将不胜感激。
这应该有效:我所做的更改是这一行 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
我正在使用 gem scss_lint
进行 scss 检测。我遇到的问题是 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
实际上由于缺少引号或其他原因而无效。
如有任何帮助,我们将不胜感激。
这应该有效:我所做的更改是这一行 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