跳到正文Skip to content

批量条件匹配

当一批图片里的文字区域需要按内容、排版或属性统一筛选后再批量修改时,在“批量管理”页使用匹配条件。条件负责筛出命中的区域,批量动作再对这些区域改文字、富文本样式或属性;两者分开,不存在“哪条条件的命中区间才是目标”的歧义。

这里按条件字段与匹配规则。方案的增删改见方案管理(增删改),批量动作见批量动作与执行顺序,预览、写回、备份与恢复见预览、应用与恢复

适用场景

  • 一个方案包含 matchlogic + conditions)与 actions 两部分;条件是前半部分,只筛选区域。
  • 条件为空时,范围内的所有区域都命中(“不填条件表示范围内的所有区域都命中。”)。
  • 条件只在结构正常的区域上求值;结构异常的区域在扫描和执行阶段都会被跳过。
  • 批量管理的条件处理的是主页文件列表中的 *_translations.json 区域数据,与翻译流水线的 batch_sizebatch_concurrent(图片分批/并发翻译)没有关系。

在批量管理中操作

在批量管理页配置匹配条件

  1. 打开左侧主导航中的“批量管理”页面。
  2. 选择或新建一个方案(方案列表操作见方案管理(增删改))。
  3. 在“匹配条件”卡片中,先用逻辑下拉框选择“全部满足”或“任一满足”。
  4. 点击“添加条件”新建一行条件 [字段 ▼] [运算符 ▼] [值] [×];字段下拉框列出全部可匹配字段,运算符随字段类型变化,值编辑器按“字段类型 + 运算符”动态生成。
  5. 修改字段或运算符后,值编辑器会重建;不需要值的运算符(emptynot_emptyis_trueis_false)隐藏值编辑器。
  6. 点击行尾 × 删除该条件(按钮提示为“移除条件”)。
  7. 任何改动都会把方案标记为待保存,约 600 ms 后自动保存到 config/batch_edit_schemes.yaml,同时清空上一次的预览结果。

条件行与值编辑器

每条条件行 [字段 ▼] [运算符 ▼] [值] [×] 的值编辑器按字段类型和运算符现造:

字段类型值编辑器说明
文本单行输入框占位文案为“值”
枚举下拉框直接显示存储值,不翻译;例如排版方向 h/v/hr/vr/auto
数字数值输入框整数范围 -100000…100000;小数保留 3 位、步进 0.05
数字区间低值 + “到” + 高值两个数值输入框
颜色颜色选择器使用“接近颜色”时附带“容差”,范围 0…442、默认 30
布尔“是”/“否”下拉框存储 true/false
字体字体下拉框列出系统字体

条件字段

以下字段出现在“字段”下拉框中;标为“否”的字段只能用于条件,不能作为“批量改区域属性”动作的写入目标。

字段取值说明:

  • translation 匹配的是区域正文:优先取富文本文档的可见文字(换行为 \n),解析失败时回退到 translation 字段。匹配不跑在带 [BR]translation 上,避免 [BR] 四个字符污染字符下标。
  • textprobhas_rich_textline_countregion_index 是只读字段,不会出现在“改 region 属性”动作里。
  • direction 取值会做别名归一化:horizontalhverticalv,并接受 h/v/hr/vr/auto
  • fg_colors/bg_colors 为空时会回退读取 font_color/bg_color,兼容编辑器保存的历史形态。

匹配运算符与规则

运算符由字段类型决定,逐类型列出。

匹配规则:

  • 文本:先 str() 归一,contains/not_contains 是子串判断,eq/ne 是整串相等;empty/not_empty 按去除首尾空白后的文本判断。
  • 正则:使用 re.search 子串搜索;正则表达式非法时,regexnot_regex 都返回不匹配(不会因非法正则报错中断整批扫描)。
  • 枚举:比较前去除首尾空白并转小写;排版方向再做别名归一化。
  • 数字:数值解析失败时该条件不匹配;eq/ne 使用浮点近似比较(相对/绝对容差 1e-9);between 包含两端,且低值大于高值时自动交换。
  • 颜色:按 RGB 距离比较;color_eq 要求距离为 0,color_near 要求距离 ≤ 容差(未提供容差时默认 30.0,UI 范围 0…442)。
  • 布尔:is_true 要求值为真,is_false 要求值为假。
  • 未知字段、未知运算符或字段类型与运算符不匹配时,该条件一律不匹配(返回假)。

条件匹配流程

下图是单条区域从文件到“是否命中”的判定流程(“执行动作”的具体内容见批量动作与执行顺序):

flowchart LR
    A["读取 *_translations.json 中的 region"] --> B{"region 结构正常?"}
    B -->|否| S["跳过(不计入扫描区域数)"]
    B -->|是| C{"方案条件列表为空?"}
    C -->|是| HIT["命中"]
    C -->|否| D["逐条求值:字段取值 → 运算符比较"]
    D --> E{"logic = all 还是 any?"}
    E -->|all| F{"全部条件成立?"}
    E -->|any| G{"至少一条成立?"}
    F -->|是| HIT
    F -->|否| MISS["不命中"]
    G -->|是| HIT
    G -->|否| MISS
    HIT --> R["交给批量动作执行"]

限制说明:上图是代码中的判定路径;translation 的正文口径是富文本可见文字(\n),因此 contains/regex 等运算符看到的是 \n 换行而非 [BR] 标记。执行(应用)阶段会重新读盘并再次跑同一套条件,不会直接套用预览缓存。

限制与注意事项

  • 条件只负责筛区域,动作各自带 pattern 在译文里定位子串;条件与动作不共享“命中区间”。
  • 条件的求值依赖区域里的 texts/lines/translation/富文本等字段;OCR 文本缺失或结构异常的区域会被跳过,不会被条件“选中”。
  • 方案改动后上一次预览自动作废,需要重新点击“预览命中”生成新的命中列表。
  • 批量管理条件与翻译设置的 context_sizebatch_sizebatch_concurrent 完全无关:前者操作的是已翻译 JSON 的区域数据,后者控制翻译流水线的分批与并发。
  • 这里不读取或展示真实 .env、用户 config.json 或任务产物;方案 YAML 只记录条件和动作结构,不包含凭据。