From 6d405432afca9dc9fdf439e3bc41a9af90abae10 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 30 Mar 2022 10:43:10 +0800 Subject: [PATCH] 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 --- packages/api/src/elastic/types.ts | 1 + packages/api/src/generated/graphql.ts | 4 ++++ packages/api/src/generated/schema.graphql | 2 ++ packages/api/src/readability.d.ts | 2 ++ packages/api/src/resolvers/article/index.ts | 1 + packages/api/src/schema.ts | 2 ++ packages/api/src/utils/parser.ts | 1 + packages/readabilityjs/Readability.js | 8 ++++++++ packages/readabilityjs/test/test-readability.js | 6 +++--- 9 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index 72e56adbb..0ec857678 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -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 diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 2820f2ab1..29c880397 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -66,6 +66,8 @@ export type Article = { savedByViewer?: Maybe; sharedComment?: Maybe; shareInfo?: Maybe; + siteIcon?: Maybe; + siteName?: Maybe; slug: Scalars['String']; title: Scalars['String']; uploadFileId?: Maybe; @@ -2406,6 +2408,8 @@ export type ArticleResolvers, ParentType, ContextType>; sharedComment?: Resolver, ParentType, ContextType>; shareInfo?: Resolver, ParentType, ContextType>; + siteIcon?: Resolver, ParentType, ContextType>; + siteName?: Resolver, ParentType, ContextType>; slug?: Resolver; title?: Resolver; uploadFileId?: Resolver, ParentType, ContextType>; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 83124233a..0d38c46b1 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -47,6 +47,8 @@ type Article { savedByViewer: Boolean sharedComment: String shareInfo: LinkShareInfo + siteIcon: String + siteName: String slug: String! title: String! uploadFileId: ID diff --git a/packages/api/src/readability.d.ts b/packages/api/src/readability.d.ts index 38be9cc1d..b18e6d4ba 100644 --- a/packages/api/src/readability.d.ts +++ b/packages/api/src/readability.d.ts @@ -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 */ diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 951ca770e..b85ae7d05 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -272,6 +272,7 @@ export const createArticleResolver = authorized< createdAt: saveTime, savedAt: saveTime, siteName: parsedContent?.siteName, + siteIcon: parsedContent?.siteIcon, readingProgressPercent: 0, readingProgressAnchorIndex: 0, } diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 1ad07cbb8..dc0561077 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -338,6 +338,8 @@ const schema = gql` linkId: ID labels: [Label!] uploadFileId: ID + siteName: String + siteIcon: String } # Query: article diff --git a/packages/api/src/utils/parser.ts b/packages/api/src/utils/parser.ts index 4f198e752..3e7de931f 100644 --- a/packages/api/src/utils/parser.ts +++ b/packages/api/src/utils/parser.ts @@ -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 diff --git a/packages/readabilityjs/Readability.js b/packages/readabilityjs/Readability.js index 5bdfc3d26..ef71eba99 100644 --- a/packages/readabilityjs/Readability.js +++ b/packages/readabilityjs/Readability.js @@ -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, }; diff --git a/packages/readabilityjs/test/test-readability.js b/packages/readabilityjs/test/test-readability.js index 7db815eb7..7c80abfe6 100644 --- a/packages/readabilityjs/test/test-readability.js +++ b/packages/readabilityjs/test/test-readability.js @@ -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();