96 lines
2.9 KiB
TypeScript
96 lines
2.9 KiB
TypeScript
import * as plugins from './smartsitemap.plugins.js';
|
|
import type * as interfaces from './interfaces/index.js';
|
|
import { UrlsetBuilder } from './smartsitemap.classes.urlsetbuilder.js';
|
|
import { FeedImporter } from './smartsitemap.classes.feedimporter.js';
|
|
|
|
/**
|
|
* Specialized builder for Google News sitemaps.
|
|
* Extends UrlsetBuilder with news-specific convenience methods.
|
|
* All standard builder methods (add, filter, merge, etc.) are inherited.
|
|
*/
|
|
export class NewsSitemapBuilder extends UrlsetBuilder {
|
|
private publicationName: string;
|
|
private publicationLanguage: string;
|
|
|
|
constructor(options: interfaces.INewsSitemapOptions) {
|
|
super(options);
|
|
this.publicationName = options.publicationName;
|
|
this.publicationLanguage = options.publicationLanguage ?? 'en';
|
|
}
|
|
|
|
/**
|
|
* Add a news article URL with convenient parameters.
|
|
* Automatically fills in publication name and language from constructor options.
|
|
*/
|
|
addNewsUrl(
|
|
loc: string,
|
|
title: string,
|
|
publicationDate: Date | string | number,
|
|
keywords?: string[] | string,
|
|
): this {
|
|
this.add({
|
|
loc,
|
|
news: {
|
|
publication: {
|
|
name: this.publicationName,
|
|
language: this.publicationLanguage,
|
|
},
|
|
publicationDate,
|
|
title,
|
|
keywords,
|
|
},
|
|
});
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Import from RSS/Atom feed URL, automatically mapping items to news entries.
|
|
*/
|
|
async importFromFeedUrl(feedUrl: string, options?: interfaces.IFeedImportOptions): Promise<this> {
|
|
const imported = await FeedImporter.fromUrlAsNews(
|
|
feedUrl,
|
|
options?.publicationName ?? this.publicationName,
|
|
options?.publicationLanguage ?? this.publicationLanguage,
|
|
options,
|
|
);
|
|
this.addUrls(imported);
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Import from RSS/Atom feed string, automatically mapping items to news entries.
|
|
*/
|
|
async importFromFeedString(feedXml: string, options?: interfaces.IFeedImportOptions): Promise<this> {
|
|
const imported = await FeedImporter.fromStringAsNews(
|
|
feedXml,
|
|
options?.publicationName ?? this.publicationName,
|
|
options?.publicationLanguage ?? this.publicationLanguage,
|
|
options,
|
|
);
|
|
this.addUrls(imported);
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Import from @tsclass/tsclass IArticle array with proper news mapping.
|
|
*/
|
|
importFromArticles(articles: plugins.tsclass.content.IArticle[]): this {
|
|
for (const article of articles) {
|
|
this.add({
|
|
loc: article.url,
|
|
lastmod: article.timestamp ? new Date(article.timestamp) : undefined,
|
|
news: {
|
|
publication: {
|
|
name: this.publicationName,
|
|
language: this.publicationLanguage,
|
|
},
|
|
publicationDate: article.timestamp ? new Date(article.timestamp) : new Date(),
|
|
title: article.title || '',
|
|
keywords: article.tags,
|
|
},
|
|
});
|
|
}
|
|
return this;
|
|
}
|
|
}
|