Add read filter

This commit is contained in:
Hongbo Wu
2022-11-23 16:28:38 +08:00
parent 6a2d143155
commit ffd7259523
6 changed files with 27 additions and 10 deletions

View File

@ -25,6 +25,7 @@ export interface PubSubData {
subscription: string
image: string
content: string
readingProgressPercent: number
}
enum EntityType {

View File

@ -7,6 +7,7 @@ import { archivePage, markPageAsRead } from './page'
import { SearchFilter } from './search_filter'
import { SubscriptionFilter } from './search_filter/subscription_filter'
import { ContentFilter } from './search_filter/content_filter'
import { ReadFilter } from './search_filter/read_filter'
export enum RuleActionType {
AddLabel = 'ADD_LABEL',
@ -41,7 +42,7 @@ const parseSearchFilter = (filter: string): SearchFilter[] => {
}
const parsed = parse(searchFilter, {
keywords: ['subscription', 'content'],
keywords: ['subscription', 'content', 'is'],
tokenize: true,
})
if (parsed.offsets) {
@ -57,6 +58,9 @@ const parseSearchFilter = (filter: string): SearchFilter[] => {
case 'content':
keyword.value && result.push(new ContentFilter(keyword.value))
break
case 'is':
keyword.value && result.push(new ReadFilter(keyword.value))
break
}
}
}

View File

@ -3,13 +3,11 @@ import { PubSubData } from '../index'
export class ContentFilter extends SearchFilter {
public isValid(data: PubSubData): boolean {
console.debug('ContentFilter.isValid', this.filter, data.content)
if (!data.content) {
return false
}
// TODO: implement content filter with semantic search
return this.filter === '*' || data.content.includes(this.filter)
return this.query === '*' || data.content.includes(this.query)
}
}

View File

@ -1,8 +1,8 @@
import { PubSubData } from '../index'
export abstract class SearchFilter {
constructor(protected filter: string) {
this.filter = filter
constructor(protected query: string) {
this.query = query
}
public abstract isValid(data: PubSubData): boolean

View File

@ -0,0 +1,16 @@
import { PubSubData } from '../index'
import { SearchFilter } from './index'
export class ReadFilter extends SearchFilter {
public isValid(data: PubSubData): boolean {
if (!data.readingProgressPercent) {
return false
}
if (this.query === 'read') {
return data.readingProgressPercent >= 98
}
return data.readingProgressPercent < 98
}
}

View File

@ -3,16 +3,14 @@ import { PubSubData } from '../index'
export class SubscriptionFilter extends SearchFilter {
public isValid(data: PubSubData): boolean {
console.debug('SubscriptionFilter.isValid', this.filter, data.subscription)
if (!data.subscription) {
return false
}
// compare subscription name case insensitive
return (
this.filter === '*' ||
data.subscription.toLowerCase() === this.filter.toLowerCase()
this.query === '*' ||
data.subscription.toLowerCase() === this.query.toLowerCase()
)
}
}