Send to your Kindle *** %%使われ方%% [#g82b3a99] %%必ず(フレームワークか要素に含まれるコントローラークラスの)コードから呼ばれるので、セレクターの使い方はフレームワークに含めない。セレクターを解釈するライブラリーを用意。処理対象の型や戻り値を統一したりもしない。セレクターはAPIからも呼ばれる。%% - %%ページ1つ → ルート要素%% - %%要素1つ → Select() → 要素セット%% - %%ページ1つ → match()/test? → boolean%% RIGHT:[[:t/セレクター]] [[:t/要素]] [[:t/データアクセス]] [[☆]] 他の要素を指す要素。%%書式。それを解釈するのが要素。%% 「[[全てURIで]]」、データアクセスで使うページ/要素取得要素。%%記法(要素を呼び出す[[記法]]ではない)。%%要素に他の要素を複数与えるために使う。 これもプラグインで。デフォルトでは記法定義なし。汎用記法で使う。 [[参照記法]]。 ---- #contents *セレクター [#c133273a] // まとめ *[[:t/セレクター]]より [#p0acaaff] **未分類 [#caf4f371] あとで[[:t/セレクター]]を追加。 // ***[[:i/]] ***[[:/セレクターは属性値デコレーションに使えない]] [#wa60954e] ***[[:/システムが書くページ裏]] [#uf771300] ***[[:/セレクターでは上位/下位ページも指定可能に]] [#n6460793] ***[[:i/ページ属性はセレクターで読む]] [#e2114575] ***[[:i/要素埋め込み]] [#c9741862] ***書き方 [#kdbf06bd] querySelector風に。 ページパスの表現も含む。 どう書くか?→ページを示すURIと、要素のインスタンス名/要素のクラス名の列をつなげて。ここに特定版(見解や版も)を含めなければいけない?? 要素にはインスタンス名を付けられるようにしたい。名前は重複するかも知れないので、IDというより名前。 ***CSS Selectors風セレクター [#oa4d5853] CSS Selectors風。document.querySelectorAll()の書式。 タグ名にあたるのが要素のクラス名。 継承したクラス名にあたるのが要素インスタンスが持つ"dotAnnotation''s''"属性。ノートアプリの「タグ」にあたるもの。でもこの言葉はもうマークアップタグとして使ってしまっているので。 :nth…とか:firstとか:evenみたいな疑似セレクターにあたるものは必要なものを似せて実装。 セレクター要素が必要。表現を解釈して要素セットを出力する要素。以前の参照記法にあたるもの。 "/"区切りのURIやページ名とひと続きになっていい。(ページ名区切りは変更可能だけど) これをページ内やURL内に書く。 PHPでならDOMXPathを利用したライブラリーがある。 [[tj/php-selector: PHP DOM parser / queries with CSS selectors>https://github.com/tj/php-selector]] ([[https://github.com/tj/php-selector/blob/master/selector.inc]]) ***XPath風でもいい [#if59dae9] document.evaluate()で使うような記法。 XPathだとURIやページ名とひと続きになっていい。(ページ名の区切りは変更可能だけど) %%ただ、CSSで使われるquerySelector風形式よりも使われてなさそう。CSS使う人だけが利用者ではないのでこの点は考えなくてもいい。%% PHPにはDOMXPathがあるので、簡単。ページをHTML化してこれに与えれば、XPathで要素を指定できる。 [[PHP: DOMXPath - Manual>https://www.php.net/manual/ja/class.domxpath.php]] ***リンクを関連名でフィルタリング [#k5ca34df] エレメント取得はデータアクセスで要素取得すればいい。 ページセットのほうはリンク要素を取得して関連名でフィルタリングするもの。それをページセットで返せればいいので。 リンクのセット→ページセット はセットの要素を個別に扱う必要がある。 †[[:Done/セットの扱い]] †[[:i/参照記法は不要]] RIGHT:[[:t/要素]] [[:t/開発]] [[:t/API]] [[:t/ページセット]] *** ページ名と一体化できる [#g7fd1fe3] ページパス+要素パス 埋め込み要素ではページ名と属性名を指定することも可能。 「全てURIで」はパラメーターをDictionaryで与えるようなもの。これを使うので一体にする必要はない。 RIGHT:[[:t/セレクター]] [[:t/データアクセス]] セレクターはページ名を含まない。 「ページセットにある各ページのルート要素から、指定位置にある要素」という指定をしたいので、ページ指定と分ける。 一体化してもいい。ページ名部分を指定せず、分けることもできるのがいい。 ***%%Selector%% [#haf7df70] %%Selector要素。「全てURIで」の要素指示の部分の解釈もする。%% %%実装はVisitorパターン。Visitorが解析後のセレクター記法を持って、要素を収集していく。%% %%Acceptorにどんな順番で道案内させるかは、Visitorがセレクターを読んで決める。Acceptorは全てのセレクターに対応できるよう選択肢を用意。%% *** %%セレクターは要素ではない%% [#udd426f6] %%セレクターはパラメーターの書き方。どう扱われるかはそれを受け入れる側(要素など)次第。%% *** %%使われ方%% [#g82b3a99] %%必ず(フレームワークか要素に含まれるコントローラークラスの)コードから呼ばれるので、セレクターの使い方はフレームワークに含めない。セレクターを解釈するライブラリーを用意。処理対象の型や戻り値を統一したりもしない。セレクターはAPIからも呼ばれる。%% - %%ページ1つ → ルート要素%% - %%要素1つ → Select() → 要素セット%% - %%ページ1つ → match()/test? → boolean%% *セレクター/ [#d8b0d7c2] #ls ***セレクターでやること [#m6646769] +トークン化、空白類区切り +行頭から解析 +DOM風をトークン通りに辿る ++辿れないときは無かったことに→null 空セットではなく。 ++辿れたら→要素セット 要素セットの順序は決まっていない。混乱するような順序ではない。