CSSセレクターの特異性を計算する


8

今日のタスクは、文字列を受け入れ、4つの整数を出力(または返す)するプログラム(または関数)を記述することです。


入力

入力文字列はCSS3セレクターであり、基本的に任意のUnicode文字を含めることができます。


出力

出力は、このセレクターのCSS固有性を表します。

  • 最初の数値は常に0です(インラインスタイルに使用されるため、この演習はインラインスタイルには適用されません)。

  • 2番目の数値は#foo、セレクターに存在するID()の数です。

  • 3番目の数値は、セレクターに存在するクラス(.foo)、属性([bar])、および疑似クラスの数です。

  • 4番目の数値は、セレクターに存在する要素(biz)と疑似要素の数です。


ノート:

  • ユニバーサルセレクター(*)はどこにもカウントされません

  • 疑似要素で::beforeあり::after、単一の ":"(レガシー表記)で記述することもできます

  • 入力は:not(selector)疑似クラスを使用できます。内部のセレクターは、ID、クラス、要素などが含まれていてもカウントされません)

  • セレクタの「レンガ」はコンビネータで区切られた(スペース/タブである+>~、例:body > div+a ~*)、彼らはまた、(EXを:累積することができますdiv#foo.bar[baz]:hover::before

  • また、CSSエスケープシーケンス\1〜6桁の16進数、スペースが続く)、およびエスケープされた特殊文字(\これらのいずれかが続く!"#$%&'()*+,-./:;<=>?@[\]^`{|}~)も適切に処理する必要があります。これらのエスケープは、セレクター(id、クラスなど)の任意のブリックの一部にすることができます。

  • 無効なセレクターまたはCSS4セレクターを受け取った場合は、特に何もする必要はありません。CSS3セレクターバリデーターを実装する気にしないでください。

  • CSSの詳細については、次のリンクをご覧ください。


//ユニバーサル

* => 0,0,0,0

// ID

#id => 0,1,0,0

//クラス

.class => 0,0,1,0

//属性

[foo] => 0,0,1,0
[foo = "bar"] => 0,0,1,0
[foo〜= "bar"] => 0,0,1,0
[foo ^ = "bar"] => 0,0,1,0
[foo $ = "bar"] => 0,0,1,0
[foo * = "bar"] => 0,0,1,0
[foo | = "bar"] => 0,0,1,0
[foo = bar] => 0,0,1,0
[foo = 'bar'] => 0,0,1,0

(注:角かっこ[]には、エスケープされていない "]"以外のものを含めることができます)

//疑似クラス

:root => 0,0,1,0
:nth-​​child(n)=> 0,0,1,0
:nth-​​last-child(n)=> 0,0,1,0
:nth-​​of-type(n)=> 0,0,1,0
:nth-​​last-of-type(n)=> 0,0,1,0
:first-child => 0,0,1,0
:last-child => 0,0,1,0
:first-of-type => 0,0,1,0
:last-of-type => 0,0,1,0
:only-child => 0,0,1,0
:only-of-type => 0,0,1,0
:空=> 0,0,1,0
:link => 0,0,1,0
:visited => 0,0,1,0
:active => 0,0,1,0
:hover => 0,0,1,0
:focus => 0,0,1,0
:target => 0,0,1,0
:lang(fr)=> 0,0,1,0
:enabled => 0,0,1,0
:disabled => 0,0,1,0
:チェック済み=> 0,0,1,0
:not(selector)=> 0,0,1,0

(注: ":"の後のキーワードは、疑似要素以外のものにすることができます)


//要素

本文=> 0,0,0,1

//疑似要素

:before => 0,0,0,1
:after => 0,0,0,1
::前=> 0,0,0,1
::後=> 0,0,0,1
:: first-line => 0,0,0,1
::最初の文字=> 0,0,0,1

(注:括弧()には、エスケープされていない ")"以外のものを含めることができます)

(つづく)


質問がある場合や例やテストデータが必要な場合は、コメント欄で質問してください。

最短コード(バイト単位)が優先されます。

幸運を!


3
例を追加してください(メモのすべての癖をカバーするのが理想的です)。
マーティンエンダー2014年

2
テストのリストは非常に良いように見えますが、単一のものを超えるいくつかの例は1素晴らしいでしょう。(ところで、これは実際にはかなり良い課題だと思いますが、テストケースの完全なリストは、それを適切に機能させるために不可欠であると思われます。)
Martin Ender

回答:


1

JavascriptをES6 453の 430バイト

これが私のショットです!

a=>(s){var n=z=[],c=[0,0,0,0],e=s.split(/[\s\+\>\~]+/);return e.forEach((s)=>{n=n.concat(s.replace(/\((.*)\)/,"").split(/(?=\[|::|\.)/))}),n.forEach((s)=>{if(0==s.indexOf("::"))return z.push(s);var n=s.split(/(?=:)/);z=z.concat(n[0].split(/(?=[\#])/)),/before|after/.test(n[1])?z.push(":"+n[1]):n[1]&&z.push(n[1])}),z.forEach((s)=>{/^[a-z]+$/gi.test(s)||"::"==s[0]+s[1]?c[3]++:-1!=":.[".indexOf(s[0])?c[2]++:"#"==s[0]&&c[1]++}),c}

@UPDATEはコードを改善し、:notおよび:before /:afterセレクターをより適切に処理するようになりましたが、それでもCSSエスケープシーケンスはテストしていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.