diff --git a/README.md b/README.md index cbd5042..c9954f2 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Required: Optional: +- `exclude` — A string an item's text content must contain to be excluded in the result. - `include` — A string an item's text content must contain to be included in the result. - `linkSelector` — A CSS selector used to identify an `` element within each item that has a href attribute to be used as a link. If the item itself is an `` element, this param can be omitted. diff --git a/src/app/List.tsx b/src/app/List.tsx index 88c36f9..a41e43a 100644 --- a/src/app/List.tsx +++ b/src/app/List.tsx @@ -8,7 +8,15 @@ type Props = Omit; const fetcher = (url: string) => fetch(url).then((r) => r.json()); -const List = ({ name, url, include, itemSelector, titleSelector, linkSelector }: Props) => { +const List = ({ + exclude, + include, + itemSelector, + linkSelector, + name, + titleSelector, + url, +}: Props) => { const [requestUrl, setRequestUrl] = useState(null); useEffect(() => { @@ -17,11 +25,12 @@ const List = ({ name, url, include, itemSelector, titleSelector, linkSelector }: if (window) { const result = new URL("/api", window.location.href); + if (exclude) result.searchParams.set("exclude", exclude); if (include) result.searchParams.set("include", include); result.searchParams.set("itemSelector", itemSelector); + if (linkSelector) result.searchParams.set("linkSelector", linkSelector); if (titleSelector) result.searchParams.set("titleSelector", titleSelector); result.searchParams.set("url", url); - if (linkSelector) result.searchParams.set("linkSelector", linkSelector); timeoutId = setTimeout(() => { setRequestUrl(result.href); @@ -31,7 +40,7 @@ const List = ({ name, url, include, itemSelector, titleSelector, linkSelector }: return () => { if (timeoutId) clearTimeout(timeoutId); }; - }, [include, itemSelector, titleSelector, url, linkSelector]); + }, [exclude, include, itemSelector, titleSelector, url, linkSelector]); const { data, error, isLoading, isValidating } = useSWR(requestUrl, fetcher); diff --git a/src/app/ListForm.tsx b/src/app/ListForm.tsx index b84eb6c..1fdbf3e 100644 --- a/src/app/ListForm.tsx +++ b/src/app/ListForm.tsx @@ -84,6 +84,19 @@ const ListForm = ({ list: initialList, onSubmit }: Props) => { placeholder="example" /> +
+ + { + setList({ ...list, exclude: event.target.value }); + }} + size={100} + placeholder="example" + /> +
{

Required fields: Name, URL and Item selector

) : ( { const requestUrl = URL.parse(request.url); const include = requestUrl?.searchParams.get("include"); + const exclude = requestUrl?.searchParams.get("exclude"); const itemSelector = requestUrl?.searchParams.get("itemSelector"); const titleSelector = requestUrl?.searchParams.get("titleSelector"); const linkSelector = requestUrl?.searchParams.get("linkSelector"); @@ -42,6 +43,15 @@ export const GET = async (request: Request) => { continue; } + if ( + exclude && + exclude.trim() !== "" && + (item.textContent === null || + item.textContent.toLocaleLowerCase().includes(exclude.toLocaleLowerCase()) === true) + ) { + continue; + } + result.debug.itemsAfterFilter += 1; const title = diff --git a/src/app/index.ts b/src/app/index.ts index 18be748..6e96f84 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -1,4 +1,5 @@ export type ListConfig = { + exclude?: string; id: string; include?: string; itemSelector: string; diff --git a/src/app/page.tsx b/src/app/page.tsx index c46776b..d7e8f34 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -96,6 +96,7 @@ const HomePage = () => { render={(closeDialog) => (