FlandreDaisuki / Patchouli

An image searching and browsing tool on pixiv
MIT License
80 stars 6 forks source link

Tag filter exclusion #27

Closed maple3142 closed 5 years ago

maple3142 commented 6 years ago

Is your feature request related to a problem? Please describe.

26 談到說可以用 R-18 之類的來指定要顯示 R18 作品,但目前還沒有方法類似 !R-18 之類的來排除特定 tag

Describe the solution you'd like

!tag 或是 ~tag 或其他的方法來排除 tag

Describe alternatives you've considered

把 tag filter 弄成可以吃一些 expression 之類的,例如 tag1 && !tag2 && (tag3 || tag4),功能更強大也更複雜

Additional context

不曉得有哪些字元是 pixiv tag 的合法字元

FlandreDaisuki commented 6 years ago

這邊有一個關鍵的問題點, 如果一個包含 include 和 exclude 條件的結果,到底要顯示還是隱藏


除了空白是 seperator 之外都是合法字元的樣子

maple3142 commented 6 years ago

同時 include 和 exclude 就丟 error 出來吧

FlandreDaisuki commented 6 years ago

怎麼丟,這絕對會很常發生阿! 而且丟錯誤出來之後是顯示還是不顯示才是最終的使用者體驗,一般人才不在意 console.error 到底發生什麼事

例如:!(fate) && ジャンヌ 我要找的不是 fate 的貞德 卻偏偏有個 tag 是 ジャンヌ・ダルク(Fate)

如果更多條件就會更複雜,例如 <找> && <不找> && <找> 是要依序過濾或是先找 <找> 再剔除 <不找> 等等 若再加上 || 會更複雜

而且這些符號本身也是問題,因為 pixiv 只有空白是作為 seperator 的非法字元,其他皆是 合法 字元 自定義表達式 ! && || () 有可能造成解析錯誤,這也是為什麼最後我只選擇 regex 實作

maple3142 commented 6 years ago

我是覺得 tag 應該要改為嚴格比對,而不是用 regex 來 match 像是 abc 不會 match 到 abc・def,這樣的話就沒有這種問題了

FlandreDaisuki commented 6 years ago

可是這樣我覺得會比現在的難用,像我本命的 tag 就會變成 フランドール・スカーレット 但我現在是打 フラン 就好了

maple3142 commented 6 years ago

tag -> tagstr.includes('tag') !tag -> !tagstr.includes('tag') tag1 && !tag2 -> tagstr.includes('tag1')&&!tagstr.includes('tag2')

所以 !(fate) && ジャンヌ 在 match ジャンヌ・ダルク(Fate) 的時候是不包含的

而符號可以用像是 "ジャンヌ・ダルク(Fate)" 來處理,不過不曉得這對一個 user.js 是不是有點複雜

FlandreDaisuki commented 6 years ago

主要是不確定有沒有 tag 是包含 "/! (合法字元) 的,有的話還是會有問題

FlandreDaisuki commented 6 years ago

被收進 pixiv 百科的直接 out 了

!!!カオスタイム!!! ~で愛してあげようか ! [[](https://dic.pixiv.net/search?query=[) \^ * \& \: \; (


這幾個比較能用 " { + -

根據以上符號比較可行的作法是: 空白:seperator 表 "且" {}:scope 符號,功能同數學的 () 空白||空白:seperator 表 "或" prefix +(可省略):顯示部份搜尋 prefix ++:顯示準確搜尋 prefix -:隱藏部份搜尋 prefix --:隱藏準確搜尋

(A && B) || (!C && !D) => {A B} || {-C -D} !(fate) && ジャンヌ => ジャンヌ -fate

maple3142 commented 6 years ago

&& 我覺得可以當作選擇性的,只有 || 卻沒有 && 有點奇怪 而且 & 是沒有搜尋結果的

FlandreDaisuki commented 6 years ago

我寫好部份了,在 4.2.x/src/lib/tagFilterQuerier.js 測試在 4.2.x/test/tagFilterQueryTestCases.js

目前為了效能,我 tag 都先 cancat 起來了,所以比較難實現 ++-- (不管是 split('\x00') 或是 match, 都不太合適。前者是要對極大量的 tag 大量重配記憶體 immutable String → mutable Array;後者是合法字元裡要處理 RegExp 保留字),目前有什麼值得測試的就 pr 到 4.2.x 或直接留言吧

然後我 wiki 開了所有權限,到時可能還要寫個 tag filter 教學 Orz

maple3142 commented 6 years ago

看了一下 test 應該都沒問題,不過兩個 rule 以上好像不太正常 image

然後 - 好像有點怪怪的 (下面的圖片都是 NSFW) none inclusion exclusion

FlandreDaisuki commented 6 years ago

你自己裝上去的嘛?我沒有在 4.1.x 裝上去喔ww 甚至我 4.2.x 也還在測試階段而已還沒放進去 也就是目前不管哪個版本都還是 RegExp

maple3142 commented 6 years ago

原來是還沒測試== 不過我覺得 test 可以加入一些特殊字元的 rule 進去測試 例如: -R-18 aaa&bbb 之類的...

FlandreDaisuki commented 6 years ago

嗯嗯 目前也有個限制,{} 不能疊到第二層ww {A && B} || {C} -- OK {{A && B} || C} -- G_G

FlandreDaisuki commented 6 years ago

目前的實做的 README https://github.com/FlandreDaisuki/Patchouli/wiki/Tag-Filter-Query-Usage

建立在使用者不會下太複雜的 tag filter 的假設下,這樣應該很夠用了

有 operator 的測試加進去了

FlandreDaisuki commented 6 years ago

v4.2.0-alpha.12 Add tagFilterQuerier 剛剛試了下 效果還算不錯 😀

https://github.com/FlandreDaisuki/Patchouli/tree/4.2.x/dist