You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.3 KiB
55 lines
1.3 KiB
import TurndownService from "turndown";
|
|
|
|
const turndown = new TurndownService({
|
|
headingStyle: "atx",
|
|
codeBlockStyle: "fenced",
|
|
bulletListMarker: "-",
|
|
});
|
|
|
|
export type ParseMode = "raw" | "markdown" | "json";
|
|
|
|
export interface ParseResult {
|
|
content: unknown;
|
|
contentType: "text" | "markdown" | "json";
|
|
degraded?: boolean;
|
|
note?: string;
|
|
}
|
|
|
|
export function parseResponse(
|
|
body: string,
|
|
mode: ParseMode,
|
|
contentTypeHeader?: string,
|
|
): ParseResult {
|
|
switch (mode) {
|
|
case "raw":
|
|
return { content: body, contentType: "text" };
|
|
|
|
case "json": {
|
|
try {
|
|
const parsed = JSON.parse(body);
|
|
return { content: parsed, contentType: "json" };
|
|
} catch {
|
|
return {
|
|
content: body,
|
|
contentType: "text",
|
|
degraded: true,
|
|
note: "JSON 解析失败,返回原始文本",
|
|
};
|
|
}
|
|
}
|
|
|
|
case "markdown": {
|
|
const isHtml =
|
|
contentTypeHeader?.includes("text/html") ||
|
|
/^\s*<(?:!doctype|html|body|div|p|h[1-6]|ul|ol|table|span|a)\b/i.test(body);
|
|
if (isHtml) {
|
|
const md = turndown.turndown(body);
|
|
return { content: md, contentType: "markdown" };
|
|
}
|
|
return { content: body, contentType: "text" };
|
|
}
|
|
|
|
default:
|
|
return { content: body, contentType: "text" };
|
|
}
|
|
}
|
|
|