change html

This commit is contained in:
2026-08-24 15:37:08 +08:00
parent 3325bc52ef
commit 0487879eee
139 changed files with 9789 additions and 1684 deletions
BIN
View File
Binary file not shown.
+45
View File
@@ -0,0 +1,45 @@
# Architecture Blueprint
## Layers
1. File Access Layer
- `LargeFileBackend` wraps buffered random reads.
- `ChunkCache` adds LRU chunk caching for streaming document access.
2. Text Model Layer
- `PieceTable` references original file ranges plus append-only add buffer.
- Original bytes are fetched on-demand via callback; no full-file load.
3. Index Layer
- `LineIndexer` incrementally scans bytes and lazily materializes line starts.
4. Search Layer
- `SearchEngine` provides basic plain/regex matches.
- `SearchThreadPool` executes chunked background searches.
5. Session Layer
- `DocumentSession` coordinates backend/model/index lifecycle.
- Exposes UI-friendly APIs (`lines`, `lineAt`, `saveAs`, `undo/redo`, `startSearch`).
6. UI Layer
- `MainWindow` wires menus and status.
- `LargeFileView` implements viewport-based rendering for visible lines only.
## Milestones
## M1 - Real Large File Open
- Done: replaced preview mode with chunked streaming reads + file-backed piece table.
- Done: added LRU cache for original file chunks.
## M2 - Editing Correctness
- Done: transactional edit commands and undo/redo stacks.
- Next: persistent durable operation log across restarts.
## M3 - Search/Replace at Scale
- Done: worker thread pool and chunked background search.
- Next: match navigation/highlighting and replace workflows.
## M4 - Platform Hardening
- CRLF/LF normalization policy.
- File lock conflict handling.
- Recovery and crash-safe temp files.
+138
View File
@@ -0,0 +1,138 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit 更新日志</title>
<meta name="description" content="MassiveEdit 版本更新日志。" />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">首页</a>
<a href="./download.html">下载</a>
<a class="active" href="./changelog.html">更新日志</a>
<a href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/changelog.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>更新日志</h1>
<p class="lead">版本演进记录以 GitHub Releases 为准,此处用于官网快速查看主要变化。</p>
<article class="entry">
<div class="entry-head">
<h2>v1.0.2</h2>
<span class="date">2026-06-14</span>
</div>
<ul>
<li>优化超大文件(数十 GB)打开速度,打开后立即可见首屏内容。</li>
<li>修复大文件中拖动滚动条卡顿、无响应的问题。</li>
<li>超长行新增底部横向滚动条,可左右查看完整内容。</li>
<li>修复外部程序持续修改已打开文件时反复弹出提示窗的问题。</li>
<li>修复横向滚动后行号不显示的问题。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v1.0.1</h2>
<span class="date">2026-04-26</span>
</div>
<ul>
<li>完善 macOS App Store 打包与沙盒权限配置。</li>
<li>改进 Qt 依赖部署流程,提升 macOS 安装包稳定性。</li>
<li>补充 App Store 上架前自检说明(依赖路径、签名与 entitlements)。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v1.0.0</h2>
<span class="date">2026-04-20</span>
</div>
<ul>
<li>MassiveEdit 正式上架 macOS App Store。</li>
<li>支持大文件流式打开、虚拟化渲染与基础编辑。</li>
<li>提供查找替换、撤销重做、编码与换行格式管理。</li>
<li>更新应用图标与 macOS 应用元数据(Info.plist)。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.3</h2>
<span class="date">2026-03-30</span>
</div>
<ul>
<li>修复 Windows 安装器“应用运行中提示”中文乱码问题(NSIS 按 UTF-8 读取脚本)。</li>
<li>版本号升级为 0.1.3,并同步安装包命名与官网版本展示。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.2</h2>
<span class="date">2026-03-30</span>
</div>
<ul>
<li>Windows 安装包命名升级为 `MassiveEdit-版本号-Setup.exe`。</li>
<li>NSIS 安装/卸载新增“程序运行中检测”,提示关闭后重试。</li>
<li>官网静态页面上线(首页、下载、更新日志、隐私政策)。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.1</h2>
<span class="date">2026-03-30</span>
</div>
<ul>
<li>修复 Windows 中文文件名路径无法打开的问题(UTF-16 路径链路)。</li>
<li>新增拖拽文件到主窗口直接打开。</li>
<li>Windows 可执行文件与安装器图标完善。</li>
<li>自定义 NSIS 脚本接管打包流程,开始菜单改为单项直达启动。</li>
</ul>
</article>
<article class="entry">
<div class="entry-head">
<h2>v0.1.0</h2>
<span class="date">2026-03-29</span>
</div>
<ul>
<li>首个跨平台可用版本,支持大文件浏览与基础编辑。</li>
<li>提供查找替换、撤销重做、编码与换行格式管理。</li>
<li>提供 Windows/macOS/Linux 构建与打包脚本。</li>
</ul>
</article>
</main>
<footer class="wrap">
<div>五道题(北京)科技有限公司</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+98
View File
@@ -0,0 +1,98 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit 下载</title>
<meta name="description" content="MassiveEdit 下载页面,提供 Windows/macOS/Linux 安装包与安装说明。" />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">首页</a>
<a class="active" href="./download.html">下载</a>
<a href="./changelog.html">更新日志</a>
<a href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/download.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>下载 MassiveEdit</h1>
<p class="lead">
当前官网版本:<strong>1.0.2</strong>macOS App Store)。Windows / Linux 包请见 GitHub Releases。
</p>
<p class="tip">
推荐直接前往
<a href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>Releases 页面</a
>
获取最新构建。Windows 安装包文件名格式为:<code>MassiveEdit-版本号-Setup.exe</code>
</p>
<section class="grid">
<article class="card">
<h2>Windows</h2>
<p class="meta">
支持图形安装程序(NSIS)与 ZIP 包。<br />
示例:<code>MassiveEdit-0.1.3-Setup.exe</code>
</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>下载 Windows 版本</a
>
</article>
<article class="card">
<h2>macOS</h2>
<p class="meta">
推荐通过 Mac App Store 安装(当前 1.0.2)。<br />
也可在 Releases 获取 DMG / tar.gz。
</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>下载 macOS 版本</a
>
</article>
<article class="card">
<h2>Linux</h2>
<p class="meta">
提供 DEB / RPM / tar.gz。<br />
具体包格式取决于发布流水线与目标发行版。
</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer"
>下载 Linux 版本</a
>
</article>
</section>
<section class="help">
需要帮助?可通过 <a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a>
<a href="tel:+8613661144700">+86 13661144700</a> 联系支持团队。
</section>
</main>
<footer class="wrap">
<div>五道题(北京)科技有限公司</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+116
View File
@@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit Changelog</title>
<meta name="description" content="Version history for MassiveEdit." />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">Home</a>
<a href="./download.html">Download</a>
<a class="active" href="./changelog.html">Changelog</a>
<a href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../changelog.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>Changelog</h1>
<p class="lead">GitHub Releases is the source of truth. This page summarizes major changes.</p>
<article class="entry">
<div class="entry-head"><h2>v1.0.2</h2><span class="date">2026-06-14</span></div>
<ul>
<li>Faster opening of very large files (tens of GB); first screen content appears immediately.</li>
<li>Fixed scrollbar drag freezing on large files.</li>
<li>Added a horizontal scrollbar for extra-long lines.</li>
<li>Fixed repeated prompts when an open file is continuously modified externally.</li>
<li>Fixed line numbers disappearing after horizontal scrolling.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v1.0.1</h2><span class="date">2026-04-26</span></div>
<ul>
<li>Improved macOS App Store packaging and sandbox entitlements.</li>
<li>Refined Qt deployment for more reliable macOS builds.</li>
<li>Added App Store preflight checks (dependencies, signing, entitlements).</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v1.0.0</h2><span class="date">2026-04-20</span></div>
<ul>
<li>Initial macOS App Store release.</li>
<li>Streaming open, virtualized rendering, and basic editing for large files.</li>
<li>Find/replace, undo/redo, encoding, and line-ending controls.</li>
<li>Updated app icon and macOS bundle metadata.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.3</h2><span class="date">2026-03-30</span></div>
<ul>
<li>Fixed mojibake in the "app is running" installer prompt on Windows (NSIS script now parsed as UTF-8).</li>
<li>Bumped version to 0.1.3 and synchronized installer naming and website labels.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.2</h2><span class="date">2026-03-30</span></div>
<ul>
<li>Windows installer naming updated to <code>MassiveEdit-version-Setup.exe</code>.</li>
<li>NSIS install/uninstall now checks whether the app is running and asks the user to retry after closing it.</li>
<li>Website static pages launched (Home, Download, Changelog, Privacy).</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.1</h2><span class="date">2026-03-30</span></div>
<ul>
<li>Fixed Windows Unicode file path opening by using UTF-16 path conversion.</li>
<li>Added drag-and-drop file opening in the main window.</li>
<li>Improved Windows executable and installer icon setup.</li>
</ul>
</article>
<article class="entry">
<div class="entry-head"><h2>v0.1.0</h2><span class="date">2026-03-29</span></div>
<ul>
<li>First cross-platform usable release with large-file browsing and basic editing.</li>
<li>Included find/replace, undo/redo, encoding, and line-ending controls.</li>
<li>Provided build/packaging scripts for Windows, macOS, and Linux.</li>
</ul>
</article>
</main>
<footer class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+77
View File
@@ -0,0 +1,77 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit Downloads</title>
<meta name="description" content="Download MassiveEdit for Windows, macOS, and Linux." />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">Home</a>
<a class="active" href="./download.html">Download</a>
<a href="./changelog.html">Changelog</a>
<a href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../download.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>Download MassiveEdit</h1>
<p class="lead">Current website version: <strong>1.0.2</strong> (macOS App Store). Windows / Linux packages are on GitHub Releases.</p>
<p class="tip">
Please use the <a href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Releases page</a>
for the latest packages. Windows installer naming pattern: <code>MassiveEdit-version-Setup.exe</code>.
</p>
<section class="grid">
<article class="card">
<h2>Windows</h2>
<p class="meta">NSIS installer and ZIP package are both available.<br />Example: <code>MassiveEdit-0.1.3-Setup.exe</code></p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Download for Windows</a>
</article>
<article class="card">
<h2>macOS</h2>
<p class="meta">Mac App Store is recommended (currently 1.0.2).<br />DMG and tar.gz are also available on Releases.</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Download for macOS</a>
</article>
<article class="card">
<h2>Linux</h2>
<p class="meta">DEB / RPM / tar.gz package options are provided depending on the pipeline.</p>
<a class="btn btn-primary" href="https://github.com/paineliu/massiveedit/releases" target="_blank" rel="noopener noreferrer">Download for Linux</a>
</article>
</section>
<section class="help">
Need help? Contact <a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a> or <a href="tel:+8613661144700">+86 13661144700</a>.
</section>
</main>
<footer class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+123
View File
@@ -0,0 +1,123 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit - Large File Text Editor</title>
<meta
name="description"
content="MassiveEdit is a high-performance large-file text editor developed by Five Questions (Beijing) Technology Co., Ltd."
/>
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="hero">
<div class="wrap">
<div class="topbar">
<div class="brand"><span class="dot"></span>MassiveEdit</div>
<nav class="topnav">
<a class="active" href="./index.html">Home</a>
<a href="./download.html">Download</a>
<a href="./changelog.html">Changelog</a>
<a href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../index.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
<div class="hero-grid">
<div>
<p class="eyebrow">Large File Editor · v1.0.2</p>
<h1>Built for Massive Text Files</h1>
<p class="lead">
MassiveEdit is a Qt-based large-file text editor focused on startup speed, smooth scrolling, and reliable editing behavior.<br />
Maintained by Five Questions (Beijing) Technology Co., Ltd.
</p>
<div class="cta">
<a class="btn btn-primary" href="./download.html">Get Downloads</a>
<a class="btn btn-ghost" href="./changelog.html">See Changelog</a>
</div>
</div>
<aside class="hero-panel">
<div class="kpi">
<div class="kpi-item"><strong>C++20</strong><span>Core Language</span></div>
<div class="kpi-item"><strong>Qt 6</strong><span>Cross-platform UI</span></div>
<div class="kpi-item"><strong>MIT</strong><span>Open-source License</span></div>
<div class="kpi-item"><strong>Win / macOS / Linux</strong><span>Platform Coverage</span></div>
</div>
</aside>
</div>
</div>
</header>
<main class="wrap">
<section>
<h2 class="title">Core Capabilities</h2>
<p class="sub">Designed for readability, search, and editing on very large text files with responsive interaction.</p>
<div class="grid-3">
<article class="card">
<h3>Fast Large-file Loading</h3>
<p>Chunked reading and caching reduce full-load wait time and keep scrolling smooth.</p>
</article>
<article class="card">
<h3>Incremental Index & Search</h3>
<p>Async search and result navigation keep large datasets practical to work with.</p>
</article>
<article class="card">
<h3>Reliable Editing Base</h3>
<p>Undo/redo, encoding controls, and line-ending management provide a stable foundation.</p>
</article>
</div>
</section>
<section>
<h2 class="title">More Pages</h2>
<p class="sub">Downloads, release history, and privacy details are separated for easy navigation.</p>
<div class="grid-3">
<article class="card"><h3>Downloads</h3><p><a href="./download.html">Platform packages</a> and installation notes.</p></article>
<article class="card"><h3>Changelog</h3><p><a href="./changelog.html">Version changes</a> and fixes.</p></article>
<article class="card"><h3>Privacy</h3><p><a href="./privacy.html">Data handling statement</a> and contact info.</p></article>
</div>
</section>
<section>
<h2 class="title">Contact</h2>
<p class="sub">For support, business inquiries, or feature suggestions:</p>
<div class="contact">
<article class="card">
<h3>Email</h3>
<a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a>
<span class="line">Include OS version, repro steps, and screenshots when possible.</span>
</article>
<article class="card">
<h3>Phone</h3>
<a href="tel:+8613661144700">+86 13661144700</a>
<span class="line">Business hours: Mon-Fri 9:00-18:00 (UTC+8).</span>
</article>
</div>
</section>
</main>
<footer>
<div class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+78
View File
@@ -0,0 +1,78 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit Privacy Policy</title>
<meta name="description" content="Privacy policy for MassiveEdit." />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="../site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">Home</a>
<a href="./download.html">Download</a>
<a href="./changelog.html">Changelog</a>
<a class="active" href="./privacy.html">Privacy</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="../privacy.html" data-lang-switch="zh"></a>
<div class="theme-switch" role="group" aria-label="Theme">
<button type="button" data-theme-mode="auto" aria-pressed="false">Auto</button>
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>Privacy Policy</h1>
<p class="lead">Effective Date: 2026-03-30</p>
<article class="policy">
<section class="section">
<h2>1. Overview</h2>
<p>MassiveEdit is provided by Five Questions (Beijing) Technology Co., Ltd. This policy explains our basic data-handling principles for the website and desktop app.</p>
</section>
<section class="section">
<h2>2. Local File Processing</h2>
<p>MassiveEdit edits files locally on your device. By default, files you open, edit, and save are not uploaded to our servers.</p>
</section>
<section class="section">
<h2>3. Website Access Data</h2>
<p>The hosting platform may collect necessary access logs (time, IP, browser type) for security and operations. We do not use this data for unrelated purposes.</p>
</section>
<section class="section">
<h2>4. Contact Information</h2>
<p>If you contact support by email or phone, we only use the information you provide to handle your request and reply.</p>
</section>
<section class="section">
<h2>5. Policy Updates</h2>
<p>When this policy changes, we will update the content and effective date on this page.</p>
</section>
<section class="section">
<h2>6. Contact</h2>
<p>Email: <a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a><br />Phone: <a href="tel:+8613661144700">+86 13661144700</a></p>
</section>
</article>
</main>
<footer class="wrap">
<div>Five Questions (Beijing) Technology Co., Ltd.</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="../theme.js"></script>
<script src="../lang.js" defer></script>
</body>
</html>
+146
View File
@@ -0,0 +1,146 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit - 大文件文本编辑器</title>
<meta
name="description"
content="MassiveEdit 是一款专注性能的大文件文本编辑器,由五道题(北京)科技有限公司开发。"
/>
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="hero">
<div class="wrap">
<div class="topbar">
<div class="brand"><span class="dot"></span>MassiveEdit</div>
<nav class="topnav">
<a class="active" href="./index.html">首页</a>
<a href="./download.html">下载</a>
<a href="./changelog.html">更新日志</a>
<a href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/index.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
<div class="hero-grid">
<div>
<p class="eyebrow fade-up">Large File Editor · v1.0.2</p>
<h1 class="fade-up d2">面向超大文本文件的编辑体验</h1>
<p class="lead fade-up d3">
MassiveEdit 是一款基于 Qt 开发的大文件文本编辑器,强调启动速度、滚动流畅性与稳定编辑能力。<br />
由五道题(北京)科技有限公司持续维护与迭代。
</p>
<div class="cta fade-up d3">
<a class="btn btn-primary" href="./download.html">下载发布版本</a>
<a class="btn btn-ghost" href="./changelog.html">查看更新日志</a>
</div>
</div>
<aside class="hero-panel fade-up d2">
<div class="kpi">
<div class="kpi-item">
<strong>C++20</strong>
<span>核心语言</span>
</div>
<div class="kpi-item">
<strong>Qt 6</strong>
<span>跨平台 UI</span>
</div>
<div class="kpi-item">
<strong>MIT</strong>
<span>开源协议</span>
</div>
<div class="kpi-item">
<strong>Win / macOS / Linux</strong>
<span>平台支持</span>
</div>
</div>
</aside>
</div>
</div>
</header>
<main class="wrap">
<section>
<h2 class="title">核心能力</h2>
<p class="sub">围绕“大文件可读、可搜、可改”设计,优先保障稳定性与响应速度。</p>
<div class="grid-3">
<article class="card">
<h3>大文件高效加载</h3>
<p>分块读取与缓存策略,减少整体加载等待,提升打开与滚动体验。</p>
</article>
<article class="card">
<h3>渐进索引与搜索</h3>
<p>支持异步检索与结果定位,面向大体量文本保持可操作性。</p>
</article>
<article class="card">
<h3>可靠编辑基础</h3>
<p>提供撤销/重做、编码与换行格式管理,为后续能力扩展留足空间。</p>
</article>
</div>
</section>
<section>
<h2 class="title">更多信息</h2>
<p class="sub">下载、版本演进和政策说明均已独立成页,便于查阅与维护。</p>
<div class="grid-3">
<article class="card">
<h3>下载页面</h3>
<p><a href="./download.html">查看各平台安装包</a>、系统要求与安装说明。</p>
</article>
<article class="card">
<h3>更新日志</h3>
<p><a href="./changelog.html">查看版本变更记录</a>,快速定位新功能与修复项。</p>
</article>
<article class="card">
<h3>隐私政策</h3>
<p><a href="./privacy.html">了解数据处理说明</a>与联系方式。</p>
</article>
</div>
</section>
<section>
<h2 class="title">联系与支持</h2>
<p class="sub">如需技术支持、商务合作或功能建议,可通过以下方式联系。</p>
<div class="contact">
<article class="card">
<h3>邮箱</h3>
<a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a>
<span class="line">建议附上系统版本、复现步骤与日志截图。</span>
</article>
<article class="card">
<h3>电话</h3>
<a href="tel:+8613661144700">+86 13661144700</a>
<span class="line">工作日 9:00-18:00。</span>
</article>
</div>
</section>
</main>
<footer>
<div class="wrap">
<div>五道题(北京)科技有限公司</div>
<div>
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a>
</div>
</div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+83
View File
@@ -0,0 +1,83 @@
(function () {
var key = "massiveedit_lang";
var supported = {
"index.html": true,
"download.html": true,
"changelog.html": true,
"privacy.html": true,
};
var path = window.location.pathname;
var fileMatch = path.match(/\/([^\/?#]+)$/);
if (!fileMatch) return;
var file = fileMatch[1];
if (!supported[file]) return;
var isEn = /\/en\/[^\/?#]+$/.test(path);
var currentLang = isEn ? "en" : "zh";
function toEn(p) {
if (/\/en\/[^\/?#]+$/.test(p)) return p;
return p.replace(/\/([^\/?#]+)$/, "/en/$1");
}
function toZh(p) {
if (!/\/en\/[^\/?#]+$/.test(p)) return p;
return p.replace(/\/en\/([^\/?#]+)$/, "/$1");
}
function targetPath(lang) {
return lang === "en" ? toEn(path) : toZh(path);
}
var params = new URLSearchParams(window.location.search);
var queryLang = params.get("lang");
if (queryLang === "zh" || queryLang === "en") {
try {
localStorage.setItem(key, queryLang);
} catch (e) {}
}
var savedLang = null;
try {
savedLang = localStorage.getItem(key);
} catch (e) {}
var browserLang = (navigator.language || "").toLowerCase().indexOf("zh") === 0 ? "zh" : "en";
var hasExplicit = queryLang === "zh" || queryLang === "en" || savedLang === "zh" || savedLang === "en";
if (hasExplicit) {
var desiredLang = queryLang === "zh" || queryLang === "en" ? queryLang : savedLang;
if (desiredLang !== currentLang) {
var explicitDest = targetPath(desiredLang);
if (explicitDest && explicitDest !== path) {
window.location.replace(explicitDest + window.location.hash);
return;
}
}
} else {
// First visit: default to English only when browser language is non-Chinese.
if (browserLang === "en" && currentLang === "zh") {
var autoDest = targetPath("en");
if (autoDest && autoDest !== path) {
window.location.replace(autoDest + window.location.hash);
return;
}
}
}
document.addEventListener("DOMContentLoaded", function () {
var links = document.querySelectorAll("[data-lang-switch]");
links.forEach(function (link) {
link.addEventListener("click", function () {
var lang = link.getAttribute("data-lang-switch");
if (lang === "zh" || lang === "en") {
try {
localStorage.setItem(key, lang);
} catch (e) {}
}
});
});
});
})();
+94
View File
@@ -0,0 +1,94 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>MassiveEdit 隐私政策</title>
<meta name="description" content="MassiveEdit 隐私政策说明。" />
<script>
(function () {
try {
var t = localStorage.getItem("massiveedit-theme-mode") || "auto";
if (t !== "light" && t !== "dark") t = "auto";
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
})();
</script>
<link rel="stylesheet" href="./site.css" />
</head>
<body>
<header class="wrap">
<div class="topbar">
<div class="brand">MassiveEdit</div>
<nav class="topnav">
<a href="./index.html">首页</a>
<a href="./download.html">下载</a>
<a href="./changelog.html">更新日志</a>
<a class="active" href="./privacy.html">隐私政策</a>
<a href="https://github.com/paineliu/massiveedit" target="_blank" rel="noopener noreferrer">GitHub</a>
<a href="./en/privacy.html" data-lang-switch="en">EN</a>
<div class="theme-switch" role="group" aria-label="主题">
<button type="button" data-theme-mode="auto" aria-pressed="false">跟随系统</button>
<button type="button" data-theme-mode="light" aria-pressed="false">浅色</button>
<button type="button" data-theme-mode="dark" aria-pressed="false">深色</button>
</div>
</nav>
</div>
</header>
<main class="wrap">
<h1>隐私政策</h1>
<p class="lead">生效日期:2026-03-30</p>
<article class="policy">
<section class="section">
<h2>1. 基本说明</h2>
<p>
MassiveEdit 由五道题(北京)科技有限公司提供。本页面用于说明官网与桌面应用在数据处理方面的基本原则。
</p>
</section>
<section class="section">
<h2>2. 本地文件处理</h2>
<p>
MassiveEdit 的核心编辑行为发生在你的本地设备。你打开、编辑和保存的文件默认不会被上传到我们的服务器。
</p>
</section>
<section class="section">
<h2>3. 官网访问信息</h2>
<p>
官网托管平台可能记录必要的访问日志(如时间、IP、浏览器类型)用于安全与运维。我们不会将这些数据用于与本服务无关的用途。
</p>
</section>
<section class="section">
<h2>4. 联系方式信息</h2>
<p>
当你通过邮箱或电话联系支持时,我们仅在处理问题与回复沟通所需范围内使用你提供的信息。
</p>
</section>
<section class="section">
<h2>5. 政策更新</h2>
<p>如本政策发生变化,我们会在本页面更新版本与生效日期。</p>
</section>
<section class="section">
<h2>6. 联系我们</h2>
<p>
邮箱:<a href="mailto:support@fivequestions.cn">support@fivequestions.cn</a><br />
电话:<a href="tel:+8613661144700">+86 13661144700</a>
</p>
</section>
</article>
</main>
<footer class="wrap">
<div>五道题(北京)科技有限公司</div>
<div><a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener noreferrer">京ICP备2025143052号</a></div>
</footer>
<script src="./theme.js"></script>
<script src="./lang.js" defer></script>
</body>
</html>
+497
View File
@@ -0,0 +1,497 @@
:root,
[data-theme="light"] {
color-scheme: light;
--bg-0: #f3f6fb;
--bg-1: #e7eef7;
--panel: rgba(255, 255, 255, 0.88);
--line: rgba(36, 68, 110, 0.16);
--text: #122033;
--muted: #4d6078;
--accent: #0d8a76;
--accent-2: #c46a16;
--shadow: 0 20px 48px rgba(30, 50, 80, 0.1);
--glow-a: #c7d8ef;
--glow-b: #d5e3f3;
--surface-deep: rgba(255, 255, 255, 0.76);
--ghost-bg: rgba(255, 255, 255, 0.7);
--code-bg: #eef3f8;
--code-text: #16324a;
--btn-ink: #02201a;
--dash: rgba(36, 68, 110, 0.18);
--hero-orb: rgba(196, 106, 22, 0.28);
--dot-glow: rgba(13, 138, 118, 0.35);
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
color-scheme: dark;
--bg-0: #06101f;
--bg-1: #0f1d35;
--panel: rgba(10, 22, 43, 0.72);
--line: rgba(104, 149, 214, 0.32);
--text: #e6efff;
--muted: #b4c5e2;
--accent: #44d1b6;
--accent-2: #ffb65d;
--shadow: 0 24px 60px rgba(0, 0, 0, 0.34);
--glow-a: #1f3e70;
--glow-b: #32456b;
--surface-deep: rgba(8, 19, 35, 0.66);
--ghost-bg: rgba(12, 26, 49, 0.42);
--code-bg: rgba(7, 17, 33, 0.9);
--code-text: #dff7ff;
--btn-ink: #02201a;
--dash: rgba(120, 159, 212, 0.25);
--hero-orb: rgba(255, 182, 93, 0.3);
--dot-glow: rgba(68, 209, 182, 0.9);
}
}
[data-theme="dark"] {
color-scheme: dark;
--bg-0: #06101f;
--bg-1: #0f1d35;
--panel: rgba(10, 22, 43, 0.72);
--line: rgba(104, 149, 214, 0.32);
--text: #e6efff;
--muted: #b4c5e2;
--accent: #44d1b6;
--accent-2: #ffb65d;
--shadow: 0 24px 60px rgba(0, 0, 0, 0.34);
--glow-a: #1f3e70;
--glow-b: #32456b;
--surface-deep: rgba(8, 19, 35, 0.66);
--ghost-bg: rgba(12, 26, 49, 0.42);
--code-bg: rgba(7, 17, 33, 0.9);
--code-text: #dff7ff;
--btn-ink: #02201a;
--dash: rgba(120, 159, 212, 0.25);
--hero-orb: rgba(255, 182, 93, 0.3);
--dot-glow: rgba(68, 209, 182, 0.9);
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
min-height: 100%;
color: var(--text);
background:
radial-gradient(1200px 700px at 8% -10%, var(--glow-a) 0%, transparent 56%),
radial-gradient(1100px 700px at 98% 0%, var(--glow-b) 0%, transparent 62%),
linear-gradient(165deg, var(--bg-1) 0%, var(--bg-0) 65%);
font-family: "Avenir Next", "PingFang SC", "Source Han Sans SC", "Noto Sans CJK SC",
"Microsoft YaHei", "Segoe UI", sans-serif;
}
a {
color: var(--accent);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.wrap {
width: min(1120px, calc(100% - 40px));
margin: 0 auto;
}
.hero {
position: relative;
overflow: hidden;
padding: 26px 0 58px;
}
.hero::after {
content: "";
position: absolute;
width: 320px;
height: 320px;
right: -120px;
top: 36px;
border: 1px solid var(--hero-orb);
border-radius: 42% 58% 56% 44%;
filter: blur(0.3px);
animation: float 7s ease-in-out infinite;
}
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-12px);
}
}
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 50px;
padding: 22px 0 0;
gap: 12px;
}
.hero .topbar {
padding-top: 0;
}
.brand {
display: inline-flex;
align-items: center;
gap: 10px;
font-size: 19px;
letter-spacing: 0.4px;
font-weight: 650;
}
.dot {
width: 10px;
height: 10px;
border-radius: 999px;
background: linear-gradient(135deg, var(--accent), #66ffdf);
box-shadow: 0 0 18px var(--dot-glow);
}
.topnav {
display: inline-flex;
align-items: center;
gap: 14px;
flex-wrap: wrap;
justify-content: flex-end;
}
.topnav a {
color: var(--muted);
font-size: 14px;
}
.topnav a.active {
color: var(--text);
}
.theme-switch {
display: inline-flex;
border: 1px solid var(--line);
border-radius: 999px;
overflow: hidden;
background: var(--panel);
}
.theme-switch button {
border: 0;
background: transparent;
color: var(--muted);
padding: 6px 10px;
font: inherit;
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.theme-switch button.active {
background: var(--accent);
color: var(--btn-ink);
}
.hero-grid {
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 28px;
align-items: center;
}
.eyebrow {
color: var(--accent-2);
font-size: 13px;
letter-spacing: 1.4px;
text-transform: uppercase;
margin-bottom: 10px;
}
h1 {
margin: 10px 0 14px;
font-family: "STZhongsong", "Songti SC", "Noto Serif SC", "Georgia", serif;
font-size: clamp(30px, 5.2vw, 58px);
line-height: 1.08;
}
.lead {
margin: 0 0 26px;
color: var(--muted);
line-height: 1.75;
font-size: 16px;
}
.cta {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 44px;
padding: 0 16px;
border-radius: 11px;
border: 1px solid transparent;
font-weight: 650;
}
.btn-primary {
background: linear-gradient(135deg, var(--accent), #2dc1f3);
color: var(--btn-ink);
}
.btn-ghost {
color: var(--text);
border-color: var(--line);
background: var(--ghost-bg);
}
.hero-panel {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 16px;
padding: 22px 20px;
box-shadow: var(--shadow);
backdrop-filter: blur(8px);
}
.kpi {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.kpi-item {
background: var(--surface-deep);
border: 1px solid var(--line);
border-radius: 12px;
padding: 14px;
}
.kpi-item strong {
display: block;
font-size: 24px;
margin-bottom: 4px;
}
section {
padding: 38px 0;
}
.title {
margin: 0 0 14px;
font-size: clamp(26px, 3.6vw, 36px);
font-family: "STZhongsong", "Songti SC", "Noto Serif SC", "Georgia", serif;
}
.sub {
margin: 0 0 18px;
color: var(--muted);
line-height: 1.72;
}
.grid-3,
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
}
.card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 14px;
padding: 18px 16px;
box-shadow: var(--shadow);
}
.card h2,
.card h3 {
margin: 0 0 8px;
}
.card h2 {
font-size: 22px;
}
.card h3 {
font-size: 18px;
}
.card p,
.meta {
margin: 0;
color: var(--muted);
line-height: 1.68;
}
.meta {
min-height: 86px;
margin-bottom: 12px;
}
.contact {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.line {
display: block;
margin-top: 6px;
color: var(--muted);
}
.tip,
.help {
margin: 0 0 26px;
padding: 12px 14px;
border: 1px solid var(--line);
border-radius: 12px;
background: var(--surface-deep);
color: var(--muted);
}
.help {
margin-top: 28px;
padding: 16px;
}
code {
background: var(--code-bg);
border: 1px solid var(--line);
border-radius: 7px;
padding: 1px 6px;
color: var(--code-text);
font-family: "SFMono-Regular", "JetBrains Mono", "Consolas", monospace;
font-size: 13px;
}
.entry,
.policy {
border: 1px solid var(--line);
border-radius: 14px;
background: var(--panel);
padding: 18px 16px;
}
.entry {
margin-bottom: 14px;
}
.entry-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 8px;
}
.entry h2 {
margin: 0;
font-size: 24px;
}
.date {
color: var(--accent-2);
font-size: 13px;
}
.entry ul {
margin: 0;
padding-left: 18px;
color: var(--muted);
line-height: 1.75;
}
.policy h2 {
margin: 0 0 8px;
font-size: 21px;
}
.policy p {
margin: 0 0 12px;
color: var(--muted);
line-height: 1.76;
}
.section {
padding: 12px 0;
border-bottom: 1px dashed var(--dash);
}
.section:last-child {
border-bottom: none;
}
footer {
padding: 24px 0 36px;
margin-top: 30px;
color: var(--muted);
font-size: 14px;
border-top: 1px solid var(--line);
}
.fade-up {
opacity: 0;
transform: translateY(12px);
animation: fadeUp 0.7s ease forwards;
}
.fade-up.d2 {
animation-delay: 0.12s;
}
.fade-up.d3 {
animation-delay: 0.2s;
}
@keyframes fadeUp {
to {
opacity: 1;
transform: translateY(0);
}
}
@media (max-width: 920px) {
.hero-grid,
.contact,
.grid-3,
.grid {
grid-template-columns: 1fr;
}
.hero {
padding-bottom: 40px;
}
.topbar {
margin-bottom: 28px;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation: none !important;
}
.fade-up {
opacity: 1;
transform: none;
}
}
+46
View File
@@ -0,0 +1,46 @@
(function () {
var STORAGE_KEY = "massiveedit-theme-mode";
var MODES = ["auto", "light", "dark"];
function normalize(mode) {
return MODES.indexOf(mode) >= 0 ? mode : "auto";
}
function readMode() {
try {
return normalize(localStorage.getItem(STORAGE_KEY));
} catch (error) {
return "auto";
}
}
function applyMode(mode) {
var normalized = normalize(mode);
document.documentElement.setAttribute("data-theme", normalized);
try {
localStorage.setItem(STORAGE_KEY, normalized);
} catch (error) {
/* ignore */
}
updateButtons(normalized);
}
function updateButtons(mode) {
document.querySelectorAll("[data-theme-mode]").forEach(function (button) {
var active = button.getAttribute("data-theme-mode") === mode;
button.classList.toggle("active", active);
button.setAttribute("aria-pressed", active ? "true" : "false");
});
}
function bindControls() {
document.querySelectorAll("[data-theme-mode]").forEach(function (button) {
button.addEventListener("click", function () {
applyMode(button.getAttribute("data-theme-mode"));
});
});
}
applyMode(readMode());
document.addEventListener("DOMContentLoaded", bindControls);
})();