mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2026-04-05 07:15:06 +08:00
🌈 style(eslint): 第一次过 eslint
姑且先把能过的 ts 文件给过了,明天再过其余的 ts 文件跟 vue Signed-off-by: BTMuli <BT-Muli@outlook.com> (cherry picked from commit b7392bddea895b8b8cc1cad5ba0403d2dc738643)
This commit is contained in:
@@ -5,27 +5,27 @@
|
||||
* @since Alpha v0.1.1
|
||||
*/
|
||||
|
||||
import { CalendarData, CalendarCard } from "../interface/calendar";
|
||||
import { type CalendarData, type CalendarCard } from "../interface/calendar";
|
||||
|
||||
/**
|
||||
* @description 将日历数据转换为卡片数据
|
||||
* @since Alpha v0.1.1
|
||||
* @param {CalendarData[]} calendarData 日历数据
|
||||
* @return {CalendarCard[]}
|
||||
* @returns {CalendarCard[]}
|
||||
*/
|
||||
export function getCalendarCard(calendarData: CalendarData[]): CalendarCard[] {
|
||||
const calendarCard: CalendarCard[] = [];
|
||||
calendarData.forEach((data: CalendarData) => {
|
||||
return calendarCard.push({
|
||||
id: Number(data.id),
|
||||
type: Number(data.break_type),
|
||||
title: data.title,
|
||||
cover: data.img_url,
|
||||
url: data.jump_type === "1" ? data.jump_url : data.content_id,
|
||||
drop_day: data.drop_day,
|
||||
sort_day: JSON.parse(data.sort),
|
||||
contentInfos: data.contentInfos,
|
||||
});
|
||||
});
|
||||
return calendarCard;
|
||||
export function getCalendarCard (calendarData: CalendarData[]): CalendarCard[] {
|
||||
const calendarCard: CalendarCard[] = [];
|
||||
calendarData.forEach((data: CalendarData) => {
|
||||
return calendarCard.push({
|
||||
id: Number(data.id),
|
||||
type: Number(data.break_type),
|
||||
title: data.title,
|
||||
cover: data.img_url,
|
||||
url: data.jump_type === "1" ? data.jump_url : data.content_id,
|
||||
drop_day: data.drop_day,
|
||||
sort_day: JSON.parse(data.sort),
|
||||
contentInfos: data.contentInfos,
|
||||
});
|
||||
});
|
||||
return calendarCard;
|
||||
}
|
||||
|
||||
@@ -6,60 +6,60 @@
|
||||
*/
|
||||
|
||||
import { getPostData } from "../request/post";
|
||||
import { GachaCard, GachaData } from "../interface/gacha";
|
||||
import { Map } from "../../../interface/Base";
|
||||
import { type GachaCard, type GachaData } from "../interface/gacha";
|
||||
import { type Map } from "../../../interface/Base";
|
||||
|
||||
/**
|
||||
* @description 根据卡池信息转为渲染用的卡池信息
|
||||
* @since Alpha v0.1.2
|
||||
* @param {GachaData[]} gachaData 卡池信息
|
||||
* @param {Map<string>} poolCover 卡池封面
|
||||
* @return {Promise<GachaCard[]>}
|
||||
* @returns {Promise<GachaCard[]>}
|
||||
*/
|
||||
export async function getGachaCard(
|
||||
gachaData: GachaData[],
|
||||
poolCover: Map<string> | undefined = undefined
|
||||
export async function getGachaCard (
|
||||
gachaData: GachaData[],
|
||||
poolCover: Map<string> | undefined = undefined,
|
||||
): Promise<GachaCard[]> {
|
||||
const gachaCard: GachaCard[] = [];
|
||||
await Promise.allSettled(
|
||||
gachaData.map(async (data: GachaData) => {
|
||||
let cover = "/source/UI/empty.webp";
|
||||
const post_id: number | undefined = Number(data.activity_url.split("/").pop()) || undefined;
|
||||
if (post_id === undefined || isNaN(post_id)) {
|
||||
throw new Error("无法获取帖子 ID");
|
||||
}
|
||||
if (poolCover !== undefined) {
|
||||
cover = poolCover[post_id];
|
||||
} else {
|
||||
try {
|
||||
await console.log("调用 getPostData");
|
||||
const post = await getPostData(post_id);
|
||||
cover = post.cover?.url || post.post.images[0];
|
||||
} catch (error) {
|
||||
await console.error(error);
|
||||
}
|
||||
}
|
||||
return gachaCard.push({
|
||||
title: data.title,
|
||||
subtitle: data.content_before_act,
|
||||
cover: cover,
|
||||
post_id: post_id,
|
||||
characters: data.pool.map(character => ({
|
||||
icon: character.icon,
|
||||
url: character.url,
|
||||
})),
|
||||
voice: {
|
||||
icon: data.voice_icon,
|
||||
url: data.voice_url,
|
||||
},
|
||||
time: {
|
||||
start: data.start_time,
|
||||
start_stamp: new Date(data.start_time).getTime(),
|
||||
end: data.end_time,
|
||||
end_stamp: new Date(data.end_time).getTime(),
|
||||
},
|
||||
});
|
||||
})
|
||||
);
|
||||
return gachaCard;
|
||||
const gachaCard: GachaCard[] = [];
|
||||
await Promise.allSettled(
|
||||
gachaData.map(async (data: GachaData) => {
|
||||
let cover = "/source/UI/empty.webp";
|
||||
const postId: number | undefined = Number(data.activity_url.split("/").pop()) || undefined;
|
||||
if (postId === undefined || isNaN(postId)) {
|
||||
throw new Error("无法获取帖子 ID");
|
||||
}
|
||||
if (poolCover !== undefined) {
|
||||
cover = poolCover[postId];
|
||||
} else {
|
||||
try {
|
||||
console.log("调用 getPostData");
|
||||
const post = await getPostData(postId);
|
||||
cover = post.cover?.url ?? post.post.images[0];
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
return gachaCard.push({
|
||||
title: data.title,
|
||||
subtitle: data.content_before_act,
|
||||
cover,
|
||||
post_id: postId,
|
||||
characters: data.pool.map((character) => ({
|
||||
icon: character.icon,
|
||||
url: character.url,
|
||||
})),
|
||||
voice: {
|
||||
icon: data.voice_icon,
|
||||
url: data.voice_url,
|
||||
},
|
||||
time: {
|
||||
start: data.start_time,
|
||||
start_stamp: new Date(data.start_time).getTime(),
|
||||
end: data.end_time,
|
||||
end_stamp: new Date(data.end_time).getTime(),
|
||||
},
|
||||
});
|
||||
}),
|
||||
);
|
||||
return gachaCard;
|
||||
}
|
||||
|
||||
@@ -5,38 +5,38 @@
|
||||
* @since Alpha v0.1.1
|
||||
*/
|
||||
|
||||
import { LotteryData, LotteryCard, LotteryRewardCard, LotteryReward } from "../interface/lottery";
|
||||
import { type LotteryData, type LotteryCard, type LotteryRewardCard, type LotteryReward } from "../interface/lottery";
|
||||
|
||||
/**
|
||||
* @description 根据抽奖信息转为渲染用的抽奖信息
|
||||
* @since Alpha v0.1.1
|
||||
* @param {LotteryData} lotteryData 抽奖信息
|
||||
* @return {LotteryCard}
|
||||
* @returns {LotteryCard}
|
||||
*/
|
||||
export function getLotteryCard(lotteryData: LotteryData): LotteryCard {
|
||||
return {
|
||||
id: lotteryData.id,
|
||||
participantWay: lotteryData.participant_way,
|
||||
status: lotteryData.status,
|
||||
creator: lotteryData.creator,
|
||||
drawTime: lotteryData.draw_time,
|
||||
rewards: lotteryData.user_rewards.map(reward => {
|
||||
return getLotteryRewardCard(reward);
|
||||
}),
|
||||
};
|
||||
export function getLotteryCard (lotteryData: LotteryData): LotteryCard {
|
||||
return {
|
||||
id: lotteryData.id,
|
||||
participantWay: lotteryData.participant_way,
|
||||
status: lotteryData.status,
|
||||
creator: lotteryData.creator,
|
||||
drawTime: lotteryData.draw_time,
|
||||
rewards: lotteryData.user_rewards.map((reward) => {
|
||||
return getLotteryRewardCard(reward);
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据抽奖奖励信息转为渲染用的抽奖奖励信息
|
||||
* @since Alpha v0.1.1
|
||||
* @param {LotteryReward} lotteryReward 抽奖奖励信息
|
||||
* @return {LotteryRewardCard}
|
||||
* @returns {LotteryRewardCard}
|
||||
*/
|
||||
export function getLotteryRewardCard(lotteryReward: LotteryReward): LotteryRewardCard {
|
||||
return {
|
||||
rewardName: lotteryReward.reward_name,
|
||||
winnerNumber: lotteryReward.winner_number,
|
||||
scheduledWinnerNumber: lotteryReward.scheduled_winner_number,
|
||||
users: lotteryReward.users,
|
||||
};
|
||||
export function getLotteryRewardCard (lotteryReward: LotteryReward): LotteryRewardCard {
|
||||
return {
|
||||
rewardName: lotteryReward.reward_name,
|
||||
winnerNumber: lotteryReward.winner_number,
|
||||
scheduledWinnerNumber: lotteryReward.scheduled_winner_number,
|
||||
users: lotteryReward.users,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* @since Alpha v0.1.2
|
||||
*/
|
||||
|
||||
import { NewsData, NewsItem, NewsCard, ActivityStatus } from "../interface/news";
|
||||
import { type NewsData, type NewsItem, type NewsCard, type ActivityStatus } from "../interface/news";
|
||||
|
||||
// 默认封面图
|
||||
const defaultCover = "/source/UI/defaultCover.webp";
|
||||
@@ -17,103 +17,103 @@ const defaultCover = "/source/UI/defaultCover.webp";
|
||||
* @property {ActivityStatus} STARTED 进行中
|
||||
* @property {ActivityStatus} FINISHED 已结束
|
||||
* @property {ActivityStatus} SELECTION 评选中
|
||||
* @return {EnumStatus}
|
||||
* @returns {EnumStatus}
|
||||
*/
|
||||
const EnumStatus = {
|
||||
STARTED: {
|
||||
status: "进行中",
|
||||
colorCss: "#1EE2BA !important",
|
||||
},
|
||||
FINISHED: {
|
||||
status: "已结束",
|
||||
colorCss: "#C0C5C8 !important",
|
||||
},
|
||||
SELECTION: {
|
||||
status: "评选中",
|
||||
colorCss: "#FF983B !important",
|
||||
},
|
||||
UNKNOWN: {
|
||||
status: "未知",
|
||||
colorCss: "#3C3F41 !important",
|
||||
},
|
||||
STARTED: {
|
||||
status: "进行中",
|
||||
colorCss: "#1EE2BA !important",
|
||||
},
|
||||
FINISHED: {
|
||||
status: "已结束",
|
||||
colorCss: "#C0C5C8 !important",
|
||||
},
|
||||
SELECTION: {
|
||||
status: "评选中",
|
||||
colorCss: "#FF983B !important",
|
||||
},
|
||||
UNKNOWN: {
|
||||
status: "未知",
|
||||
colorCss: "#3C3F41 !important",
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 获取活动状态
|
||||
* @since Alpha
|
||||
* @param {number} status 活动状态码
|
||||
* @return {string}
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getActivityStatus(status: number): ActivityStatus {
|
||||
switch (status) {
|
||||
case 1:
|
||||
return EnumStatus.STARTED;
|
||||
case 2:
|
||||
return EnumStatus.SELECTION;
|
||||
case 3:
|
||||
return EnumStatus.FINISHED;
|
||||
default:
|
||||
return EnumStatus.UNKNOWN;
|
||||
}
|
||||
export function getActivityStatus (status: number): ActivityStatus {
|
||||
switch (status) {
|
||||
case 1:
|
||||
return EnumStatus.STARTED;
|
||||
case 2:
|
||||
return EnumStatus.SELECTION;
|
||||
case 3:
|
||||
return EnumStatus.FINISHED;
|
||||
default:
|
||||
return EnumStatus.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取渲染用公告数据
|
||||
* @since Alpha
|
||||
* @since Alpha v0.1.2
|
||||
* @param {NewsData} noticeData 公告数据
|
||||
* @return {NewsCard[]}
|
||||
* @returns {NewsCard[]}
|
||||
*/
|
||||
export function getNoticeCard(noticeData: NewsData): NewsCard[] {
|
||||
const noticeCard: NewsCard[] = [];
|
||||
noticeData.list.map((item: NewsItem) => {
|
||||
noticeCard.push({
|
||||
title: item.post.subject,
|
||||
cover: item.cover?.url || item.post.cover || item.post.images[0] || defaultCover,
|
||||
post_id: Number(item.post.post_id),
|
||||
subtitle: item.post.post_id,
|
||||
});
|
||||
});
|
||||
return noticeCard;
|
||||
export function getNoticeCard (noticeData: NewsData): NewsCard[] {
|
||||
const noticeCard: NewsCard[] = [];
|
||||
noticeData.list.map((item: NewsItem) => {
|
||||
return noticeCard.push({
|
||||
title: item.post.subject,
|
||||
cover: item.cover?.url || item.post.cover || item.post.images[0] || defaultCover,
|
||||
post_id: Number(item.post.post_id),
|
||||
subtitle: item.post.post_id,
|
||||
});
|
||||
});
|
||||
return noticeCard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取渲染用活动数据
|
||||
* @since Alpha
|
||||
* @since Alpha v0.1.2
|
||||
* @param {NewsData} activityData 活动数据
|
||||
* @return {NewsCard[]}
|
||||
* @returns {NewsCard[]}
|
||||
*/
|
||||
export function getActivityCard(activityData: NewsData): NewsCard[] {
|
||||
const activityCard: NewsCard[] = [];
|
||||
activityData.list.map((item: NewsItem) => {
|
||||
const start_time = new Date(Number(item.news_meta.start_at_sec) * 1000).toLocaleDateString();
|
||||
const end_time = new Date(Number(item.news_meta.end_at_sec) * 1000).toLocaleDateString();
|
||||
const status_info = getActivityStatus(item.news_meta.activity_status);
|
||||
activityCard.push({
|
||||
title: item.post.subject,
|
||||
cover: item.cover?.url || item.post.cover || item.post.images[0] || defaultCover,
|
||||
post_id: Number(item.post.post_id),
|
||||
subtitle: `${start_time} - ${end_time}`,
|
||||
status: status_info,
|
||||
});
|
||||
});
|
||||
return activityCard;
|
||||
export function getActivityCard (activityData: NewsData): NewsCard[] {
|
||||
const activityCard: NewsCard[] = [];
|
||||
activityData.list.map((item: NewsItem) => {
|
||||
const startTime = new Date(Number(item.news_meta.start_at_sec) * 1000).toLocaleDateString();
|
||||
const endTime = new Date(Number(item.news_meta.end_at_sec) * 1000).toLocaleDateString();
|
||||
const statusInfo = getActivityStatus(item.news_meta.activity_status);
|
||||
return activityCard.push({
|
||||
title: item.post.subject,
|
||||
cover: item.cover?.url || item.post.cover || item.post.images[0] || defaultCover,
|
||||
post_id: Number(item.post.post_id),
|
||||
subtitle: `${startTime} - ${endTime}`,
|
||||
status: statusInfo,
|
||||
});
|
||||
});
|
||||
return activityCard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取渲染用新闻数据
|
||||
* @since Alpha
|
||||
* @since Alpha v0.1.2
|
||||
* @param {NewsData} newsData 新闻数据
|
||||
* @return {NewsCard[]}
|
||||
* @returns {NewsCard[]}
|
||||
*/
|
||||
export function getNewsCard(newsData: NewsData): NewsCard[] {
|
||||
const newsCard: NewsCard[] = [];
|
||||
newsData.list.map((item: NewsItem) => {
|
||||
newsCard.push({
|
||||
title: item.post.subject,
|
||||
cover: item.cover?.url || item.post.cover || item.post.images[0] || defaultCover,
|
||||
post_id: Number(item.post.post_id),
|
||||
subtitle: item.post.post_id,
|
||||
});
|
||||
});
|
||||
return newsCard;
|
||||
export function getNewsCard (newsData: NewsData): NewsCard[] {
|
||||
const newsCard: NewsCard[] = [];
|
||||
newsData.list.map((item: NewsItem) => {
|
||||
return newsCard.push({
|
||||
title: item.post.subject,
|
||||
cover: item.cover?.url || item.post.cover || item.post.images[0] || defaultCover,
|
||||
post_id: Number(item.post.post_id),
|
||||
subtitle: item.post.post_id,
|
||||
});
|
||||
});
|
||||
return newsCard;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* @author BTMuli<bt-muli@outlook.com>
|
||||
* @since Alpha v0.1.2
|
||||
*/
|
||||
import { PostContent, PostData, PostStructuredContent } from "../interface/post";
|
||||
import { type PostData, type PostStructuredContent } from "../interface/post";
|
||||
|
||||
/**
|
||||
* @description 检测链接是否是米游社帖子
|
||||
@@ -12,47 +12,61 @@ import { PostContent, PostData, PostStructuredContent } from "../interface/post"
|
||||
* @param {string} url 链接
|
||||
* @returns {boolean} 是否是米游社帖子
|
||||
*/
|
||||
export function IsMysPost(url: string): boolean {
|
||||
const regBBS = /^https:\/\/bbs\.mihoyo\.com\/\w+\/article\/\d+$/;
|
||||
const regMYS = /^https:\/\/www\.miyoushe\.com\/\w+\/article\/\d+$/;
|
||||
return regBBS.test(url) || regMYS.test(url);
|
||||
export function IsMysPost (url: string): boolean {
|
||||
const regBBS = /^https:\/\/bbs\.mihoyo\.com\/\w+\/article\/\d+$/;
|
||||
const regMYS = /^https:\/\/www\.miyoushe\.com\/\w+\/article\/\d+$/;
|
||||
return regBBS.test(url) || regMYS.test(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据 url 获取帖子 id
|
||||
* @since Alpha v0.1.2
|
||||
* @param {string} url 链接
|
||||
* @returns {string} 帖子 id
|
||||
*/
|
||||
export function getPostId (url: string): string {
|
||||
const postId: string | undefined = url.split("/").pop();
|
||||
if (postId === undefined) {
|
||||
throw new Error("无法获取帖子 id");
|
||||
}
|
||||
return postId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 解析用户帖子,将其转换为 PostStructContent
|
||||
* @since Alpha v0.1.1
|
||||
* @since Alpha v0.1.2
|
||||
* @see PostContent
|
||||
* @param {string} content 帖子内容
|
||||
* @returns {string} 解析后的内容
|
||||
*/
|
||||
export function contentParser(content: string): string {
|
||||
const data = JSON.parse(content);
|
||||
const result: PostStructuredContent[] = [];
|
||||
// 遍历 data 属性,值
|
||||
Object.keys(data).forEach(key => {
|
||||
switch (key) {
|
||||
case "describe":
|
||||
result.push({
|
||||
insert: data.describe,
|
||||
});
|
||||
break;
|
||||
case "imgs":
|
||||
for (const image of data.imgs) {
|
||||
result.push({
|
||||
insert: {
|
||||
image: image,
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// 如果是其他属性,就直接插入
|
||||
result.push({
|
||||
insert: JSON.stringify(data[key]),
|
||||
});
|
||||
}
|
||||
});
|
||||
return JSON.stringify(result);
|
||||
export function contentParser (content: string): string {
|
||||
const data = JSON.parse(content);
|
||||
const result: PostStructuredContent[] = [];
|
||||
// 遍历 data 属性,值
|
||||
Object.keys(data).forEach((key) => {
|
||||
switch (key) {
|
||||
case "describe":
|
||||
result.push({
|
||||
insert: data.describe,
|
||||
});
|
||||
break;
|
||||
case "imgs":
|
||||
for (const image of data.imgs) {
|
||||
result.push({
|
||||
insert: {
|
||||
image,
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// 如果是其他属性,就直接插入
|
||||
result.push({
|
||||
insert: JSON.stringify(data[key]),
|
||||
});
|
||||
}
|
||||
});
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -62,25 +76,25 @@ export function contentParser(content: string): string {
|
||||
* @description 为了安全考虑,不会解析所有的属性,只会解析几个常用的属性
|
||||
* @returns {string} 解析后的HTML,可作为 v-html 使用
|
||||
*/
|
||||
export function PostParser(post: PostData): string {
|
||||
const postContent = post.post.content;
|
||||
let parserData;
|
||||
if (postContent.startsWith("<")) {
|
||||
parserData = post.post.structured_content;
|
||||
} else {
|
||||
try {
|
||||
parserData = contentParser(post.post.content);
|
||||
} catch (error) {
|
||||
parserData = post.post.structured_content;
|
||||
}
|
||||
}
|
||||
let jsonData: PostStructuredContent[] = JSON.parse(parserData);
|
||||
const doc = document.createElement("div");
|
||||
jsonData.forEach((item: any) => {
|
||||
const parsed = ParserTransfer(item);
|
||||
doc.appendChild(parsed);
|
||||
});
|
||||
return doc.innerHTML;
|
||||
export function PostParser (post: PostData): string {
|
||||
const postContent = post.post.content;
|
||||
let parserData;
|
||||
if (postContent.startsWith("<")) {
|
||||
parserData = post.post.structured_content;
|
||||
} else {
|
||||
try {
|
||||
parserData = contentParser(post.post.content);
|
||||
} catch (error) {
|
||||
parserData = post.post.structured_content;
|
||||
}
|
||||
}
|
||||
const jsonData: PostStructuredContent[] = JSON.parse(parserData);
|
||||
const doc = document.createElement("div");
|
||||
jsonData.forEach((item: any) => {
|
||||
const parsed = ParserTransfer(item);
|
||||
doc.appendChild(parsed);
|
||||
});
|
||||
return doc.innerHTML;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,24 +103,24 @@ export function PostParser(post: PostData): string {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement | HTMLSpanElement} 解析后的中转
|
||||
*/
|
||||
function ParserTransfer(data: PostStructuredContent): HTMLDivElement | HTMLSpanElement {
|
||||
if (typeof data.insert === "string") {
|
||||
return TextParser(data);
|
||||
} else if (data.insert.image) {
|
||||
return ImageParser(data);
|
||||
} else if (data.insert.vod) {
|
||||
return VideoParser(data);
|
||||
} else if (data.insert.video) {
|
||||
return VideoParser(data);
|
||||
} else if (data.insert.backup_text) {
|
||||
return BackupTextParser(data);
|
||||
} else if (data.insert.link_card) {
|
||||
return LinkCardParser(data);
|
||||
} else if (data.insert.divider) {
|
||||
return DividerParser(data);
|
||||
} else {
|
||||
return UnknownParser(data);
|
||||
}
|
||||
function ParserTransfer (data: PostStructuredContent): HTMLDivElement | HTMLSpanElement {
|
||||
if (typeof data.insert === "string") {
|
||||
return TextParser(data);
|
||||
} else if (data.insert.image) {
|
||||
return ImageParser(data);
|
||||
} else if (data.insert.vod) {
|
||||
return VideoParser(data);
|
||||
} else if (data.insert.video) {
|
||||
return VideoParser(data);
|
||||
} else if (data.insert.backup_text) {
|
||||
return BackupTextParser(data);
|
||||
} else if (data.insert.link_card) {
|
||||
return LinkCardParser(data);
|
||||
} else if (data.insert.divider) {
|
||||
return DividerParser(data);
|
||||
} else {
|
||||
return UnknownParser(data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -115,17 +129,17 @@ function ParserTransfer(data: PostStructuredContent): HTMLDivElement | HTMLSpanE
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的未知数据
|
||||
*/
|
||||
function UnknownParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-unknown");
|
||||
// 创建 code,将数据放入 code
|
||||
const code = document.createElement("code");
|
||||
code.innerText = JSON.stringify(data);
|
||||
// 插入 code
|
||||
div.appendChild(code);
|
||||
// 返回 div
|
||||
return div;
|
||||
function UnknownParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-unknown");
|
||||
// 创建 code,将数据放入 code
|
||||
const code = document.createElement("code");
|
||||
code.innerText = JSON.stringify(data);
|
||||
// 插入 code
|
||||
div.appendChild(code);
|
||||
// 返回 div
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -134,65 +148,66 @@ function UnknownParser(data: PostStructuredContent): HTMLDivElement {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLSpanElement} 解析后的文本
|
||||
*/
|
||||
function TextParser(data: PostStructuredContent): HTMLSpanElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert !== "string") {
|
||||
throw new Error("data.insert is not a string");
|
||||
}
|
||||
// 创建文本
|
||||
const text = document.createElement("span");
|
||||
// 设置文本属性
|
||||
if (data.attributes) {
|
||||
if (data.attributes.bold) text.style.fontWeight = "bold";
|
||||
if (data.attributes.color) text.style.color = data.attributes.color;
|
||||
if (data.attributes.link) {
|
||||
return LinkTextParser(data);
|
||||
}
|
||||
}
|
||||
// 添加 class
|
||||
text.classList.add("mys-post-span");
|
||||
// 设置 span 内容
|
||||
text.innerText = data.insert;
|
||||
// 返回文本
|
||||
return text;
|
||||
function TextParser (data: PostStructuredContent): HTMLSpanElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert !== "string") {
|
||||
throw new Error("data.insert is not a string");
|
||||
}
|
||||
// 创建文本
|
||||
const text = document.createElement("span");
|
||||
// 设置文本属性
|
||||
if (data.attributes) {
|
||||
if (data.attributes.bold) text.style.fontWeight = "bold";
|
||||
if (data.attributes.color) text.style.color = data.attributes.color;
|
||||
if (data.attributes.link) {
|
||||
return LinkTextParser(data);
|
||||
}
|
||||
}
|
||||
// 添加 class
|
||||
text.classList.add("mys-post-span");
|
||||
// 设置 span 内容
|
||||
text.innerText = data.insert;
|
||||
// 返回文本
|
||||
return text;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 解析链接
|
||||
* @since Alpha v0.1.1
|
||||
* @since Alpha v0.1.2
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLSpanElement} 解析后的链接
|
||||
*/
|
||||
function LinkTextParser(data: PostStructuredContent): HTMLSpanElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert !== "string") {
|
||||
throw new Error("data.insert is not a string");
|
||||
}
|
||||
if (!data.attributes) {
|
||||
throw new Error("data.attributes is not defined");
|
||||
}
|
||||
if (!data.attributes.link) {
|
||||
throw new Error("data.attributes.link is not defined");
|
||||
}
|
||||
// 创建图标
|
||||
const icon = document.createElement("i");
|
||||
icon.classList.add("mdi", "mdi-link-variant");
|
||||
// 创建链接
|
||||
const link = document.createElement("a");
|
||||
const link_url = data.attributes.link;
|
||||
link.classList.add("mys-post-link");
|
||||
if (IsMysPost(link_url)) {
|
||||
link.href = "/post_detail/" + link_url.split("/").pop();
|
||||
link.target = "_self";
|
||||
} else {
|
||||
link.href = link_url;
|
||||
link.target = "view_window";
|
||||
}
|
||||
link.innerText = data.insert;
|
||||
// 插入图标作为链接前缀
|
||||
link.prepend(icon);
|
||||
// 返回链接
|
||||
return link;
|
||||
function LinkTextParser (data: PostStructuredContent): HTMLSpanElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert !== "string") {
|
||||
throw new Error("data.insert is not a string");
|
||||
}
|
||||
if (!data.attributes) {
|
||||
throw new Error("data.attributes is not defined");
|
||||
}
|
||||
if (!data.attributes.link) {
|
||||
throw new Error("data.attributes.link is not defined");
|
||||
}
|
||||
// 创建图标
|
||||
const icon = document.createElement("i");
|
||||
icon.classList.add("mdi", "mdi-link-variant");
|
||||
// 创建链接
|
||||
const link = document.createElement("a");
|
||||
const linkUrl = data.attributes.link;
|
||||
link.classList.add("mys-post-link");
|
||||
if (IsMysPost(linkUrl)) {
|
||||
const postId = getPostId(linkUrl);
|
||||
link.href = `/post_detail/${postId}`;
|
||||
link.target = "_self";
|
||||
} else {
|
||||
link.href = linkUrl;
|
||||
link.target = "view_window";
|
||||
}
|
||||
link.innerText = data.insert;
|
||||
// 插入图标作为链接前缀
|
||||
link.prepend(icon);
|
||||
// 返回链接
|
||||
return link;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -201,39 +216,38 @@ function LinkTextParser(data: PostStructuredContent): HTMLSpanElement {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的分割线
|
||||
*/
|
||||
function DividerParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 数据检查
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.divider) {
|
||||
throw new Error("data.insert.divider is not defined");
|
||||
}
|
||||
// 创建分割线
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-divider");
|
||||
// 创建 img
|
||||
const img = document.createElement("img");
|
||||
if (data.insert.divider === "line_1") {
|
||||
img.src =
|
||||
function DividerParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 数据检查
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.divider) {
|
||||
throw new Error("data.insert.divider is not defined");
|
||||
}
|
||||
// 创建分割线
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-divider");
|
||||
// 创建 img
|
||||
const img = document.createElement("img");
|
||||
if (data.insert.divider === "line_1") {
|
||||
img.src =
|
||||
"https://mihoyo-community-web.oss-cn-shanghai.aliyuncs.com/upload/2021/01/05/40eb5281cb24042bf34a9f1bcc61eaf5.png";
|
||||
} else if (data.insert.divider === "line_2") {
|
||||
img.src =
|
||||
} else if (data.insert.divider === "line_2") {
|
||||
img.src =
|
||||
"https://mihoyo-community-web.oss-cn-shanghai.aliyuncs.com/upload/2021/01/05/477d4c535e965bec1791203aecdfa8e6.png";
|
||||
} else if (data.insert.divider === "line_3") {
|
||||
img.src =
|
||||
} else if (data.insert.divider === "line_3") {
|
||||
img.src =
|
||||
"https://mihoyo-community-web.oss-cn-shanghai.aliyuncs.com/upload/2021/01/05/e7047588e912d60ff87a975e037c7606.png";
|
||||
} else if (data.insert.divider === "line_4") {
|
||||
img.src =
|
||||
"https://mihoyo-community-web.oss-cn-shanghai.aliyuncs.com/upload/2022/07/13/line_4.png";
|
||||
} else {
|
||||
console.error("Unknown divider type", data);
|
||||
return UnknownParser(data);
|
||||
}
|
||||
// 插入 img
|
||||
div.appendChild(img);
|
||||
// 返回分割线
|
||||
return div;
|
||||
} else if (data.insert.divider === "line_4") {
|
||||
img.src = "https://mihoyo-community-web.oss-cn-shanghai.aliyuncs.com/upload/2022/07/13/line_4.png";
|
||||
} else {
|
||||
console.error("Unknown divider type", data);
|
||||
return UnknownParser(data);
|
||||
}
|
||||
// 插入 img
|
||||
div.appendChild(img);
|
||||
// 返回分割线
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -242,35 +256,35 @@ function DividerParser(data: PostStructuredContent): HTMLDivElement {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的图片
|
||||
*/
|
||||
function ImageParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.image) {
|
||||
throw new Error("data.insert.image is not defined");
|
||||
}
|
||||
// if (!data.attributes) {
|
||||
// throw new Error("data.attributes is not defined");
|
||||
// }
|
||||
// if (!data.attributes.width) {
|
||||
// throw new Error("data.attributes.width is not defined");
|
||||
// }
|
||||
// if (!data.attributes.height) {
|
||||
// throw new Error("data.attributes.height is not defined");
|
||||
// }
|
||||
const div = document.createElement("div");
|
||||
// 创建图片
|
||||
const img = document.createElement("img");
|
||||
img.src = data.insert.image;
|
||||
// 添加 class
|
||||
img.classList.add("mys-post-img");
|
||||
// 插入图片
|
||||
div.appendChild(img);
|
||||
// 添加 class
|
||||
div.classList.add("mys-post-div");
|
||||
// 返回 div
|
||||
return div;
|
||||
function ImageParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.image) {
|
||||
throw new Error("data.insert.image is not defined");
|
||||
}
|
||||
// if (!data.attributes) {
|
||||
// throw new Error("data.attributes is not defined");
|
||||
// }
|
||||
// if (!data.attributes.width) {
|
||||
// throw new Error("data.attributes.width is not defined");
|
||||
// }
|
||||
// if (!data.attributes.height) {
|
||||
// throw new Error("data.attributes.height is not defined");
|
||||
// }
|
||||
const div = document.createElement("div");
|
||||
// 创建图片
|
||||
const img = document.createElement("img");
|
||||
img.src = data.insert.image;
|
||||
// 添加 class
|
||||
img.classList.add("mys-post-img");
|
||||
// 插入图片
|
||||
div.appendChild(img);
|
||||
// 添加 class
|
||||
div.classList.add("mys-post-div");
|
||||
// 返回 div
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -279,48 +293,48 @@ function ImageParser(data: PostStructuredContent): HTMLDivElement {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的视频
|
||||
*/
|
||||
function VideoParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.vod && !data.insert.video) {
|
||||
throw new Error("data.insert.vod is not defined");
|
||||
}
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-div");
|
||||
if (data.insert.vod) {
|
||||
// 创建视频
|
||||
const video = document.createElement("video");
|
||||
video.classList.add("mys-post-vod");
|
||||
// 获取 resolutions中size最大的视频
|
||||
const resolution = data.insert.vod.resolutions.reduce((prev: any, curr: any) => {
|
||||
if (prev.size > curr.size) return prev;
|
||||
return curr;
|
||||
});
|
||||
video.poster = data.insert.vod.cover; // 设置封面
|
||||
video.controls = true; // 设置 controls
|
||||
// 添加 source
|
||||
const source = document.createElement("source");
|
||||
source.src = resolution.url;
|
||||
source.type = resolution.format === ".mp4" ? "video/mp4" : "video/webm";
|
||||
// 插入 source
|
||||
video.appendChild(source);
|
||||
// 插入 video
|
||||
div.appendChild(video);
|
||||
} else if (data.insert.video) {
|
||||
// 创建 iframe
|
||||
const video = document.createElement("iframe");
|
||||
video.classList.add("mys-post-iframe");
|
||||
// 设置 iframe 属性
|
||||
video.src = data.insert.video;
|
||||
video.allowFullscreen = true;
|
||||
video.sandbox.add("allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts");
|
||||
// 插入 video
|
||||
div.appendChild(video);
|
||||
}
|
||||
return div;
|
||||
function VideoParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.vod && !data.insert.video) {
|
||||
throw new Error("data.insert.vod is not defined");
|
||||
}
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-div");
|
||||
if (data.insert.vod) {
|
||||
// 创建视频
|
||||
const video = document.createElement("video");
|
||||
video.classList.add("mys-post-vod");
|
||||
// 获取 resolutions中size最大的视频
|
||||
const resolution = data.insert.vod.resolutions.reduce((prev: any, curr: any) => {
|
||||
if (prev.size > curr.size) return prev;
|
||||
return curr;
|
||||
});
|
||||
video.poster = data.insert.vod.cover; // 设置封面
|
||||
video.controls = true; // 设置 controls
|
||||
// 添加 source
|
||||
const source = document.createElement("source");
|
||||
source.src = resolution.url;
|
||||
source.type = resolution.format === ".mp4" ? "video/mp4" : "video/webm";
|
||||
// 插入 source
|
||||
video.appendChild(source);
|
||||
// 插入 video
|
||||
div.appendChild(video);
|
||||
} else if (data.insert.video) {
|
||||
// 创建 iframe
|
||||
const video = document.createElement("iframe");
|
||||
video.classList.add("mys-post-iframe");
|
||||
// 设置 iframe 属性
|
||||
video.src = data.insert.video;
|
||||
video.allowFullscreen = true;
|
||||
video.sandbox.add("allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts");
|
||||
// 插入 video
|
||||
div.appendChild(video);
|
||||
}
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -329,44 +343,44 @@ function VideoParser(data: PostStructuredContent): HTMLDivElement {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的折叠内容
|
||||
*/
|
||||
function BackupTextParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (data.insert.backup_text === "[抽奖]") {
|
||||
return LotteryParser(data);
|
||||
}
|
||||
if (!data.insert.fold) {
|
||||
throw new Error("data.insert.fold is not defined");
|
||||
}
|
||||
// 转换
|
||||
const titleJson: PostStructuredContent[] = JSON.parse(data.insert.fold.title);
|
||||
const contentJson: PostStructuredContent[] = JSON.parse(data.insert.fold.content);
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-div");
|
||||
// 创建折叠内容
|
||||
const details = document.createElement("details");
|
||||
details.classList.add("mys-post-details");
|
||||
// 创建标题
|
||||
const title = document.createElement("summary");
|
||||
// 解析标题
|
||||
titleJson.forEach(item => {
|
||||
const parsed = ParserTransfer(item);
|
||||
title.appendChild(parsed);
|
||||
});
|
||||
// 创建内容
|
||||
const content = document.createElement("div");
|
||||
contentJson.forEach(item => {
|
||||
const parsed = ParserTransfer(item);
|
||||
content.appendChild(parsed);
|
||||
});
|
||||
details.appendChild(title);
|
||||
details.appendChild(content);
|
||||
div.appendChild(details);
|
||||
// 返回 div
|
||||
return div;
|
||||
function BackupTextParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (data.insert.backup_text === "[抽奖]") {
|
||||
return LotteryParser(data);
|
||||
}
|
||||
if (!data.insert.fold) {
|
||||
throw new Error("data.insert.fold is not defined");
|
||||
}
|
||||
// 转换
|
||||
const titleJson: PostStructuredContent[] = JSON.parse(data.insert.fold.title);
|
||||
const contentJson: PostStructuredContent[] = JSON.parse(data.insert.fold.content);
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
div.classList.add("mys-post-div");
|
||||
// 创建折叠内容
|
||||
const details = document.createElement("details");
|
||||
details.classList.add("mys-post-details");
|
||||
// 创建标题
|
||||
const title = document.createElement("summary");
|
||||
// 解析标题
|
||||
titleJson.forEach((item) => {
|
||||
const parsed = ParserTransfer(item);
|
||||
title.appendChild(parsed);
|
||||
});
|
||||
// 创建内容
|
||||
const content = document.createElement("div");
|
||||
contentJson.forEach((item) => {
|
||||
const parsed = ParserTransfer(item);
|
||||
content.appendChild(parsed);
|
||||
});
|
||||
details.appendChild(title);
|
||||
details.appendChild(content);
|
||||
div.appendChild(details);
|
||||
// 返回 div
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -375,96 +389,97 @@ function BackupTextParser(data: PostStructuredContent): HTMLDivElement {
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的抽奖
|
||||
*/
|
||||
function LotteryParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.backup_text) {
|
||||
throw new Error("data.insert.backup_text is not defined");
|
||||
}
|
||||
if (data.insert.backup_text !== "[抽奖]") {
|
||||
throw new Error("data.insert.backup_text is not [抽奖]");
|
||||
}
|
||||
if (!data.insert.lottery) {
|
||||
throw new Error("data.insert.lottery is not defined");
|
||||
}
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
// 创建图标
|
||||
const icon = document.createElement("i");
|
||||
icon.classList.add("mdi", "mdi-gift");
|
||||
// 创建标题
|
||||
const title = document.createElement("a");
|
||||
title.classList.add("mys-post-link");
|
||||
title.href = `/lottery/${data.insert.lottery.id}`;
|
||||
title.innerText = data.insert.lottery.toast;
|
||||
// 插入图标
|
||||
title.prepend(icon);
|
||||
// 插入标题
|
||||
div.appendChild(title);
|
||||
// 返回 div
|
||||
return div;
|
||||
function LotteryParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.backup_text) {
|
||||
throw new Error("data.insert.backup_text is not defined");
|
||||
}
|
||||
if (data.insert.backup_text !== "[抽奖]") {
|
||||
throw new Error("data.insert.backup_text is not [抽奖]");
|
||||
}
|
||||
if (!data.insert.lottery) {
|
||||
throw new Error("data.insert.lottery is not defined");
|
||||
}
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
// 创建图标
|
||||
const icon = document.createElement("i");
|
||||
icon.classList.add("mdi", "mdi-gift");
|
||||
// 创建标题
|
||||
const title = document.createElement("a");
|
||||
title.classList.add("mys-post-link");
|
||||
title.href = `/lottery/${data.insert.lottery.id}`;
|
||||
title.innerText = data.insert.lottery.toast;
|
||||
// 插入图标
|
||||
title.prepend(icon);
|
||||
// 插入标题
|
||||
div.appendChild(title);
|
||||
// 返回 div
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 解析链接卡片
|
||||
* @since Alpha v0.1.1
|
||||
* @since Alpha v0.1.2
|
||||
* @param {PostStructuredContent} data Mys数据
|
||||
* @returns {HTMLDivElement} 解析后的链接卡片
|
||||
*/
|
||||
function LinkCardParser(data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.link_card) {
|
||||
throw new Error("data.insert.link_card is not defined");
|
||||
}
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
// 创建 cover
|
||||
const cover = document.createElement("div");
|
||||
cover.classList.add("mys-post-link-card-cover");
|
||||
// 创建 img
|
||||
const img = document.createElement("img");
|
||||
img.src = data.insert.link_card.cover;
|
||||
// 插入 img
|
||||
cover.appendChild(img);
|
||||
// 插入 cover
|
||||
div.appendChild(cover);
|
||||
// 创建 content
|
||||
const content = document.createElement("div");
|
||||
content.classList.add("mys-post-link-card-content");
|
||||
// 创建标题
|
||||
const title = document.createElement("div");
|
||||
title.classList.add("mys-post-link-card-title");
|
||||
title.innerHTML = data.insert.link_card.title;
|
||||
// 插入 title
|
||||
content.appendChild(title);
|
||||
if (data.insert.link_card.price) {
|
||||
const price = document.createElement("div");
|
||||
price.classList.add("mys-post-link-card-price");
|
||||
price.innerHTML = data.insert.link_card.price;
|
||||
content.appendChild(price);
|
||||
}
|
||||
// 创建 button
|
||||
const button = document.createElement("a");
|
||||
button.classList.add("mys-post-link-card-btn");
|
||||
button.innerHTML = (data.insert.link_card.button_text || "详情") + " >";
|
||||
const link_url = data.insert.link_card.origin_url;
|
||||
if (IsMysPost(link_url)) {
|
||||
button.href = "/post_detail/" + link_url.split("/").pop();
|
||||
button.target = "_self";
|
||||
} else {
|
||||
button.href = link_url;
|
||||
button.target = "view_window";
|
||||
}
|
||||
// 插入 button
|
||||
content.appendChild(button);
|
||||
// 插入 content
|
||||
div.appendChild(content);
|
||||
// 添加 class
|
||||
div.classList.add("mys-post-link-card");
|
||||
return div;
|
||||
function LinkCardParser (data: PostStructuredContent): HTMLDivElement {
|
||||
// 检查数据
|
||||
if (typeof data.insert === "string") {
|
||||
throw new Error("data.insert is a string");
|
||||
}
|
||||
if (!data.insert.link_card) {
|
||||
throw new Error("data.insert.link_card is not defined");
|
||||
}
|
||||
// 创建 div
|
||||
const div = document.createElement("div");
|
||||
// 创建 cover
|
||||
const cover = document.createElement("div");
|
||||
cover.classList.add("mys-post-link-card-cover");
|
||||
// 创建 img
|
||||
const img = document.createElement("img");
|
||||
img.src = data.insert.link_card.cover;
|
||||
// 插入 img
|
||||
cover.appendChild(img);
|
||||
// 插入 cover
|
||||
div.appendChild(cover);
|
||||
// 创建 content
|
||||
const content = document.createElement("div");
|
||||
content.classList.add("mys-post-link-card-content");
|
||||
// 创建标题
|
||||
const title = document.createElement("div");
|
||||
title.classList.add("mys-post-link-card-title");
|
||||
title.innerHTML = data.insert.link_card.title;
|
||||
// 插入 title
|
||||
content.appendChild(title);
|
||||
if (data.insert.link_card.price) {
|
||||
const price = document.createElement("div");
|
||||
price.classList.add("mys-post-link-card-price");
|
||||
price.innerHTML = data.insert.link_card.price;
|
||||
content.appendChild(price);
|
||||
}
|
||||
// 创建 button
|
||||
const button = document.createElement("a");
|
||||
button.classList.add("mys-post-link-card-btn");
|
||||
button.innerHTML = (data.insert.link_card.button_text || "详情") + " >";
|
||||
const linkUrl = data.insert.link_card.origin_url;
|
||||
if (IsMysPost(linkUrl)) {
|
||||
const postId = getPostId(linkUrl);
|
||||
button.href = `/post_detail/${postId}`;
|
||||
button.target = "_self";
|
||||
} else {
|
||||
button.href = linkUrl;
|
||||
button.target = "view_window";
|
||||
}
|
||||
// 插入 button
|
||||
content.appendChild(button);
|
||||
// 插入 content
|
||||
div.appendChild(content);
|
||||
// 添加 class
|
||||
div.classList.add("mys-post-link-card");
|
||||
return div;
|
||||
}
|
||||
|
||||
@@ -2,55 +2,55 @@
|
||||
* @file plugins Mys utils position.ts
|
||||
* @description Mys 插件热点追踪工具
|
||||
* @author BTMuli<bt-muli@outlook.com>
|
||||
* @since Alpha v0.1.1
|
||||
* @since Alpha v0.1.2
|
||||
*/
|
||||
|
||||
import { PositionObc, PositionData, PositionCard } from "../interface/position";
|
||||
import { type PositionObc, type PositionData, type PositionCard } from "../interface/position";
|
||||
|
||||
/**
|
||||
* @description 深度优先遍历
|
||||
* @since Alpha v0.1.1
|
||||
* @param {PositionObc[]} list 列表
|
||||
* @return {PositionData[]} 返回列表
|
||||
* @returns {PositionData[]} 返回列表
|
||||
*/
|
||||
export function dfs(list: PositionObc[]): PositionData[] {
|
||||
const res: PositionData[] = [];
|
||||
for (const item of list) {
|
||||
if (item.name === "近期活动") {
|
||||
res.push(...item.list);
|
||||
}
|
||||
if (item.children) {
|
||||
res.push(...dfs(item.children as PositionObc[]));
|
||||
}
|
||||
}
|
||||
return res;
|
||||
export function dfs (list: PositionObc[]): PositionData[] {
|
||||
const res: PositionData[] = [];
|
||||
for (const item of list) {
|
||||
if (item.name === "近期活动") {
|
||||
res.push(...item.list);
|
||||
}
|
||||
if (item.children) {
|
||||
res.push(...dfs(item.children as PositionObc[]));
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据热点追踪信息转为渲染用的数据
|
||||
* @since Alpha v0.1.1
|
||||
* @since Alpha v0.1.2
|
||||
* @param {PositionData[]} positionData 列表
|
||||
* @return {PositionCard[]} 返回列表
|
||||
* @returns {PositionCard[]} 返回列表
|
||||
*/
|
||||
export function getPositionCard(positionData: PositionData[]): PositionCard[] {
|
||||
const res: PositionCard[] = [];
|
||||
positionData.map(position => {
|
||||
res.push({
|
||||
title: position.title,
|
||||
post_id: Number(position.url.split("/").pop()),
|
||||
icon: position.icon,
|
||||
abstract: position.abstract,
|
||||
time: {
|
||||
start: position.create_time,
|
||||
start_stamp: new Date(position.create_time).getTime(),
|
||||
end: new Date(Number(position.end_time))
|
||||
.toLocaleString("zh-CN", {
|
||||
hour12: false,
|
||||
})
|
||||
.replace(/\//g, "-"),
|
||||
end_stamp: Number(position.end_time),
|
||||
},
|
||||
});
|
||||
});
|
||||
return res;
|
||||
export function getPositionCard (positionData: PositionData[]): PositionCard[] {
|
||||
const res: PositionCard[] = [];
|
||||
positionData.map((position) => {
|
||||
return res.push({
|
||||
title: position.title,
|
||||
post_id: Number(position.url.split("/").pop()),
|
||||
icon: position.icon,
|
||||
abstract: position.abstract,
|
||||
time: {
|
||||
start: position.create_time,
|
||||
start_stamp: new Date(position.create_time).getTime(),
|
||||
end: new Date(Number(position.end_time))
|
||||
.toLocaleString("zh-CN", {
|
||||
hour12: false,
|
||||
})
|
||||
.replace(/\//g, "-"),
|
||||
end_stamp: Number(position.end_time),
|
||||
},
|
||||
});
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user