@files-preview-app/preview-file 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +299 -295
- package/THIRD_PARTY_LICENSES.md +7 -3
- package/dist/angular.cjs +825 -0
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.js +824 -0
- package/dist/angular.js.map +1 -1
- package/dist/index.cjs +808 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +804 -1
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +825 -0
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +4 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.js +824 -0
- package/dist/react.js.map +1 -1
- package/dist/vue.cjs +825 -0
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js +824 -0
- package/dist/vue.js.map +1 -1
- package/package.json +17 -4
package/dist/index.cjs
CHANGED
|
@@ -4,6 +4,13 @@ var DOMPurify = require('dompurify');
|
|
|
4
4
|
var docx = require('docx-preview');
|
|
5
5
|
var ExcelJS = require('exceljs');
|
|
6
6
|
var hljs = require('highlight.js');
|
|
7
|
+
var fflate = require('fflate');
|
|
8
|
+
var marked = require('marked');
|
|
9
|
+
var pptxBrowser = require('pptx-browser');
|
|
10
|
+
var THREE = require('three');
|
|
11
|
+
var STLLoader_js = require('three/examples/jsm/loaders/STLLoader.js');
|
|
12
|
+
var OBJLoader_js = require('three/examples/jsm/loaders/OBJLoader.js');
|
|
13
|
+
var OrbitControls_js = require('three/examples/jsm/controls/OrbitControls.js');
|
|
7
14
|
|
|
8
15
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
16
|
|
|
@@ -29,6 +36,7 @@ var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
|
|
|
29
36
|
var docx__namespace = /*#__PURE__*/_interopNamespace(docx);
|
|
30
37
|
var ExcelJS__default = /*#__PURE__*/_interopDefault(ExcelJS);
|
|
31
38
|
var hljs__default = /*#__PURE__*/_interopDefault(hljs);
|
|
39
|
+
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
32
40
|
|
|
33
41
|
// ../core/dist/index.js
|
|
34
42
|
var EventEmitter = class {
|
|
@@ -1802,6 +1810,798 @@ var CodePlugin = class {
|
|
|
1802
1810
|
function codePlugin() {
|
|
1803
1811
|
return new CodePlugin();
|
|
1804
1812
|
}
|
|
1813
|
+
var ArchivePlugin = class {
|
|
1814
|
+
id = "archive";
|
|
1815
|
+
name = "Archive Explorer";
|
|
1816
|
+
extensions = [".zip"];
|
|
1817
|
+
mimeTypes = ["application/zip", "application/x-zip-compressed"];
|
|
1818
|
+
weight = 70;
|
|
1819
|
+
supports(file) {
|
|
1820
|
+
const ext = file.metadata.extension?.toLowerCase();
|
|
1821
|
+
const mime = file.metadata.mimeType?.toLowerCase();
|
|
1822
|
+
return ext === ".zip" || this.mimeTypes.includes(mime || "");
|
|
1823
|
+
}
|
|
1824
|
+
getToolbarActions(instance) {
|
|
1825
|
+
return [
|
|
1826
|
+
{
|
|
1827
|
+
id: "zoom-out",
|
|
1828
|
+
icon: "zoom-out",
|
|
1829
|
+
label: "Zoom Out",
|
|
1830
|
+
type: "button",
|
|
1831
|
+
group: "zoom",
|
|
1832
|
+
execute: () => instance.zoomOut?.()
|
|
1833
|
+
},
|
|
1834
|
+
{
|
|
1835
|
+
id: "zoom-in",
|
|
1836
|
+
icon: "zoom-in",
|
|
1837
|
+
label: "Zoom In",
|
|
1838
|
+
type: "button",
|
|
1839
|
+
group: "zoom",
|
|
1840
|
+
execute: () => instance.zoomIn?.()
|
|
1841
|
+
},
|
|
1842
|
+
{
|
|
1843
|
+
id: "fit-page",
|
|
1844
|
+
icon: "fit-page",
|
|
1845
|
+
label: "Reset Zoom",
|
|
1846
|
+
type: "button",
|
|
1847
|
+
group: "zoom",
|
|
1848
|
+
execute: () => instance.fitToPage?.()
|
|
1849
|
+
},
|
|
1850
|
+
{
|
|
1851
|
+
id: "download",
|
|
1852
|
+
icon: "download",
|
|
1853
|
+
label: "Download Archive",
|
|
1854
|
+
type: "button",
|
|
1855
|
+
group: "actions",
|
|
1856
|
+
execute: () => instance.download?.()
|
|
1857
|
+
},
|
|
1858
|
+
{
|
|
1859
|
+
id: "print",
|
|
1860
|
+
icon: "print",
|
|
1861
|
+
label: "Print File List",
|
|
1862
|
+
type: "button",
|
|
1863
|
+
group: "actions",
|
|
1864
|
+
execute: () => instance.print?.()
|
|
1865
|
+
}
|
|
1866
|
+
];
|
|
1867
|
+
}
|
|
1868
|
+
async render(ctx) {
|
|
1869
|
+
const wrapper = document.createElement("div");
|
|
1870
|
+
wrapper.className = "fp-archive-wrapper";
|
|
1871
|
+
wrapper.style.cssText = `
|
|
1872
|
+
width: 100%;
|
|
1873
|
+
height: 100%;
|
|
1874
|
+
overflow: auto;
|
|
1875
|
+
padding: 24px;
|
|
1876
|
+
box-sizing: border-box;
|
|
1877
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
1878
|
+
transform-origin: top left;
|
|
1879
|
+
transition: transform 0.2s ease;
|
|
1880
|
+
`;
|
|
1881
|
+
ctx.container.innerHTML = "";
|
|
1882
|
+
ctx.container.style.overflow = "auto";
|
|
1883
|
+
ctx.container.appendChild(wrapper);
|
|
1884
|
+
let scale = 1;
|
|
1885
|
+
const entries = await new Promise((resolve, reject) => {
|
|
1886
|
+
fflate.unzip(new Uint8Array(ctx.buffer), (err, unzipped) => {
|
|
1887
|
+
if (err) {
|
|
1888
|
+
reject(err);
|
|
1889
|
+
return;
|
|
1890
|
+
}
|
|
1891
|
+
const list = Object.entries(unzipped).map(([path, data]) => {
|
|
1892
|
+
const isDir = path.endsWith("/");
|
|
1893
|
+
const parts = path.split("/").filter(Boolean);
|
|
1894
|
+
const name = parts[parts.length - 1] || path;
|
|
1895
|
+
return {
|
|
1896
|
+
path,
|
|
1897
|
+
name,
|
|
1898
|
+
isDir,
|
|
1899
|
+
size: data.length,
|
|
1900
|
+
data
|
|
1901
|
+
};
|
|
1902
|
+
});
|
|
1903
|
+
resolve(list);
|
|
1904
|
+
});
|
|
1905
|
+
});
|
|
1906
|
+
const totalUncompressedSize = entries.reduce((acc, e) => acc + e.size, 0);
|
|
1907
|
+
const renderUI = (filteredEntries) => {
|
|
1908
|
+
wrapper.innerHTML = `
|
|
1909
|
+
<div style="max-width: 900px; margin: 0 auto; background: var(--fp-bg, #ffffff); border: 1px solid var(--fp-border, #e5e7eb); border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); overflow: hidden;">
|
|
1910
|
+
<div style="padding: 16px 20px; background: var(--fp-toolbar-bg, #f9fafb); border-bottom: 1px solid var(--fp-border, #e5e7eb); display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;">
|
|
1911
|
+
<div>
|
|
1912
|
+
<h3 style="margin: 0 0 4px 0; font-size: 16px; font-weight: 600; color: var(--fp-text, #111827);">
|
|
1913
|
+
\u{1F4E6} ${ctx.metadata.name || "Archive.zip"}
|
|
1914
|
+
</h3>
|
|
1915
|
+
<div style="font-size: 13px; color: var(--fp-text-muted, #6b7280);">
|
|
1916
|
+
${entries.length} items \xB7 Total size: ${formatFileSize(totalUncompressedSize)} (Compressed: ${formatFileSize(ctx.buffer.byteLength)})
|
|
1917
|
+
</div>
|
|
1918
|
+
</div>
|
|
1919
|
+
<div>
|
|
1920
|
+
<input type="text" id="fp-archive-search" placeholder="Search files in archive..." style="padding: 6px 12px; font-size: 13px; border: 1px solid var(--fp-border, #d1d5db); border-radius: 6px; outline: none; width: 220px;" />
|
|
1921
|
+
</div>
|
|
1922
|
+
</div>
|
|
1923
|
+
<div style="max-height: 550px; overflow-y: auto;">
|
|
1924
|
+
<table style="width: 100%; border-collapse: collapse; font-size: 13px; text-align: left;">
|
|
1925
|
+
<thead>
|
|
1926
|
+
<tr style="background: var(--fp-toolbar-bg, #f3f4f6); color: var(--fp-text-muted, #4b5563); border-bottom: 1px solid var(--fp-border, #e5e7eb);">
|
|
1927
|
+
<th style="padding: 10px 16px; font-weight: 600;">Name / Path</th>
|
|
1928
|
+
<th style="padding: 10px 16px; font-weight: 600; width: 120px;">Size</th>
|
|
1929
|
+
<th style="padding: 10px 16px; font-weight: 600; width: 100px; text-align: right;">Action</th>
|
|
1930
|
+
</tr>
|
|
1931
|
+
</thead>
|
|
1932
|
+
<tbody id="fp-archive-body">
|
|
1933
|
+
</tbody>
|
|
1934
|
+
</table>
|
|
1935
|
+
</div>
|
|
1936
|
+
</div>
|
|
1937
|
+
`;
|
|
1938
|
+
const tbody = wrapper.querySelector("#fp-archive-body");
|
|
1939
|
+
if (filteredEntries.length === 0) {
|
|
1940
|
+
tbody.innerHTML = `<tr><td colspan="3" style="padding: 24px; text-align: center; color: #9ca3af;">No matching files found</td></tr>`;
|
|
1941
|
+
} else {
|
|
1942
|
+
tbody.innerHTML = filteredEntries.map((e, idx) => `
|
|
1943
|
+
<tr style="border-bottom: 1px solid var(--fp-border, #f3f4f6); transition: background 0.15s ease;" onmouseover="this.style.background='var(--fp-hover, #f9fafb)'" onmouseout="this.style.background='transparent'">
|
|
1944
|
+
<td style="padding: 10px 16px; color: var(--fp-text, #1f2937); word-break: break-all;">
|
|
1945
|
+
<span style="margin-right: 8px;">${e.isDir ? "\u{1F4C1}" : "\u{1F4C4}"}</span>
|
|
1946
|
+
${e.path}
|
|
1947
|
+
</td>
|
|
1948
|
+
<td style="padding: 10px 16px; color: var(--fp-text-muted, #6b7280);">
|
|
1949
|
+
${e.isDir ? "-" : formatFileSize(e.size)}
|
|
1950
|
+
</td>
|
|
1951
|
+
<td style="padding: 10px 16px; text-align: right;">
|
|
1952
|
+
${!e.isDir ? `<button data-idx="${idx}" class="fp-entry-dl" style="padding: 4px 8px; font-size: 12px; background: transparent; border: 1px solid var(--fp-border, #d1d5db); border-radius: 4px; cursor: pointer; color: var(--fp-text, #374151);">\u2B07\uFE0F Save</button>` : ""}
|
|
1953
|
+
</td>
|
|
1954
|
+
</tr>
|
|
1955
|
+
`).join("");
|
|
1956
|
+
}
|
|
1957
|
+
tbody.querySelectorAll(".fp-entry-dl").forEach((btn) => {
|
|
1958
|
+
btn.addEventListener("click", (ev) => {
|
|
1959
|
+
const target = ev.currentTarget;
|
|
1960
|
+
const idx = Number(target.getAttribute("data-idx"));
|
|
1961
|
+
const entry = filteredEntries[idx];
|
|
1962
|
+
if (entry && entry.data) {
|
|
1963
|
+
downloadFile(entry.data.buffer, entry.name);
|
|
1964
|
+
}
|
|
1965
|
+
});
|
|
1966
|
+
});
|
|
1967
|
+
const searchInput = wrapper.querySelector("#fp-archive-search");
|
|
1968
|
+
if (searchInput) {
|
|
1969
|
+
searchInput.addEventListener("input", () => {
|
|
1970
|
+
const q = searchInput.value.toLowerCase().trim();
|
|
1971
|
+
const filtered = q ? entries.filter((e) => e.path.toLowerCase().includes(q)) : entries;
|
|
1972
|
+
renderUI(filtered);
|
|
1973
|
+
const newSearch = wrapper.querySelector("#fp-archive-search");
|
|
1974
|
+
if (newSearch) {
|
|
1975
|
+
newSearch.value = q;
|
|
1976
|
+
newSearch.focus();
|
|
1977
|
+
}
|
|
1978
|
+
});
|
|
1979
|
+
}
|
|
1980
|
+
};
|
|
1981
|
+
renderUI(entries);
|
|
1982
|
+
const cleanup = () => {
|
|
1983
|
+
wrapper.remove();
|
|
1984
|
+
ctx.container.innerHTML = "";
|
|
1985
|
+
};
|
|
1986
|
+
ctx.signal.addEventListener("abort", cleanup);
|
|
1987
|
+
return {
|
|
1988
|
+
destroy: cleanup,
|
|
1989
|
+
zoomIn: () => {
|
|
1990
|
+
scale += 0.1;
|
|
1991
|
+
wrapper.style.transform = `scale(${scale})`;
|
|
1992
|
+
},
|
|
1993
|
+
zoomOut: () => {
|
|
1994
|
+
scale = Math.max(0.3, scale - 0.1);
|
|
1995
|
+
wrapper.style.transform = `scale(${scale})`;
|
|
1996
|
+
},
|
|
1997
|
+
getZoom: () => scale,
|
|
1998
|
+
setZoom: (level) => {
|
|
1999
|
+
scale = level;
|
|
2000
|
+
wrapper.style.transform = `scale(${scale})`;
|
|
2001
|
+
},
|
|
2002
|
+
fitToPage: () => {
|
|
2003
|
+
scale = 1;
|
|
2004
|
+
wrapper.style.transform = `scale(1)`;
|
|
2005
|
+
},
|
|
2006
|
+
download: () => {
|
|
2007
|
+
downloadFile(ctx.buffer, ctx.metadata.name || "archive.zip", "application/zip");
|
|
2008
|
+
},
|
|
2009
|
+
print: () => {
|
|
2010
|
+
window.print();
|
|
2011
|
+
}
|
|
2012
|
+
};
|
|
2013
|
+
}
|
|
2014
|
+
};
|
|
2015
|
+
function archivePlugin() {
|
|
2016
|
+
return new ArchivePlugin();
|
|
2017
|
+
}
|
|
2018
|
+
var MarkdownPlugin = class {
|
|
2019
|
+
id = "markdown";
|
|
2020
|
+
name = "Markdown Preview";
|
|
2021
|
+
extensions = [".md", ".markdown", ".mdown", ".mkd"];
|
|
2022
|
+
mimeTypes = ["text/markdown", "text/x-markdown"];
|
|
2023
|
+
weight = 90;
|
|
2024
|
+
// Higher than generic text/code plugin
|
|
2025
|
+
supports(file) {
|
|
2026
|
+
const ext = file.metadata.extension?.toLowerCase();
|
|
2027
|
+
const mime = file.metadata.mimeType?.toLowerCase();
|
|
2028
|
+
return this.extensions.includes(ext || "") || this.mimeTypes.includes(mime || "");
|
|
2029
|
+
}
|
|
2030
|
+
getToolbarActions(instance) {
|
|
2031
|
+
return [
|
|
2032
|
+
{
|
|
2033
|
+
id: "zoom-out",
|
|
2034
|
+
icon: "zoom-out",
|
|
2035
|
+
label: "Decrease Font",
|
|
2036
|
+
type: "button",
|
|
2037
|
+
group: "zoom",
|
|
2038
|
+
execute: () => instance.zoomOut?.()
|
|
2039
|
+
},
|
|
2040
|
+
{
|
|
2041
|
+
id: "zoom-in",
|
|
2042
|
+
icon: "zoom-in",
|
|
2043
|
+
label: "Increase Font",
|
|
2044
|
+
type: "button",
|
|
2045
|
+
group: "zoom",
|
|
2046
|
+
execute: () => instance.zoomIn?.()
|
|
2047
|
+
},
|
|
2048
|
+
{
|
|
2049
|
+
id: "fit-page",
|
|
2050
|
+
icon: "fit-page",
|
|
2051
|
+
label: "Default Size",
|
|
2052
|
+
type: "button",
|
|
2053
|
+
group: "zoom",
|
|
2054
|
+
execute: () => instance.fitToPage?.()
|
|
2055
|
+
},
|
|
2056
|
+
{
|
|
2057
|
+
id: "download",
|
|
2058
|
+
icon: "download",
|
|
2059
|
+
label: "Download Markdown",
|
|
2060
|
+
type: "button",
|
|
2061
|
+
group: "actions",
|
|
2062
|
+
execute: () => instance.download?.()
|
|
2063
|
+
},
|
|
2064
|
+
{
|
|
2065
|
+
id: "print",
|
|
2066
|
+
icon: "print",
|
|
2067
|
+
label: "Print Document",
|
|
2068
|
+
type: "button",
|
|
2069
|
+
group: "actions",
|
|
2070
|
+
execute: () => instance.print?.()
|
|
2071
|
+
}
|
|
2072
|
+
];
|
|
2073
|
+
}
|
|
2074
|
+
async render(ctx) {
|
|
2075
|
+
const text = new TextDecoder("utf-8", { fatal: false }).decode(ctx.buffer);
|
|
2076
|
+
const rawHtml = await marked.marked.parse(text, {
|
|
2077
|
+
gfm: true,
|
|
2078
|
+
breaks: true
|
|
2079
|
+
});
|
|
2080
|
+
const cleanHtml = DOMPurify__default.default.sanitize(rawHtml, {
|
|
2081
|
+
USE_PROFILES: { html: true }
|
|
2082
|
+
});
|
|
2083
|
+
const wrapper = document.createElement("div");
|
|
2084
|
+
wrapper.className = "fp-markdown-wrapper";
|
|
2085
|
+
wrapper.style.cssText = `
|
|
2086
|
+
width: 100%;
|
|
2087
|
+
height: 100%;
|
|
2088
|
+
overflow: auto;
|
|
2089
|
+
padding: 32px 40px;
|
|
2090
|
+
box-sizing: border-box;
|
|
2091
|
+
line-height: 1.6;
|
|
2092
|
+
font-size: 15px;
|
|
2093
|
+
color: var(--fp-text, #24292f);
|
|
2094
|
+
background: var(--fp-bg, #ffffff);
|
|
2095
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
|
|
2096
|
+
`;
|
|
2097
|
+
wrapper.innerHTML = `
|
|
2098
|
+
<style>
|
|
2099
|
+
.fp-markdown-wrapper h1, .fp-markdown-wrapper h2, .fp-markdown-wrapper h3,
|
|
2100
|
+
.fp-markdown-wrapper h4, .fp-markdown-wrapper h5, .fp-markdown-wrapper h6 {
|
|
2101
|
+
margin-top: 24px;
|
|
2102
|
+
margin-bottom: 16px;
|
|
2103
|
+
font-weight: 600;
|
|
2104
|
+
line-height: 1.25;
|
|
2105
|
+
color: var(--fp-text, #1f2328);
|
|
2106
|
+
}
|
|
2107
|
+
.fp-markdown-wrapper h1 { font-size: 2em; padding-bottom: 0.3em; border-bottom: 1px solid var(--fp-border, #d0d7de); }
|
|
2108
|
+
.fp-markdown-wrapper h2 { font-size: 1.5em; padding-bottom: 0.3em; border-bottom: 1px solid var(--fp-border, #d0d7de); }
|
|
2109
|
+
.fp-markdown-wrapper h3 { font-size: 1.25em; }
|
|
2110
|
+
.fp-markdown-wrapper p { margin-top: 0; margin-bottom: 16px; }
|
|
2111
|
+
.fp-markdown-wrapper table {
|
|
2112
|
+
border-spacing: 0;
|
|
2113
|
+
border-collapse: collapse;
|
|
2114
|
+
margin-top: 0;
|
|
2115
|
+
margin-bottom: 16px;
|
|
2116
|
+
width: 100%;
|
|
2117
|
+
overflow: auto;
|
|
2118
|
+
}
|
|
2119
|
+
.fp-markdown-wrapper table th, .fp-markdown-wrapper table td {
|
|
2120
|
+
padding: 6px 13px;
|
|
2121
|
+
border: 1px solid var(--fp-border, #d0d7de);
|
|
2122
|
+
}
|
|
2123
|
+
.fp-markdown-wrapper table tr:nth-child(2n) {
|
|
2124
|
+
background-color: var(--fp-toolbar-bg, #f6f8fa);
|
|
2125
|
+
}
|
|
2126
|
+
.fp-markdown-wrapper blockquote {
|
|
2127
|
+
margin: 0 0 16px 0;
|
|
2128
|
+
padding: 0 1em;
|
|
2129
|
+
color: var(--fp-text-muted, #59636e);
|
|
2130
|
+
border-left: 0.25em solid var(--fp-border, #d0d7de);
|
|
2131
|
+
}
|
|
2132
|
+
.fp-markdown-wrapper pre {
|
|
2133
|
+
padding: 16px;
|
|
2134
|
+
overflow: auto;
|
|
2135
|
+
font-size: 85%;
|
|
2136
|
+
line-height: 1.45;
|
|
2137
|
+
background-color: var(--fp-toolbar-bg, #f6f8fa);
|
|
2138
|
+
border-radius: 6px;
|
|
2139
|
+
border: 1px solid var(--fp-border, #d0d7de);
|
|
2140
|
+
}
|
|
2141
|
+
.fp-markdown-wrapper code {
|
|
2142
|
+
padding: 0.2em 0.4em;
|
|
2143
|
+
margin: 0;
|
|
2144
|
+
font-size: 85%;
|
|
2145
|
+
background-color: rgba(175, 184, 193, 0.2);
|
|
2146
|
+
border-radius: 4px;
|
|
2147
|
+
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
2148
|
+
}
|
|
2149
|
+
.fp-markdown-wrapper pre code {
|
|
2150
|
+
padding: 0;
|
|
2151
|
+
background: transparent;
|
|
2152
|
+
}
|
|
2153
|
+
.fp-markdown-wrapper ul, .fp-markdown-wrapper ol {
|
|
2154
|
+
padding-left: 2em;
|
|
2155
|
+
margin-top: 0;
|
|
2156
|
+
margin-bottom: 16px;
|
|
2157
|
+
}
|
|
2158
|
+
.fp-markdown-wrapper hr {
|
|
2159
|
+
height: 0.25em;
|
|
2160
|
+
padding: 0;
|
|
2161
|
+
margin: 24px 0;
|
|
2162
|
+
background-color: var(--fp-border, #d0d7de);
|
|
2163
|
+
border: 0;
|
|
2164
|
+
}
|
|
2165
|
+
</style>
|
|
2166
|
+
<div class="fp-markdown-content" style="max-width: 860px; margin: 0 auto;">
|
|
2167
|
+
${cleanHtml}
|
|
2168
|
+
</div>
|
|
2169
|
+
`;
|
|
2170
|
+
wrapper.querySelectorAll("pre code").forEach((block) => {
|
|
2171
|
+
hljs__default.default.highlightElement(block);
|
|
2172
|
+
});
|
|
2173
|
+
ctx.container.innerHTML = "";
|
|
2174
|
+
ctx.container.style.overflow = "auto";
|
|
2175
|
+
ctx.container.appendChild(wrapper);
|
|
2176
|
+
let fontSize = 15;
|
|
2177
|
+
const cleanup = () => {
|
|
2178
|
+
wrapper.remove();
|
|
2179
|
+
ctx.container.innerHTML = "";
|
|
2180
|
+
};
|
|
2181
|
+
ctx.signal.addEventListener("abort", cleanup);
|
|
2182
|
+
return {
|
|
2183
|
+
destroy: cleanup,
|
|
2184
|
+
zoomIn: () => {
|
|
2185
|
+
fontSize = Math.min(28, fontSize + 2);
|
|
2186
|
+
wrapper.style.fontSize = `${fontSize}px`;
|
|
2187
|
+
},
|
|
2188
|
+
zoomOut: () => {
|
|
2189
|
+
fontSize = Math.max(10, fontSize - 2);
|
|
2190
|
+
wrapper.style.fontSize = `${fontSize}px`;
|
|
2191
|
+
},
|
|
2192
|
+
getZoom: () => fontSize / 15,
|
|
2193
|
+
setZoom: (level) => {
|
|
2194
|
+
fontSize = Math.round(15 * level);
|
|
2195
|
+
wrapper.style.fontSize = `${fontSize}px`;
|
|
2196
|
+
},
|
|
2197
|
+
fitToPage: () => {
|
|
2198
|
+
fontSize = 15;
|
|
2199
|
+
wrapper.style.fontSize = "15px";
|
|
2200
|
+
},
|
|
2201
|
+
download: () => {
|
|
2202
|
+
downloadFile(ctx.buffer, ctx.metadata.name || "document.md", "text/markdown");
|
|
2203
|
+
},
|
|
2204
|
+
print: () => {
|
|
2205
|
+
window.print();
|
|
2206
|
+
}
|
|
2207
|
+
};
|
|
2208
|
+
}
|
|
2209
|
+
};
|
|
2210
|
+
function markdownPlugin() {
|
|
2211
|
+
return new MarkdownPlugin();
|
|
2212
|
+
}
|
|
2213
|
+
var PptxPlugin = class {
|
|
2214
|
+
id = "pptx";
|
|
2215
|
+
name = "PowerPoint Presentation";
|
|
2216
|
+
extensions = [".pptx", ".ppsx"];
|
|
2217
|
+
mimeTypes = [
|
|
2218
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
2219
|
+
"application/vnd.openxmlformats-officedocument.presentationml.slideshow"
|
|
2220
|
+
];
|
|
2221
|
+
weight = 80;
|
|
2222
|
+
supports(file) {
|
|
2223
|
+
const ext = file.metadata.extension?.toLowerCase();
|
|
2224
|
+
const mime = file.metadata.mimeType?.toLowerCase();
|
|
2225
|
+
return this.extensions.includes(ext || "") || this.mimeTypes.includes(mime || "");
|
|
2226
|
+
}
|
|
2227
|
+
getToolbarActions(instance) {
|
|
2228
|
+
return [
|
|
2229
|
+
{
|
|
2230
|
+
id: "thumbnails",
|
|
2231
|
+
icon: "thumbnails",
|
|
2232
|
+
label: "Slide Thumbnails",
|
|
2233
|
+
type: "button",
|
|
2234
|
+
group: "navigation",
|
|
2235
|
+
execute: () => instance.toggleThumbnails?.()
|
|
2236
|
+
},
|
|
2237
|
+
{
|
|
2238
|
+
id: "page-prev",
|
|
2239
|
+
icon: "page-prev",
|
|
2240
|
+
label: "Previous Slide",
|
|
2241
|
+
type: "button",
|
|
2242
|
+
group: "navigation",
|
|
2243
|
+
execute: () => {
|
|
2244
|
+
const cur = instance.getCurrentPage?.() ?? 1;
|
|
2245
|
+
if (cur > 1) instance.goToPage?.(cur - 1);
|
|
2246
|
+
}
|
|
2247
|
+
},
|
|
2248
|
+
{
|
|
2249
|
+
id: "page-nav",
|
|
2250
|
+
icon: "",
|
|
2251
|
+
label: "Slide Number",
|
|
2252
|
+
type: "page-nav",
|
|
2253
|
+
group: "navigation",
|
|
2254
|
+
execute: (page) => instance.goToPage?.(Number(page))
|
|
2255
|
+
},
|
|
2256
|
+
{
|
|
2257
|
+
id: "page-next",
|
|
2258
|
+
icon: "page-next",
|
|
2259
|
+
label: "Next Slide",
|
|
2260
|
+
type: "button",
|
|
2261
|
+
group: "navigation",
|
|
2262
|
+
execute: () => {
|
|
2263
|
+
const cur = instance.getCurrentPage?.() ?? 1;
|
|
2264
|
+
const total = instance.getPageCount?.() ?? 1;
|
|
2265
|
+
if (cur < total) instance.goToPage?.(cur + 1);
|
|
2266
|
+
}
|
|
2267
|
+
},
|
|
2268
|
+
{
|
|
2269
|
+
id: "zoom-out",
|
|
2270
|
+
icon: "zoom-out",
|
|
2271
|
+
label: "Zoom Out",
|
|
2272
|
+
type: "button",
|
|
2273
|
+
group: "zoom",
|
|
2274
|
+
execute: () => instance.zoomOut?.()
|
|
2275
|
+
},
|
|
2276
|
+
{
|
|
2277
|
+
id: "zoom-in",
|
|
2278
|
+
icon: "zoom-in",
|
|
2279
|
+
label: "Zoom In",
|
|
2280
|
+
type: "button",
|
|
2281
|
+
group: "zoom",
|
|
2282
|
+
execute: () => instance.zoomIn?.()
|
|
2283
|
+
},
|
|
2284
|
+
{
|
|
2285
|
+
id: "fit-page",
|
|
2286
|
+
icon: "fit-page",
|
|
2287
|
+
label: "Fit to Slide",
|
|
2288
|
+
type: "button",
|
|
2289
|
+
group: "zoom",
|
|
2290
|
+
execute: () => instance.fitToPage?.()
|
|
2291
|
+
},
|
|
2292
|
+
{
|
|
2293
|
+
id: "download",
|
|
2294
|
+
icon: "download",
|
|
2295
|
+
label: "Download PPTX",
|
|
2296
|
+
type: "button",
|
|
2297
|
+
group: "actions",
|
|
2298
|
+
execute: () => instance.download?.()
|
|
2299
|
+
},
|
|
2300
|
+
{
|
|
2301
|
+
id: "print",
|
|
2302
|
+
icon: "print",
|
|
2303
|
+
label: "Print Presentation",
|
|
2304
|
+
type: "button",
|
|
2305
|
+
group: "actions",
|
|
2306
|
+
execute: () => instance.print?.()
|
|
2307
|
+
}
|
|
2308
|
+
];
|
|
2309
|
+
}
|
|
2310
|
+
async render(ctx) {
|
|
2311
|
+
const renderer = new pptxBrowser.PptxRenderer();
|
|
2312
|
+
await renderer.load(ctx.buffer);
|
|
2313
|
+
const slideCount = renderer.slidePaths?.length || 1;
|
|
2314
|
+
let currentSlide = 1;
|
|
2315
|
+
let scale = 1;
|
|
2316
|
+
const wrapper = document.createElement("div");
|
|
2317
|
+
wrapper.className = "fp-pptx-wrapper";
|
|
2318
|
+
wrapper.style.cssText = `
|
|
2319
|
+
width: 100%;
|
|
2320
|
+
height: 100%;
|
|
2321
|
+
overflow: auto;
|
|
2322
|
+
display: flex;
|
|
2323
|
+
justify-content: center;
|
|
2324
|
+
align-items: flex-start;
|
|
2325
|
+
padding: 24px;
|
|
2326
|
+
box-sizing: border-box;
|
|
2327
|
+
background: var(--fp-bg-canvas, #525659);
|
|
2328
|
+
`;
|
|
2329
|
+
const slideContainer = document.createElement("div");
|
|
2330
|
+
slideContainer.className = "fp-slide-container";
|
|
2331
|
+
slideContainer.style.cssText = `
|
|
2332
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
|
2333
|
+
border-radius: 4px;
|
|
2334
|
+
overflow: hidden;
|
|
2335
|
+
background: #ffffff;
|
|
2336
|
+
transform-origin: top center;
|
|
2337
|
+
transition: transform 0.2s ease;
|
|
2338
|
+
`;
|
|
2339
|
+
const canvas = document.createElement("canvas");
|
|
2340
|
+
slideContainer.appendChild(canvas);
|
|
2341
|
+
wrapper.appendChild(slideContainer);
|
|
2342
|
+
ctx.container.innerHTML = "";
|
|
2343
|
+
ctx.container.style.overflow = "auto";
|
|
2344
|
+
ctx.container.appendChild(wrapper);
|
|
2345
|
+
const renderCurrentSlide = async () => {
|
|
2346
|
+
try {
|
|
2347
|
+
await renderer.renderSlide(currentSlide - 1, canvas, 1280);
|
|
2348
|
+
ctx.emit("page-change", { page: currentSlide, totalPages: slideCount });
|
|
2349
|
+
} catch (err) {
|
|
2350
|
+
console.error("[PptxPlugin] Failed to render slide:", err);
|
|
2351
|
+
}
|
|
2352
|
+
};
|
|
2353
|
+
await renderCurrentSlide();
|
|
2354
|
+
const cleanup = () => {
|
|
2355
|
+
renderer.destroy();
|
|
2356
|
+
wrapper.remove();
|
|
2357
|
+
ctx.container.innerHTML = "";
|
|
2358
|
+
};
|
|
2359
|
+
ctx.signal.addEventListener("abort", cleanup);
|
|
2360
|
+
const instance = {
|
|
2361
|
+
destroy: cleanup,
|
|
2362
|
+
goToPage: (page) => {
|
|
2363
|
+
if (page >= 1 && page <= slideCount) {
|
|
2364
|
+
currentSlide = page;
|
|
2365
|
+
renderCurrentSlide();
|
|
2366
|
+
}
|
|
2367
|
+
},
|
|
2368
|
+
getPageCount: () => slideCount,
|
|
2369
|
+
getCurrentPage: () => currentSlide,
|
|
2370
|
+
zoomIn: () => {
|
|
2371
|
+
scale += 0.1;
|
|
2372
|
+
slideContainer.style.transform = `scale(${scale})`;
|
|
2373
|
+
},
|
|
2374
|
+
zoomOut: () => {
|
|
2375
|
+
scale = Math.max(0.2, scale - 0.1);
|
|
2376
|
+
slideContainer.style.transform = `scale(${scale})`;
|
|
2377
|
+
},
|
|
2378
|
+
getZoom: () => scale,
|
|
2379
|
+
setZoom: (level) => {
|
|
2380
|
+
scale = level;
|
|
2381
|
+
slideContainer.style.transform = `scale(${scale})`;
|
|
2382
|
+
},
|
|
2383
|
+
fitToPage: () => {
|
|
2384
|
+
scale = 1;
|
|
2385
|
+
slideContainer.style.transform = "scale(1)";
|
|
2386
|
+
},
|
|
2387
|
+
getThumbnails: () => {
|
|
2388
|
+
const list = [];
|
|
2389
|
+
for (let i = 0; i < slideCount; i++) {
|
|
2390
|
+
const slideIdx = i;
|
|
2391
|
+
list.push({
|
|
2392
|
+
index: slideIdx,
|
|
2393
|
+
label: `Slide ${slideIdx + 1}`,
|
|
2394
|
+
render: async (thumbCanvas) => {
|
|
2395
|
+
await renderer.renderSlide(slideIdx, thumbCanvas, 240);
|
|
2396
|
+
}
|
|
2397
|
+
});
|
|
2398
|
+
}
|
|
2399
|
+
return list;
|
|
2400
|
+
},
|
|
2401
|
+
download: () => {
|
|
2402
|
+
downloadFile(
|
|
2403
|
+
ctx.buffer,
|
|
2404
|
+
ctx.metadata.name || "presentation.pptx",
|
|
2405
|
+
this.mimeTypes[0]
|
|
2406
|
+
);
|
|
2407
|
+
},
|
|
2408
|
+
print: () => {
|
|
2409
|
+
window.print();
|
|
2410
|
+
}
|
|
2411
|
+
};
|
|
2412
|
+
return instance;
|
|
2413
|
+
}
|
|
2414
|
+
};
|
|
2415
|
+
function pptxPlugin() {
|
|
2416
|
+
return new PptxPlugin();
|
|
2417
|
+
}
|
|
2418
|
+
var ThreeDPlugin = class {
|
|
2419
|
+
id = "3d";
|
|
2420
|
+
name = "3D Model Preview";
|
|
2421
|
+
extensions = [".stl", ".obj"];
|
|
2422
|
+
mimeTypes = ["model/stl", "model/obj", "application/sla", "text/plain"];
|
|
2423
|
+
weight = 75;
|
|
2424
|
+
supports(file) {
|
|
2425
|
+
const ext = file.metadata.extension?.toLowerCase();
|
|
2426
|
+
return ext === ".stl" || ext === ".obj";
|
|
2427
|
+
}
|
|
2428
|
+
getToolbarActions(instance) {
|
|
2429
|
+
return [
|
|
2430
|
+
{
|
|
2431
|
+
id: "zoom-out",
|
|
2432
|
+
icon: "zoom-out",
|
|
2433
|
+
label: "Zoom Out",
|
|
2434
|
+
type: "button",
|
|
2435
|
+
group: "zoom",
|
|
2436
|
+
execute: () => instance.zoomOut?.()
|
|
2437
|
+
},
|
|
2438
|
+
{
|
|
2439
|
+
id: "zoom-in",
|
|
2440
|
+
icon: "zoom-in",
|
|
2441
|
+
label: "Zoom In",
|
|
2442
|
+
type: "button",
|
|
2443
|
+
group: "zoom",
|
|
2444
|
+
execute: () => instance.zoomIn?.()
|
|
2445
|
+
},
|
|
2446
|
+
{
|
|
2447
|
+
id: "fit-page",
|
|
2448
|
+
icon: "fit-page",
|
|
2449
|
+
label: "Reset Camera View",
|
|
2450
|
+
type: "button",
|
|
2451
|
+
group: "zoom",
|
|
2452
|
+
execute: () => instance.fitToPage?.()
|
|
2453
|
+
},
|
|
2454
|
+
{
|
|
2455
|
+
id: "rotate-cw",
|
|
2456
|
+
icon: "rotate-cw",
|
|
2457
|
+
label: "Toggle Wireframe",
|
|
2458
|
+
type: "button",
|
|
2459
|
+
group: "view",
|
|
2460
|
+
execute: () => instance.rotateCW?.()
|
|
2461
|
+
},
|
|
2462
|
+
{
|
|
2463
|
+
id: "download",
|
|
2464
|
+
icon: "download",
|
|
2465
|
+
label: "Download 3D Model",
|
|
2466
|
+
type: "button",
|
|
2467
|
+
group: "actions",
|
|
2468
|
+
execute: () => instance.download?.()
|
|
2469
|
+
}
|
|
2470
|
+
];
|
|
2471
|
+
}
|
|
2472
|
+
async render(ctx) {
|
|
2473
|
+
const container = ctx.container;
|
|
2474
|
+
container.innerHTML = "";
|
|
2475
|
+
container.style.overflow = "hidden";
|
|
2476
|
+
container.style.position = "relative";
|
|
2477
|
+
container.style.width = "100%";
|
|
2478
|
+
container.style.height = "100%";
|
|
2479
|
+
container.style.background = "#1a1a1a";
|
|
2480
|
+
const width = container.clientWidth || 800;
|
|
2481
|
+
const height = container.clientHeight || 600;
|
|
2482
|
+
const scene = new THREE__namespace.Scene();
|
|
2483
|
+
scene.background = new THREE__namespace.Color(1973796);
|
|
2484
|
+
const camera = new THREE__namespace.PerspectiveCamera(45, width / height, 0.1, 2e3);
|
|
2485
|
+
const renderer = new THREE__namespace.WebGLRenderer({ antialias: true });
|
|
2486
|
+
renderer.setSize(width, height);
|
|
2487
|
+
renderer.setPixelRatio(window.devicePixelRatio);
|
|
2488
|
+
renderer.shadowMap.enabled = true;
|
|
2489
|
+
container.appendChild(renderer.domElement);
|
|
2490
|
+
const controls = new OrbitControls_js.OrbitControls(camera, renderer.domElement);
|
|
2491
|
+
controls.enableDamping = true;
|
|
2492
|
+
controls.dampingFactor = 0.05;
|
|
2493
|
+
const ambientLight = new THREE__namespace.AmbientLight(16777215, 0.8);
|
|
2494
|
+
scene.add(ambientLight);
|
|
2495
|
+
const dirLight1 = new THREE__namespace.DirectionalLight(16777215, 1.2);
|
|
2496
|
+
dirLight1.position.set(100, 200, 100);
|
|
2497
|
+
scene.add(dirLight1);
|
|
2498
|
+
const dirLight2 = new THREE__namespace.DirectionalLight(16777215, 0.6);
|
|
2499
|
+
dirLight2.position.set(-100, -100, -100);
|
|
2500
|
+
scene.add(dirLight2);
|
|
2501
|
+
const grid = new THREE__namespace.GridHelper(200, 20, 4473924, 2236962);
|
|
2502
|
+
scene.add(grid);
|
|
2503
|
+
let meshGroup = new THREE__namespace.Group();
|
|
2504
|
+
let isWireframe = false;
|
|
2505
|
+
const ext = ctx.metadata.extension?.toLowerCase();
|
|
2506
|
+
const materials = [];
|
|
2507
|
+
if (ext === ".stl") {
|
|
2508
|
+
const loader = new STLLoader_js.STLLoader();
|
|
2509
|
+
const geometry = loader.parse(ctx.buffer);
|
|
2510
|
+
geometry.computeVertexNormals();
|
|
2511
|
+
geometry.center();
|
|
2512
|
+
const material = new THREE__namespace.MeshStandardMaterial({
|
|
2513
|
+
color: 3900150,
|
|
2514
|
+
roughness: 0.4,
|
|
2515
|
+
metalness: 0.2
|
|
2516
|
+
});
|
|
2517
|
+
materials.push(material);
|
|
2518
|
+
const mesh = new THREE__namespace.Mesh(geometry, material);
|
|
2519
|
+
meshGroup.add(mesh);
|
|
2520
|
+
} else if (ext === ".obj") {
|
|
2521
|
+
const loader = new OBJLoader_js.OBJLoader();
|
|
2522
|
+
const text = new TextDecoder().decode(ctx.buffer);
|
|
2523
|
+
const obj = loader.parse(text);
|
|
2524
|
+
obj.traverse((child) => {
|
|
2525
|
+
if (child.isMesh) {
|
|
2526
|
+
const m = child;
|
|
2527
|
+
m.geometry.computeVertexNormals();
|
|
2528
|
+
const mat = new THREE__namespace.MeshStandardMaterial({
|
|
2529
|
+
color: 1096065,
|
|
2530
|
+
roughness: 0.5,
|
|
2531
|
+
metalness: 0.1
|
|
2532
|
+
});
|
|
2533
|
+
materials.push(mat);
|
|
2534
|
+
m.material = mat;
|
|
2535
|
+
}
|
|
2536
|
+
});
|
|
2537
|
+
meshGroup.add(obj);
|
|
2538
|
+
}
|
|
2539
|
+
scene.add(meshGroup);
|
|
2540
|
+
const box = new THREE__namespace.Box3().setFromObject(meshGroup);
|
|
2541
|
+
const sphere = box.getBoundingSphere(new THREE__namespace.Sphere());
|
|
2542
|
+
const radius = Math.max(sphere.radius, 10);
|
|
2543
|
+
const fitCamera = () => {
|
|
2544
|
+
camera.position.set(radius * 1.5, radius * 1.2, radius * 2);
|
|
2545
|
+
camera.lookAt(0, 0, 0);
|
|
2546
|
+
controls.target.set(0, 0, 0);
|
|
2547
|
+
controls.update();
|
|
2548
|
+
};
|
|
2549
|
+
fitCamera();
|
|
2550
|
+
let animId;
|
|
2551
|
+
const animate = () => {
|
|
2552
|
+
animId = requestAnimationFrame(animate);
|
|
2553
|
+
controls.update();
|
|
2554
|
+
renderer.render(scene, camera);
|
|
2555
|
+
};
|
|
2556
|
+
animate();
|
|
2557
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
2558
|
+
const newWidth = container.clientWidth || 800;
|
|
2559
|
+
const newHeight = container.clientHeight || 600;
|
|
2560
|
+
camera.aspect = newWidth / newHeight;
|
|
2561
|
+
camera.updateProjectionMatrix();
|
|
2562
|
+
renderer.setSize(newWidth, newHeight);
|
|
2563
|
+
});
|
|
2564
|
+
resizeObserver.observe(container);
|
|
2565
|
+
const cleanup = () => {
|
|
2566
|
+
cancelAnimationFrame(animId);
|
|
2567
|
+
resizeObserver.disconnect();
|
|
2568
|
+
controls.dispose();
|
|
2569
|
+
renderer.dispose();
|
|
2570
|
+
materials.forEach((m) => m.dispose());
|
|
2571
|
+
meshGroup.traverse((child) => {
|
|
2572
|
+
if (child.geometry) {
|
|
2573
|
+
child.geometry.dispose();
|
|
2574
|
+
}
|
|
2575
|
+
});
|
|
2576
|
+
container.innerHTML = "";
|
|
2577
|
+
};
|
|
2578
|
+
ctx.signal.addEventListener("abort", cleanup);
|
|
2579
|
+
return {
|
|
2580
|
+
destroy: cleanup,
|
|
2581
|
+
zoomIn: () => {
|
|
2582
|
+
camera.position.multiplyScalar(0.85);
|
|
2583
|
+
controls.update();
|
|
2584
|
+
},
|
|
2585
|
+
zoomOut: () => {
|
|
2586
|
+
camera.position.multiplyScalar(1.15);
|
|
2587
|
+
controls.update();
|
|
2588
|
+
},
|
|
2589
|
+
fitToPage: fitCamera,
|
|
2590
|
+
rotateCW: () => {
|
|
2591
|
+
isWireframe = !isWireframe;
|
|
2592
|
+
materials.forEach((m) => {
|
|
2593
|
+
m.wireframe = isWireframe;
|
|
2594
|
+
});
|
|
2595
|
+
},
|
|
2596
|
+
download: () => {
|
|
2597
|
+
downloadFile(ctx.buffer, ctx.metadata.name || `model${ext || ".stl"}`);
|
|
2598
|
+
}
|
|
2599
|
+
};
|
|
2600
|
+
}
|
|
2601
|
+
};
|
|
2602
|
+
function threeDPlugin() {
|
|
2603
|
+
return new ThreeDPlugin();
|
|
2604
|
+
}
|
|
1805
2605
|
|
|
1806
2606
|
// src/index.ts
|
|
1807
2607
|
function getDefaultPlugins() {
|
|
@@ -1810,7 +2610,11 @@ function getDefaultPlugins() {
|
|
|
1810
2610
|
mediaPlugin(),
|
|
1811
2611
|
docxPlugin(),
|
|
1812
2612
|
excelPlugin(),
|
|
2613
|
+
pptxPlugin(),
|
|
1813
2614
|
csvPlugin(),
|
|
2615
|
+
archivePlugin(),
|
|
2616
|
+
markdownPlugin(),
|
|
2617
|
+
threeDPlugin(),
|
|
1814
2618
|
codePlugin()
|
|
1815
2619
|
];
|
|
1816
2620
|
}
|
|
@@ -1827,6 +2631,7 @@ exports.EventEmitter = EventEmitter;
|
|
|
1827
2631
|
exports.FilePreviewViewer = FilePreviewViewer2;
|
|
1828
2632
|
exports.ThumbnailPanel = ThumbnailPanel;
|
|
1829
2633
|
exports.ToolbarController = ToolbarController;
|
|
2634
|
+
exports.archivePlugin = archivePlugin;
|
|
1830
2635
|
exports.clamp = clamp;
|
|
1831
2636
|
exports.codePlugin = codePlugin;
|
|
1832
2637
|
exports.createElement = createElement;
|
|
@@ -1840,12 +2645,15 @@ exports.excelPlugin = excelPlugin;
|
|
|
1840
2645
|
exports.extractExtension = extractExtension;
|
|
1841
2646
|
exports.formatFileSize = formatFileSize;
|
|
1842
2647
|
exports.getDefaultPlugins = getDefaultPlugins;
|
|
2648
|
+
exports.markdownPlugin = markdownPlugin;
|
|
1843
2649
|
exports.mediaPlugin = mediaPlugin;
|
|
1844
2650
|
exports.mimeFromExtension = mimeFromExtension;
|
|
1845
2651
|
exports.pdfPlugin = pdfPlugin;
|
|
2652
|
+
exports.pptxPlugin = pptxPlugin;
|
|
1846
2653
|
exports.printElement = printElement;
|
|
1847
2654
|
exports.sanitizeHTML = sanitizeHTML;
|
|
1848
2655
|
exports.sanitizeSVG = sanitizeSVG;
|
|
1849
2656
|
exports.sourceToArrayBuffer = sourceToArrayBuffer;
|
|
2657
|
+
exports.threeDPlugin = threeDPlugin;
|
|
1850
2658
|
//# sourceMappingURL=index.cjs.map
|
|
1851
2659
|
//# sourceMappingURL=index.cjs.map
|