正在显示
16 个修改的文件
包含
850 行增加
和
219 行删除
@@ -27,6 +27,7 @@ type HTMLPreviewProps = { | @@ -27,6 +27,7 @@ type HTMLPreviewProps = { | ||
27 | autoHeight?: boolean; | 27 | autoHeight?: boolean; |
28 | height?: number | string; | 28 | height?: number | string; |
29 | onLoad?: (title?: string) => void; | 29 | onLoad?: (title?: string) => void; |
30 | + width?: number | string; //20250403 新增宽度配置 | ||
30 | }; | 31 | }; |
31 | 32 | ||
32 | export type HTMLPreviewHander = { | 33 | export type HTMLPreviewHander = { |
@@ -78,6 +79,8 @@ export const HTMLPreview = forwardRef<HTMLPreviewHander, HTMLPreviewProps>( | @@ -78,6 +79,8 @@ export const HTMLPreview = forwardRef<HTMLPreviewHander, HTMLPreviewProps>( | ||
78 | : iframeHeight + 40; | 79 | : iframeHeight + 40; |
79 | }, [props.autoHeight, props.height, iframeHeight]); | 80 | }, [props.autoHeight, props.height, iframeHeight]); |
80 | 81 | ||
82 | + const width = props.width || "100%"; //20250403 新增宽度配置 | ||
83 | + | ||
81 | const srcDoc = useMemo(() => { | 84 | const srcDoc = useMemo(() => { |
82 | const script = `<script>window.addEventListener("DOMContentLoaded", () => new ResizeObserver((entries) => parent.postMessage({id: '${frameId}', height: entries[0].target.clientHeight}, '*')).observe(document.body))</script>`; | 85 | const script = `<script>window.addEventListener("DOMContentLoaded", () => new ResizeObserver((entries) => parent.postMessage({id: '${frameId}', height: entries[0].target.clientHeight}, '*')).observe(document.body))</script>`; |
83 | if (props.code.includes("<!DOCTYPE html>")) { | 86 | if (props.code.includes("<!DOCTYPE html>")) { |
@@ -98,7 +101,7 @@ export const HTMLPreview = forwardRef<HTMLPreviewHander, HTMLPreviewProps>( | @@ -98,7 +101,7 @@ export const HTMLPreview = forwardRef<HTMLPreviewHander, HTMLPreviewProps>( | ||
98 | key={frameId} | 101 | key={frameId} |
99 | ref={iframeRef} | 102 | ref={iframeRef} |
100 | sandbox="allow-forms allow-modals allow-scripts" | 103 | sandbox="allow-forms allow-modals allow-scripts" |
101 | - style={{ height }} | 104 | + style={{ height, width }} |
102 | srcDoc={srcDoc} | 105 | srcDoc={srcDoc} |
103 | onLoad={handleOnLoad} | 106 | onLoad={handleOnLoad} |
104 | /> | 107 | /> |
@@ -253,7 +256,7 @@ export function Artifacts() { | @@ -253,7 +256,7 @@ export function Artifacts() { | ||
253 | code={code} | 256 | code={code} |
254 | ref={previewRef} | 257 | ref={previewRef} |
255 | autoHeight={false} | 258 | autoHeight={false} |
256 | - height={"100%"} | 259 | + height={"100%"} //20250403 新增宽度配置 |
257 | onLoad={(title) => { | 260 | onLoad={(title) => { |
258 | setFileName(title as string); | 261 | setFileName(title as string); |
259 | setLoading(false); | 262 | setLoading(false); |
@@ -136,10 +136,11 @@ import clsx from "clsx"; | @@ -136,10 +136,11 @@ import clsx from "clsx"; | ||
136 | import { getAvailableClientsCount, isMcpEnabled } from "../mcp/actions"; | 136 | import { getAvailableClientsCount, isMcpEnabled } from "../mcp/actions"; |
137 | 137 | ||
138 | //20250317新增 | 138 | //20250317新增 |
139 | -import { getExcelData, toExcel } from "../utils/excelAndWordUtils/export2Excel"; | ||
140 | -import { exportWord } from "../utils/excelAndWordUtils/word"; | 139 | +import { getExcelData, toExcel } from "../utils/fileExport/export2Excel"; |
140 | +import { exportWord, getWordData } from "../utils/fileExport/word"; | ||
141 | import { getMindPrompt } from "../utils/prompt"; | 141 | import { getMindPrompt } from "../utils/prompt"; |
142 | import { message } from "antd"; | 142 | import { message } from "antd"; |
143 | +import { getPdfData } from "../utils/fileExport/toPdf"; | ||
143 | const localStorage = safeLocalStorage(); | 144 | const localStorage = safeLocalStorage(); |
144 | 145 | ||
145 | const ttsPlayer = createTTSPlayer(); | 146 | const ttsPlayer = createTTSPlayer(); |
@@ -1774,33 +1775,57 @@ function _Chat() { | @@ -1774,33 +1775,57 @@ function _Chat() { | ||
1774 | const [fileName, setFileName] = useState(""); | 1775 | const [fileName, setFileName] = useState(""); |
1775 | 1776 | ||
1776 | async function uploadFile() { | 1777 | async function uploadFile() { |
1777 | - // 创建一个隐藏的文件输入框 | ||
1778 | const fileInput = document.createElement("input"); | 1778 | const fileInput = document.createElement("input"); |
1779 | fileInput.type = "file"; | 1779 | fileInput.type = "file"; |
1780 | - fileInput.accept = ".xlsx, .xls"; | 1780 | + fileInput.accept = ".xlsx, .xls, .pdf, .docx, .doc"; |
1781 | fileInput.multiple = false; | 1781 | fileInput.multiple = false; |
1782 | - fileInput.onchange = (event: Event) => { | ||
1783 | - const target = event.target as HTMLInputElement; | ||
1784 | - const files = target.files; | ||
1785 | - if (files && files.length > 0) { | ||
1786 | - const file = files[0]; // 获取第一个文件 | ||
1787 | - getExcelData(file) | ||
1788 | - .then((data) => { | ||
1789 | - const value = `'''filedata | ||
1790 | - ${file.name} | ||
1791 | - ${JSON.stringify(data)} | ||
1792 | - '''filedata | ||
1793 | - `; | ||
1794 | - setFileData(value); | ||
1795 | - setFileName(file.name); | ||
1796 | - console.log(value); | ||
1797 | - }) | ||
1798 | - .catch((error) => { | ||
1799 | - message.error("上传失败"); | ||
1800 | - }); | 1782 | + fileInput.style.display = "none"; |
1783 | + const handleFileResult = (fileName: string, data: any) => { | ||
1784 | + if (!data) { | ||
1785 | + message.error("未读取到内容"); | ||
1786 | + return; | ||
1787 | + } | ||
1788 | + setFileData(`'''filedata | ||
1789 | + ${fileName} | ||
1790 | + ${JSON.stringify(data)} | ||
1791 | + '''filedata`); | ||
1792 | + setFileName(fileName); | ||
1793 | + }; | ||
1794 | + const handleError = (error: any, defaultMsg = "上传失败") => { | ||
1795 | + console.error(`${defaultMsg}:`, error); | ||
1796 | + message.error(defaultMsg); | ||
1797 | + }; | ||
1798 | + // 文件处理器映射 | ||
1799 | + const fileHandlers: Record<string, (file: File) => Promise<any>> = { | ||
1800 | + ".xlsx": getExcelData, | ||
1801 | + ".xls": getExcelData, | ||
1802 | + ".doc": getWordData, | ||
1803 | + ".docx": getWordData, | ||
1804 | + ".pdf": getPdfData, | ||
1805 | + }; | ||
1806 | + fileInput.onchange = async (event: Event) => { | ||
1807 | + try { | ||
1808 | + const file = (event.target as HTMLInputElement).files?.[0]; | ||
1809 | + if (!file) return; | ||
1810 | + const fileExt = file.name | ||
1811 | + .toLowerCase() | ||
1812 | + .slice(file.name.lastIndexOf(".")); | ||
1813 | + // 校验文件类型 | ||
1814 | + if (!Object.keys(fileHandlers).includes(fileExt)) { | ||
1815 | + message.error("不支持的文件类型"); | ||
1816 | + return; | ||
1817 | + } | ||
1818 | + // 获取处理器并执行 | ||
1819 | + const handler = fileHandlers[fileExt]; | ||
1820 | + const data = await handler(file); | ||
1821 | + handleFileResult(file.name, data); | ||
1822 | + } catch (error) { | ||
1823 | + handleError(error); | ||
1824 | + } finally { | ||
1825 | + fileInput.remove(); | ||
1801 | } | 1826 | } |
1802 | - fileInput.remove(); | ||
1803 | }; | 1827 | }; |
1828 | + document.body.appendChild(fileInput); | ||
1804 | fileInput.click(); | 1829 | fileInput.click(); |
1805 | } | 1830 | } |
1806 | return ( | 1831 | return ( |
@@ -21,6 +21,8 @@ export interface WriteSiderBarProps { | @@ -21,6 +21,8 @@ export interface WriteSiderBarProps { | ||
21 | setHtmlCode: React.Dispatch<React.SetStateAction<string>>; | 21 | setHtmlCode: React.Dispatch<React.SetStateAction<string>>; |
22 | loading: boolean; | 22 | loading: boolean; |
23 | setLoading: React.Dispatch<React.SetStateAction<boolean>>; | 23 | setLoading: React.Dispatch<React.SetStateAction<boolean>>; |
24 | + setWidth: React.Dispatch<React.SetStateAction<string>>; | ||
25 | + setHtmlheader: React.Dispatch<React.SetStateAction<string>>; | ||
24 | } | 26 | } |
25 | 27 | ||
26 | const WritingPanel = dynamic( | 28 | const WritingPanel = dynamic( |
@@ -31,7 +33,15 @@ const WritingPanel = dynamic( | @@ -31,7 +33,15 @@ const WritingPanel = dynamic( | ||
31 | ); | 33 | ); |
32 | 34 | ||
33 | export function WriteSiderBar(props: WriteSiderBarProps) { | 35 | export function WriteSiderBar(props: WriteSiderBarProps) { |
34 | - const { className, htmlCode, setHtmlCode, loading, setLoading } = props; | 36 | + const { |
37 | + className, | ||
38 | + htmlCode, | ||
39 | + setHtmlCode, | ||
40 | + loading, | ||
41 | + setLoading, | ||
42 | + setWidth, | ||
43 | + setHtmlheader, | ||
44 | + } = props; | ||
35 | const isMobileScreen = useMobileScreen(); | 45 | const isMobileScreen = useMobileScreen(); |
36 | const { onDragStart, shouldNarrow } = useDragSideBar(); | 46 | const { onDragStart, shouldNarrow } = useDragSideBar(); |
37 | const navigate = useNavigate(); | 47 | const navigate = useNavigate(); |
@@ -93,6 +103,8 @@ export function WriteSiderBar(props: WriteSiderBarProps) { | @@ -93,6 +103,8 @@ export function WriteSiderBar(props: WriteSiderBarProps) { | ||
93 | setHtmlCode={setHtmlCode} | 103 | setHtmlCode={setHtmlCode} |
94 | loading={loading} | 104 | loading={loading} |
95 | setLoading={setLoading} | 105 | setLoading={setLoading} |
106 | + setWidth={setWidth} | ||
107 | + setHtmlheader={setHtmlheader} | ||
96 | /> | 108 | /> |
97 | </SideBarBody> | 109 | </SideBarBody> |
98 | </SideBarContainer> | 110 | </SideBarContainer> |
@@ -16,11 +16,10 @@ const mergedData = [ | @@ -16,11 +16,10 @@ const mergedData = [ | ||
16 | type: "select", | 16 | type: "select", |
17 | default: "公司官网", | 17 | default: "公司官网", |
18 | options: [ | 18 | options: [ |
19 | - { name: "公司官网", value: "1" }, | ||
20 | - { name: "小红书", value: "2" }, | ||
21 | - { name: "微信", value: "3" }, | ||
22 | - { name: "公众号", value: "4" }, | ||
23 | - { name: "今日头条", value: "5" }, | 19 | + { name: "公司官网", value: "100%" }, |
20 | + { name: "小红书", value: "400px" }, | ||
21 | + { name: "微信公众号", value: "300px" }, | ||
22 | + { name: "今日头条", value: "500px" }, | ||
24 | ], | 23 | ], |
25 | }, | 24 | }, |
26 | { | 25 | { |
@@ -62,10 +61,10 @@ const mergedData = [ | @@ -62,10 +61,10 @@ const mergedData = [ | ||
62 | required: false, | 61 | required: false, |
63 | default: "产品推广文案", | 62 | default: "产品推广文案", |
64 | options: [ | 63 | options: [ |
65 | - { name: "产品推广文案", value: "产品推广文案" }, | ||
66 | - { name: "品牌宣传文案", value: "品牌宣传文案" }, | ||
67 | - { name: "产品说明书", value: "产品说明书" }, | ||
68 | - { name: "产品介绍", value: "产品介绍" }, | 64 | + { name: "产品推广文案", value: "promotion" }, |
65 | + { name: "品牌宣传文案", value: "propagandize" }, | ||
66 | + { name: "产品说明书", value: "instructionBook" }, | ||
67 | + { name: "产品介绍", value: "introduce" }, | ||
69 | ], | 68 | ], |
70 | }, | 69 | }, |
71 | { | 70 | { |
@@ -85,9 +84,18 @@ export interface WritePanelProps { | @@ -85,9 +84,18 @@ export interface WritePanelProps { | ||
85 | setHtmlCode: React.Dispatch<React.SetStateAction<string>>; | 84 | setHtmlCode: React.Dispatch<React.SetStateAction<string>>; |
86 | loading: boolean; | 85 | loading: boolean; |
87 | setLoading: React.Dispatch<React.SetStateAction<boolean>>; | 86 | setLoading: React.Dispatch<React.SetStateAction<boolean>>; |
87 | + setWidth: React.Dispatch<React.SetStateAction<string>>; | ||
88 | + setHtmlheader: React.Dispatch<React.SetStateAction<string>>; | ||
88 | } | 89 | } |
89 | export function WritingPanel(props: WritePanelProps) { | 90 | export function WritingPanel(props: WritePanelProps) { |
90 | - const { htmlCode, setHtmlCode, setLoading, loading } = props; | 91 | + const { |
92 | + htmlCode, | ||
93 | + setHtmlCode, | ||
94 | + setLoading, | ||
95 | + loading, | ||
96 | + setWidth, | ||
97 | + setHtmlheader, | ||
98 | + } = props; | ||
91 | // 为每个选择框单独声明状态,存储name | 99 | // 为每个选择框单独声明状态,存储name |
92 | const chatStore = useChatStore(); | 100 | const chatStore = useChatStore(); |
93 | const [writingPurposeName, setWritingPurposeName] = useState("公司官网"); // 写作用途 | 101 | const [writingPurposeName, setWritingPurposeName] = useState("公司官网"); // 写作用途 |
@@ -104,10 +112,12 @@ export function WritingPanel(props: WritePanelProps) { | @@ -104,10 +112,12 @@ export function WritingPanel(props: WritePanelProps) { | ||
104 | const handleSelectChange = (index: number, value: string) => { | 112 | const handleSelectChange = (index: number, value: string) => { |
105 | const options = mergedData[index].options; | 113 | const options = mergedData[index].options; |
106 | const selectedName = options.find((opt) => opt.value === value)?.name || ""; | 114 | const selectedName = options.find((opt) => opt.value === value)?.name || ""; |
107 | - | 115 | + const selectedValue = |
116 | + options.find((opt) => opt.value === value)?.value || ""; | ||
108 | switch (index) { | 117 | switch (index) { |
109 | case 0: | 118 | case 0: |
110 | setWritingPurposeName(selectedName); | 119 | setWritingPurposeName(selectedName); |
120 | + setWidth(selectedValue); | ||
111 | break; | 121 | break; |
112 | case 1: | 122 | case 1: |
113 | setImageModeName(selectedName); | 123 | setImageModeName(selectedName); |
@@ -164,6 +174,19 @@ export function WritingPanel(props: WritePanelProps) { | @@ -164,6 +174,19 @@ export function WritingPanel(props: WritePanelProps) { | ||
164 | if (cleanedContent.endsWith("```")) { | 174 | if (cleanedContent.endsWith("```")) { |
165 | cleanedContent = cleanedContent.substring(0, cleanedContent.length - 4); | 175 | cleanedContent = cleanedContent.substring(0, cleanedContent.length - 4); |
166 | } | 176 | } |
177 | + | ||
178 | + //保存html头部 | ||
179 | + const bodyTagRegex = /<body[^>]*>/i; | ||
180 | + const bodyTagMatch = cleanedContent.match(bodyTagRegex); | ||
181 | + if (bodyTagMatch && bodyTagMatch.index !== undefined) { | ||
182 | + // 截取从文档开头到 <body> 标签的起始位置 | ||
183 | + const contentUpToBody = cleanedContent.slice( | ||
184 | + 0, | ||
185 | + bodyTagMatch.index + bodyTagMatch[0].length, | ||
186 | + ); | ||
187 | + setHtmlheader(contentUpToBody); //保存html头部 | ||
188 | + } | ||
189 | + localStorage.setItem("htmlCode", cleanedContent); | ||
167 | setHtmlCode(cleanedContent); | 190 | setHtmlCode(cleanedContent); |
168 | } catch (error) { | 191 | } catch (error) { |
169 | message.error("生成失败,请重试"); | 192 | message.error("生成失败,请重试"); |
@@ -11,12 +11,11 @@ import Locale from "@/app/locales"; | @@ -11,12 +11,11 @@ import Locale from "@/app/locales"; | ||
11 | import { Path } from "@/app/constant"; | 11 | import { Path } from "@/app/constant"; |
12 | import { useNavigate } from "react-router-dom"; | 12 | import { useNavigate } from "react-router-dom"; |
13 | import { getClientConfig } from "@/app/config/client"; | 13 | import { getClientConfig } from "@/app/config/client"; |
14 | -import React, { useMemo, useRef, useState } from "react"; | ||
15 | -import { useAppConfig } from "@/app/store"; | 14 | +import React, { useCallback, useMemo, useRef, useState } from "react"; |
15 | +import { useAppConfig, useMindMapStore } from "@/app/store"; | ||
16 | import { ChatAction } from "../chat"; | 16 | import { ChatAction } from "../chat"; |
17 | import { useWindowSize } from "@/app/utils"; | 17 | import { useWindowSize } from "@/app/utils"; |
18 | -import { exportWord } from "@/app/utils/excelAndWordUtils/word"; | ||
19 | -import { HTMLPreview } from "../artifacts"; | 18 | +import { exportHtmlToWord } from "@/app/utils/fileExport/word"; |
20 | import ReactQuill from "react-quill"; | 19 | import ReactQuill from "react-quill"; |
21 | import "react-quill/dist/quill.snow.css"; | 20 | import "react-quill/dist/quill.snow.css"; |
22 | 21 | ||
@@ -34,7 +33,13 @@ import WordIcon from "@/app/icons/word.svg"; | @@ -34,7 +33,13 @@ import WordIcon from "@/app/icons/word.svg"; | ||
34 | import MindIcon from "@/app/icons/mind.svg"; | 33 | import MindIcon from "@/app/icons/mind.svg"; |
35 | import PptIcon from "@/app/icons/ppt.svg"; | 34 | import PptIcon from "@/app/icons/ppt.svg"; |
36 | import PdfIcon from "@/app/icons/pdf.svg"; | 35 | import PdfIcon from "@/app/icons/pdf.svg"; |
36 | +import HtmlIcon from "@/app/icons/HTML.svg"; | ||
37 | + | ||
37 | import { message } from "antd"; | 38 | import { message } from "antd"; |
39 | +import { HTMLPreview } from "../artifacts"; | ||
40 | +import { getMindPrompt } from "@/app/utils/prompt"; | ||
41 | +import { htmlToPdf2 } from "@/app/utils/fileExport/toPdf"; | ||
42 | +import { htmlToExcel } from "@/app/utils/fileExport/export2Excel"; | ||
38 | 43 | ||
39 | export function WritingPage() { | 44 | export function WritingPage() { |
40 | const isMobileScreen = useMobileScreen(); | 45 | const isMobileScreen = useMobileScreen(); |
@@ -45,10 +50,14 @@ export function WritingPage() { | @@ -45,10 +50,14 @@ export function WritingPage() { | ||
45 | const scrollRef = useRef<HTMLDivElement>(null); | 50 | const scrollRef = useRef<HTMLDivElement>(null); |
46 | const isWriting = location.pathname === Path.Writing; | 51 | const isWriting = location.pathname === Path.Writing; |
47 | const { height } = useWindowSize(); | 52 | const { height } = useWindowSize(); |
53 | + const [width, setWidth] = useState("100%"); | ||
48 | const [isEdit, setIsEdit] = useState(false); | 54 | const [isEdit, setIsEdit] = useState(false); |
49 | const [loading, setLoading] = useState(false); | 55 | const [loading, setLoading] = useState(false); |
50 | const quillRef = useRef<ReactQuill | null>(null); | 56 | const quillRef = useRef<ReactQuill | null>(null); |
51 | - const [htmlCode, setHtmlCode] = useState(""); | 57 | + const [htmlHeader, setHtmlheader] = useState(""); |
58 | + const [htmlCode, setHtmlCode] = useState( | ||
59 | + localStorage.getItem("htmlCode") || "", | ||
60 | + ); | ||
52 | 61 | ||
53 | //编辑器 | 62 | //编辑器 |
54 | const toolbarOptions = [ | 63 | const toolbarOptions = [ |
@@ -60,42 +69,66 @@ export function WritingPage() { | @@ -60,42 +69,66 @@ export function WritingPage() { | ||
60 | ["link", "image"], | 69 | ["link", "image"], |
61 | ]; | 70 | ]; |
62 | 71 | ||
63 | - const copyToClipboard = () => { | ||
64 | - // 检查quillRef.current是否为null | ||
65 | - if (quillRef.current) { | ||
66 | - const editor = quillRef.current.getEditor(); // 获取编辑器实例 | ||
67 | - const range = editor.getSelection(); // 获取当前选择的范围 | ||
68 | - const text = editor.getText(); // 获取编辑器中的文本内容 | 72 | + // 生成完整HTML内容 |
73 | + const generateFullHtml = useCallback( | ||
74 | + () => `${htmlHeader}${htmlCode}</body></html>`, | ||
75 | + [htmlHeader, htmlCode], | ||
76 | + ); | ||
69 | 77 | ||
70 | - if (range && range.length > 0) { | ||
71 | - // 如果有选中的文本,复制选中的内容 | ||
72 | - const selectedText = text.substring( | ||
73 | - range.index, | ||
74 | - range.index + range.length, | ||
75 | - ); | ||
76 | - navigator.clipboard | ||
77 | - .writeText(selectedText) | ||
78 | - .then(() => { | ||
79 | - message.success("复制成功"); | ||
80 | - }) | ||
81 | - .catch((err) => { | ||
82 | - message.error("复制失败:"); | ||
83 | - }); | ||
84 | - } else { | ||
85 | - // 如果没有选择文本,就复制全部内容 | ||
86 | - navigator.clipboard | ||
87 | - .writeText(text) | ||
88 | - .then(() => { | ||
89 | - message.success("复制成功"); | ||
90 | - }) | ||
91 | - .catch((err) => { | ||
92 | - message.error("复制失败:"); | ||
93 | - }); | ||
94 | - } | ||
95 | - } else { | ||
96 | - console.error("Quill编辑器尚未初始化"); | 78 | + const handleCopy = async () => { |
79 | + try { | ||
80 | + const blob = new Blob([htmlCode], { type: "text/html" }); | ||
81 | + const clipboardItem = new ClipboardItem({ "text/html": blob }); | ||
82 | + await navigator.clipboard.write([clipboardItem]); | ||
83 | + message.success("复制成功!"); | ||
84 | + } catch (error) { | ||
85 | + message.error("复制失败"); | ||
97 | } | 86 | } |
98 | }; | 87 | }; |
88 | + //跳转到ppt页面 | ||
89 | + function toPowerpoint(pptMessage: string) { | ||
90 | + navigate("/powerpoint", { state: { msg: true, pptMessage: pptMessage } }); | ||
91 | + } | ||
92 | + // 转至思维导图页面 | ||
93 | + const toMind = useCallback( | ||
94 | + (content: string) => { | ||
95 | + const { setMindMapData } = useMindMapStore.getState(); | ||
96 | + setMindMapData( | ||
97 | + [ | ||
98 | + { | ||
99 | + role: "user", | ||
100 | + content: getMindPrompt(content, true), | ||
101 | + }, | ||
102 | + ], | ||
103 | + content, | ||
104 | + ); | ||
105 | + navigate("/mind", { state: { msg: true } }); | ||
106 | + }, | ||
107 | + [navigate], | ||
108 | + ); | ||
109 | + | ||
110 | + //导出html文件 | ||
111 | + const exportHtml = useCallback(() => { | ||
112 | + try { | ||
113 | + const htmlContent = generateFullHtml(); | ||
114 | + const blob = new Blob([htmlContent], { type: "text/html" }); | ||
115 | + const url = URL.createObjectURL(blob); | ||
116 | + const a = document.createElement("a"); | ||
117 | + a.href = url; | ||
118 | + a.download = "output.html"; | ||
119 | + a.click(); | ||
120 | + URL.revokeObjectURL(url); | ||
121 | + message.success("导出成功"); | ||
122 | + } catch (error) { | ||
123 | + message.error("导出失败"); | ||
124 | + } | ||
125 | + }, [generateFullHtml]); | ||
126 | + | ||
127 | + function hasTable(htmlContent: string): boolean { | ||
128 | + const parser = new DOMParser(); | ||
129 | + const doc = parser.parseFromString(htmlContent, "text/html"); | ||
130 | + return doc.querySelector("table") !== null; | ||
131 | + } | ||
99 | 132 | ||
100 | return ( | 133 | return ( |
101 | <> | 134 | <> |
@@ -105,6 +138,8 @@ export function WritingPage() { | @@ -105,6 +138,8 @@ export function WritingPage() { | ||
105 | setHtmlCode={setHtmlCode} | 138 | setHtmlCode={setHtmlCode} |
106 | loading={loading} | 139 | loading={loading} |
107 | setLoading={setLoading} | 140 | setLoading={setLoading} |
141 | + setWidth={setWidth} | ||
142 | + setHtmlheader={setHtmlheader} | ||
108 | /> | 143 | /> |
109 | <WindowContent> | 144 | <WindowContent> |
110 | <div className={chatStyles.chat} key={"1"}> | 145 | <div className={chatStyles.chat} key={"1"}> |
@@ -130,66 +165,97 @@ export function WritingPage() { | @@ -130,66 +165,97 @@ export function WritingPage() { | ||
130 | <div className={`window-header-main-title`}>AI-Writing</div> | 165 | <div className={`window-header-main-title`}>AI-Writing</div> |
131 | </div> | 166 | </div> |
132 | <div className={chatStyles["chat-message-actions"]}> | 167 | <div className={chatStyles["chat-message-actions"]}> |
133 | - <div className={chatStyles["chat-input-actions"]}> | ||
134 | - <ChatAction | ||
135 | - text={Locale.Chat.Actions.ReWrite} | ||
136 | - icon={<ReloadIcon />} | ||
137 | - onClick={() => {}} | ||
138 | - /> | ||
139 | - <ChatAction | ||
140 | - text={Locale.Chat.Actions.Copy} | ||
141 | - icon={<CopyIcon />} | ||
142 | - onClick={copyToClipboard} | ||
143 | - /> | ||
144 | - {!isEdit ? ( | 168 | + {htmlCode && ( |
169 | + <div className={chatStyles["chat-input-actions"]}> | ||
145 | <ChatAction | 170 | <ChatAction |
146 | - text={Locale.Chat.Actions.Edit} | ||
147 | - icon={<EditIcon />} | ||
148 | - onClick={() => { | ||
149 | - setIsEdit(true); | 171 | + text={Locale.Chat.Actions.ReWrite} |
172 | + icon={<ReloadIcon />} | ||
173 | + onClick={() => {}} | ||
174 | + disabled={isEdit} | ||
175 | + /> | ||
176 | + <ChatAction | ||
177 | + text={Locale.Chat.Actions.Copy} | ||
178 | + icon={<CopyIcon />} | ||
179 | + onClick={handleCopy} | ||
180 | + disabled={isEdit} | ||
181 | + /> | ||
182 | + {!isEdit ? ( | ||
183 | + <ChatAction | ||
184 | + text={Locale.Chat.Actions.Edit} | ||
185 | + icon={<EditIcon />} | ||
186 | + onClick={() => { | ||
187 | + setIsEdit(true); | ||
188 | + }} | ||
189 | + /> | ||
190 | + ) : ( | ||
191 | + <ChatAction | ||
192 | + text={Locale.Chat.Actions.CancelEdit} | ||
193 | + icon={<EditIcon />} | ||
194 | + onClick={() => { | ||
195 | + setIsEdit(false); | ||
196 | + }} | ||
197 | + /> | ||
198 | + )} | ||
199 | + <ChatAction | ||
200 | + text={Locale.Export.Pdf} | ||
201 | + icon={<PdfIcon />} | ||
202 | + onClick={async () => { | ||
203 | + setLoading(true); | ||
204 | + await htmlToPdf2(htmlCode); | ||
205 | + setLoading(false); | ||
150 | }} | 206 | }} |
207 | + disabled={isEdit} | ||
151 | /> | 208 | /> |
152 | - ) : ( | ||
153 | <ChatAction | 209 | <ChatAction |
154 | - text="取消编辑" | ||
155 | - icon={<EditIcon />} | 210 | + text={Locale.Export.Word} |
211 | + icon={<WordIcon />} | ||
156 | onClick={() => { | 212 | onClick={() => { |
157 | - setIsEdit(false); | 213 | + const html = `${htmlHeader} |
214 | + ${htmlCode} | ||
215 | + </body> | ||
216 | + </html> | ||
217 | + `; | ||
218 | + exportHtmlToWord(html); | ||
158 | }} | 219 | }} |
220 | + disabled={isEdit} | ||
159 | /> | 221 | /> |
160 | - )} | 222 | + {hasTable(htmlCode) && ( |
223 | + <ChatAction | ||
224 | + text={Locale.Export.Excel} | ||
225 | + icon={<ExcelIcon />} | ||
226 | + onClick={() => { | ||
227 | + htmlToExcel(htmlCode); | ||
228 | + }} | ||
229 | + disabled={isEdit} | ||
230 | + /> | ||
231 | + )} | ||
161 | 232 | ||
162 | - <ChatAction | ||
163 | - text={Locale.Export.Pdf} | ||
164 | - icon={<PdfIcon />} | ||
165 | - onClick={() => {}} | ||
166 | - /> | ||
167 | - {htmlCode && ( | ||
168 | <ChatAction | 233 | <ChatAction |
169 | - text={Locale.Export.Word} | ||
170 | - icon={<WordIcon />} | 234 | + text={Locale.Export.Ppt} |
235 | + icon={<PptIcon />} | ||
171 | onClick={() => { | 236 | onClick={() => { |
172 | - exportWord(htmlCode); | 237 | + toPowerpoint(htmlCode); |
173 | }} | 238 | }} |
239 | + disabled={isEdit} | ||
174 | /> | 240 | /> |
175 | - )} | ||
176 | - <ChatAction | ||
177 | - text={Locale.Export.Excel} | ||
178 | - icon={<ExcelIcon />} | ||
179 | - onClick={() => {}} | ||
180 | - disabled={true} | ||
181 | - /> | ||
182 | - <ChatAction | ||
183 | - text={Locale.Export.Ppt} | ||
184 | - icon={<PptIcon />} | ||
185 | - onClick={() => {}} | ||
186 | - /> | ||
187 | - <ChatAction | ||
188 | - text={Locale.Export.Mind.title} | ||
189 | - icon={<MindIcon />} | ||
190 | - onClick={() => {}} | ||
191 | - /> | ||
192 | - </div> | 241 | + <ChatAction |
242 | + text={Locale.Export.Mind.title} | ||
243 | + icon={<MindIcon />} | ||
244 | + onClick={() => { | ||
245 | + toMind(htmlCode); | ||
246 | + }} | ||
247 | + disabled={isEdit} | ||
248 | + /> | ||
249 | + <ChatAction | ||
250 | + text={Locale.Export.Html} | ||
251 | + icon={<HtmlIcon />} | ||
252 | + onClick={() => { | ||
253 | + exportHtml(); | ||
254 | + }} | ||
255 | + disabled={isEdit} | ||
256 | + /> | ||
257 | + </div> | ||
258 | + )} | ||
193 | </div> | 259 | </div> |
194 | <div className="window-actions"> | 260 | <div className="window-actions"> |
195 | {showMaxIcon && ( | 261 | {showMaxIcon && ( |
@@ -209,7 +275,10 @@ export function WritingPage() { | @@ -209,7 +275,10 @@ export function WritingPage() { | ||
209 | {isMobileScreen && <SDIcon width={50} height={50} />} | 275 | {isMobileScreen && <SDIcon width={50} height={50} />} |
210 | </div> | 276 | </div> |
211 | </div> | 277 | </div> |
212 | - <div className={chatStyles["chat-body"]} ref={scrollRef}> | 278 | + <div |
279 | + className={`${chatStyles["chat-body"]} ${styles["write-body"]}`} | ||
280 | + ref={scrollRef} | ||
281 | + > | ||
213 | {loading ? ( | 282 | {loading ? ( |
214 | <div className={clsx("no-dark", styles["loading-content"])}> | 283 | <div className={clsx("no-dark", styles["loading-content"])}> |
215 | <BotIcon /> | 284 | <BotIcon /> |
@@ -231,7 +300,8 @@ export function WritingPage() { | @@ -231,7 +300,8 @@ export function WritingPage() { | ||
231 | <HTMLPreview | 300 | <HTMLPreview |
232 | code={htmlCode} | 301 | code={htmlCode} |
233 | autoHeight={!document.fullscreenElement} | 302 | autoHeight={!document.fullscreenElement} |
234 | - height={!document.fullscreenElement ? 600 : height} | 303 | + height={!document.fullscreenElement ? "100%" : height} |
304 | + width={width} | ||
235 | /> | 305 | /> |
236 | )) | 306 | )) |
237 | )} | 307 | )} |
app/icons/HTML.svg
0 → 100644
1 | +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1743667735062" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4363" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M354.40128 0c-87.04 0-157.44 70.55872-157.44 157.59872v275.68128H78.72c-21.6576 0-39.36256 17.69984-39.36256 39.36256v236.31872c0 21.6576 17.69984 39.35744 39.36256 39.35744h118.24128v118.08256c0 87.04 70.4 157.59872 157.44 157.59872h472.63744c87.04 0 157.59872-70.55872 157.59872-157.59872V315.0336c0-41.74848-38.9888-81.93024-107.52-149.27872l-29.11744-29.12256L818.87744 107.52C751.5392 38.9888 711.39328 0 669.59872 0H354.4064z m0 78.72h287.20128c28.35456 7.0912 27.99616 42.1376 27.99616 76.8v120.16128c0 21.6576 17.69984 39.35744 39.36256 39.35744h118.07744c39.38816 0 78.87872-0.0256 78.87872 39.36256v512c0 43.32032-35.55328 78.87872-78.87872 78.87872H354.4064c-43.32544 0-78.72-35.5584-78.72-78.87872v-118.08256h393.91744c21.66272 0 39.36256-17.69472 39.36256-39.35744V472.64256c0-21.66272-17.69984-39.36256-39.36256-39.36256H275.68128V157.59872c0-43.32032 35.39456-78.87872 78.72-78.87872zM75.03872 493.59872h22.08256v73.92256H176.7936V493.59872h23.04v175.68256h-23.04V587.6736H97.1264v81.60256h-22.08256V493.59872z m151.68 0h121.92256v20.16256h-49.92v155.52H276.6336v-155.52h-49.92v-20.16256z m148.80256 0h32.64l49.92 143.04256h0.95744l48.96256-143.04256h33.59744v175.68256h-22.07744v-106.56256c0-10.88 0.31744-26.55744 0.95744-47.03744h-0.95744l-52.80256 153.6h-19.2l-52.79744-153.6h-0.96256c1.28 22.4 1.92 38.71744 1.92 48.95744v104.64256h-20.15744V493.59872z m214.07744 0h22.08256v155.52h69.12v20.16256h-91.20256V493.59872z" p-id="4364"></path></svg> |
@@ -53,6 +53,7 @@ const cn = { | @@ -53,6 +53,7 @@ const cn = { | ||
53 | PinToastAction: "查看", | 53 | PinToastAction: "查看", |
54 | Delete: "删除", | 54 | Delete: "删除", |
55 | Edit: "编辑", | 55 | Edit: "编辑", |
56 | + CancelEdit: "取消编辑", | ||
56 | FullScreen: "全屏", | 57 | FullScreen: "全屏", |
57 | RefreshTitle: "刷新标题", | 58 | RefreshTitle: "刷新标题", |
58 | RefreshToast: "已发送刷新标题请求", | 59 | RefreshToast: "已发送刷新标题请求", |
@@ -148,6 +149,7 @@ const cn = { | @@ -148,6 +149,7 @@ const cn = { | ||
148 | Excel: "下载Excel", | 149 | Excel: "下载Excel", |
149 | Pdf: "导出PDF", | 150 | Pdf: "导出PDF", |
150 | Ppt: "导出PPT", | 151 | Ppt: "导出PPT", |
152 | + Html: "导出HTML", | ||
151 | }, | 153 | }, |
152 | Select: { | 154 | Select: { |
153 | Search: "搜索消息", | 155 | Search: "搜索消息", |
@@ -3,4 +3,4 @@ export * from "./update"; | @@ -3,4 +3,4 @@ export * from "./update"; | ||
3 | export * from "./access"; | 3 | export * from "./access"; |
4 | export * from "./config"; | 4 | export * from "./config"; |
5 | export * from "./plugin"; | 5 | export * from "./plugin"; |
6 | -export * from "./message"; | 6 | +export * from "./mindMap"; |
@@ -106,7 +106,6 @@ export function getExcelData(file: File): Promise<any[][]> { | @@ -106,7 +106,6 @@ export function getExcelData(file: File): Promise<any[][]> { | ||
106 | reject(new Error("Failed to read file data")); | 106 | reject(new Error("Failed to read file data")); |
107 | return; | 107 | return; |
108 | } | 108 | } |
109 | - | ||
110 | const workbook = XLSX.read(data, { type: "array" }); | 109 | const workbook = XLSX.read(data, { type: "array" }); |
111 | const firstSheetName = workbook.SheetNames[0]; | 110 | const firstSheetName = workbook.SheetNames[0]; |
112 | const worksheet = workbook.Sheets[firstSheetName]; | 111 | const worksheet = workbook.Sheets[firstSheetName]; |
@@ -127,3 +126,29 @@ export function getExcelData(file: File): Promise<any[][]> { | @@ -127,3 +126,29 @@ export function getExcelData(file: File): Promise<any[][]> { | ||
127 | reader.readAsArrayBuffer(file); | 126 | reader.readAsArrayBuffer(file); |
128 | }); | 127 | }); |
129 | } | 128 | } |
129 | + | ||
130 | +export function htmlToExcel(htmlContent: string) { | ||
131 | + const parser = new DOMParser(); | ||
132 | + const doc = parser.parseFromString(htmlContent, "text/html"); | ||
133 | + const table = doc.querySelector("table"); | ||
134 | + if (!table) { | ||
135 | + return []; | ||
136 | + } | ||
137 | + const rows = table.querySelectorAll("tr"); | ||
138 | + const tableData: string[][] = []; | ||
139 | + // 提取表格数据(包含表头) | ||
140 | + rows.forEach((row) => { | ||
141 | + const cells = row.querySelectorAll("td, th"); | ||
142 | + const rowData: string[] = []; | ||
143 | + cells.forEach((cell) => { | ||
144 | + rowData.push(cell.textContent?.trim() || ""); | ||
145 | + }); | ||
146 | + tableData.push(rowData); | ||
147 | + }); | ||
148 | + // 使用二维数组直接创建工作表 | ||
149 | + const ws = XLSX.utils.aoa_to_sheet(tableData); | ||
150 | + // 创建工作簿并保存 | ||
151 | + const wb = XLSX.utils.book_new(); | ||
152 | + XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); | ||
153 | + XLSX.writeFile(wb, "export.xlsx"); | ||
154 | +} |
app/utils/fileExport/toPdf.ts
0 → 100644
1 | +import html2canvas from "html2canvas"; | ||
2 | +import jsPDF from "jspdf"; | ||
3 | +import { pdfToText } from "pdf-ts"; | ||
4 | + | ||
5 | +export async function htmlToPdf2(htmlCode: string) { | ||
6 | + const container = document.createElement("div"); | ||
7 | + container.style.cssText = ` | ||
8 | + position: fixed; | ||
9 | + left: -9999px; | ||
10 | + top: -9999px; | ||
11 | + width: 210mm; // 固定 A4 宽度 | ||
12 | + background: white; | ||
13 | + `; | ||
14 | + container.innerHTML = htmlCode; | ||
15 | + document.body.appendChild(container); | ||
16 | + | ||
17 | + try { | ||
18 | + // 关键修改 1: 确保所有图片加载完成 | ||
19 | + await waitForImages(container); | ||
20 | + | ||
21 | + // 关键修改 2: 强制触发布局计算 | ||
22 | + void container.offsetHeight; | ||
23 | + | ||
24 | + const canvas = await html2canvas(container, { | ||
25 | + scale: 2, | ||
26 | + useCORS: true, | ||
27 | + logging: true, | ||
28 | + scrollY: -window.scrollY, // 消除滚动偏移 | ||
29 | + windowWidth: container.scrollWidth, | ||
30 | + windowHeight: container.scrollHeight, | ||
31 | + }); | ||
32 | + | ||
33 | + const pdf = new jsPDF("p", "mm", "a4"); | ||
34 | + const pageWidth = pdf.internal.pageSize.getWidth(); | ||
35 | + const imgRatio = canvas.width / canvas.height; | ||
36 | + | ||
37 | + // 关键修改 3: 动态计算高度 | ||
38 | + const imgHeight = (pageWidth * canvas.height) / canvas.width; | ||
39 | + pdf.addImage( | ||
40 | + canvas.toDataURL("image/png"), | ||
41 | + "PNG", | ||
42 | + 0, | ||
43 | + 0, | ||
44 | + pageWidth, | ||
45 | + imgHeight, | ||
46 | + ); | ||
47 | + | ||
48 | + // 关键修改 4: 处理多页内容 | ||
49 | + if (imgHeight > pdf.internal.pageSize.getHeight()) { | ||
50 | + pdf.addPage(); | ||
51 | + pdf.addImage( | ||
52 | + canvas.toDataURL("image/png"), | ||
53 | + "PNG", | ||
54 | + 0, | ||
55 | + -pdf.internal.pageSize.getHeight(), | ||
56 | + pageWidth, | ||
57 | + imgHeight, | ||
58 | + ); | ||
59 | + } | ||
60 | + | ||
61 | + pdf.save("document.pdf"); | ||
62 | + } catch (error) { | ||
63 | + console.error("生成失败:", error); | ||
64 | + } finally { | ||
65 | + document.body.removeChild(container); | ||
66 | + } | ||
67 | +} | ||
68 | + | ||
69 | +// 图片加载等待函数 | ||
70 | +const waitForImages = (element: HTMLElement) => { | ||
71 | + return new Promise<void>((resolve) => { | ||
72 | + const images = element.getElementsByTagName("img"); | ||
73 | + let loaded = 0; | ||
74 | + | ||
75 | + const checkDone = () => { | ||
76 | + if (loaded >= images.length) resolve(); | ||
77 | + }; | ||
78 | + | ||
79 | + if (images.length === 0) return resolve(); | ||
80 | + | ||
81 | + Array.from(images).forEach((img) => { | ||
82 | + if (img.complete) { | ||
83 | + loaded++; | ||
84 | + checkDone(); | ||
85 | + } else { | ||
86 | + img.onload = () => { | ||
87 | + loaded++; | ||
88 | + checkDone(); | ||
89 | + }; | ||
90 | + img.onerror = checkDone; | ||
91 | + } | ||
92 | + }); | ||
93 | + }); | ||
94 | +}; | ||
95 | + | ||
96 | +export function htmlToPdf(htmlCode: string) { | ||
97 | + // 1. 动态创建一个 div 元素,并配置为隐藏(display: none) | ||
98 | + const container = document.createElement("div"); | ||
99 | + container.innerHTML = htmlCode; | ||
100 | + container.style.display = "none"; | ||
101 | + document.body.appendChild(container); | ||
102 | + // 2. 为了让 html2canvas 能捕获内容,将 display 修改为 block,并移至视野之外 | ||
103 | + container.style.display = "block"; | ||
104 | + container.style.position = "absolute"; | ||
105 | + container.style.top = "-9999px"; | ||
106 | + container.style.left = "-9999px"; | ||
107 | + window.pageYOffset = 0; | ||
108 | + document.documentElement.scrollTop = 0; | ||
109 | + document.body.scrollTop = 0; | ||
110 | + setTimeout(() => { | ||
111 | + html2canvas(container, { | ||
112 | + allowTaint: true, | ||
113 | + useCORS: true, | ||
114 | + scale: 2, // 提升画面质量,但是会增加文件大小 | ||
115 | + height: container.scrollHeight, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!! | ||
116 | + windowHeight: container.scrollHeight, | ||
117 | + }).then(function (canvas) { | ||
118 | + var contentWidth = canvas.width; | ||
119 | + var contentHeight = canvas.height; | ||
120 | + // console.log('contentWidth', contentWidth) | ||
121 | + // console.log('contentHeight', contentHeight) | ||
122 | + // 一页pdf显示html页面生成的canvas高度; | ||
123 | + var pageHeight = (contentWidth * 841.89) / 592.28; | ||
124 | + // 未生成pdf的html页面高度 | ||
125 | + var leftHeight = contentHeight; | ||
126 | + // console.log('pageHeight', pageHeight) | ||
127 | + // console.log('leftHeight', leftHeight) | ||
128 | + // 页面偏移 | ||
129 | + var position = 0; | ||
130 | + // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高 //40是左右页边距 | ||
131 | + var imgWidth = 595.28 - 40; | ||
132 | + var imgHeight = (592.28 / contentWidth) * contentHeight; | ||
133 | + var pageData = canvas.toDataURL("image/jpeg", 1.0); | ||
134 | + var pdf = new jsPDF("p", "pt", "a4"); | ||
135 | + // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89) | ||
136 | + // 当内容未超过pdf一页显示的范围,无需分页 | ||
137 | + if (leftHeight < pageHeight) { | ||
138 | + // console.log('没超过1页') | ||
139 | + pdf.addImage(pageData, "JPEG", 20, 20, imgWidth, imgHeight); | ||
140 | + } else { | ||
141 | + while (leftHeight > 0) { | ||
142 | + // console.log('超过1页') | ||
143 | + pdf.addImage(pageData, "JPEG", 20, position, imgWidth, imgHeight); | ||
144 | + leftHeight -= pageHeight; | ||
145 | + position -= 841.89; | ||
146 | + // 避免添加空白页 | ||
147 | + if (leftHeight > 0) { | ||
148 | + pdf.addPage(); | ||
149 | + } | ||
150 | + } | ||
151 | + } | ||
152 | + pdf.save("out.pdf"); | ||
153 | + }); | ||
154 | + }, 1000); | ||
155 | +} | ||
156 | + | ||
157 | +export async function getPdfData(file: File) { | ||
158 | + try { | ||
159 | + const arrayBuffer = await file.arrayBuffer(); | ||
160 | + const text = await pdfToText(new Uint8Array(arrayBuffer)); | ||
161 | + return text; | ||
162 | + } catch (error) { | ||
163 | + console.error("Error extracting PDF content:", error); | ||
164 | + throw error; | ||
165 | + } | ||
166 | +} |
1 | -import { Document, Packer, Paragraph, TextRun } from "docx"; | 1 | +import { Document, Packer, Paragraph } from "docx"; |
2 | import { saveAs } from "file-saver"; | 2 | import { saveAs } from "file-saver"; |
3 | -import * as cheerio from "cheerio"; | 3 | +import * as mammoth from "mammoth"; |
4 | 4 | ||
5 | export function exportWord(content: string) { | 5 | export function exportWord(content: string) { |
6 | - console.log(content) | ||
7 | - // 简单类型检测示例 | ||
8 | - const isHTML = (text: string): boolean => { | ||
9 | - return /<html[\s>]/.test(text) && | ||
10 | - /<\/html>/.test(text) && | ||
11 | - /<head>/.test(text) && | ||
12 | - /<body>/.test(text) | ||
13 | - } | ||
14 | - if (isHTML(content)) { | ||
15 | - exportHtmlToWord(content) | ||
16 | - } else { | ||
17 | - exportMarkdownToWord(content) | ||
18 | - } | 6 | + console.log(content); |
7 | + // 简单类型检测示例 | ||
8 | + const isHTML = (text: string): boolean => { | ||
9 | + return ( | ||
10 | + /<html[\s>]/.test(text) && | ||
11 | + /<\/html>/.test(text) && | ||
12 | + /<head>/.test(text) && | ||
13 | + /<body>/.test(text) | ||
14 | + ); | ||
15 | + }; | ||
16 | + if (isHTML(content)) { | ||
17 | + exportHtmlToWord(content); | ||
18 | + } else { | ||
19 | + exportMarkdownToWord(content); | ||
20 | + } | ||
19 | } | 21 | } |
20 | 22 | ||
21 | -function exportHtmlToWord(content: string) { | ||
22 | - console.log("-----------------------------------"+content) | ||
23 | - let cleanedContent = content.startsWith('```html') ? content.substring(8) : content; | ||
24 | - if (cleanedContent.endsWith('```')) { | ||
25 | - cleanedContent = cleanedContent.substring(0, cleanedContent.length - 4); | ||
26 | - } | ||
27 | - const blob = new Blob([cleanedContent], { type: 'application/msword' }); | ||
28 | - const url = URL.createObjectURL(blob); | ||
29 | - const a = document.createElement('a'); | ||
30 | - a.href = url; | ||
31 | - a.download = 'htmldemo.docx'; | ||
32 | - // 触发点击事件,开始下载 | ||
33 | - document.body.appendChild(a); | ||
34 | - a.click(); | ||
35 | - // 下载完成后移除临时链接元素 | ||
36 | - document.body.removeChild(a); | ||
37 | - // 释放 Blob URL 对象 | ||
38 | - URL.revokeObjectURL(url); | 23 | +export function exportHtmlToWord(content: string) { |
24 | + let cleanedContent = content.startsWith("```html") | ||
25 | + ? content.substring(8) | ||
26 | + : content; | ||
27 | + if (cleanedContent.endsWith("```")) { | ||
28 | + cleanedContent = cleanedContent.substring(0, cleanedContent.length - 4); | ||
29 | + } | ||
30 | + const blob = new Blob([cleanedContent], { type: "application/msword" }); | ||
31 | + const url = URL.createObjectURL(blob); | ||
32 | + const a = document.createElement("a"); | ||
33 | + a.href = url; | ||
34 | + a.download = "htmldemo.docx"; | ||
35 | + // 触发点击事件,开始下载 | ||
36 | + document.body.appendChild(a); | ||
37 | + a.click(); | ||
38 | + // 下载完成后移除临时链接元素 | ||
39 | + document.body.removeChild(a); | ||
40 | + // 释放 Blob URL 对象 | ||
41 | + URL.revokeObjectURL(url); | ||
39 | } | 42 | } |
40 | 43 | ||
41 | function exportMarkdownToWord(content: string) { | 44 | function exportMarkdownToWord(content: string) { |
42 | - // 按换行符拆分内容 | ||
43 | - const lines = content.split(/\r?\n/); | ||
44 | - const paragraphs: Paragraph[] = []; | ||
45 | - for (const line of lines) { | ||
46 | - // 去除 Markdown 标记(#、*等) | ||
47 | - const cleanedLine = line.replace(/^#+\s*/, "").replace(/^\*\*\s*|\*\s*/g, "").trim(); | ||
48 | - // 处理空行 | ||
49 | - if (cleanedLine === "") { | ||
50 | - paragraphs.push(new Paragraph("")); | ||
51 | - continue; | ||
52 | - } | ||
53 | - // 添加文本段落 | ||
54 | - paragraphs.push(new Paragraph(cleanedLine)); | 45 | + // 按换行符拆分内容 |
46 | + const lines = content.split(/\r?\n/); | ||
47 | + const paragraphs: Paragraph[] = []; | ||
48 | + for (const line of lines) { | ||
49 | + // 去除 Markdown 标记(#、*等) | ||
50 | + const cleanedLine = line | ||
51 | + .replace(/^#+\s*/, "") | ||
52 | + .replace(/^\*\*\s*|\*\s*/g, "") | ||
53 | + .trim(); | ||
54 | + // 处理空行 | ||
55 | + if (cleanedLine === "") { | ||
56 | + paragraphs.push(new Paragraph("")); | ||
57 | + continue; | ||
55 | } | 58 | } |
59 | + // 添加文本段落 | ||
60 | + paragraphs.push(new Paragraph(cleanedLine)); | ||
61 | + } | ||
56 | 62 | ||
57 | - // 创建 Word 文档对象 | ||
58 | - const doc = new Document({ | ||
59 | - sections: [{ | ||
60 | - children: paragraphs, | ||
61 | - }], | 63 | + // 创建 Word 文档对象 |
64 | + const doc = new Document({ | ||
65 | + sections: [ | ||
66 | + { | ||
67 | + children: paragraphs, | ||
68 | + }, | ||
69 | + ], | ||
70 | + }); | ||
71 | + | ||
72 | + // 转换为 Blob 并下载 | ||
73 | + Packer.toBlob(doc) | ||
74 | + .then((blob) => { | ||
75 | + saveAs(blob, "demo.docx"); | ||
76 | + }) | ||
77 | + .catch((error) => { | ||
78 | + console.error("导出 Word 失败:", error); | ||
62 | }); | 79 | }); |
80 | +} | ||
63 | 81 | ||
64 | - // 转换为 Blob 并下载 | ||
65 | - Packer.toBlob(doc) | ||
66 | - .then((blob) => { | ||
67 | - saveAs(blob, "demo.docx"); | ||
68 | - }) | ||
69 | - .catch((error) => { | ||
70 | - console.error("导出 Word 失败:", error); | ||
71 | - }); | 82 | +export async function getWordData(file: File) { |
83 | + try { | ||
84 | + const arrayBuffer = await file.arrayBuffer(); | ||
85 | + const { value, messages } = await mammoth.extractRawText({ arrayBuffer }); | ||
86 | + return value; | ||
87 | + } catch (error) { | ||
88 | + console.error("Error extracting Word content:", error); | ||
89 | + throw error; | ||
90 | + } | ||
72 | } | 91 | } |
1 | import type { writePromptParam } from "@/app/types/prompt"; | 1 | import type { writePromptParam } from "@/app/types/prompt"; |
2 | 2 | ||
3 | -export function getWrtingPrompt(param: writePromptParam) { | ||
4 | - let writingPurposeName; | ||
5 | - switch (param.writingPurposeName) { | ||
6 | - case "公司官网": | ||
7 | - writingPurposeName = "公司官网的介绍"; | ||
8 | - break; | ||
9 | - case "小红书": | ||
10 | - writingPurposeName = "小红书的介绍"; | ||
11 | - break; | ||
12 | - case "微信": | ||
13 | - writingPurposeName = "微信的介绍"; | ||
14 | - break; | ||
15 | - case "公众号": | ||
16 | - writingPurposeName = "公众号的介绍"; | ||
17 | - break; | ||
18 | - case "今日头条": | ||
19 | - writingPurposeName = "今日头条的介绍"; | ||
20 | - break; | ||
21 | - } | ||
22 | - const isImg = `文案要配上图片,实现图文混排,要美观,要符合${writingPurposeName}的排版标准和写作风格,写作风格要${param.writingStyleName}, | 3 | +export function getWrtingPrompt(param: writePromptParam): string { |
4 | + const { | ||
5 | + isImgName, | ||
6 | + writingPurposeName: rawPurpose, | ||
7 | + writingStyleName: rawStyle, | ||
8 | + writingTypeName: rawType, | ||
9 | + writingLanguageName, | ||
10 | + prompt, | ||
11 | + writingCount, | ||
12 | + } = param; | ||
13 | + | ||
14 | + const purposeMap: Record<string, string> = { | ||
15 | + 公司官网: "公司官网的介绍", | ||
16 | + 小红书: "小红书的介绍", | ||
17 | + 微信: "微信的介绍", | ||
18 | + 公众号: "公众号的介绍", | ||
19 | + 今日头条: "今日头条的介绍", | ||
20 | + }; | ||
21 | + const styleMap: Record<string, string> = { | ||
22 | + 专业: "专业的风格", | ||
23 | + 活泼: "活泼的风格", | ||
24 | + 严谨: "严谨的风格", | ||
25 | + }; | ||
26 | + const typeMap: Record<string, string> = { | ||
27 | + 产品推广文案: "产品推广的文案", | ||
28 | + 品牌宣传文案: "品牌宣传的文案", | ||
29 | + 产品说明书: "产品的说明书", | ||
30 | + 产品介绍: "产品的介绍", | ||
31 | + }; | ||
32 | + | ||
33 | + let isImg = ""; | ||
34 | + if (isImgName === "是") { | ||
35 | + const purpose = purposeMap[rawPurpose] || "公司官网的介绍"; | ||
36 | + const style = styleMap[rawStyle] || "专业的风格"; | ||
37 | + | ||
38 | + isImg = `文案要配上图片,实现图文混排,要美观,要符合${purpose}的排版标准和写作风格,写作风格要${style}, | ||
23 | 你没有图片没关系,把图文混排的效果实现,并在你认为要插入图片的地方将图片的Prompt用英文输出给:,记得图片地址后面的?nologo=true一定不能去掉了, | 39 | 你没有图片没关系,把图文混排的效果实现,并在你认为要插入图片的地方将图片的Prompt用英文输出给:,记得图片地址后面的?nologo=true一定不能去掉了, |
24 | 因为这个语法可以自动按照提示生成并渲染图片。你可以帮我大幅提高生成图片质量和丰富程度,比如增加相机光圈、具体场景描述等内容,注意图片一定要用<img,否则在HTML下图片可能显示不了`; | 40 | 因为这个语法可以自动按照提示生成并渲染图片。你可以帮我大幅提高生成图片质量和丰富程度,比如增加相机光圈、具体场景描述等内容,注意图片一定要用<img,否则在HTML下图片可能显示不了`; |
41 | + } | ||
42 | + const writingTypeName = typeMap[rawType] || "产品推广文案"; | ||
25 | 43 | ||
26 | - const input = `帮我使用${param.writingLanguageName}写一篇主题是${ | ||
27 | - param.prompt | ||
28 | - }的${param.writingTypeName}, | ||
29 | - ${param.isImgName === "是" ? isImg : ""} | ||
30 | - ,字数要求不少于${ | ||
31 | - param.writingCount | ||
32 | - }字,字数不包括html代码和图片Prompt。输出成标准的html,直接给结果,不要做任何解释`; | 44 | + const input = `帮我使用${writingLanguageName}写一篇主题是${prompt}的${writingTypeName},${isImg},字数要求不少于${writingCount}字, |
45 | + 字数不包括html代码和图片Prompt。输出成标准的html并且样式必须为内联样式,直接给结果,不要做任何解释`; | ||
33 | return input; | 46 | return input; |
34 | } | 47 | } |
35 | 48 |
@@ -43,9 +43,12 @@ | @@ -43,9 +43,12 @@ | ||
43 | "fuse.js": "^7.0.0", | 43 | "fuse.js": "^7.0.0", |
44 | "heic2any": "^0.0.4", | 44 | "heic2any": "^0.0.4", |
45 | "html-to-image": "^1.11.11", | 45 | "html-to-image": "^1.11.11", |
46 | + "html2canvas": "^1.4.1", | ||
46 | "idb-keyval": "^6.2.1", | 47 | "idb-keyval": "^6.2.1", |
48 | + "jspdf": "^3.0.1", | ||
47 | "lodash-es": "^4.17.21", | 49 | "lodash-es": "^4.17.21", |
48 | "lucide-react": "^0.484.0", | 50 | "lucide-react": "^0.484.0", |
51 | + "mammoth": "^1.9.0", | ||
49 | "markdown-to-txt": "^2.0.1", | 52 | "markdown-to-txt": "^2.0.1", |
50 | "mermaid": "^10.6.1", | 53 | "mermaid": "^10.6.1", |
51 | "mind-elixir": "^4.5.0", | 54 | "mind-elixir": "^4.5.0", |
@@ -53,6 +56,7 @@ | @@ -53,6 +56,7 @@ | ||
53 | "next": "^14.1.1", | 56 | "next": "^14.1.1", |
54 | "node-fetch": "^3.3.1", | 57 | "node-fetch": "^3.3.1", |
55 | "openapi-client-axios": "^7.5.5", | 58 | "openapi-client-axios": "^7.5.5", |
59 | + "pdf-ts": "^0.0.2", | ||
56 | "rc-tooltip": "^6.4.0", | 60 | "rc-tooltip": "^6.4.0", |
57 | "react": "^18.2.0", | 61 | "react": "^18.2.0", |
58 | "react-dom": "^18.2.0", | 62 | "react-dom": "^18.2.0", |
@@ -1271,6 +1271,13 @@ | @@ -1271,6 +1271,13 @@ | ||
1271 | dependencies: | 1271 | dependencies: |
1272 | regenerator-runtime "^0.14.0" | 1272 | regenerator-runtime "^0.14.0" |
1273 | 1273 | ||
1274 | +"@babel/runtime@^7.26.7": | ||
1275 | + version "7.27.0" | ||
1276 | + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" | ||
1277 | + integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== | ||
1278 | + dependencies: | ||
1279 | + regenerator-runtime "^0.14.0" | ||
1280 | + | ||
1274 | "@babel/template@^7.18.10", "@babel/template@^7.20.7": | 1281 | "@babel/template@^7.18.10", "@babel/template@^7.20.7": |
1275 | version "7.20.7" | 1282 | version "7.20.7" |
1276 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" | 1283 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" |
@@ -2626,6 +2633,11 @@ | @@ -2626,6 +2633,11 @@ | ||
2626 | dependencies: | 2633 | dependencies: |
2627 | parchment "^1.1.2" | 2634 | parchment "^1.1.2" |
2628 | 2635 | ||
2636 | +"@types/raf@^3.4.0": | ||
2637 | + version "3.4.3" | ||
2638 | + resolved "https://registry.npmmirror.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" | ||
2639 | + integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== | ||
2640 | + | ||
2629 | "@types/react-dom@^18.2.7": | 2641 | "@types/react-dom@^18.2.7": |
2630 | version "18.2.7" | 2642 | version "18.2.7" |
2631 | resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" | 2643 | resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" |
@@ -2669,6 +2681,11 @@ | @@ -2669,6 +2681,11 @@ | ||
2669 | resolved "https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" | 2681 | resolved "https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" |
2670 | integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== | 2682 | integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== |
2671 | 2683 | ||
2684 | +"@types/trusted-types@^2.0.7": | ||
2685 | + version "2.0.7" | ||
2686 | + resolved "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" | ||
2687 | + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== | ||
2688 | + | ||
2672 | "@types/unist@*", "@types/unist@^2.0.0": | 2689 | "@types/unist@*", "@types/unist@^2.0.0": |
2673 | version "2.0.6" | 2690 | version "2.0.6" |
2674 | resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" | 2691 | resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" |
@@ -2898,6 +2915,11 @@ | @@ -2898,6 +2915,11 @@ | ||
2898 | "@webassemblyjs/wast-parser" "1.9.0" | 2915 | "@webassemblyjs/wast-parser" "1.9.0" |
2899 | "@xtuc/long" "4.2.2" | 2916 | "@xtuc/long" "4.2.2" |
2900 | 2917 | ||
2918 | +"@xmldom/xmldom@^0.8.6": | ||
2919 | + version "0.8.10" | ||
2920 | + resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" | ||
2921 | + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== | ||
2922 | + | ||
2901 | "@xmldom/xmldom@^0.9.7": | 2923 | "@xmldom/xmldom@^0.9.7": |
2902 | version "0.9.8" | 2924 | version "0.9.8" |
2903 | resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.9.8.tgz" | 2925 | resolved "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.9.8.tgz" |
@@ -2985,12 +3007,12 @@ aggregate-error@^3.0.0: | @@ -2985,12 +3007,12 @@ aggregate-error@^3.0.0: | ||
2985 | clean-stack "^2.0.0" | 3007 | clean-stack "^2.0.0" |
2986 | indent-string "^4.0.0" | 3008 | indent-string "^4.0.0" |
2987 | 3009 | ||
2988 | -ajv-keywords@^3.5.2: | 3010 | +ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: |
2989 | version "3.5.2" | 3011 | version "3.5.2" |
2990 | resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" | 3012 | resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" |
2991 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== | 3013 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== |
2992 | 3014 | ||
2993 | -ajv@^6.12.4, ajv@^6.12.5: | 3015 | +ajv@^6.1.0, ajv@^6.12.4, ajv@^6.12.5: |
2994 | version "6.12.6" | 3016 | version "6.12.6" |
2995 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" | 3017 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" |
2996 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== | 3018 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== |
@@ -3109,7 +3131,7 @@ arg@^4.1.0: | @@ -3109,7 +3131,7 @@ arg@^4.1.0: | ||
3109 | resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz" | 3131 | resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz" |
3110 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== | 3132 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== |
3111 | 3133 | ||
3112 | -argparse@^1.0.7: | 3134 | +argparse@^1.0.7, argparse@~1.0.3: |
3113 | version "1.0.10" | 3135 | version "1.0.10" |
3114 | resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz" | 3136 | resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz" |
3115 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== | 3137 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== |
@@ -3198,6 +3220,11 @@ asynckit@^0.4.0: | @@ -3198,6 +3220,11 @@ asynckit@^0.4.0: | ||
3198 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" | 3220 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" |
3199 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== | 3221 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== |
3200 | 3222 | ||
3223 | +atob@^2.1.2: | ||
3224 | + version "2.1.2" | ||
3225 | + resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" | ||
3226 | + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== | ||
3227 | + | ||
3201 | available-typed-arrays@^1.0.5: | 3228 | available-typed-arrays@^1.0.5: |
3202 | version "1.0.5" | 3229 | version "1.0.5" |
3203 | resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" | 3230 | resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" |
@@ -3318,16 +3345,36 @@ balanced-match@^1.0.0: | @@ -3318,16 +3345,36 @@ balanced-match@^1.0.0: | ||
3318 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" | 3345 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" |
3319 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== | 3346 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== |
3320 | 3347 | ||
3348 | +base64-arraybuffer@^1.0.2: | ||
3349 | + version "1.0.2" | ||
3350 | + resolved "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" | ||
3351 | + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== | ||
3352 | + | ||
3353 | +base64-js@^1.5.1: | ||
3354 | + version "1.5.1" | ||
3355 | + resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" | ||
3356 | + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== | ||
3357 | + | ||
3321 | bath-es5@^3.0.3: | 3358 | bath-es5@^3.0.3: |
3322 | version "3.0.3" | 3359 | version "3.0.3" |
3323 | resolved "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz" | 3360 | resolved "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz" |
3324 | integrity sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg== | 3361 | integrity sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg== |
3325 | 3362 | ||
3363 | +big.js@^5.2.2: | ||
3364 | + version "5.2.2" | ||
3365 | + resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" | ||
3366 | + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== | ||
3367 | + | ||
3326 | binary-extensions@^2.0.0: | 3368 | binary-extensions@^2.0.0: |
3327 | version "2.2.0" | 3369 | version "2.2.0" |
3328 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" | 3370 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" |
3329 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== | 3371 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== |
3330 | 3372 | ||
3373 | +bluebird@~3.4.0: | ||
3374 | + version "3.4.7" | ||
3375 | + resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" | ||
3376 | + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== | ||
3377 | + | ||
3331 | boolbase@^1.0.0: | 3378 | boolbase@^1.0.0: |
3332 | version "1.0.0" | 3379 | version "1.0.0" |
3333 | resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" | 3380 | resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" |
@@ -3365,6 +3412,11 @@ bser@2.1.1: | @@ -3365,6 +3412,11 @@ bser@2.1.1: | ||
3365 | dependencies: | 3412 | dependencies: |
3366 | node-int64 "^0.4.0" | 3413 | node-int64 "^0.4.0" |
3367 | 3414 | ||
3415 | +btoa@^1.2.1: | ||
3416 | + version "1.2.1" | ||
3417 | + resolved "https://registry.npmmirror.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" | ||
3418 | + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== | ||
3419 | + | ||
3368 | buffer-from@^1.0.0: | 3420 | buffer-from@^1.0.0: |
3369 | version "1.1.2" | 3421 | version "1.1.2" |
3370 | resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" | 3422 | resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" |
@@ -3444,6 +3496,20 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001688: | @@ -3444,6 +3496,20 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001688: | ||
3444 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz" | 3496 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz" |
3445 | integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== | 3497 | integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== |
3446 | 3498 | ||
3499 | +canvg@^3.0.11: | ||
3500 | + version "3.0.11" | ||
3501 | + resolved "https://registry.npmmirror.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b" | ||
3502 | + integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA== | ||
3503 | + dependencies: | ||
3504 | + "@babel/runtime" "^7.12.5" | ||
3505 | + "@types/raf" "^3.4.0" | ||
3506 | + core-js "^3.8.3" | ||
3507 | + raf "^3.4.1" | ||
3508 | + regenerator-runtime "^0.13.7" | ||
3509 | + rgbcolor "^1.0.1" | ||
3510 | + stackblur-canvas "^2.0.0" | ||
3511 | + svg-pathdata "^6.0.3" | ||
3512 | + | ||
3447 | ccount@^2.0.0: | 3513 | ccount@^2.0.0: |
3448 | version "2.0.1" | 3514 | version "2.0.1" |
3449 | resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" | 3515 | resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" |
@@ -3758,6 +3824,11 @@ core-js-compat@^3.25.1: | @@ -3758,6 +3824,11 @@ core-js-compat@^3.25.1: | ||
3758 | dependencies: | 3824 | dependencies: |
3759 | browserslist "^4.21.5" | 3825 | browserslist "^4.21.5" |
3760 | 3826 | ||
3827 | +core-js@^3.6.0, core-js@^3.8.3: | ||
3828 | + version "3.41.0" | ||
3829 | + resolved "https://registry.npmmirror.com/core-js/-/core-js-3.41.0.tgz#57714dafb8c751a6095d028a7428f1fb5834a776" | ||
3830 | + integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA== | ||
3831 | + | ||
3761 | core-util-is@~1.0.0: | 3832 | core-util-is@~1.0.0: |
3762 | version "1.0.3" | 3833 | version "1.0.3" |
3763 | resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz" | 3834 | resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz" |
@@ -3834,6 +3905,13 @@ css-box-model@^1.2.1: | @@ -3834,6 +3905,13 @@ css-box-model@^1.2.1: | ||
3834 | dependencies: | 3905 | dependencies: |
3835 | tiny-invariant "^1.0.6" | 3906 | tiny-invariant "^1.0.6" |
3836 | 3907 | ||
3908 | +css-line-break@^2.1.0: | ||
3909 | + version "2.1.0" | ||
3910 | + resolved "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" | ||
3911 | + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== | ||
3912 | + dependencies: | ||
3913 | + utrie "^1.0.2" | ||
3914 | + | ||
3837 | css-select@^4.1.3: | 3915 | css-select@^4.1.3: |
3838 | version "4.3.0" | 3916 | version "4.3.0" |
3839 | resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" | 3917 | resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" |
@@ -4388,6 +4466,11 @@ diff@^5.0.0: | @@ -4388,6 +4466,11 @@ diff@^5.0.0: | ||
4388 | resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" | 4466 | resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" |
4389 | integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== | 4467 | integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== |
4390 | 4468 | ||
4469 | +dingbat-to-unicode@^1.0.1: | ||
4470 | + version "1.0.1" | ||
4471 | + resolved "https://registry.npmmirror.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" | ||
4472 | + integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w== | ||
4473 | + | ||
4391 | dir-glob@^3.0.1: | 4474 | dir-glob@^3.0.1: |
4392 | version "3.0.1" | 4475 | version "3.0.1" |
4393 | resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" | 4476 | resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" |
@@ -4487,6 +4570,13 @@ dompurify@^3.0.5: | @@ -4487,6 +4570,13 @@ dompurify@^3.0.5: | ||
4487 | resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz" | 4570 | resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz" |
4488 | integrity sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A== | 4571 | integrity sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A== |
4489 | 4572 | ||
4573 | +dompurify@^3.2.4: | ||
4574 | + version "3.2.4" | ||
4575 | + resolved "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.4.tgz#af5a5a11407524431456cf18836c55d13441cd8e" | ||
4576 | + integrity sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg== | ||
4577 | + optionalDependencies: | ||
4578 | + "@types/trusted-types" "^2.0.7" | ||
4579 | + | ||
4490 | domutils@^2.8.0: | 4580 | domutils@^2.8.0: |
4491 | version "2.8.0" | 4581 | version "2.8.0" |
4492 | resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" | 4582 | resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" |
@@ -4505,6 +4595,13 @@ domutils@^3.0.1, domutils@^3.1.0: | @@ -4505,6 +4595,13 @@ domutils@^3.0.1, domutils@^3.1.0: | ||
4505 | domelementtype "^2.3.0" | 4595 | domelementtype "^2.3.0" |
4506 | domhandler "^5.0.3" | 4596 | domhandler "^5.0.3" |
4507 | 4597 | ||
4598 | +duck@^0.1.12: | ||
4599 | + version "0.1.12" | ||
4600 | + resolved "https://registry.npmmirror.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa" | ||
4601 | + integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg== | ||
4602 | + dependencies: | ||
4603 | + underscore "^1.13.1" | ||
4604 | + | ||
4508 | dunder-proto@^1.0.1: | 4605 | dunder-proto@^1.0.1: |
4509 | version "1.0.1" | 4606 | version "1.0.1" |
4510 | resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz" | 4607 | resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz" |
@@ -4559,6 +4656,11 @@ emoji-regex@^9.2.2: | @@ -4559,6 +4656,11 @@ emoji-regex@^9.2.2: | ||
4559 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" | 4656 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" |
4560 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== | 4657 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== |
4561 | 4658 | ||
4659 | +emojis-list@^3.0.0: | ||
4660 | + version "3.0.0" | ||
4661 | + resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" | ||
4662 | + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== | ||
4663 | + | ||
4562 | encoding-sniffer@^0.2.0: | 4664 | encoding-sniffer@^0.2.0: |
4563 | version "0.2.0" | 4665 | version "0.2.0" |
4564 | resolved "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz" | 4666 | resolved "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz" |
@@ -5132,6 +5234,11 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: | @@ -5132,6 +5234,11 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: | ||
5132 | node-domexception "^1.0.0" | 5234 | node-domexception "^1.0.0" |
5133 | web-streams-polyfill "^3.0.3" | 5235 | web-streams-polyfill "^3.0.3" |
5134 | 5236 | ||
5237 | +fflate@^0.8.1: | ||
5238 | + version "0.8.2" | ||
5239 | + resolved "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" | ||
5240 | + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== | ||
5241 | + | ||
5135 | file-entry-cache@^6.0.1: | 5242 | file-entry-cache@^6.0.1: |
5136 | version "6.0.1" | 5243 | version "6.0.1" |
5137 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" | 5244 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" |
@@ -5626,6 +5733,14 @@ html-to-image@^1.11.11: | @@ -5626,6 +5733,14 @@ html-to-image@^1.11.11: | ||
5626 | resolved "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz" | 5733 | resolved "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz" |
5627 | integrity sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA== | 5734 | integrity sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA== |
5628 | 5735 | ||
5736 | +html2canvas@^1.0.0-rc.5, html2canvas@^1.4.1: | ||
5737 | + version "1.4.1" | ||
5738 | + resolved "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" | ||
5739 | + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== | ||
5740 | + dependencies: | ||
5741 | + css-line-break "^2.1.0" | ||
5742 | + text-segmentation "^1.0.3" | ||
5743 | + | ||
5629 | htmlparser2@^9.1.0: | 5744 | htmlparser2@^9.1.0: |
5630 | version "9.1.0" | 5745 | version "9.1.0" |
5631 | resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz" | 5746 | resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz" |
@@ -6531,7 +6646,7 @@ json2mq@^0.2.0: | @@ -6531,7 +6646,7 @@ json2mq@^0.2.0: | ||
6531 | dependencies: | 6646 | dependencies: |
6532 | string-convert "^0.2.0" | 6647 | string-convert "^0.2.0" |
6533 | 6648 | ||
6534 | -json5@^1.0.2: | 6649 | +json5@^1.0.1, json5@^1.0.2: |
6535 | version "1.0.2" | 6650 | version "1.0.2" |
6536 | resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" | 6651 | resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" |
6537 | integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== | 6652 | integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== |
@@ -6543,6 +6658,21 @@ json5@^2.2.2, json5@^2.2.3: | @@ -6543,6 +6658,21 @@ json5@^2.2.2, json5@^2.2.3: | ||
6543 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" | 6658 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" |
6544 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== | 6659 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== |
6545 | 6660 | ||
6661 | +jspdf@^3.0.1: | ||
6662 | + version "3.0.1" | ||
6663 | + resolved "https://registry.npmmirror.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" | ||
6664 | + integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg== | ||
6665 | + dependencies: | ||
6666 | + "@babel/runtime" "^7.26.7" | ||
6667 | + atob "^2.1.2" | ||
6668 | + btoa "^1.2.1" | ||
6669 | + fflate "^0.8.1" | ||
6670 | + optionalDependencies: | ||
6671 | + canvg "^3.0.11" | ||
6672 | + core-js "^3.6.0" | ||
6673 | + dompurify "^3.2.4" | ||
6674 | + html2canvas "^1.0.0-rc.5" | ||
6675 | + | ||
6546 | "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: | 6676 | "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: |
6547 | version "3.3.3" | 6677 | version "3.3.3" |
6548 | resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" | 6678 | resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" |
@@ -6551,7 +6681,7 @@ json5@^2.2.2, json5@^2.2.3: | @@ -6551,7 +6681,7 @@ json5@^2.2.2, json5@^2.2.3: | ||
6551 | array-includes "^3.1.5" | 6681 | array-includes "^3.1.5" |
6552 | object.assign "^4.1.3" | 6682 | object.assign "^4.1.3" |
6553 | 6683 | ||
6554 | -jszip@*, jszip@^3.10.1: | 6684 | +jszip@*, jszip@^3.10.1, jszip@^3.7.1: |
6555 | version "3.10.1" | 6685 | version "3.10.1" |
6556 | resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz" | 6686 | resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz" |
6557 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== | 6687 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== |
@@ -6680,6 +6810,15 @@ loader-runner@^4.1.0: | @@ -6680,6 +6810,15 @@ loader-runner@^4.1.0: | ||
6680 | resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" | 6810 | resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" |
6681 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== | 6811 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== |
6682 | 6812 | ||
6813 | +loader-utils@^1.0.0: | ||
6814 | + version "1.4.2" | ||
6815 | + resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" | ||
6816 | + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== | ||
6817 | + dependencies: | ||
6818 | + big.js "^5.2.2" | ||
6819 | + emojis-list "^3.0.0" | ||
6820 | + json5 "^1.0.1" | ||
6821 | + | ||
6683 | locate-path@^5.0.0: | 6822 | locate-path@^5.0.0: |
6684 | version "5.0.0" | 6823 | version "5.0.0" |
6685 | resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" | 6824 | resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" |
@@ -6746,6 +6885,15 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: | @@ -6746,6 +6885,15 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: | ||
6746 | dependencies: | 6885 | dependencies: |
6747 | js-tokens "^3.0.0 || ^4.0.0" | 6886 | js-tokens "^3.0.0 || ^4.0.0" |
6748 | 6887 | ||
6888 | +lop@^0.4.2: | ||
6889 | + version "0.4.2" | ||
6890 | + resolved "https://registry.npmmirror.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640" | ||
6891 | + integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw== | ||
6892 | + dependencies: | ||
6893 | + duck "^0.1.12" | ||
6894 | + option "~0.2.1" | ||
6895 | + underscore "^1.13.1" | ||
6896 | + | ||
6749 | lowlight@^2.0.0: | 6897 | lowlight@^2.0.0: |
6750 | version "2.8.1" | 6898 | version "2.8.1" |
6751 | resolved "https://registry.npmjs.org/lowlight/-/lowlight-2.8.1.tgz" | 6899 | resolved "https://registry.npmjs.org/lowlight/-/lowlight-2.8.1.tgz" |
@@ -6805,6 +6953,22 @@ makeerror@1.0.12: | @@ -6805,6 +6953,22 @@ makeerror@1.0.12: | ||
6805 | dependencies: | 6953 | dependencies: |
6806 | tmpl "1.0.5" | 6954 | tmpl "1.0.5" |
6807 | 6955 | ||
6956 | +mammoth@^1.9.0: | ||
6957 | + version "1.9.0" | ||
6958 | + resolved "https://registry.npmmirror.com/mammoth/-/mammoth-1.9.0.tgz#71e34ca280735275788bfe95e653a058dcab4df2" | ||
6959 | + integrity sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg== | ||
6960 | + dependencies: | ||
6961 | + "@xmldom/xmldom" "^0.8.6" | ||
6962 | + argparse "~1.0.3" | ||
6963 | + base64-js "^1.5.1" | ||
6964 | + bluebird "~3.4.0" | ||
6965 | + dingbat-to-unicode "^1.0.1" | ||
6966 | + jszip "^3.7.1" | ||
6967 | + lop "^0.4.2" | ||
6968 | + path-is-absolute "^1.0.0" | ||
6969 | + underscore "^1.13.1" | ||
6970 | + xmlbuilder "^10.0.0" | ||
6971 | + | ||
6808 | markdown-table@^3.0.0: | 6972 | markdown-table@^3.0.0: |
6809 | version "3.0.3" | 6973 | version "3.0.3" |
6810 | resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" | 6974 | resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" |
@@ -7481,6 +7645,11 @@ node-domexception@^1.0.0: | @@ -7481,6 +7645,11 @@ node-domexception@^1.0.0: | ||
7481 | resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" | 7645 | resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" |
7482 | integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== | 7646 | integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== |
7483 | 7647 | ||
7648 | +node-ensure@^0.0.0: | ||
7649 | + version "0.0.0" | ||
7650 | + resolved "https://registry.npmmirror.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" | ||
7651 | + integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== | ||
7652 | + | ||
7484 | node-fetch@^3.3.1: | 7653 | node-fetch@^3.3.1: |
7485 | version "3.3.1" | 7654 | version "3.3.1" |
7486 | resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz" | 7655 | resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz" |
@@ -7639,6 +7808,11 @@ openapi-types@^12.1.3: | @@ -7639,6 +7808,11 @@ openapi-types@^12.1.3: | ||
7639 | resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" | 7808 | resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" |
7640 | integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== | 7809 | integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== |
7641 | 7810 | ||
7811 | +option@~0.2.1: | ||
7812 | + version "0.2.4" | ||
7813 | + resolved "https://registry.npmmirror.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" | ||
7814 | + integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== | ||
7815 | + | ||
7642 | optionator@^0.9.3: | 7816 | optionator@^0.9.3: |
7643 | version "0.9.3" | 7817 | version "0.9.3" |
7644 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" | 7818 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" |
@@ -7770,6 +7944,26 @@ path-type@^4.0.0: | @@ -7770,6 +7944,26 @@ path-type@^4.0.0: | ||
7770 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" | 7944 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" |
7771 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== | 7945 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== |
7772 | 7946 | ||
7947 | +pdf-ts@^0.0.2: | ||
7948 | + version "0.0.2" | ||
7949 | + resolved "https://registry.npmmirror.com/pdf-ts/-/pdf-ts-0.0.2.tgz#27fc7842f998fdd679ae1aa2b95e42b8e0736758" | ||
7950 | + integrity sha512-t9VmdLA+8dvX9t3XulCD1hIEWi0N94p2WpfTPwDcvYCW/NElaK+abHj4q5F4XhJcnxzm6dzlileyaH7qcIbnmQ== | ||
7951 | + dependencies: | ||
7952 | + pdfjs-dist "1.10.100" | ||
7953 | + | ||
7954 | +pdfjs-dist@1.10.100: | ||
7955 | + version "1.10.100" | ||
7956 | + resolved "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-1.10.100.tgz#d5a250b42482ab6e41d763a795ce7cdebe6b1894" | ||
7957 | + integrity sha512-aCfONGqlBeazYxik3rjd7xaoCKMRYECwZSCC3EC3weqibF2V1Bp/v9WZbF7Lyy5Q6UE4NqOYu126r7U+Le4Uhg== | ||
7958 | + dependencies: | ||
7959 | + node-ensure "^0.0.0" | ||
7960 | + worker-loader "^1.0.0" | ||
7961 | + | ||
7962 | +performance-now@^2.1.0: | ||
7963 | + version "2.1.0" | ||
7964 | + resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" | ||
7965 | + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== | ||
7966 | + | ||
7773 | picocolors@^1.0.0, picocolors@^1.1.1: | 7967 | picocolors@^1.0.0, picocolors@^1.1.1: |
7774 | version "1.1.1" | 7968 | version "1.1.1" |
7775 | resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz" | 7969 | resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz" |
@@ -7943,6 +8137,13 @@ raf-schd@^4.0.3: | @@ -7943,6 +8137,13 @@ raf-schd@^4.0.3: | ||
7943 | resolved "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz" | 8137 | resolved "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz" |
7944 | integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== | 8138 | integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== |
7945 | 8139 | ||
8140 | +raf@^3.4.1: | ||
8141 | + version "3.4.1" | ||
8142 | + resolved "https://registry.npmmirror.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" | ||
8143 | + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== | ||
8144 | + dependencies: | ||
8145 | + performance-now "^2.1.0" | ||
8146 | + | ||
7946 | randombytes@^2.1.0: | 8147 | randombytes@^2.1.0: |
7947 | version "2.1.0" | 8148 | version "2.1.0" |
7948 | resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" | 8149 | resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" |
@@ -8445,6 +8646,11 @@ regenerate@^1.4.2: | @@ -8445,6 +8646,11 @@ regenerate@^1.4.2: | ||
8445 | resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" | 8646 | resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" |
8446 | integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== | 8647 | integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== |
8447 | 8648 | ||
8649 | +regenerator-runtime@^0.13.7: | ||
8650 | + version "0.13.11" | ||
8651 | + resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" | ||
8652 | + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== | ||
8653 | + | ||
8448 | regenerator-runtime@^0.14.0: | 8654 | regenerator-runtime@^0.14.0: |
8449 | version "0.14.1" | 8655 | version "0.14.1" |
8450 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" | 8656 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" |
@@ -8646,6 +8852,11 @@ rfdc@^1.3.0: | @@ -8646,6 +8852,11 @@ rfdc@^1.3.0: | ||
8646 | resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" | 8852 | resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" |
8647 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== | 8853 | integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== |
8648 | 8854 | ||
8855 | +rgbcolor@^1.0.1: | ||
8856 | + version "1.0.1" | ||
8857 | + resolved "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" | ||
8858 | + integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== | ||
8859 | + | ||
8649 | rimraf@^3.0.2: | 8860 | rimraf@^3.0.2: |
8650 | version "3.0.2" | 8861 | version "3.0.2" |
8651 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" | 8862 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" |
@@ -8745,6 +8956,14 @@ scheduler@^0.23.0: | @@ -8745,6 +8956,14 @@ scheduler@^0.23.0: | ||
8745 | dependencies: | 8956 | dependencies: |
8746 | loose-envify "^1.1.0" | 8957 | loose-envify "^1.1.0" |
8747 | 8958 | ||
8959 | +schema-utils@^0.4.0: | ||
8960 | + version "0.4.7" | ||
8961 | + resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" | ||
8962 | + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== | ||
8963 | + dependencies: | ||
8964 | + ajv "^6.1.0" | ||
8965 | + ajv-keywords "^3.1.0" | ||
8966 | + | ||
8748 | schema-utils@^3.0.0: | 8967 | schema-utils@^3.0.0: |
8749 | version "3.3.0" | 8968 | version "3.3.0" |
8750 | resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" | 8969 | resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" |
@@ -8976,6 +9195,11 @@ stack-utils@^2.0.3: | @@ -8976,6 +9195,11 @@ stack-utils@^2.0.3: | ||
8976 | dependencies: | 9195 | dependencies: |
8977 | escape-string-regexp "^2.0.0" | 9196 | escape-string-regexp "^2.0.0" |
8978 | 9197 | ||
9198 | +stackblur-canvas@^2.0.0: | ||
9199 | + version "2.7.0" | ||
9200 | + resolved "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" | ||
9201 | + integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== | ||
9202 | + | ||
8979 | statuses@2.0.1: | 9203 | statuses@2.0.1: |
8980 | version "2.0.1" | 9204 | version "2.0.1" |
8981 | resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" | 9205 | resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" |
@@ -9173,6 +9397,11 @@ svg-parser@^2.0.4: | @@ -9173,6 +9397,11 @@ svg-parser@^2.0.4: | ||
9173 | resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" | 9397 | resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" |
9174 | integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== | 9398 | integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== |
9175 | 9399 | ||
9400 | +svg-pathdata@^6.0.3: | ||
9401 | + version "6.0.3" | ||
9402 | + resolved "https://registry.npmmirror.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" | ||
9403 | + integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== | ||
9404 | + | ||
9176 | svgo@^2.8.0: | 9405 | svgo@^2.8.0: |
9177 | version "2.8.0" | 9406 | version "2.8.0" |
9178 | resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" | 9407 | resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" |
@@ -9250,6 +9479,13 @@ test-exclude@^6.0.0: | @@ -9250,6 +9479,13 @@ test-exclude@^6.0.0: | ||
9250 | glob "^7.1.4" | 9479 | glob "^7.1.4" |
9251 | minimatch "^3.0.4" | 9480 | minimatch "^3.0.4" |
9252 | 9481 | ||
9482 | +text-segmentation@^1.0.3: | ||
9483 | + version "1.0.3" | ||
9484 | + resolved "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" | ||
9485 | + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== | ||
9486 | + dependencies: | ||
9487 | + utrie "^1.0.2" | ||
9488 | + | ||
9253 | text-table@^0.2.0: | 9489 | text-table@^0.2.0: |
9254 | version "0.2.0" | 9490 | version "0.2.0" |
9255 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" | 9491 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" |
@@ -9444,6 +9680,11 @@ unbox-primitive@^1.0.2: | @@ -9444,6 +9680,11 @@ unbox-primitive@^1.0.2: | ||
9444 | has-symbols "^1.0.3" | 9680 | has-symbols "^1.0.3" |
9445 | which-boxed-primitive "^1.0.2" | 9681 | which-boxed-primitive "^1.0.2" |
9446 | 9682 | ||
9683 | +underscore@^1.13.1: | ||
9684 | + version "1.13.7" | ||
9685 | + resolved "https://registry.npmmirror.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" | ||
9686 | + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== | ||
9687 | + | ||
9447 | undici-types@~6.19.2: | 9688 | undici-types@~6.19.2: |
9448 | version "6.19.8" | 9689 | version "6.19.8" |
9449 | resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz" | 9690 | resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz" |
@@ -9621,6 +9862,13 @@ util-deprecate@~1.0.1: | @@ -9621,6 +9862,13 @@ util-deprecate@~1.0.1: | ||
9621 | resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" | 9862 | resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" |
9622 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== | 9863 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== |
9623 | 9864 | ||
9865 | +utrie@^1.0.2: | ||
9866 | + version "1.0.2" | ||
9867 | + resolved "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" | ||
9868 | + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== | ||
9869 | + dependencies: | ||
9870 | + base64-arraybuffer "^1.0.2" | ||
9871 | + | ||
9624 | uuid@^9.0.0: | 9872 | uuid@^9.0.0: |
9625 | version "9.0.0" | 9873 | version "9.0.0" |
9626 | resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz" | 9874 | resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz" |
@@ -9854,6 +10102,14 @@ word@~0.3.0: | @@ -9854,6 +10102,14 @@ word@~0.3.0: | ||
9854 | resolved "https://registry.npmmirror.com/word/-/word-0.3.0.tgz" | 10102 | resolved "https://registry.npmmirror.com/word/-/word-0.3.0.tgz" |
9855 | integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== | 10103 | integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== |
9856 | 10104 | ||
10105 | +worker-loader@^1.0.0: | ||
10106 | + version "1.1.1" | ||
10107 | + resolved "https://registry.npmmirror.com/worker-loader/-/worker-loader-1.1.1.tgz#920d74ddac6816fc635392653ed8b4af1929fd92" | ||
10108 | + integrity sha512-qJZLVS/jMCBITDzPo/RuweYSIG8VJP5P67mP/71alGyTZRe1LYJFdwLjLalY3T5ifx0bMDRD3OB6P2p1escvlg== | ||
10109 | + dependencies: | ||
10110 | + loader-utils "^1.0.0" | ||
10111 | + schema-utils "^0.4.0" | ||
10112 | + | ||
9857 | wrap-ansi@^6.2.0: | 10113 | wrap-ansi@^6.2.0: |
9858 | version "6.2.0" | 10114 | version "6.2.0" |
9859 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" | 10115 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" |
@@ -9920,6 +10176,11 @@ xml@^1.0.1: | @@ -9920,6 +10176,11 @@ xml@^1.0.1: | ||
9920 | resolved "https://registry.npmmirror.com/xml/-/xml-1.0.1.tgz" | 10176 | resolved "https://registry.npmmirror.com/xml/-/xml-1.0.1.tgz" |
9921 | integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== | 10177 | integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== |
9922 | 10178 | ||
10179 | +xmlbuilder@^10.0.0: | ||
10180 | + version "10.1.1" | ||
10181 | + resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" | ||
10182 | + integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== | ||
10183 | + | ||
9923 | xmlchars@^2.2.0: | 10184 | xmlchars@^2.2.0: |
9924 | version "2.2.0" | 10185 | version "2.2.0" |
9925 | resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz" | 10186 | resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz" |
-
请 注册 或 登录 后发表评论