Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,9 @@ pre-commit run --all-files
## Install variants

```bash
pip install -e "." # core only
pip install -e ".[api]" # core + FastAPI server
pip install -e "." # core (includes FastAPI server)
pip install -e ".[test]" # core + pytest plugins
pip install -e ".[dev]" # everything (api, test, pre-commit, ruff, pyinstaller)
pip install -e ".[dev]" # everything (test, pre-commit, ruff, pyinstaller)
```

## Pre-commit hooks
Expand Down
48 changes: 10 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
- **灵活的交互方式**:支持「生成结构文件→手动调整→执行校验」的分步流程,兼顾自动化与灵活性

### 实用功能
- **Markdown 转 Word**:支持将 Markdown 文件直接转换为格式化后的 .docx 文档,保留标题层级结构并自动应用配置中的格式规范
- **自动批注生成**:在格式违规位置自动添加 Word 批注,标注问题类型和修正建议
- **文档结构可视化**:通过 `wordf tree` 命令以树形结构展示文档段落分类和层级关系,支持按类别过滤、显示置信度
- **格式一键修正**:支持根据规范自动修正部分常见格式问题(如标题字号、正文行距)
Expand Down Expand Up @@ -53,8 +54,7 @@ pip install pipx # 其他平台
# 安装 WordFormat
pipx install wordformat

# 需要 Web 界面时安装 api 版本
pipx install "wordformat[api]"
pipx install wordformat
```

安装完成后直接使用 `wordf` 或 `wordformat` 命令。
Expand All @@ -63,8 +63,6 @@ pipx install "wordformat[api]"

```bash
pip install wordformat
# 或
pip install "wordformat[api]"
```

> 安装后如果提示"找不到 wordf 命令",说明 Python 脚本目录不在系统 PATH 中。
Expand Down Expand Up @@ -115,12 +113,15 @@ wordf af -d 论文.docx -c 配置.yaml -f 结构文件.json
# 5. 启动 Web 可视化界面
wordf startapi
# 然后在浏览器打开 http://127.0.0.1:8000

# 6. Markdown 转 Word(从 Markdown 直接生成格式化后的 .docx)
wordf md -d 论文.md -c 配置.yaml
```
### startapi命令行预览(推荐使用)

```bash
# 下载api版
pip install "wordformat[api]"
# 安装
pip install wordformat
# 启动 Web 可视化界面
wordf startapi
# 访问 http://127.0.0.1:8000
Expand All @@ -143,39 +144,9 @@ python -m wordformat startapi

更多详细用法请查看 [使用指南](https://github.com/AfishInLake/WordFormat/blob/master/docs/usage.md)

## AI Skill 集成

WordFormat 提供了 **SOLO Skill**,可在 SOLO 等 AI 助手平台中直接调用,实现对话式论文格式化。

### Skill 工作流程

Skill 包含两个独立任务,可分步执行:

| 任务 | 说明 | 产物 |
|------|------|------|
| **任务一:准备配置文件** | 根据格式要求生成/编辑 config.yaml | `config.yaml` |
| **任务二:执行格式化** | 使用配置文件对论文进行格式检查或修正 | `--标注版.docx` 或 `--修改版.docx` |

### Skill 目录结构

```
wordformat-skill/
├── SKILL.md # Skill 定义文件
├── scripts/
│ ├── setup_config.py # 配置文件生成/验证脚本
│ ├── validate_json.py # JSON 标签校验脚本
│ └── validate_config.py # 配置文件验证脚本
└── data/
├── config.yaml # 默认配置模板
├── config_spec.md # 配置文件完整字段规范
├── config_editing_guide.md # 配置编辑指南
├── category_reference.md # 段落分类参考
└── font_size_table.md # 字号对照表
```

### 预设配置库
## 预设配置

项目内置了多所高校的论文格式预设,保存在 `presets/` 目录下,命名格式为 `{学校}_{学院/专业}_{论文类型}.yaml`,可直接使用或在此基础上修改。
项目内置了多所高校的论文格式预设,保存在 `presets/` 目录下,可直接使用或在此基础上修改。

## 详细文档

Expand All @@ -184,6 +155,7 @@ wordformat-skill/
- [安装指南](https://github.com/AfishInLake/WordFormat/blob/master/docs/installation.md) - 环境要求和安装步骤
- [使用指南](https://github.com/AfishInLake/WordFormat/blob/master/docs/usage.md) - 命令行、Python编程和API调用的详细使用方法
- [配置文件说明](https://github.com/AfishInLake/WordFormat/blob/master/docs/configuration.md) - 格式规范配置项和自定义配置方法
- [Markdown 转 Word](https://github.com/AfishInLake/WordFormat/blob/master/docs/md-to-docx.md) - Markdown → Docx 转换功能介绍与使用说明
- [常见问题](https://github.com/AfishInLake/WordFormat/blob/master/docs/faq.md) - 常见问题及解决方案
- [贡献指南](https://github.com/AfishInLake/WordFormat/blob/master/docs/contributing.md) - 如何为项目贡献代码和文档
- [技术架构](https://github.com/AfishInLake/WordFormat/blob/master/docs/architecture.md) - 项目的技术架构和实现原理
Expand Down
4 changes: 2 additions & 2 deletions WordFormatUI/src/config-generator/ConfigGenerator.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@
<ConfigSection title="正文配置">
<div class="grid grid-cols-2 gap-4 mb-4">
<div class="form-item">
<label><input type="checkbox" v-model="userConfig.body_text.rules.punctuation.enabled"> 启用标点符号校验</label>
<label><input type="checkbox" v-model="userConfig.body.text.rules.punctuation.enabled"> 启用标点符号校验</label>
</div>
</div>
<FormatConfig :config="userConfig.body_text" />
<FormatConfig :config="userConfig.body.text" />
</ConfigSection>

<!-- 插图配置 -->
Expand Down
36 changes: 18 additions & 18 deletions WordFormatUI/src/config-generator/components/AbstractConfig.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,42 @@
<div class="abstract-config">
<h3>中文摘要</h3>
<h4>中文标题</h4>
<FormatConfig :config="config.chinese.chinese_title" />
<FormatConfig :config="config.chinese.title" />
<h4 class="mt-4">中文内容</h4>
<FormatConfig :config="config.chinese.chinese_content" />
<FormatConfig :config="config.chinese.body" />

<h3 class="mt-4">英文摘要</h3>
<h4>英文标题</h4>
<FormatConfig :config="config.english.english_title" />
<FormatConfig :config="config.english.title" />
<h4 class="mt-4">英文内容</h4>
<FormatConfig :config="config.english.english_content" />
<FormatConfig :config="config.english.body" />

<h3 class="mt-4">关键词配置</h3>
<h4>中文关键词</h4>
<div class="rules-grid">
<label class="rule-check"><input type="checkbox" v-model="config.keywords.chinese.rules.keyword_count.enabled"> 启用数量检查</label>
<div class="rule-field"><label>最少</label><input type="number" v-model.number="config.keywords.chinese.rules.keyword_count.count_min"></div>
<div class="rule-field"><label>最多</label><input type="number" v-model.number="config.keywords.chinese.rules.keyword_count.count_max"></div>
<label class="rule-check"><input type="checkbox" v-model="config.keywords.chinese.rules.trailing_punctuation.enabled"> 禁止末尾标点</label>
<div class="rule-field"><label>禁止字符</label><input type="text" v-model="config.keywords.chinese.rules.trailing_punctuation.forbidden_chars" :disabled="!config.keywords.chinese.rules.trailing_punctuation.enabled"></div>
<label class="rule-check"><input type="checkbox" v-model="config.chinese.keywords.rules.keyword_count.enabled"> 启用数量检查</label>
<div class="rule-field"><label>最少</label><input type="number" v-model.number="config.chinese.keywords.rules.keyword_count.count_min"></div>
<div class="rule-field"><label>最多</label><input type="number" v-model.number="config.chinese.keywords.rules.keyword_count.count_max"></div>
<label class="rule-check"><input type="checkbox" v-model="config.chinese.keywords.rules.trailing_punctuation.enabled"> 禁止末尾标点</label>
<div class="rule-field"><label>禁止字符</label><input type="text" v-model="config.chinese.keywords.rules.trailing_punctuation.forbidden_chars" :disabled="!config.chinese.keywords.rules.trailing_punctuation.enabled"></div>
</div>
<h5>中文关键词内容格式</h5>
<FormatConfig :config="config.keywords.chinese" />
<FormatConfig :config="config.chinese.keywords" />
<h5 class="mt-3">中文关键词标签("关键词:")</h5>
<FormatConfig :config="config.keywords.chinese.label" />
<FormatConfig :config="config.chinese.keywords.label" />

<h4 class="mt-4">英文关键词</h4>
<div class="rules-grid">
<label class="rule-check"><input type="checkbox" v-model="config.keywords.english.rules.keyword_count.enabled"> 启用数量检查</label>
<div class="rule-field"><label>最少</label><input type="number" v-model.number="config.keywords.english.rules.keyword_count.count_min"></div>
<div class="rule-field"><label>最多</label><input type="number" v-model.number="config.keywords.english.rules.keyword_count.count_max"></div>
<label class="rule-check"><input type="checkbox" v-model="config.keywords.english.rules.trailing_punctuation.enabled"> 禁止末尾标点</label>
<div class="rule-field"><label>禁止字符</label><input type="text" v-model="config.keywords.english.rules.trailing_punctuation.forbidden_chars" :disabled="!config.keywords.english.rules.trailing_punctuation.enabled"></div>
<label class="rule-check"><input type="checkbox" v-model="config.english.keywords.rules.keyword_count.enabled"> 启用数量检查</label>
<div class="rule-field"><label>最少</label><input type="number" v-model.number="config.english.keywords.rules.keyword_count.count_min"></div>
<div class="rule-field"><label>最多</label><input type="number" v-model.number="config.english.keywords.rules.keyword_count.count_max"></div>
<label class="rule-check"><input type="checkbox" v-model="config.english.keywords.rules.trailing_punctuation.enabled"> 禁止末尾标点</label>
<div class="rule-field"><label>禁止字符</label><input type="text" v-model="config.english.keywords.rules.trailing_punctuation.forbidden_chars" :disabled="!config.english.keywords.rules.trailing_punctuation.enabled"></div>
</div>
<h5>英文关键词内容格式</h5>
<FormatConfig :config="config.keywords.english" />
<FormatConfig :config="config.english.keywords" />
<h5 class="mt-3">英文关键词标签("Keywords:")</h5>
<FormatConfig :config="config.keywords.english.label" />
<FormatConfig :config="config.english.keywords.label" />
</div>
</template>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<h3>致谢标题</h3>
<FormatConfig :config="config.title" />
<h3 class="mt-4">致谢内容</h3>
<FormatConfig :config="config.content" />
<FormatConfig :config="config.body" />
</div>
</template>

Expand Down
10 changes: 5 additions & 5 deletions WordFormatUI/src/config-generator/components/FiguresConfig.vue
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<template>
<div class="figures-config">
<div class="rules-grid">
<div class="rule-field"><label>编号前缀</label><input type="text" v-model="config.caption_prefix"></div>
<label class="rule-check"><input type="checkbox" v-model="config.rules.caption_numbering.enabled"> 启用编号检查</label>
<div class="rule-field"><label>分隔符</label><input type="text" v-model="config.rules.caption_numbering.separator" :disabled="!config.rules.caption_numbering.enabled"></div>
<label class="rule-check"><input type="checkbox" v-model="config.rules.caption_numbering.label_number_space" :disabled="!config.rules.caption_numbering.enabled"> 标签-编号间空格</label>
<div class="rule-field"><label>编号前缀</label><input type="text" v-model="config.caption.caption_prefix"></div>
<label class="rule-check"><input type="checkbox" v-model="config.caption.rules.caption_numbering.enabled"> 启用编号检查</label>
<div class="rule-field"><label>分隔符</label><input type="text" v-model="config.caption.rules.caption_numbering.separator" :disabled="!config.caption.rules.caption_numbering.enabled"></div>
<label class="rule-check"><input type="checkbox" v-model="config.caption.rules.caption_numbering.label_number_space" :disabled="!config.caption.rules.caption_numbering.enabled"> 标签-编号间空格</label>
</div>
<h5>题注格式</h5>
<FormatConfig :config="config" />
<FormatConfig :config="config.caption" />
<h5 class="mt-3">图片段落格式</h5>
<FormatConfig :config="config.image" />
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,6 @@
<div class="field" :class="{ disabled: !config.references.enabled }"><label>文本缩进</label><input type="text" v-model="config.references.text_indent" :disabled="!config.references.enabled" placeholder="可选" /><span class="hint">悬挂缩进量</span></div>
</div>
</div>
<div class="level-item">
<h4>题注编号</h4>
<div class="level-controls">
<label class="inline-check"><input type="checkbox" v-model="config.captions.enabled" /><span>启用</span></label>
<div class="field" :class="{ disabled: !config.captions.enabled }"><label>分隔符</label><input type="text" v-model="config.captions.separator" :disabled="!config.captions.enabled" /><span class="hint">如 . - :</span></div>
<label class="inline-check" :class="{ disabled: !config.captions.enabled }"><input type="checkbox" v-model="config.captions.label_number_space" :disabled="!config.captions.enabled" /><span>标签与编号间加空格</span></label>
</div>
</div>
</div>
</div>
</template>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<h3>参考文献标题</h3>
<FormatConfig :config="config.title" />
<h3 class="mt-4">参考文献内容</h3>
<FormatConfig :config="config.content" />
<FormatConfig :config="config.entry" />
</div>
</template>

Expand Down
12 changes: 5 additions & 7 deletions WordFormatUI/src/config-generator/components/TablesConfig.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
<template>
<div class="tables-config">
<div class="rules-grid">
<div class="rule-field"><label>编号前缀</label><input type="text" v-model="config.caption_prefix"></div>
<label class="rule-check"><input type="checkbox" v-model="config.rules.caption_numbering.enabled"> 启用编号检查</label>
<div class="rule-field"><label>分隔符</label><input type="text" v-model="config.rules.caption_numbering.separator" :disabled="!config.rules.caption_numbering.enabled"></div>
<label class="rule-check"><input type="checkbox" v-model="config.rules.caption_numbering.label_number_space" :disabled="!config.rules.caption_numbering.enabled"> 标签-编号间空格</label>
<div class="rule-field"><label>编号前缀</label><input type="text" v-model="config.caption.caption_prefix"></div>
<label class="rule-check"><input type="checkbox" v-model="config.caption.rules.caption_numbering.enabled"> 启用编号检查</label>
<div class="rule-field"><label>分隔符</label><input type="text" v-model="config.caption.rules.caption_numbering.separator" :disabled="!config.caption.rules.caption_numbering.enabled"></div>
<label class="rule-check"><input type="checkbox" v-model="config.caption.rules.caption_numbering.label_number_space" :disabled="!config.caption.rules.caption_numbering.enabled"> 标签-编号间空格</label>
</div>
<h5>题注格式</h5>
<FormatConfig :config="config" />
<FormatConfig :config="config.caption" />
<h5 class="mt-3">表格对象格式</h5>
<FormatConfig :config="config.object" />
<h5 class="mt-3">表格内容格式</h5>
<FormatConfig :config="config.content" />
</div>
</template>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@
<div class="form-item"><label><input type="checkbox" v-model="config.italic"> 斜体</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.underline"> 下划线</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.font_size"> 字号</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.font_name"> 字体名称</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.font_name_cn"> 中文字体名称</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.font_name_en"> 英文字体名称</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.font_color"> 字体颜色</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.alignment"> 对齐方式</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.space_before"> 段前间距</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.space_after"> 段后间距</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.line_spacing"> 行距</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.line_spacingrule"> 行距类型</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.line_spacing_rule"> 行距类型</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.left_indent"> 文本之前</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.right_indent"> 文本之后</label></div>
<div class="form-item"><label><input type="checkbox" v-model="config.first_line_indent"> 段落首行缩进</label></div>
Expand All @@ -29,7 +30,7 @@
<script setup>
import { computed } from 'vue'
const props = defineProps({ config: { type: Object, required: true } })
const FIELDS = ['bold','italic','underline','font_size','font_name','font_color','alignment','space_before','space_after','line_spacing','line_spacingrule','left_indent','right_indent','first_line_indent','builtin_style_name']
const FIELDS = ['bold','italic','underline','font_size','font_name_cn','font_name_en','font_color','alignment','space_before','space_after','line_spacing','line_spacing_rule','left_indent','right_indent','first_line_indent','builtin_style_name']
const allChecked = computed(() => FIELDS.every(f => props.config[f]))
function toggleAll() { const n = !allChecked.value; FIELDS.forEach(f => { props.config[f] = n }) }
</script>
Expand Down
Loading
Loading