{"version":3,"sources":["webpack://@lemon8/webapp-seo/./shared/models/article/article.ts","webpack://@lemon8/webapp-seo/./shared/models/article/article-unavailable.ts","webpack://@lemon8/webapp-seo/./shared/utils/format/time-fowmatter.ts","webpack://@lemon8/webapp-seo/./shared/models/article/json-ld-util.ts","webpack://@lemon8/webapp-seo/./shared/models/article/article-util.ts","webpack://@lemon8/webapp-seo/./shared/models/user/json-ld-util.ts","webpack://@lemon8/webapp-seo/./shared/models/user/user.ts","webpack://@lemon8/webapp-seo/./shared/models/user/user-unavailable.ts","webpack://@lemon8/webapp-seo/./shared/models/comments/comment.ts","webpack://@lemon8/webapp-seo/./shared/models/comments/json-ld-util.ts","webpack://@lemon8/webapp-seo/./shared/models/comments/rich-content.ts","webpack://@lemon8/webapp-seo/./shared/models/media.ts","webpack://@lemon8/webapp-seo/./shared/models/topic/topic-unavailable.ts","webpack://@lemon8/webapp-seo/./shared/models/discover/discover-data.ts","webpack://@lemon8/webapp-seo/./shared/models/discover/discover-util.ts","webpack://@lemon8/webapp-seo/./shared/models/search-word.ts","webpack://@lemon8/webapp-seo/./shared/models/page-level-traffic.ts","webpack://@lemon8/webapp-seo/./shared/models/topic/topic-util.ts","webpack://@lemon8/webapp-seo/./shared/utils/escape-xml.ts","webpack://@lemon8/webapp-seo/./src/components/image/index.tsx","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/i18n/region.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/i18n/language.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/i18n/europe.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/i18n-text.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/render-config.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/traffic.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/user-agent.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/web-user.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/locale.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/ab-test.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/crawler.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/page-traffic.js","webpack://@lemon8/webapp-seo/../libs/lemon8-webapp-shared/dist/esm/model/page-loading.js"],"names":["ECommentPermission","EArticleClass","EArticleUnavailableReason","dateToLocalISO","timeStamp","timeZone","off","absoff","Math","abs","concat","Date","toISOString","substr","toFixed","padStart","toString","ArticleJsonLDUtil","getTitle","props","article","t","articleTitle","title","removeEscapedSpecialXmlCharacter","replace","articleClass","author","nickName","getDescription","articleShortContent","shortContent","getKeywords","result","relatedQueryInfos","push","map","info","word","getSocialMediaJsonLD","region","articleTranslated","ArticleDetailUtil","jsonLDTitle","jsonLDDescription","jsonLDKeywords","canonicalUrl","readCount","diggCount","favoriteCount","commentCount","publishTime","modifyTime","gptSummary","imageList","galleryImageList","galleryLabels","ocrText","imageListWithExtraInfo","image","index","_objectSpread","imgOcrText","galleryKeywords","filter","label","imageIndex","name","url","contentUrl","representativeOfPage","keywords","caption","String","embeddedTextCaption","largeImage","articleBaseJsonLD","headline","description","datePublished","sharedContent","mainEntityOfPage","interactionStatistic","interactionType","userInteractionCount","dateModified","abstract","getVideoObjectJsonLD","_a","video","isTranslatedVersion","output","thumbnailUrl","uploadDate","encryptedUrl","width","height","duration","VideoUtils","ocr","length","join","isArticleAvailable","hasTranslatedVersion","translatedRegions","isTranslatedArticleToShow","getOriginalArticleCanonicalUri","linkName","groupId","articleRegion","getCurrentArticleCanonicalUri","JsonLD","UserJsonLDUtil","getPersonJsonLD","user","userRegion","person","alternateName","identifier","propertyID","value","dugCount","favoredCount","Number","followerCount","followingCount","postCount","EUserGender","EPrivacyStatus","UserDetailUtil","isUserAvailable","EUserUnavailableReason","CommentUtil","isReply","comment","replyToCommentId","isPrimaryComment","isReplyToReply","replyToReplyId","JsonLd","getCommentsJsonLd","comments","item","text","avatar","CommentRichContentUtil","ECommentRichContentCategory","durationTo8601","hour","trunc","minute","second","ret","ETopicUnavailableReason","EDiscoverUnavailableReason","DiscoverUtil","Libra","shouldUseSortModel","parameters","Boolean","_get","shouldFormatAsArticleDetail","isDiscoverDataAvailable","input","EWordType","PageLevelTrafficUtil","getPageIdFromTraffic","traffic","pageType","EPageType","categoryId","hashtagId","poiId","keyword","userId","TopicUtil","isTopicAvailable","topic","escapeSpecialXmlCharacter","content","unescapeSpecialXmlCharacter","Image","jsx","onContextMenu","e","preventDefault","Region","RegionDisplayMap","jp","th","my","id","vn","us","gb","sg","ph","getRegionIDC","includes","Language","LanguageDisplayNameMap","en","ja","ms","vi","fil","RegionFallbackLanguageMap","RegionHrefLangMap","EURO_COUNTRY_LIST","EURO_COUNTRY_SET","Set","isEuropeRegion","has","$I18nText","atom","debugLabel","$RenderConfig","isSteamingSSR","$Traffic","href","pid","$UserAgent","isMobile","isBot","isiOS","isSafari","isInApp","isMacOS","$WebUser","webId","LOCALE_PLACEHOLDER","$Locale","ipRegion","language","$ABTest","versions","$Crawler","$PageTraffic","pageName","$PageLoading"],"mappings":"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","file":"7-529edefa84b1efd1375c.js","sourcesContent":["import { IImage, IVideo } from '../media';\nimport { IUserAuthInfo } from 'shared/models/user-auth-info';\n\nexport enum ECommentPermission {\n All = 0, // 显示评论区\n Follower = 1, // 粉丝可评论\n Self = 2, // 自己可评论\n Disable = 3, // 不可评论,不显示评论区\n Friend = 4, // 好友可评论\n}\n\nexport interface GalleryLabelType {\n direction: string;\n id: string;\n imageIndex: number;\n name: string;\n type: string;\n xPct: number;\n yPct: number;\n}\n\nexport enum EArticleClass {\n GALLERY = 'Gallery',\n VIDEO = 'Video',\n ARTICLE = 'Article',\n}\n\nexport interface IIllegalInfo {\n warningLabel: string;\n warningLabelType: number;\n}\n\nexport interface IArticleDetail {\n groupId: string;\n templateId?: string;\n imprId?: string;\n\n // author\n author: {\n userId: string;\n avatar: string;\n authInfo: IUserAuthInfo;\n nickName: string;\n linkName: string;\n };\n\n // content\n articleClass: EArticleClass;\n\n // TODO cast to i18n:Region\n articleRegion: string;\n title: string;\n content: string;\n shortContent: string;\n\n translatedRegions?: string[];\n isTranslatedVersion?: boolean;\n\n gptSummary?: string;\n\n // content publish time\n publishTime: number;\n modifyTime?: number;\n\n // interaction\n readCount: number;\n diggCount: number;\n favoriteCount: number;\n commentCount: number;\n\n // legacy hashtag\n forumList?: {\n id: string;\n name: string;\n }[];\n\n // poi\n locationInfo?: {\n poiId: string;\n poiName: string;\n };\n\n // search after read\n relatedQuery?: string;\n relatedQueryInfos: { word: string }[];\n\n // privacy & safety\n isOnlyFollow: boolean;\n commentPermission: ECommentPermission;\n illegalInfo?: IIllegalInfo;\n}\n\nexport interface IVideoArticleDetail extends IArticleDetail {\n articleClass: EArticleClass.VIDEO;\n largeImage: IImage;\n video: IVideo & { encryptedUrl?: string; ocr?: string[] };\n}\n\nexport interface IGalleryArticleDetail extends IArticleDetail {\n articleClass: EArticleClass.GALLERY;\n imageList: IImage[];\n galleryLabels: GalleryLabelType[];\n ocrText?: string[]; // ocr识别文字\n imageAutoGenDesp?: string[]; // 图片描述自动生成\n}\n\nexport interface IRichArticleDetail extends IArticleDetail {\n articleClass: EArticleClass.ARTICLE;\n largeImage: IImage;\n}\n\nexport type TArticleDetail = IVideoArticleDetail | IGalleryArticleDetail | IRichArticleDetail;\n","export enum EArticleUnavailableReason {\n NOT_FOUND = 'not_found',\n PRIVATE_ACCOUNT = 'private_account',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface IArticleUnavailableDetail {\n groupId: string;\n unavailableReason: EArticleUnavailableReason;\n}\n","export const dateToLocalISO = function (timeStamp: number, timeZone: number) {\n // off为当地时区相对UTC的偏移量,日本为9,中国为8\n const off = -timeZone * 60;\n const absoff = Math.abs(off);\n return `${\n new Date(timeStamp * 1000 - off * 60 * 1000).toISOString().substr(0, 23) +\n (off > 0 ? '-' : '+') +\n (absoff / 60).toFixed(0).padStart(2, '0')\n }:${(absoff % 60).toString().padStart(2, '0')}`;\n};\n","import {\n ArticleDetailUtil,\n EArticleClass,\n IArticleDetail,\n IGalleryArticleDetail,\n IImage,\n IRichArticleDetail,\n IVideoArticleDetail,\n VideoUtils,\n} from 'shared/models';\nimport { ImageObject, SocialMediaPosting, VideoObject } from 'schema-dts';\nimport { Region } from '@lemon8/webapp-shared/i18n';\nimport type { TFunction } from 'i18next';\nimport { removeEscapedSpecialXmlCharacter } from 'shared/utils/escape-xml';\nimport { dateToLocalISO } from 'shared/utils/format/time-fowmatter';\n\nexport const ArticleJsonLDUtil = {\n getTitle: (props: { article: IArticleDetail; region: Region; t: TFunction }): string => {\n const { article, t } = props;\n\n const articleTitle = article.title;\n if (articleTitle) {\n return removeEscapedSpecialXmlCharacter(articleTitle.replace(/\\s+/g, ' '));\n }\n\n // 3. fallback title according to article class\n if (article.articleClass === EArticleClass.GALLERY) {\n return `${t('user_published_gallery').replace('%s', article.author.nickName)} | Lemon8`;\n } else if (article.articleClass === EArticleClass.VIDEO) {\n return `${t('own_video').replace('%s', article.author.nickName)} | Lemon8`;\n } else {\n return `${t('user_published_article').replace('%s', article.author.nickName)} | Lemon8`;\n }\n },\n getDescription: (props: { article: IArticleDetail; region: Region; t: TFunction }): string => {\n const { article } = props;\n\n const articleShortContent = article.shortContent;\n if (articleShortContent) {\n return removeEscapedSpecialXmlCharacter(articleShortContent.replace(/\\s+/g, ' '));\n }\n return ArticleJsonLDUtil.getTitle(props);\n },\n getKeywords: (props: { article: IArticleDetail; region: Region; t: TFunction }): string[] => {\n const { article } = props;\n\n const result: string[] = [];\n const { relatedQueryInfos } = article;\n\n const articleTitle = article.title;\n if (articleTitle) {\n result.push(articleTitle);\n }\n\n result.push(article.author.nickName);\n result.push(...relatedQueryInfos.map((info) => info.word));\n result.push('Lemon8');\n return result;\n },\n getSocialMediaJsonLD: (props: {\n article: IArticleDetail;\n region: Region;\n t: TFunction;\n abInfo: Record;\n }): SocialMediaPosting => {\n // region: page on the URL query\n const { article, region, t } = props;\n const articleTranslated = ArticleDetailUtil.isTranslatedArticleToShow(article, region);\n\n const jsonLDTitle = ArticleJsonLDUtil.getTitle(props);\n const jsonLDDescription = ArticleJsonLDUtil.getDescription(props);\n const jsonLDKeywords = ArticleJsonLDUtil.getKeywords(props);\n const canonicalUrl = articleTranslated\n ? `https://www.lemon8-app.com${ArticleDetailUtil.getCurrentArticleCanonicalUri(article, region)}`\n : `https://www.lemon8-app.com${ArticleDetailUtil.getOriginalArticleCanonicalUri(article)}`;\n\n const articleTitle = article.title;\n\n const { readCount, diggCount, favoriteCount, commentCount, publishTime, modifyTime, gptSummary } = article;\n\n const imageList: ImageObject[] = [];\n\n if (article.articleClass === EArticleClass.GALLERY) {\n const { imageList: galleryImageList, galleryLabels, ocrText = [] } = article as IGalleryArticleDetail;\n\n const imageListWithExtraInfo = galleryImageList.map((image, index) => {\n return {\n ...image,\n imgOcrText: ocrText[index] || '',\n };\n });\n\n imageList.push(\n ...imageListWithExtraInfo.map((image: IImage & { imgOcrText: string }, index: number): ImageObject => {\n const galleryKeywords = galleryLabels\n .filter((label) => label.imageIndex === index)\n .map((label) => label.name);\n\n return {\n '@type': 'ImageObject',\n url: image.url,\n contentUrl: image.url,\n representativeOfPage: 'True',\n keywords: [...galleryKeywords, articleTitle, article.author.nickName, 'Lemon8'],\n caption: t('own_picture_with_count')\n .replace('%s', articleTitle)\n .replace('%d', String(index + 1)),\n embeddedTextCaption: !articleTranslated ? image.imgOcrText || '' : '',\n };\n }),\n );\n } else {\n const { largeImage } = article as IVideoArticleDetail | IRichArticleDetail;\n imageList.push({\n '@type': 'ImageObject',\n url: largeImage.url,\n contentUrl: largeImage.url,\n representativeOfPage: 'True',\n keywords: [articleTitle, article.author.nickName, 'Lemon8'],\n caption: t('own_picture_with_count').replace('%s', articleTitle).replace('%d', '1'),\n } as ImageObject);\n }\n\n const articleBaseJsonLD: SocialMediaPosting = {\n '@type': 'SocialMediaPosting',\n headline: jsonLDTitle,\n description: jsonLDDescription,\n keywords: jsonLDKeywords,\n url: canonicalUrl,\n commentCount,\n\n datePublished: dateToLocalISO(publishTime, /** currently fix timezone to JP. @lidiang */ 9),\n\n image: imageList,\n sharedContent: imageList,\n\n mainEntityOfPage: {\n '@id': canonicalUrl,\n '@type': 'WebPage',\n },\n interactionStatistic: [\n {\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'ViewAction',\n },\n userInteractionCount: readCount,\n },\n {\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'LikeAction',\n },\n userInteractionCount: diggCount,\n },\n {\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'BookmarkAction',\n },\n userInteractionCount: favoriteCount,\n },\n ],\n };\n\n if (modifyTime) {\n articleBaseJsonLD.dateModified = dateToLocalISO(modifyTime, /** currently fix timezone to JP. @lidiang */ 9);\n }\n\n if (gptSummary) {\n articleBaseJsonLD.abstract = gptSummary;\n }\n\n return articleBaseJsonLD;\n },\n getVideoObjectJsonLD: (props: {\n article: IVideoArticleDetail;\n region: Region;\n t: TFunction;\n abInfo: Record;\n }): VideoObject => {\n const { article } = props;\n const {\n video,\n readCount,\n diggCount,\n favoriteCount,\n largeImage,\n publishTime,\n gptSummary,\n isTranslatedVersion = false,\n } = article;\n\n const title = ArticleJsonLDUtil.getTitle(props);\n const description = ArticleJsonLDUtil.getTitle(props);\n\n const output: VideoObject = {\n '@type': 'VideoObject',\n name: title,\n description,\n thumbnailUrl: largeImage.url,\n uploadDate: dateToLocalISO(publishTime, /** currently fix timezone to JP. @lidiang */ 9),\n contentUrl: video.encryptedUrl || video.url,\n width: `${article.video.width}`,\n height: `${article.video.height}`,\n interactionStatistic: [\n {\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'WatchAction',\n },\n userInteractionCount: readCount,\n },\n {\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'LikeAction',\n },\n userInteractionCount: diggCount,\n },\n {\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'BookmarkAction',\n },\n userInteractionCount: favoriteCount,\n },\n ],\n };\n\n if (article.video.duration) {\n output.duration = VideoUtils.durationTo8601(article.video.duration);\n }\n\n if (gptSummary) {\n output.abstract = gptSummary;\n }\n\n if (video.ocr?.length && !isTranslatedVersion) {\n output.embeddedTextCaption = video.ocr.join(', ');\n }\n\n return output;\n },\n};\n","import { IArticleDetail } from 'shared/models/article/article';\nimport { Region } from '@lemon8/webapp-shared/i18n';\nimport { IArticleUnavailableDetail } from './article-unavailable';\nimport { ArticleJsonLDUtil } from 'shared/models/article/json-ld-util';\n\nexport const ArticleDetailUtil = {\n isArticleAvailable: (article: IArticleUnavailableDetail | IArticleDetail): article is IArticleDetail => {\n return !('unavailableReason' in article);\n },\n /**\n * article has translated version\n */\n hasTranslatedVersion: (article: IArticleDetail): boolean => {\n const { translatedRegions = [] } = article;\n return translatedRegions.length !== 0;\n },\n /**\n * article is translated, and translated version is needed to show\n */\n isTranslatedArticleToShow: (article: IArticleDetail, region: Region): boolean => {\n const { isTranslatedVersion = false } = article;\n return isTranslatedVersion;\n },\n\n /**\n * get canonical Article URL in created region\n */\n getOriginalArticleCanonicalUri: (article: IArticleDetail): string => {\n return `/${article.author.linkName}/${article.groupId}?region=${article.articleRegion}`;\n },\n\n /**\n * get canonical Article URL in current page region\n */\n getCurrentArticleCanonicalUri: (article: IArticleDetail, region: string): string => {\n return `/${article.author.linkName}/${article.groupId}?region=${region}`;\n },\n\n JsonLD: ArticleJsonLDUtil,\n};\n","import { Region } from '@lemon8/webapp-shared/i18n';\nimport { InteractionCounter, Person } from 'schema-dts';\nimport { IUserDetail } from 'shared/models';\n\nexport const UserJsonLDUtil = {\n getPersonJsonLD: (props: { user: IUserDetail; userRegion: Region }): Person => {\n const { user, userRegion } = props;\n\n const person: Person = {\n '@type': 'Person',\n url: `https://www.lemon8-app.com/${user.linkName}?region=${userRegion}`,\n name: user.nickName,\n alternateName: user.linkName,\n identifier: {\n '@type': 'PropertyValue',\n propertyID: 'Username',\n value: user.linkName,\n },\n };\n\n const interactionStatistic: InteractionCounter[] = [];\n\n if (user.dugCount || user.favoredCount) {\n interactionStatistic.push({\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'LikeAction',\n },\n userInteractionCount: Number(user.dugCount) + Number(user.favoredCount),\n });\n }\n\n if (user.followerCount || user.followingCount) {\n interactionStatistic.push({\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'FollowAction',\n },\n userInteractionCount: Number(user.followerCount) + Number(user.followingCount),\n });\n }\n\n if (user.postCount) {\n interactionStatistic.push({\n '@type': 'InteractionCounter',\n interactionType: {\n '@type': 'WriteAction',\n },\n userInteractionCount: Number(user.postCount),\n });\n }\n\n person.interactionStatistic = interactionStatistic;\n\n return person;\n },\n};\n","import { IUserAuthInfo } from 'shared/models/user-auth-info';\nimport { IUserUnavailableDetail } from 'shared/models';\nimport { UserJsonLDUtil } from 'shared/models/user/json-ld-util';\n\nexport interface IUserDetail {\n userId: string;\n avatar: string;\n authInfo: IUserAuthInfo;\n nickName: string;\n linkName: string;\n\n gender: EUserGender;\n ageGroup?: number;\n location?: string;\n\n description: string;\n\n postCount: number;\n diggCount: number;\n dugCount: number;\n favoriteCount: number;\n favoredCount: number;\n followingCount: number;\n followerCount: number;\n\n thirdLinks: {\n platform: string;\n name: string;\n url: string;\n }[];\n\n privacyStatus: EPrivacyStatus;\n\n // banned account\n isBannedAccount: boolean;\n}\n\nexport enum EUserGender {\n Unknown = 0,\n MALE = 1,\n FEMALE = 2,\n}\n\nexport enum EPrivacyStatus {\n Normal = -1,\n UserPageNoPermission = 0,\n UserPageHasPermission = 1,\n PrivateUser = 2,\n UnderAge = 3,\n}\n\nexport const UserDetailUtil = {\n isUserAvailable: (user: IUserDetail | IUserUnavailableDetail): user is IUserDetail => {\n return !('unavailableReason' in user);\n },\n JsonLD: UserJsonLDUtil,\n};\n","export enum EUserUnavailableReason {\n NOT_FOUND = 'not_found',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface IUserUnavailableDetail {\n userId: string;\n unavailableReason: EUserUnavailableReason;\n}\n","import { TCommentRichContent } from './rich-content';\nimport { IUserAuthInfo } from 'shared/models/user-auth-info';\nimport { IImage } from '../media';\nimport { CommentJsonLDUtil } from 'shared/models/comments/json-ld-util';\n\nexport interface IBaseComment {\n commentId: string;\n // timestamp in second\n createTime: number;\n\n author: {\n userId: string;\n avatar: string;\n linkName: string;\n nickName: string;\n authInfo: IUserAuthInfo;\n };\n\n // content\n text: string;\n richContent?: TCommentRichContent[];\n imageList?: IImage[];\n\n // interaction\n diggCount: number;\n}\n\n/**\n * 1st-level comment\n */\nexport interface IPrimaryComment extends IBaseComment {\n replyCount: number;\n}\n\n/**\n * 2nd-level comment\n */\nexport interface IReply extends IBaseComment {\n replyToCommentId: string;\n}\n\n/**\n * 3rd-level comment\n */\nexport interface IReplyToReply extends IReply {\n replyToReplyId: string;\n}\n\nexport type TComment = IPrimaryComment | IReply | IReplyToReply;\n\nexport const CommentUtil = {\n isReply(comment: TComment): comment is IReply {\n return (comment as IReply).replyToCommentId !== void 0;\n },\n isPrimaryComment(comment: TComment): comment is IPrimaryComment {\n return !CommentUtil.isReply(comment);\n },\n isReplyToReply: (comment: TComment): comment is IReplyToReply => {\n return CommentUtil.isReply(comment) && (comment as IReplyToReply).replyToReplyId !== void 0;\n },\n JsonLd: CommentJsonLDUtil,\n};\n\nexport const CommentRichContentUtil = {};\n","import { Region } from '@lemon8/webapp-shared/i18n';\nimport { Comment } from 'schema-dts';\nimport { TComment } from 'shared/models';\n\nexport const CommentJsonLDUtil = {\n getCommentsJsonLd: (props: { comments: TComment[]; region: Region }): Comment[] => {\n const { comments, region } = props;\n\n return comments.map((item: TComment) => {\n return {\n '@type': 'Comment',\n text: item.text.replace(/\\s/g, ' ') || '',\n author: {\n '@type': 'Person',\n name: item.author.nickName,\n alternateName: item.author.linkName,\n image: item.author.avatar,\n identifier: {\n '@type': 'PropertyValue',\n propertyID: 'Username',\n value: item.author.linkName,\n },\n mainEntityOfPage: {\n '@type': 'ProfilePage',\n '@id': `https://www.lemon8-app.com/${item.author.linkName}?region=${region}`,\n },\n },\n };\n });\n },\n};\n","/**\n * 评论富文本类型\n */\nexport enum ECommentRichContentCategory {\n MENTION_USER = 1000,\n}\n\ninterface ICommentRichContent {\n type: ECommentRichContentCategory;\n start: number;\n length: number;\n}\n\nexport interface IMentionUserRichContent extends ICommentRichContent {\n type: ECommentRichContentCategory.MENTION_USER;\n mentionUserId: string;\n}\n\nexport type TCommentRichContent = IMentionUserRichContent;\n","export interface IMedia {\n url: string;\n\n height: number;\n\n width: number;\n}\n\nexport type IImage = IMedia;\n\nexport interface IVideo extends IMedia {\n duration: number;\n}\n\nexport const VideoUtils = {\n durationTo8601: (duration: number) => {\n const hour = Math.trunc(duration / 3600);\n const minute = Math.trunc((duration - hour * 3600) / 60);\n const second = Math.trunc(duration - (hour * 3600 + minute * 60));\n let ret = 'PT';\n if (hour) {\n ret += `${hour}H`;\n }\n if (minute) {\n ret += `${minute}M`;\n }\n if ((!hour && !minute) || second) {\n ret += `${second}S`;\n }\n return ret;\n },\n};\n","export enum ETopicUnavailableReason {\n NOT_FOUND = 'not_found',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface ITopicUnavailableDetail {\n hashtagId: string;\n unavailableReason: ETopicUnavailableReason;\n}\n","import { Article, Topic, User } from '@lemon8/webapp-seo-shared';\nimport { IGuessWordCards, IUserDetail, TArticleDetail, TComment } from 'shared/models';\n\ninterface WithLoadmoreOptions {\n items: T[];\n hasMore: boolean;\n minCursor: number;\n maxCursor: number;\n}\n\nexport type DiscoverBreadcrumbs = {\n breadcrumbs: string;\n};\n\nexport interface IDiscoverData {\n query: string;\n isBanned: false;\n dataFrom: string;\n article: WithLoadmoreOptions
;\n article_v2: WithLoadmoreOptions<{\n article: TArticleDetail;\n author: IUserDetail;\n comments: TComment[];\n }>;\n user: WithLoadmoreOptions;\n hashtag: WithLoadmoreOptions;\n guessWordCards: IGuessWordCards;\n}\n\nexport enum EDiscoverUnavailableReason {\n BANNED = 'banned',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface IDiscoverUnavailableData {\n query: string;\n unavailableReason: EDiscoverUnavailableReason;\n}\n\nexport type TDiscoverData = IDiscoverData | IDiscoverUnavailableData;\n","import _get from 'lodash/get';\nimport { IDiscoverData, IDiscoverUnavailableData } from 'shared/models';\n\nexport const DiscoverUtil = {\n Libra: {\n shouldUseSortModel: (parameters: unknown) => Boolean(_get(parameters, 'seo_web.seo_sort_model_webid', 0)),\n shouldFormatAsArticleDetail: (parameters: unknown) => Boolean(_get(parameters, 'seo_web.kep_immersive', 0)),\n },\n isDiscoverDataAvailable: (input: IDiscoverData | IDiscoverUnavailableData): input is IDiscoverData => {\n return !('unavailableReason' in input);\n },\n};\n","export enum EWordType {\n SarWord = 1,\n RSWord = 2,\n GuessWord = 3,\n BreadcrumbsWord = 4,\n}\n\nexport interface SearchWord {\n word: string;\n wordType: EWordType;\n}\n\nexport interface IGuessWordCard {\n words: SearchWord[];\n pos: number;\n}\n\nexport type IGuessWordCards = IGuessWordCard[];\n","import { EPageType } from 'shared/models/page-type';\n\nexport interface IPageTraffic {\n canonicalUrl: string;\n pageType: EPageType;\n seoPageId: string;\n}\n\nexport interface IFeedPageTraffic extends IPageTraffic {\n pageType: EPageType.feed;\n categoryId: string;\n}\n\nexport interface IHashtagPageTraffic extends IPageTraffic {\n pageType: EPageType.hashtag;\n hashtagId: string;\n}\n\nexport interface IArticlePageTraffic extends IPageTraffic {\n pageType: EPageType.article;\n groupId: string;\n mediaId: string;\n contentByTranslate: 0 | 1;\n}\n\nexport interface IVideoPageTraffic extends IPageTraffic {\n pageType: EPageType.video;\n groupId: string;\n mediaId: string;\n contentByTranslate: 0 | 1;\n}\n\nexport interface IPOIPageTraffic extends IPageTraffic {\n pageType: EPageType.poi;\n poiId: string;\n}\n\nexport interface IDiscoverPageTraffic extends IPageTraffic {\n pageType: EPageType.discover;\n keyword: string;\n standardKeyword: string;\n hasBreadCrumb: boolean;\n}\n\nexport interface IUserPageTraffic extends IPageTraffic {\n pageType: EPageType.user;\n userLinkName: string;\n userId: string;\n}\n\nexport interface IUserFollowPageTraffic extends IPageTraffic {\n pageType: EPageType.user_follow;\n userLinkName: string;\n userId: string;\n}\n\nexport interface IUserTopicPageTraffic extends IPageTraffic {\n pageType: EPageType.user_topic;\n userLinkName: string;\n userId: string;\n}\n\nexport type PageLevelTraffic =\n | IFeedPageTraffic\n | IHashtagPageTraffic\n | IPOIPageTraffic\n | IArticlePageTraffic\n | IVideoPageTraffic\n | IDiscoverPageTraffic\n | IUserPageTraffic\n | IUserFollowPageTraffic\n | IUserTopicPageTraffic;\n\nexport const PageLevelTrafficUtil = {\n getPageIdFromTraffic: (traffic: PageLevelTraffic): string | null => {\n if (traffic.pageType === EPageType.feed) {\n return traffic.categoryId;\n }\n\n if (traffic.pageType === EPageType.hashtag) {\n return traffic.hashtagId;\n }\n\n if (traffic.pageType === EPageType.poi) {\n return traffic.poiId;\n }\n\n if (traffic.pageType === EPageType.article || traffic.pageType === EPageType.video) {\n return traffic.groupId;\n }\n\n if (traffic.pageType === EPageType.discover) {\n return traffic.keyword;\n }\n\n if (\n traffic.pageType === EPageType.user ||\n traffic.pageType === EPageType.user_follow ||\n traffic.pageType === EPageType.user_topic\n ) {\n return traffic.userId;\n }\n\n return null;\n },\n};\n","import { HashtagInfo } from '@lemon8/webapp-seo-shared';\nimport { ITopicUnavailableDetail } from 'shared/models';\n\nexport const TopicUtil = {\n isTopicAvailable: (topic: HashtagInfo | ITopicUnavailableDetail): topic is HashtagInfo => {\n return !('unavailableReason' in topic);\n },\n};\n","/**\n * xml 中特殊字符过滤\n * 参考 https://developers.google.com/search/docs/advanced/sitemaps/build-sitemap#sitemap-encoding-guidelines\n */\nexport const escapeSpecialXmlCharacter = (content: string): string =>\n content\n .replace(/&/g, '&')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/>/g, '>')\n .replace(/\n content\n .replace(/&/g, '&')\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/"/g, '\"')\n .replace(/>/g, '>')\n .replace(/</g, '<');\n\nexport const removeEscapedSpecialXmlCharacter = (content: string): string =>\n content.replace(/&(lt|gt|nbsp|amp|quot);/gi, '');\n","import React from 'react';\n\nexport const Image = (\n props: React.DetailedHTMLProps<\n React.ImgHTMLAttributes & { fetchpriority?: 'high' | 'low' | 'auto' },\n HTMLImageElement\n >,\n) => {\n return e.preventDefault()} />;\n};\n","/**\n * ISO 639-1 Language Code\n */\nexport var Region;\n(function (Region) {\n Region[\"jp\"] = \"jp\";\n Region[\"th\"] = \"th\";\n Region[\"my\"] = \"my\";\n Region[\"id\"] = \"id\";\n Region[\"ph\"] = \"ph\";\n Region[\"vn\"] = \"vn\";\n Region[\"us\"] = \"us\";\n Region[\"gb\"] = \"gb\";\n Region[\"sg\"] = \"sg\";\n})(Region || (Region = {}));\nexport const RegionDisplayMap = {\n [Region.jp]: '日本',\n [Region.th]: 'ไทย',\n [Region.my]: 'Malaysia',\n [Region.id]: 'Indonesia',\n [Region.vn]: 'Việt Nam',\n [Region.us]: 'US',\n [Region.gb]: 'UK',\n [Region.sg]: 'Singapore',\n [Region.ph]: 'Philippines',\n};\nexport const getRegionIDC = (region) => {\n return [Region.jp, Region.us, Region.gb].includes(region) ? 'va' : 'sg';\n};\n//# sourceMappingURL=region.js.map","import { Region } from './region';\nexport var Language;\n(function (Language) {\n Language[\"en\"] = \"en\";\n Language[\"id\"] = \"id\";\n Language[\"ja\"] = \"ja\";\n Language[\"ms\"] = \"ms\";\n Language[\"th\"] = \"th\";\n Language[\"vi\"] = \"vi\";\n Language[\"fil\"] = \"fil\";\n})(Language || (Language = {}));\nexport const LanguageDisplayNameMap = {\n en: 'English',\n id: 'Bahasa Indonesia',\n ja: '日本語',\n ms: 'Bahasa Melayu',\n th: 'ไทย',\n vi: 'Tiếng Việt',\n fil: 'Pilipino',\n};\nexport const RegionFallbackLanguageMap = {\n [Region.jp]: Language.ja,\n [Region.th]: Language.th,\n [Region.my]: Language.ms,\n [Region.id]: Language.id,\n [Region.vn]: Language.vi,\n [Region.us]: Language.en,\n [Region.gb]: Language.en,\n [Region.sg]: Language.en,\n [Region.ph]: Language.en,\n};\nexport const RegionHrefLangMap = {\n [Region.jp]: 'ja-jp',\n [Region.th]: 'th-th',\n [Region.my]: 'ms-my',\n [Region.id]: 'id-id',\n [Region.vn]: 'vi-vn',\n [Region.us]: 'en-us',\n [Region.gb]: 'en-gb',\n [Region.sg]: 'en-sg',\n [Region.ph]: 'en-ph',\n};\n//# sourceMappingURL=language.js.map","export const EURO_COUNTRY_LIST = [\n 'at',\n 'be',\n 'bg',\n 'hr',\n 'ch',\n 'cy',\n 'cz',\n 'de',\n 'dk',\n 'ee',\n 'el',\n 'fi',\n 'fr',\n 'gb',\n 'gr',\n 'hu',\n 'ie',\n 'it',\n 'lv',\n 'lt',\n 'lu',\n 'mt',\n 'nl',\n 'pl',\n 'pt',\n 'ro',\n 'sk',\n 'si',\n 'es',\n 'se',\n 'no',\n 'is',\n 'li',\n];\nexport const EURO_COUNTRY_SET = new Set(EURO_COUNTRY_LIST);\nexport const isEuropeRegion = (region) => EURO_COUNTRY_SET.has(region);\n//# sourceMappingURL=europe.js.map","import { atom } from 'jotai';\nexport const $I18nText = atom({});\n//# sourceMappingURL=i18n-text.js.map","import { atom } from 'jotai';\nexport const $RenderConfig = atom({\n isSteamingSSR: false,\n});\n//# sourceMappingURL=render-config.js.map","import { atom } from 'jotai';\nexport const $Traffic = atom({\n href: '',\n pid: '',\n});\n$Traffic.debugLabel = '$Traffic';\n//# sourceMappingURL=traffic.js.map","import { atom } from 'jotai';\nexport const $UserAgent = atom({\n isMobile: false,\n isBot: false,\n isiOS: false,\n isSafari: false,\n isInApp: false,\n isMacOS: false,\n});\n//# sourceMappingURL=user-agent.js.map","import { atom } from 'jotai';\nexport const $WebUser = atom({\n webId: '',\n});\n//# sourceMappingURL=web-user.js.map","import { atom } from 'jotai';\nconst LOCALE_PLACEHOLDER = 'locale_placeholder';\nexport const $Locale = atom({\n region: LOCALE_PLACEHOLDER,\n ipRegion: LOCALE_PLACEHOLDER,\n language: LOCALE_PLACEHOLDER,\n});\n//# sourceMappingURL=locale.js.map","import { atom } from 'jotai';\nexport const $ABTest = atom({\n versions: '',\n parameters: {},\n});\n$ABTest.debugLabel = '$ABTest';\n//# sourceMappingURL=ab-test.js.map","import { atom } from 'jotai';\nexport const $Crawler = atom({});\n//# sourceMappingURL=crawler.js.map","import { atom } from 'jotai';\nexport const $PageTraffic = atom({\n canonicalUrl: '',\n pageName: '',\n});\n$PageTraffic.debugLabel = '$PageTraffic';\n//# sourceMappingURL=page-traffic.js.map","import { atom } from 'jotai';\nexport const $PageLoading = atom(false);\n//# sourceMappingURL=page-loading.js.map"],"sourceRoot":""}