mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-15 09:48:14 +08:00
feat(Mys): 添加结构化内容接口,明天起来完善各种类型的渲染
This commit is contained in:
@@ -64,7 +64,7 @@ import { fs, http } from "@tauri-apps/api";
|
|||||||
import useAppStore from "../store/modules/app";
|
import useAppStore from "../store/modules/app";
|
||||||
// utils
|
// utils
|
||||||
import { createTGWindow } from "../utils/TGWindow";
|
import { createTGWindow } from "../utils/TGWindow";
|
||||||
import { parseMys } from "../utils/MysParse";
|
import { StructuredPostParser } from "../plugins/Mys/utils/parser";
|
||||||
// interface
|
// interface
|
||||||
import {
|
import {
|
||||||
GachaResponse,
|
GachaResponse,
|
||||||
@@ -180,7 +180,7 @@ async function toPost(post_id: string) {
|
|||||||
return res.data.post.post;
|
return res.data.post.post;
|
||||||
});
|
});
|
||||||
// 结构化渲染
|
// 结构化渲染
|
||||||
const parseDoc = parseMys(post.structured_content);
|
const parseDoc = StructuredPostParser(post.structured_content);
|
||||||
// 将解析后的 doc 保存到 文件
|
// 将解析后的 doc 保存到 文件
|
||||||
await fs.writeTextFile(
|
await fs.writeTextFile(
|
||||||
`${appStore.dataPath.temp}\\${post_id}_home.html`,
|
`${appStore.dataPath.temp}\\${post_id}_home.html`,
|
||||||
|
|||||||
@@ -134,14 +134,13 @@ import useAppStore from "../store/modules/app";
|
|||||||
import "../tools/svg-inject.js";
|
import "../tools/svg-inject.js";
|
||||||
// utils
|
// utils
|
||||||
import { createTGWindow } from "../utils/TGWindow";
|
import { createTGWindow } from "../utils/TGWindow";
|
||||||
import { parseMys } from "../utils/MysParse";
|
import { StructuredPostParser } from "../plugins/Mys/utils/parser";
|
||||||
// interface
|
// interface
|
||||||
import {
|
import {
|
||||||
Post,
|
Post,
|
||||||
PostResponse,
|
PostResponse,
|
||||||
POST_FULL_API,
|
POST_FULL_API,
|
||||||
POST_FULL_REFERER,
|
POST_FULL_REFERER,
|
||||||
PostData,
|
|
||||||
} from "../plugins/Mys/interface/post";
|
} from "../plugins/Mys/interface/post";
|
||||||
import {
|
import {
|
||||||
NewsResponse,
|
NewsResponse,
|
||||||
@@ -216,7 +215,7 @@ async function toPost(post_id: string) {
|
|||||||
// 获取渲染模式
|
// 获取渲染模式
|
||||||
if (renderMode.value) {
|
if (renderMode.value) {
|
||||||
// 结构化渲染
|
// 结构化渲染
|
||||||
parseDoc = parseMys(post.structured_content);
|
parseDoc = StructuredPostParser(post.structured_content);
|
||||||
} else {
|
} else {
|
||||||
// 原始渲染
|
// 原始渲染
|
||||||
parseDoc = new DOMParser().parseFromString(post.content, "text/html");
|
parseDoc = new DOMParser().parseFromString(post.content, "text/html");
|
||||||
@@ -231,12 +230,12 @@ async function toPost(post_id: string) {
|
|||||||
}
|
}
|
||||||
async function toJson(post_id: string) {
|
async function toJson(post_id: string) {
|
||||||
const post = await getPost(post_id).then(res => {
|
const post = await getPost(post_id).then(res => {
|
||||||
return res.data;
|
return res.data.post.post.structured_content;
|
||||||
});
|
});
|
||||||
// 将 json 保存到 文件
|
// 将 json 保存到 文件
|
||||||
await fs.writeTextFile(
|
await fs.writeTextFile(
|
||||||
`${appStore.dataPath.temp}\\${post_id}.json`,
|
`${appStore.dataPath.temp}\\${post_id}.json`,
|
||||||
JSON.stringify(post, null, 4)
|
JSON.stringify(JSON.parse(post), null, 4)
|
||||||
);
|
);
|
||||||
const logUrl = `file:\\\\\\${appStore.dataPath.temp}\\${post_id}.json`;
|
const logUrl = `file:\\\\\\${appStore.dataPath.temp}\\${post_id}.json`;
|
||||||
// 打开窗口
|
// 打开窗口
|
||||||
|
|||||||
@@ -247,3 +247,79 @@ export interface PostStat {
|
|||||||
bookmark_num: number;
|
bookmark_num: number;
|
||||||
forward_num: number;
|
forward_num: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 帖子结构化内容
|
||||||
|
* @since Alpha
|
||||||
|
* @interface PostStructuredContent
|
||||||
|
* @property {string|object} insert 插入内容
|
||||||
|
* @property {string} insert.image 图片 URL
|
||||||
|
* @property {object} insert.vod 视频信息
|
||||||
|
* @property {number} insert.vod.id 视频 ID
|
||||||
|
* @property {number} insert.vod.duration 时长
|
||||||
|
* @property {string} insert.vod.cover 封面图 URL
|
||||||
|
* @property {object[]} insert.vod.resolutions 分辨率
|
||||||
|
* @property {string} insert.vod.resolutions.url URL
|
||||||
|
* @property {string} insert.vod.resolutions.definition 清晰度
|
||||||
|
* @property {number} insert.vod.resolutions.height 高度
|
||||||
|
* @property {number} insert.vod.resolutions.width 宽度
|
||||||
|
* @property {number} insert.vod.resolutions.bitrate 比特率
|
||||||
|
* @property {number} insert.vod.resolutions.size 大小
|
||||||
|
* @property {string} insert.vod.resolutions.format 格式
|
||||||
|
* @property {string} insert.vod.resolutions.label 标签
|
||||||
|
* @property {number} insert.vod.view_num 浏览数
|
||||||
|
* @property {number} insert.vod.transcode_status 转码状态
|
||||||
|
* @property {number} insert.vod.review_status 审核状态
|
||||||
|
* @property {string} insert.backup_text 折叠文本
|
||||||
|
* @property {object} insert.fold 折叠内容
|
||||||
|
* @property {string} insert.fold.title 折叠标题,反序列化后为 PostStructuredContent[]
|
||||||
|
* @property {string} insert.fold.content 折叠文本,反序列化后为 PostStructuredContent[]
|
||||||
|
* @property {object} attributes 属性
|
||||||
|
* @property {number} attributes.height 高度
|
||||||
|
* @property {number} attributes.width 宽度
|
||||||
|
* @property {number} attributes.size 大小
|
||||||
|
* @property {string} attributes.ext 扩展名
|
||||||
|
* @property {boolean} attributes.bold 是否加粗
|
||||||
|
* @property {string} attributes.color 颜色
|
||||||
|
* @property {string} attributes.link 链接
|
||||||
|
* @return {PostStructuredContent}
|
||||||
|
*/
|
||||||
|
export interface PostStructuredContent {
|
||||||
|
insert:
|
||||||
|
| {
|
||||||
|
image?: string;
|
||||||
|
vod?: {
|
||||||
|
id: number;
|
||||||
|
duration: number;
|
||||||
|
cover: string;
|
||||||
|
resolutions: {
|
||||||
|
url: string;
|
||||||
|
definition: string;
|
||||||
|
height: number;
|
||||||
|
width: number;
|
||||||
|
bitrate: number;
|
||||||
|
size: number;
|
||||||
|
format: string;
|
||||||
|
label: string;
|
||||||
|
}[];
|
||||||
|
view_num: number;
|
||||||
|
transcoding_status: number;
|
||||||
|
review_status: number;
|
||||||
|
};
|
||||||
|
backup_text?: string;
|
||||||
|
fold?: {
|
||||||
|
title: string;
|
||||||
|
content: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
| string;
|
||||||
|
attributes?: {
|
||||||
|
height?: number;
|
||||||
|
width?: number;
|
||||||
|
size?: number;
|
||||||
|
ext?: string;
|
||||||
|
bold?: boolean;
|
||||||
|
color?: string;
|
||||||
|
link?: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,20 +1,21 @@
|
|||||||
/**
|
/**
|
||||||
* @file utils MysParse.ts
|
* @file plugins Mys utils PostParser.ts
|
||||||
* @description 用于解析Mys数据的工具
|
* @description 用于解析Mys数据的工具
|
||||||
* @author BTMuli<bt-muli@outlook.com>
|
* @author BTMuli<bt-muli@outlook.com>
|
||||||
* @since Alpha
|
* @since Alpha
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { PostStructuredContent } from "../interface/post";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 解析Mys数据
|
* @description 解析Mys数据
|
||||||
* @param {string} data Mys数据
|
* @param {string} data Mys数据
|
||||||
* @description 为了安全考虑,不会解析所有的属性,只会解析几个常用的属性
|
* @description 为了安全考虑,不会解析所有的属性,只会解析几个常用的属性
|
||||||
* @returns {Document} 解析后的 HTML 文档
|
* @returns {Document} 解析后的 HTML 文档
|
||||||
*/
|
*/
|
||||||
export function parseMys(data: string): Document {
|
export function StructuredPostParser(data: string): Document {
|
||||||
// Json 化
|
// Json 化
|
||||||
let jsonData = JSON.parse(data);
|
let jsonData: PostStructuredContent[] = JSON.parse(data);
|
||||||
while (typeof jsonData === "string") jsonData = JSON.parse(jsonData);
|
|
||||||
// 创建 HTML 文档
|
// 创建 HTML 文档
|
||||||
const doc = document.implementation.createHTMLDocument();
|
const doc = document.implementation.createHTMLDocument();
|
||||||
// 遍历 Json 数据
|
// 遍历 Json 数据
|
||||||
Reference in New Issue
Block a user