mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
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:
parent
102c747a99
commit
6d405432af
9 changed files with 24 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
|
|
|
|||
|
|
@ -47,6 +47,8 @@ type Article {
|
|||
savedByViewer: Boolean
|
||||
sharedComment: String
|
||||
shareInfo: LinkShareInfo
|
||||
siteIcon: String
|
||||
siteName: String
|
||||
slug: String!
|
||||
title: String!
|
||||
uploadFileId: ID
|
||||
|
|
|
|||
2
packages/api/src/readability.d.ts
vendored
2
packages/api/src/readability.d.ts
vendored
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -272,6 +272,7 @@ export const createArticleResolver = authorized<
|
|||
createdAt: saveTime,
|
||||
savedAt: saveTime,
|
||||
siteName: parsedContent?.siteName,
|
||||
siteIcon: parsedContent?.siteIcon,
|
||||
readingProgressPercent: 0,
|
||||
readingProgressAnchorIndex: 0,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -338,6 +338,8 @@ const schema = gql`
|
|||
linkId: ID
|
||||
labels: [Label!]
|
||||
uploadFileId: ID
|
||||
siteName: String
|
||||
siteIcon: String
|
||||
}
|
||||
|
||||
# Query: article
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue