Multifile support in Filter. #2171

This commit is contained in:
ccd0 2019-07-17 10:25:59 -07:00
parent 1bad329294
commit e2373db508
4 changed files with 56 additions and 50 deletions

View File

@ -127,8 +127,8 @@ Filter =
mask = (mask | (if post.file then 4 else 8)) mask = (mask | (if post.file then 4 else 8))
board = "#{post.siteID}/#{post.boardID}" board = "#{post.siteID}/#{post.boardID}"
site = "#{post.siteID}/*" site = "#{post.siteID}/*"
for key of Filter.filters when ((value = Filter.value key, post)?) for key of Filter.filters
# Continue if there's nothing to filter (no tripcode for example). for value in Filter.values(key, post)
for filter in Filter.filters[key] for filter in Filter.filters[key]
continue if ( continue if (
(filter.boards and !(filter.boards[board] or filter.boards[site] )) or (filter.boards and !(filter.boards[board] or filter.boards[site] )) or
@ -170,26 +170,31 @@ Filter =
!!Filter.test(post).hide !!Filter.test(post).hide
valueF: valueF:
postID: (post) -> "#{post.ID}" postID: (post) -> ["#{post.ID}"]
name: (post) -> post.info.name name: (post) -> [post.info.name]
uniqueID: (post) -> post.info.uniqueID or '' uniqueID: (post) -> [post.info.uniqueID or '']
tripcode: (post) -> post.info.tripcode tripcode: (post) -> [post.info.tripcode]
capcode: (post) -> post.info.capcode capcode: (post) -> [post.info.capcode]
pass: (post) -> post.info.pass pass: (post) -> [post.info.pass]
email: (post) -> post.info.email email: (post) -> [post.info.email]
subject: (post) -> post.info.subject or (if post.isReply then undefined else '') subject: (post) -> [post.info.subject or (if post.isReply then undefined else '')]
comment: (post) -> (post.info.comment ?= g.sites[post.siteID]?.Build?.parseComment?(post.info.commentHTML.innerHTML)) comment: (post) -> [(post.info.comment ?= g.sites[post.siteID]?.Build?.parseComment?(post.info.commentHTML.innerHTML))]
flag: (post) -> post.info.flag flag: (post) -> [post.info.flag]
filename: (post) -> post.file?.name filename: (post) -> post.files.map((f) -> f.name)
dimensions: (post) -> post.file?.dimensions dimensions: (post) -> post.files.map((f) -> f.dimensions)
filesize: (post) -> post.file?.size filesize: (post) -> post.files.map((f) -> f.size)
MD5: (post) -> post.file?.MD5 MD5: (post) -> post.files.map((f) -> f.MD5)
value: (key, post) -> values: (key, post) ->
if key of Filter.valueF if key of Filter.valueF
Filter.valueF[key](post) Filter.valueF[key](post).filter((v) -> v?)
else else
key.split('+').map((k) -> Filter.valueF[k]?(post) or '').join('\n') [key.split('+').map((k) ->
if (f=Filter.valueF[k])
f(post).map((v) -> v or '').join('\n')
else
''
).join('\n')]
addFilter: (type, re, cb) -> addFilter: (type, re, cb) ->
$.get type, Conf[type], (item) -> $.get type, Conf[type], (item) ->
@ -286,21 +291,22 @@ Filter =
return { return {
el: el el: el
open: (post) -> open: (post) ->
value = Filter.value type, post Filter.values(type, post).length
value?
} }
makeFilter: -> makeFilter: ->
{type} = @dataset {type} = @dataset
# Convert value -> regexp, unless type is MD5 # Convert value -> regexp, unless type is MD5
value = Filter.value type, Filter.menu.post values = Filter.values type, Filter.menu.post
res = values.map((value) ->
re = if type in ['uniqueID', 'MD5'] then value else Filter.escape(value) re = if type in ['uniqueID', 'MD5'] then value else Filter.escape(value)
re = if type in ['uniqueID', 'MD5'] if type in ['uniqueID', 'MD5']
"/#{re}/" "/#{re}/"
else else
"/^#{re}$/" "/^#{re}$/"
).join('\n')
Filter.addFilter type, re, -> Filter.addFilter type, res, ->
# Open the settings and display & focus the relevant filter textarea. # Open the settings and display & focus the relevant filter textarea.
Settings.open 'Filter' Settings.open 'Filter'
section = $ '.section-container' section = $ '.section-container'

View File

@ -944,7 +944,7 @@ Index =
catch catch
return [] return []
return Index.sortedThreadIDs.filter (ID) -> return Index.sortedThreadIDs.filter (ID) ->
regexp.test(Filter.value(match[1], Index.parsedThreads[ID]) or '') regexp.test(Filter.values(match[1], Index.parsedThreads[ID]).join('\n'))
return if not (keywords = query.toLowerCase().match /\S+/g) return if not (keywords = query.toLowerCase().match /\S+/g)
Index.sortedThreadIDs.filter (ID) -> Index.sortedThreadIDs.filter (ID) ->
Index.searchMatch Index.parsedThreads[ID], keywords Index.searchMatch Index.parsedThreads[ID], keywords

View File

@ -91,9 +91,9 @@ Test =
c.log y.outerHTML c.log y.outerHTML
for key of Config.filter when not key is 'General' and not (key is 'MD5' and post.board.ID is 'f') for key of Config.filter when not key is 'General' and not (key is 'MD5' and post.board.ID is 'f')
val1 = Filter.value key, obj val1 = Filter.values key, obj
val2 = Filter.value key, post2 val2 = Filter.values key, post2
if val1 isnt val2 unless val1.length is val2.length and val1.every((x, i) -> x is val2[i])
fail = true fail = true
c.log "#{post.fullID} has filter bug in #{key}" c.log "#{post.fullID} has filter bug in #{key}"
c.log val1 c.log val1

View File

@ -45,7 +45,7 @@ ArchiveLink =
value = if type is 'country' value = if type is 'country'
post.info.flagCode or post.info.flagCodeTroll post.info.flagCode or post.info.flagCodeTroll
else else
Filter.value type, post Filter.values(type, post)[0]
# We want to parse the exact same stuff as the filter does already. # We want to parse the exact same stuff as the filter does already.
return false unless value return false unless value
el.href = Redirect.to 'search', el.href = Redirect.to 'search',