summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/content.config.ts1
-rw-r--r--src/loaders/pleroma.ts27
2 files changed, 27 insertions, 1 deletions
diff --git a/src/content.config.ts b/src/content.config.ts
index 5dff41a..4b7b230 100644
--- a/src/content.config.ts
+++ b/src/content.config.ts
@@ -42,6 +42,7 @@ const micro = defineCollection({
instanceUrl: "https://social.craftknight.com",
username: "dawid",
maxPosts: 50,
+ allowedTags: ["#miniblog", "#vanlife", "#microblog", "#giereczkowo"],
}),
schema: baseSchema.extend({
description: z.string().optional(),
diff --git a/src/loaders/pleroma.ts b/src/loaders/pleroma.ts
index a833248..73d11da 100644
--- a/src/loaders/pleroma.ts
+++ b/src/loaders/pleroma.ts
@@ -7,6 +7,7 @@ interface PleromaFeedConfig {
username: string;
maxPosts?: number;
accountId?: string; // Optional: if provided, skips account lookup
+ allowedTags?: string[]; // Optional: if provided, only posts with these tags are included
}
interface PleromaAccount {
@@ -150,6 +151,26 @@ function isFilteredStatus(status: PleromaStatus): boolean {
return false;
}
+function extractHashtags(htmlContent: string): string[] {
+ // Extract hashtags from HTML spans and plain text
+ const hashtagPattern = /#(\w+)/gi;
+ const matches = htmlContent.match(hashtagPattern);
+ return matches ? [...new Set(matches.map((tag) => tag.toLowerCase()))] : [];
+}
+
+function hasAllowedTag(status: PleromaStatus, allowedTags: string[]): boolean {
+ if (!allowedTags || allowedTags.length === 0) {
+ return true; // No filtering if no tags specified
+ }
+
+ const content = status.content || "";
+ const hashtags = extractHashtags(content);
+ const normalizedAllowedTags = allowedTags.map((tag) => tag.toLowerCase().replace(/^#/, ""));
+ const normalizedHashtags = hashtags.map((tag) => tag.toLowerCase().replace(/^#/, ""));
+
+ return normalizedHashtags.some((tag) => normalizedAllowedTags.includes(tag));
+}
+
function cleanContent(htmlContent: string): string {
const turndownService = new TurndownService({
headingStyle: "atx",
@@ -227,7 +248,11 @@ export function pleromaLoader(config: PleromaFeedConfig): Loader {
logger.info(`Fetched ${statuses.length} statuses from API`);
// Filter statuses
- const validStatuses = statuses.filter((status) => !isFilteredStatus(status));
+ const validStatuses = statuses.filter((status) => {
+ if (isFilteredStatus(status)) return false;
+ if (config.allowedTags && !hasAllowedTag(status, config.allowedTags)) return false;
+ return true;
+ });
logger.info(`After filtering: ${validStatuses.length} valid posts`);
// Clear existing entries