add site_name and site_icon to page model and return in resolver (#341)

* add site_name and site_icon to page model and return in resolver

* fix tests
This commit is contained in:
Hongbo Wu 2022-03-30 10:43:10 +08:00 committed by GitHub
parent 102c747a99
commit 6d405432af
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 24 additions and 3 deletions

View file

@ -142,6 +142,7 @@ export interface Page {
archivedAt?: Date | null
siteName?: string
_id?: string
siteIcon?: string
}
const keys = ['_id', 'url', 'slug', 'userId', 'uploadFileId'] as const

View file

@ -66,6 +66,8 @@ export type Article = {
savedByViewer?: Maybe<Scalars['Boolean']>;
sharedComment?: Maybe<Scalars['String']>;
shareInfo?: Maybe<LinkShareInfo>;
siteIcon?: Maybe<Scalars['String']>;
siteName?: Maybe<Scalars['String']>;
slug: Scalars['String'];
title: Scalars['String'];
uploadFileId?: Maybe<Scalars['ID']>;
@ -2406,6 +2408,8 @@ export type ArticleResolvers<ContextType = ResolverContext, ParentType extends R
savedByViewer?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
sharedComment?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
shareInfo?: Resolver<Maybe<ResolversTypes['LinkShareInfo']>, ParentType, ContextType>;
siteIcon?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
siteName?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
slug?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
title?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
uploadFileId?: Resolver<Maybe<ResolversTypes['ID']>, ParentType, ContextType>;

View file

@ -47,6 +47,8 @@ type Article {
savedByViewer: Boolean
sharedComment: String
shareInfo: LinkShareInfo
siteIcon: String
siteName: String
slug: String!
title: String!
uploadFileId: ID

View file

@ -157,6 +157,8 @@ declare module '@omnivore/readability' {
excerpt: string
/** Article site name */
siteName: string
/** Article site icon */
siteIcon: string
/** Article preview image */
previewImage?: string
/** Article published date */

View file

@ -272,6 +272,7 @@ export const createArticleResolver = authorized<
createdAt: saveTime,
savedAt: saveTime,
siteName: parsedContent?.siteName,
siteIcon: parsedContent?.siteIcon,
readingProgressPercent: 0,
readingProgressAnchorIndex: 0,
}

View file

@ -338,6 +338,8 @@ const schema = gql`
linkId: ID
labels: [Label!]
uploadFileId: ID
siteName: String
siteIcon: String
}
# Query: article

View file

@ -286,6 +286,7 @@ export const parsePreparedContent = async (
title: article?.title || jsonLdLinkMetadata.title,
previewImage: article?.previewImage || jsonLdLinkMetadata.previewImage,
siteName: article?.siteName || jsonLdLinkMetadata.siteName,
siteIcon: article?.siteIcon,
byline: article?.byline || jsonLdLinkMetadata.byline,
})
logRecord.parseSuccess = true

View file

@ -1880,6 +1880,12 @@ Readability.prototype = {
metadata.siteName = jsonld.siteName ||
values["og:site_name"];
// get website icon
const iconLink = this._doc.querySelector(
"link[rel='apple-touch-icon'], link[rel='shortcut icon'], link[rel='icon']"
);
metadata.siteIcon = iconLink ? iconLink.href : '';
// get published date
metadata.publishedDate = jsonld.publishedDate ||
values["date"] ||
@ -1907,6 +1913,7 @@ Readability.prototype = {
metadata.byline = this._unescapeHtmlEntities(metadata.byline);
metadata.excerpt = this._unescapeHtmlEntities(metadata.excerpt);
metadata.siteName = this._unescapeHtmlEntities(metadata.siteName);
metadata.siteIcon = this._unescapeHtmlEntities(metadata.siteIcon);
metadata.previewImage = this._unescapeHtmlEntities(metadata.previewImage);
if (metadata.previewImage) {
@ -2876,6 +2883,7 @@ Readability.prototype = {
length: textContent.length,
excerpt: metadata.excerpt,
siteName: metadata.siteName || this._articleSiteName,
siteIcon: metadata.siteIcon,
previewImage: metadata.previewImage,
publishedDate: metadata.publishedDate || publishedAt || this._articlePublishedDate,
};

View file

@ -227,7 +227,7 @@ describe("Readability API", function() {
});
it("should run _cleanClasses with default configuration", function() {
var doc = new JSDOMParser().parse(exampleSource);
var doc = new JSDOM(exampleSource).window.document;
var parser = new Readability(doc);
parser._cleanClasses = sinon.fake();
@ -238,7 +238,7 @@ describe("Readability API", function() {
});
it("should run _cleanClasses when option keepClasses = false", function() {
var doc = new JSDOMParser().parse(exampleSource);
var doc = new JSDOM(exampleSource).window.document;
var parser = new Readability(doc, {keepClasses: false});
parser._cleanClasses = sinon.fake();
@ -249,7 +249,7 @@ describe("Readability API", function() {
});
it("shouldn't run _cleanClasses when option keepClasses = true", function() {
var doc = new JSDOMParser().parse(exampleSource);
var doc = new JSDOM(exampleSource).window.document;
var parser = new Readability(doc, {keepClasses: true});
parser._cleanClasses = sinon.fake();