# punp **Repository Path**: haukzero/punp ## Basic Information - **Project Name**: punp - **Description**: 一个基于C++编写的高性能文本符号替换工具, 支持多线程将多文本按照制定规则将符号替换, 不依赖任何第三方库 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-07-05 - **Last Updated**: 2025-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## punp - Simple Punctuation Processor 一个基于C++编写的文本符号替换工具, 支持多线程将多文本按照制定规则将符号替换, 不依赖任何第三方库 由于本人有时写文档时容易中英文标点混用, 很不美观, 如果是写tex也可能会出问题, 借助像vscode等工具自带的查找替换工具一个标点一个标点替换过于麻烦, 遂写了这个项目, 凑合能用 ### Update - 2025.7.12: - 调整了写回线程分配任务给线程池的任务批量计算逻辑, 采用实时获取空闲线程数而不是先拿到线程数后用这个固定值为上界, 让一次分配任务的批量尽可能多 - 2025.7.10: - 使用 AC 自动机替代原本朴素查找替换算法, 并根据当前任务的具体情况简化 AC 自动机处理逻辑 - 对 LongBench(zh) (36M) (5 个数据集文件) 测试, 达到 **1.4x speedup** (96ms -> 71ms) - 修复了过早关闭线程池的 Bug - 2025.7.9: - 重构了 PageConfig 相关代码, 将其从 `types.h` 中移出到 `common.h` 中作为常量而不是可变 `struct` - 写回线程尝试将写回任务分配给线程池中的空闲线程, 减轻单个写回线程的压力,优化整体速度 - 在 13th Gen Intel(R) Core(TM) i9-13900H (14 核, 20 逻辑处理器) 上对 LongBench (683M) (66 个数据集文件) 测试, 达到 **1.7x speedup** (5348ms -> 3158ms) - 2025.7.8: - 实现删除规则与清空规则的规则语句识别 - 使用线程池对文件读取并行化, 达到 **1.6x speedup** (151ms -> 96ms) - 2025.7.7: - 添加 version info - 对文件管理做重构, 不再根据文件大小区分是否分块, 统一用分页管理 - 使用更小的page size (16KB); 使用专门的线程负责监听工作线程, 当某个文件的所有page替换完成后直接写回, 不必等到所有文件都替换完成后才一起写回 - 在 13th Gen Intel(R) Core(TM) i9-13900H (14 核, 20 逻辑处理器) 上对 LongBench(zh) (36M) 测试, 达到 **7.8x speedup** (1184ms -> 151ms) - 约束file_finder, 防止替换掉规则文件中的内容 - 2025.7.6: 当处理大文件时, 将大文件分块提交到线程池处理, 提升性能 - 在 13th Gen Intel(R) Core(TM) i9-13900H (14 核, 20 逻辑处理器) 上对 LongBench(zh) (36M) 测试, 达到 **75.1x speedup** (88927ms -> 1184ms) ### 规则编写说明 规则写在`.prules`中, 逻辑非常简单: - 一行一个规则或注释, 不支持一行多语句及语句非左顶格 - 注释: 以 `#` 开头 - 添加规则: - 规则以`"x" -> "y"`的样式罗列, 程序将对目标文本中的`x`全部替换为`y` - 规则语句中的引号, 箭头两边的空格都不能省略 - 对于左值相同的规则, 新加载的语句替换旧语句 - 删除规则: - 规则以`- "x"` 的样式罗列, 程序将尝试删除已导入规则中左值为 `x` 的规则 - 规则语句中 `-` 与左边引号之间的空格不能省略 - 清除当前已导入的规则: `--` - 除了上面指定的注释编写规则, 替换规则编写规则外, 其他语句均不能正确识别 - 对于Linux, 先在`~/.local/share/punp/`中查找规则文件`.prules`, 然后再在当前目录中找 > 其实不仅可以对标点做修改, 也可以对任意字符修改替换, 只要自定义了相关规则即可 ### 编译并安装程序 - 编译 ```bash cmake -Bbuild && cmake --build ./build ``` - 安装(首先确保已经编译通过) ```bash cmake --install ./build ``` ### 使用说明 - 程序后可接多个 option 和多个文件路径 - Options 说明: - `-V`, `--version`: 版本信息 - `-h`, `--help`: 使用说明 - `-r`, `--recursive`: 对一个目录递归的处理里面的文件 - `-v`, `--verbose`: 详细的结果输出 - `-t`, `--threads `: 使用的最大线程数, `n`为一个正整数, 默认情况下, 程序将使用 `min(n_task, hw_max_threads)` 个线程 - 路径支持使用`*`和`?`通配符, 其中`*`可代表任意零个或多个字符, `?`可以代表任意单个字符