Add read filter
This commit is contained in:
@ -25,6 +25,7 @@ export interface PubSubData {
|
||||
subscription: string
|
||||
image: string
|
||||
content: string
|
||||
readingProgressPercent: number
|
||||
}
|
||||
|
||||
enum EntityType {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
16
packages/rule-handler/src/search_filter/read_filter.ts
Normal file
16
packages/rule-handler/src/search_filter/read_filter.ts
Normal 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
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user