Gradio-Lite 本地文本清理:保留段落并检查数据去向
粘贴资料后,只想整理连续空行,不必先把内容交给模型。本文围绕保留原文、按按钮处理和对照结果设计轻量页面,提供原创 Python 函数与浏览器检查流程。资料包只有官方博客索引,没有当前嵌入说明或运行记录,因此页面连接以设计原型呈现,不提供未经…
样本准备与回退边界
本题要解决的是:不部署文本处理 Python 服务,怎样设计一个在浏览器内整理空行的页面,并检查原始资料有没有进入网络请求或持久存储。第一版只处理换行和连续空行,不纠错、不改写、不删除敏感字段。
所给 Hugging Face 博客索引收录了 2023 年 10 月 19 日的 Gradio-Lite: Serverless Gradio Running Entirely in Your Browser。它确认了历史文章条目及浏览器内运行这一主题,但不能证明当前嵌入入口、运行时版本、依赖支持或默认网络行为。下面的清理规则和代码是独立设计,页面接入仍需补充当前官方说明;本文没有完成浏览器运行验证。
- 准备无敏感信息的合成样本,包含中文引号、金额、小数、编号、缩进、单换行和连续空行。
- 保留原始文本副本。预览结果不能覆盖输入,更不能直接覆盖来源文件。
- 使用独立浏览器配置进行检查,记录浏览器版本、操作系统、页面版本及检查时间,减少扩展干扰。
- 页面第一版不加入模型、文件上传、远程接口、自动保存或访问统计;这只是设计约束,仍须检查实际运行页面。
清理不等于脱敏。姓名、联系方式和内部编号不会因为空行减少而失去敏感性;后续提交模型之前仍要另行审核资料范围。
对照样例与字符保留规则
建议第一版采用保守规则:将回车换行和单独回车统一为换行;仅把由普通空格、制表符或全角空格组成的行认作空行;段间最多保留一个空行;删除开头和结尾的空行。非空行的缩进、行尾空格及正文字符全部保留。
下面用 Python 字符串表示输入和预期输出,便于看清隐藏字符。它们是规则演算示例,不是页面运行结果。输入中金额后有两个普通空格,这两个空格也应保留。
输入:
标题:预算说明
金额:1,200.50 元。
“计划”不等于“完成”。
编号:A-001
预期: 标题:预算说明
金额:1,200.50 元。
“计划”不等于“完成”。
编号:A-001| 样本项目 | 预期行为 | 误改信号 |
|---|---|---|
| 中文标点与引号 | 逐字保留 | 全角标点被替换,或引号消失 |
| 金额与编号 | 保留逗号、小数点、连字符和前导零 | 1,200.50 变为其他写法,A-001 丢零 |
| 非空行之间的单换行 | 保持原有行边界 | 两行被拼成一句 |
| 连续空行 | 段间只保留一个空行 | 全部空行被删,段落连成一块 |
| 缩进与行尾空格 | 非空行原样保留 | 缩进或有意义的格式空格被清除 |
这套规则面向普通粘贴资料,不适合作为代码、诗歌、表格或依赖空行数量的格式文档的通用整理规则。此类内容应保留原稿,或关闭空行压缩。
纯函数实现与界面连接
下面是原创 Python 逻辑,不导入第三方包,也不包含网络、文件或存储操作。它不代表整个宿主页面没有其他行为;浏览器运行时对该函数的执行仍需验证。
def clean_text(text):
normalized = text.replace('\r\n', '\n').replace('\r', '\n')
result = []
pending_blank = False
for line in normalized.split('\n'):
if line.strip(' \t\u3000') == '':
if result:
pending_blank = True
continue
if pending_blank:
result.append('')
result.append(line)
pending_blank = False
return '\n'.join(result)
def preview(text):
return clean_text(text)
assert clean_text('') == ''
assert clean_text(' \t\n\u3000') == ''
assert clean_text('a\r\nb') == 'a\nb'
assert clean_text('a\n \t\n\n b ') == 'a\n\n b '
assert clean_text(' x ') == ' x 'strip 只用来判断一行是否为空,不把处理后的行写回结果。因此非空行仍使用原来的 line。不要把它改成对全文按空白分词后重新拼接,否则段落、缩进和正文内空格都会受到影响。上述断言是待执行的检查用例,并非通过记录。
- 从索引定位历史文章,再核对当前官方嵌入说明,登记入口资源版本、浏览器 Python 运行时及配套 Python 包版本。未核对时先停留在函数设计阶段,不拼凑加载地址。
- 按已核对的说明建立最小空页面,先让固定字符串原样返回。确认执行位置在浏览器侧,不把普通服务端应用误当作浏览器内应用。
- 把上面的函数放入该版本规定的 Python 入口,先执行断言。失败时先修正函数或换行输入,不同时加入额外依赖。
- 配置原文输入区、结果预览区、处理按钮和清空按钮。桌面可并排对照,窄屏上下排列;结果按纯文本展示,不把粘贴内容解释为页面标记。
- 仅将处理按钮连接到
preview,输入为原文文本,输出为结果预览。第一版不绑定输入变化自动处理,不配置外部推理请求。 - 清空按钮同时清空原文、预览和错误状态。处理失败时清除旧结果并显示失败状态,避免把上一次结果当作本次输出。
页面连接设计,非框架调用代码:
原文输入 + 处理按钮 → 浏览器内 preview → 只读纯文本预览
清空按钮 → 原文清空 + 预览清空 + 错误状态清空
输入已变化但未处理 → 标记预览尚未更新
运行时未就绪 → 禁用处理
处理异常 → 清除旧预览 + 显示失败以上交付的是函数与界面连接原型,不是可直接打开的完整 HTML 页面。资料包没有当前入口正文,因而不提供看似完整却未经核对的嵌入配方。补齐当前说明并完成下面的核验后,才能把它升级为可发布页面。
依赖兼容与离线状态核对
浏览器 Python 环境不能仅凭本机 Python 能运行来判断兼容。对每个新增包都应重新核对,第一版保持零额外第三方依赖,减少排查范围。下表是待填写的兼容工作表,不是支持列表。
| 核对对象 | 需要登记的内容 | 当前状态与动作 |
|---|---|---|
| 嵌入入口 | 资源来源、固定版本、配套样式及加载方式 | 资料未确认,补充当前官方说明 |
| 浏览器运行时 | 实现名称、版本、Python 版本和浏览器条件 | 资料未确认,以实际加载配置核对 |
| 界面组件与事件 | 文本输入、只读输出、按钮绑定及清空入口 | 资料未确认,先运行最小回显 |
| 清理函数 | 仅使用字符串、列表和循环,无额外包 | 原创实现,须在目标运行时执行断言 |
| 以后新增的包 | 版本、传递依赖、安装来源、原生扩展及运行时支持说明 | 未核对前不加入;不能用桌面安装成功替代浏览器验证 |
需要把运行资源下载与用户文本传输分开记录。页面启动时的资源请求不能直接算作文本上传;反过来,函数没有联网代码也不能证明宿主页面不会发送文本。
- 首次加载:清除该测试站点数据并关闭缓存复用,打开网络记录后加载页面。不输入正文,登记所有资源来源、失败请求及从开始导航到可处理的耗时。
- 处理阶段:保持记录开启,输入唯一合成标记,例如
LOCALCHECK_A7_中文样本,依次观察粘贴、点击处理、清空和离开页面时的请求。查看查询参数、请求体、请求头和长连接消息,不只筛选某一种请求类型。 - 已加载页面断网:运行时就绪后断网,输入一份新样本并处理。记录是否成功;成功只能支持该会话加载后的处理可用,不能推出重新打开也可用。
- 缓存后离线重开:恢复正常缓存设置,在线加载完整页面后,再断网并重新打开或刷新。登记页面、运行时和依赖是否都能恢复。
- 无缓存离线加载:清除测试站点数据后断网打开,单独记录结果。不要把前一步缓存命中写成无缓存也能启动。
每种状态分别填写记录。没有执行的项目写“未执行”,失败写明缺少的资源或错误,不填写推测耗时。
| 测试条件 | 页面可处理 | 耗时与请求 | 时间及产物 |
|---|---|---|---|
| 清缓存、在线首次加载 | 未执行 | 待记录 | 待执行后登记 |
| 页面就绪后断网处理新样本 | 未执行 | 待记录 | 待执行后登记 |
| 正常缓存后离线重开 | 未执行 | 待记录 | 待执行后登记 |
| 无缓存、离线首次加载 | 未执行 | 待记录 | 待执行后登记 |
存储检查也要分阶段做:打开页面后记录基线,处理标记文本后检查一次,清空后检查一次,再重新打开检查。查看 Cookie、Local Storage、Session Storage、IndexedDB、Cache Storage,以及页面注册的后台缓存机制,区分运行资源缓存和用户资料残留。可参照浏览器缓存排查的检查思路组织记录,但不要把其他工具的存储接口或支持范围套用到本页面。
检查结果只对记录中的页面版本、浏览器和动作范围有效。标记未出现在可见请求中不是绝对不外传的证明,还应检查页面代码、第三方资源和可能的编码或延迟发送。网络归档也可能带有测试文本与会话信息,应仅使用合成数据并按权限保存。
故障原因与修正路径
| 常见故障 | 可能原因 | 修正动作 |
|---|---|---|
| 页面停在加载状态 | 入口资源失败、运行时初始化异常或版本不配套 | 先看网络失败项和控制台首条错误,恢复已核对的最小回显页面,再逐项加回功能 |
| 新增包后无法启动 | 依赖含目标运行时不支持的扩展,或依赖版本冲突 | 移除新增包回到纯字符串实现,按官方支持说明核对包及传递依赖 |
| 中文段落全部连在一起 | 使用了按空白分词或删除所有换行的清理方式 | 恢复逐行处理,加入单换行与段间空行用例,保留原文作对照 |
| 全角空格被过度删除 | 把空行判断规则扩展到所有正文字符 | 仅在空行判定中识别全角空格,不替换非空行内字符 |
| 修改原文后预览仍是旧内容 | 未再次处理或异常时保留了旧结果 | 标记待更新状态;失败时清空结果;核对按钮输入输出是否连接正确 |
| 断网处理成功,刷新却失败 | 当前会话已加载资源,但重启所需资源未缓存完整 | 分别记录会话内与重开测试,不宣传完全离线;有离线需求时先补齐经过核对的资源分发方案 |
| 请求中出现合成标记 | 事件绑定、统计、远程调用或宿主逻辑发送了文本 | 暂停投入资料,按请求发起来源定位并移除发送逻辑,重新检查完整操作链 |
| 清空后仍能找到原文 | 自动保存、持久化缓存或页面恢复机制保留了内容 | 定位存储位置,关闭非必要保存并实现对应删除;重新打开复核,不把输入框变空当作已彻底删除 |
发布验收与数据边界
- 当前嵌入入口、运行时、配套包和浏览器版本已登记,最小回显与清理函数用例均有执行记录。
- 空输入、全空白、混合换行、连续空行及重复处理都有检查;再次处理不应继续改变结果。
- 中文标点、金额、小数、编号、非空行缩进和行尾空格与原文一致,单换行没有被合并。
- 原文和预览分开,原稿不会被覆盖;过期预览、初始化、处理失败及清空状态明确,窄屏也能完整查看。
- 网络检查覆盖加载、粘贴、处理、清空与离开页面;资源请求与文本传输分别归类,异常目的地已解释或移除。
- 存储检查覆盖处理前后、清空后与重开后;用户文本残留及运行缓存分别记录,没有把界面清空等同于彻底擦除。
- 首次加载、会话内断网、缓存后离线重开、无缓存离线加载分别有结论;文案只声明已验证的条件。
- 归档页面版本、合成样本、预期与实际输出、环境、检查时间和受控产物位置;未执行项保持明确标记,不作为验收通过。
- 页面说明明确“格式清理不等于脱敏”,不提供零网络请求、绝不外传或全浏览器兼容的无依据承诺。
当前可以交付的是原创纯函数、对照样例、界面连接设计和待执行核对表。下一步应先补充当前官方嵌入与运行时资料,再完成页面接入和网络、存储及离线检查;在这些记录齐全前,不应把原型描述为已经完成兼容与隐私验收的成品。
下一步
把这篇的方法练一遍
提示词和步骤可以带到创作里直接试做一版。