2017-03-13 42 views
8

0,scss linting kullanıyorum. Sorun şu ki, lls 'lerde URL'lerimdeki bazı satır değişkenlerim var, bu yüzden linter bir hata bildirdi:UrlFormat için scss_lint gem'e hariç tutma seçeneği ekle

Bazı şeyleri kontrolde dışlamak için bir yol olmalı. data:'un beyaz listeye alınmış olduğunu görüyoruz, ancak bazen bir cms'ye konulduğu için değişkenlerimizi css'de kullanıyoruz.

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 

o üzerinde erroring olan koddur:

@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; 
} 

Belki de izin şeyler yazmak için Ruby usta değilim

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

yapmak için bir yol olan Bu değişkenlerin kontrol edilmesi ve değişkenin kendisini veya bütün çizgiyi görmezden gelmesi.

Birisi bununla uğraşmak ister miydi?

Bunun için Ruby kodu geçerlidir.

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 

belki çözüm sadece aslında UrlFormat çünkü eksik tırnak falan geçersiz sürece data: değil hata yapar şekilde değişken görmezden olacağını düşünüyorum.

Herhangi bir yardım için teşekkür ederiz.

cevap

4

Bu işe yaramalı: Yaptığım değişiklik bu satır return if url.include?('${')'du. ${ dizesini içeren URL'leri, data: ile başlayan URL'leri yok saymasına benzer şekilde yok sayar.

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 
+0

Teşekkürler! Bu kadar basit lol olduğunu farketmemişti. Bu şartname için çalışmalıdır? URL bir değişken içeriyorsa 'yapalım (: url) {' $ {'} it {not_not report_lint} sonu' –

+0

Güzel görünüyor :) – acrogenesis