ciit-lesson-plan 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ciit_lesson_plan-0.1.2/LICENSE +20 -0
- ciit_lesson_plan-0.1.2/PKG-INFO +87 -0
- ciit_lesson_plan-0.1.2/README.md +74 -0
- ciit_lesson_plan-0.1.2/ciit_lesson_plan.egg-info/PKG-INFO +87 -0
- ciit_lesson_plan-0.1.2/ciit_lesson_plan.egg-info/SOURCES.txt +9 -0
- ciit_lesson_plan-0.1.2/ciit_lesson_plan.egg-info/dependency_links.txt +1 -0
- ciit_lesson_plan-0.1.2/ciit_lesson_plan.egg-info/requires.txt +1 -0
- ciit_lesson_plan-0.1.2/ciit_lesson_plan.egg-info/top_level.txt +1 -0
- ciit_lesson_plan-0.1.2/ciit_lesson_plan.py +489 -0
- ciit_lesson_plan-0.1.2/pyproject.toml +26 -0
- ciit_lesson_plan-0.1.2/setup.cfg +4 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
Copyright (c) 2025 Yongshun Song
|
|
3
|
+
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
in the Software without restriction, including without limitation the rights
|
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
|
12
|
+
all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
20
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ciit-lesson-plan
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: 这是一个用于将Markdown格式的教学计划内容转换为Word文档(.docx)的Python脚本。该脚本使用python_docx库来处理Word文档,能够读取Markdown文件内容,并根据预定义的模板生成格式化的教案文档。
|
|
5
|
+
Author-email: Yongshun Song <ys_song@foxmail.com>
|
|
6
|
+
Maintainer-email: Yongshun Song <ys_song@foxmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Keywords: lesson,plan,ciit,teaching,docx
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: python-docx
|
|
12
|
+
Dynamic: license-file
|
|
13
|
+
|
|
14
|
+
# `lesson_plan.py` 使用说明
|
|
15
|
+
|
|
16
|
+
## 简介
|
|
17
|
+
`lesson_plan.py` 是一个用于将 Markdown 文件转换为格式化 Word 文档(.docx)的 Python 脚本。它主要用于生成教学教案文档,支持从 Markdown 文件中提取内容并按照预定义的模板格式化输出。
|
|
18
|
+
|
|
19
|
+
## 功能
|
|
20
|
+
- 从 Markdown 文件中提取内容。
|
|
21
|
+
- 将提取的内容填充到 Word 文档模板中。
|
|
22
|
+
- 支持自定义输出文件名。
|
|
23
|
+
- 支持复杂的表格格式,包括单元格合并、字体样式、背景颜色等。
|
|
24
|
+
|
|
25
|
+
## 依赖库
|
|
26
|
+
- `python-docx`: 用于创建和修改 Word 文档。
|
|
27
|
+
- `re`: 用于正则表达式操作。
|
|
28
|
+
|
|
29
|
+
## 使用方法
|
|
30
|
+
1. 准备一个 Markdown 文件,文件名格式为 `lesson_{number}.md`,其中 `{number}` 是一个数字。
|
|
31
|
+
2. 准备一个 Word 文档模板 `lesson_template.docx`。
|
|
32
|
+
3. 运行脚本:
|
|
33
|
+
```bash
|
|
34
|
+
python lesson_plan.py
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 输入文件结构
|
|
38
|
+
Markdown 文件应包含以下部分:
|
|
39
|
+
- **项目名称**
|
|
40
|
+
- **授课类型**
|
|
41
|
+
- **授课周次**
|
|
42
|
+
- **授课学时**
|
|
43
|
+
- **知识目标**
|
|
44
|
+
- **能力目标**
|
|
45
|
+
- **素质目标**
|
|
46
|
+
- **学情分析**
|
|
47
|
+
- **教学重点**
|
|
48
|
+
- **教学难点**
|
|
49
|
+
- **教学方法**
|
|
50
|
+
- **教材资源**
|
|
51
|
+
- **课前:教学内容**
|
|
52
|
+
- **课前:学生活动**
|
|
53
|
+
- **课前:教师活动**
|
|
54
|
+
- **课前:设计意图**
|
|
55
|
+
- **项目导入:教学内容**
|
|
56
|
+
- **项目导入:学生活动**
|
|
57
|
+
- **项目导入:教师活动**
|
|
58
|
+
- **项目导入:设计意图**
|
|
59
|
+
- **内容展开:教学内容**
|
|
60
|
+
- **内容展开:学生活动**
|
|
61
|
+
- **内容展开:教师活动**
|
|
62
|
+
- **内容展开:设计意图**
|
|
63
|
+
- **课堂小结:教学内容**
|
|
64
|
+
- **课堂小结:学生活动**
|
|
65
|
+
- **课堂小结:教师活动**
|
|
66
|
+
- **课堂小结:设计意图**
|
|
67
|
+
- **课后:教学内容**
|
|
68
|
+
- **课后:学生活动**
|
|
69
|
+
- **课后:教师活动**
|
|
70
|
+
- **课后:设计意图**
|
|
71
|
+
- **教学反思:教学效果**
|
|
72
|
+
- **教学反思:诊断**
|
|
73
|
+
- **教学反思:改进**
|
|
74
|
+
|
|
75
|
+
## 输出文件
|
|
76
|
+
生成的 Word 文档将保存在当前目录下,文件名格式为 `{number}-{project_name}-教案.docx`,其中 `{number}` 是从 Markdown 文件名中提取的编号,`{project_name}` 是从 Markdown 文件中提取的项目名称。
|
|
77
|
+
|
|
78
|
+
## 注意事项
|
|
79
|
+
- 确保 Markdown 文件和 Word 模板文件路径正确。
|
|
80
|
+
- 确保 Markdown 文件内容格式正确,避免解析错误。
|
|
81
|
+
- 脚本中使用了复杂的表格格式化功能,确保 `python-docx` 版本支持这些功能。
|
|
82
|
+
|
|
83
|
+
## 作者
|
|
84
|
+
Yongshun Song
|
|
85
|
+
|
|
86
|
+
## 许可证
|
|
87
|
+
MIT License
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# `lesson_plan.py` 使用说明
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
`lesson_plan.py` 是一个用于将 Markdown 文件转换为格式化 Word 文档(.docx)的 Python 脚本。它主要用于生成教学教案文档,支持从 Markdown 文件中提取内容并按照预定义的模板格式化输出。
|
|
5
|
+
|
|
6
|
+
## 功能
|
|
7
|
+
- 从 Markdown 文件中提取内容。
|
|
8
|
+
- 将提取的内容填充到 Word 文档模板中。
|
|
9
|
+
- 支持自定义输出文件名。
|
|
10
|
+
- 支持复杂的表格格式,包括单元格合并、字体样式、背景颜色等。
|
|
11
|
+
|
|
12
|
+
## 依赖库
|
|
13
|
+
- `python-docx`: 用于创建和修改 Word 文档。
|
|
14
|
+
- `re`: 用于正则表达式操作。
|
|
15
|
+
|
|
16
|
+
## 使用方法
|
|
17
|
+
1. 准备一个 Markdown 文件,文件名格式为 `lesson_{number}.md`,其中 `{number}` 是一个数字。
|
|
18
|
+
2. 准备一个 Word 文档模板 `lesson_template.docx`。
|
|
19
|
+
3. 运行脚本:
|
|
20
|
+
```bash
|
|
21
|
+
python lesson_plan.py
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 输入文件结构
|
|
25
|
+
Markdown 文件应包含以下部分:
|
|
26
|
+
- **项目名称**
|
|
27
|
+
- **授课类型**
|
|
28
|
+
- **授课周次**
|
|
29
|
+
- **授课学时**
|
|
30
|
+
- **知识目标**
|
|
31
|
+
- **能力目标**
|
|
32
|
+
- **素质目标**
|
|
33
|
+
- **学情分析**
|
|
34
|
+
- **教学重点**
|
|
35
|
+
- **教学难点**
|
|
36
|
+
- **教学方法**
|
|
37
|
+
- **教材资源**
|
|
38
|
+
- **课前:教学内容**
|
|
39
|
+
- **课前:学生活动**
|
|
40
|
+
- **课前:教师活动**
|
|
41
|
+
- **课前:设计意图**
|
|
42
|
+
- **项目导入:教学内容**
|
|
43
|
+
- **项目导入:学生活动**
|
|
44
|
+
- **项目导入:教师活动**
|
|
45
|
+
- **项目导入:设计意图**
|
|
46
|
+
- **内容展开:教学内容**
|
|
47
|
+
- **内容展开:学生活动**
|
|
48
|
+
- **内容展开:教师活动**
|
|
49
|
+
- **内容展开:设计意图**
|
|
50
|
+
- **课堂小结:教学内容**
|
|
51
|
+
- **课堂小结:学生活动**
|
|
52
|
+
- **课堂小结:教师活动**
|
|
53
|
+
- **课堂小结:设计意图**
|
|
54
|
+
- **课后:教学内容**
|
|
55
|
+
- **课后:学生活动**
|
|
56
|
+
- **课后:教师活动**
|
|
57
|
+
- **课后:设计意图**
|
|
58
|
+
- **教学反思:教学效果**
|
|
59
|
+
- **教学反思:诊断**
|
|
60
|
+
- **教学反思:改进**
|
|
61
|
+
|
|
62
|
+
## 输出文件
|
|
63
|
+
生成的 Word 文档将保存在当前目录下,文件名格式为 `{number}-{project_name}-教案.docx`,其中 `{number}` 是从 Markdown 文件名中提取的编号,`{project_name}` 是从 Markdown 文件中提取的项目名称。
|
|
64
|
+
|
|
65
|
+
## 注意事项
|
|
66
|
+
- 确保 Markdown 文件和 Word 模板文件路径正确。
|
|
67
|
+
- 确保 Markdown 文件内容格式正确,避免解析错误。
|
|
68
|
+
- 脚本中使用了复杂的表格格式化功能,确保 `python-docx` 版本支持这些功能。
|
|
69
|
+
|
|
70
|
+
## 作者
|
|
71
|
+
Yongshun Song
|
|
72
|
+
|
|
73
|
+
## 许可证
|
|
74
|
+
MIT License
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ciit-lesson-plan
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: 这是一个用于将Markdown格式的教学计划内容转换为Word文档(.docx)的Python脚本。该脚本使用python_docx库来处理Word文档,能够读取Markdown文件内容,并根据预定义的模板生成格式化的教案文档。
|
|
5
|
+
Author-email: Yongshun Song <ys_song@foxmail.com>
|
|
6
|
+
Maintainer-email: Yongshun Song <ys_song@foxmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Keywords: lesson,plan,ciit,teaching,docx
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: python-docx
|
|
12
|
+
Dynamic: license-file
|
|
13
|
+
|
|
14
|
+
# `lesson_plan.py` 使用说明
|
|
15
|
+
|
|
16
|
+
## 简介
|
|
17
|
+
`lesson_plan.py` 是一个用于将 Markdown 文件转换为格式化 Word 文档(.docx)的 Python 脚本。它主要用于生成教学教案文档,支持从 Markdown 文件中提取内容并按照预定义的模板格式化输出。
|
|
18
|
+
|
|
19
|
+
## 功能
|
|
20
|
+
- 从 Markdown 文件中提取内容。
|
|
21
|
+
- 将提取的内容填充到 Word 文档模板中。
|
|
22
|
+
- 支持自定义输出文件名。
|
|
23
|
+
- 支持复杂的表格格式,包括单元格合并、字体样式、背景颜色等。
|
|
24
|
+
|
|
25
|
+
## 依赖库
|
|
26
|
+
- `python-docx`: 用于创建和修改 Word 文档。
|
|
27
|
+
- `re`: 用于正则表达式操作。
|
|
28
|
+
|
|
29
|
+
## 使用方法
|
|
30
|
+
1. 准备一个 Markdown 文件,文件名格式为 `lesson_{number}.md`,其中 `{number}` 是一个数字。
|
|
31
|
+
2. 准备一个 Word 文档模板 `lesson_template.docx`。
|
|
32
|
+
3. 运行脚本:
|
|
33
|
+
```bash
|
|
34
|
+
python lesson_plan.py
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 输入文件结构
|
|
38
|
+
Markdown 文件应包含以下部分:
|
|
39
|
+
- **项目名称**
|
|
40
|
+
- **授课类型**
|
|
41
|
+
- **授课周次**
|
|
42
|
+
- **授课学时**
|
|
43
|
+
- **知识目标**
|
|
44
|
+
- **能力目标**
|
|
45
|
+
- **素质目标**
|
|
46
|
+
- **学情分析**
|
|
47
|
+
- **教学重点**
|
|
48
|
+
- **教学难点**
|
|
49
|
+
- **教学方法**
|
|
50
|
+
- **教材资源**
|
|
51
|
+
- **课前:教学内容**
|
|
52
|
+
- **课前:学生活动**
|
|
53
|
+
- **课前:教师活动**
|
|
54
|
+
- **课前:设计意图**
|
|
55
|
+
- **项目导入:教学内容**
|
|
56
|
+
- **项目导入:学生活动**
|
|
57
|
+
- **项目导入:教师活动**
|
|
58
|
+
- **项目导入:设计意图**
|
|
59
|
+
- **内容展开:教学内容**
|
|
60
|
+
- **内容展开:学生活动**
|
|
61
|
+
- **内容展开:教师活动**
|
|
62
|
+
- **内容展开:设计意图**
|
|
63
|
+
- **课堂小结:教学内容**
|
|
64
|
+
- **课堂小结:学生活动**
|
|
65
|
+
- **课堂小结:教师活动**
|
|
66
|
+
- **课堂小结:设计意图**
|
|
67
|
+
- **课后:教学内容**
|
|
68
|
+
- **课后:学生活动**
|
|
69
|
+
- **课后:教师活动**
|
|
70
|
+
- **课后:设计意图**
|
|
71
|
+
- **教学反思:教学效果**
|
|
72
|
+
- **教学反思:诊断**
|
|
73
|
+
- **教学反思:改进**
|
|
74
|
+
|
|
75
|
+
## 输出文件
|
|
76
|
+
生成的 Word 文档将保存在当前目录下,文件名格式为 `{number}-{project_name}-教案.docx`,其中 `{number}` 是从 Markdown 文件名中提取的编号,`{project_name}` 是从 Markdown 文件中提取的项目名称。
|
|
77
|
+
|
|
78
|
+
## 注意事项
|
|
79
|
+
- 确保 Markdown 文件和 Word 模板文件路径正确。
|
|
80
|
+
- 确保 Markdown 文件内容格式正确,避免解析错误。
|
|
81
|
+
- 脚本中使用了复杂的表格格式化功能,确保 `python-docx` 版本支持这些功能。
|
|
82
|
+
|
|
83
|
+
## 作者
|
|
84
|
+
Yongshun Song
|
|
85
|
+
|
|
86
|
+
## 许可证
|
|
87
|
+
MIT License
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
ciit_lesson_plan.py
|
|
4
|
+
pyproject.toml
|
|
5
|
+
ciit_lesson_plan.egg-info/PKG-INFO
|
|
6
|
+
ciit_lesson_plan.egg-info/SOURCES.txt
|
|
7
|
+
ciit_lesson_plan.egg-info/dependency_links.txt
|
|
8
|
+
ciit_lesson_plan.egg-info/requires.txt
|
|
9
|
+
ciit_lesson_plan.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
python-docx
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ciit_lesson_plan
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
from docx import Document
|
|
2
|
+
from docx.shared import Pt, Cm, RGBColor
|
|
3
|
+
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
|
4
|
+
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
|
|
5
|
+
from docx.oxml import OxmlElement
|
|
6
|
+
from docx.oxml.ns import qn
|
|
7
|
+
from docx.table import _Cell
|
|
8
|
+
import re
|
|
9
|
+
import argparse
|
|
10
|
+
|
|
11
|
+
# 课前,课中等字体设置
|
|
12
|
+
def _color_white(merged_cell: _Cell):
|
|
13
|
+
"""
|
|
14
|
+
设置合并单元格的文本居中、背景色为 #1A5F88,并设置字体颜色为白色且加粗。
|
|
15
|
+
|
|
16
|
+
参数:
|
|
17
|
+
merged_cell (_Cell): 要设置格式的表格单元格对象
|
|
18
|
+
"""
|
|
19
|
+
# 设置单元格文本水平居中
|
|
20
|
+
paragraph = merged_cell.paragraphs[0]
|
|
21
|
+
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
|
22
|
+
|
|
23
|
+
# 设置背景色为 #1A5F88
|
|
24
|
+
tc = merged_cell._tc
|
|
25
|
+
tcPr = tc.get_or_add_tcPr()
|
|
26
|
+
shd = OxmlElement('w:shd')
|
|
27
|
+
shd.set(qn('w:fill'), '1A5F88') # 使用十六进制颜色码
|
|
28
|
+
tcPr.append(shd)
|
|
29
|
+
|
|
30
|
+
# 设置字体颜色为白色
|
|
31
|
+
run = paragraph.runs[0] if paragraph.runs else paragraph.add_run()
|
|
32
|
+
font = run.font
|
|
33
|
+
font.color.rgb = RGBColor(255, 255, 255)
|
|
34
|
+
run.font.size = Pt(16) # 设置字体大小为16pt
|
|
35
|
+
run.font.name = '微软雅黑' # 设置字体为"微软雅黑"
|
|
36
|
+
run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 确保中文字体兼容
|
|
37
|
+
run.bold = True # 添加这一行以实现加粗
|
|
38
|
+
|
|
39
|
+
def _read_markdown(file_path):
|
|
40
|
+
with open(file_path, 'r', encoding='utf-8') as file:
|
|
41
|
+
return file.read()
|
|
42
|
+
|
|
43
|
+
def _parse_markdown(content):
|
|
44
|
+
data = {}
|
|
45
|
+
current_key = None
|
|
46
|
+
for line in content.splitlines():
|
|
47
|
+
if line.startswith('# '):
|
|
48
|
+
current_key = line[2:].strip()
|
|
49
|
+
data[current_key] = ''
|
|
50
|
+
elif line.startswith('## '):
|
|
51
|
+
current_key = line[3:].strip()
|
|
52
|
+
data[current_key] = ''
|
|
53
|
+
elif line.startswith('### '):
|
|
54
|
+
current_key = line[4:].strip()
|
|
55
|
+
data[current_key] = ''
|
|
56
|
+
elif current_key:
|
|
57
|
+
data[current_key] += line.strip() + '\n'
|
|
58
|
+
return data
|
|
59
|
+
|
|
60
|
+
def convert_md_to_docx(template_path, markdown_path):
|
|
61
|
+
template_path = 'template.docx'
|
|
62
|
+
output_dir = '.' # 输出目录
|
|
63
|
+
document = Document(template_path)
|
|
64
|
+
|
|
65
|
+
# 获取文档中的所有内容元素(段落和表格)
|
|
66
|
+
all_elements = []
|
|
67
|
+
for block in document.element.body:
|
|
68
|
+
if block.tag == qn('w:p'): # 是段落
|
|
69
|
+
all_elements.append({'type': 'paragraph', 'element': block})
|
|
70
|
+
elif block.tag == qn('w:tbl'): # 是表格
|
|
71
|
+
all_elements.append({'type': 'table', 'element': block})
|
|
72
|
+
|
|
73
|
+
# 找到第17个段落的索引
|
|
74
|
+
last_paragraph_to_keep_index = -1
|
|
75
|
+
paragraph_count = 0
|
|
76
|
+
for i, item in enumerate(all_elements):
|
|
77
|
+
if item['type'] == 'paragraph':
|
|
78
|
+
paragraph_count += 1
|
|
79
|
+
if paragraph_count == 17:
|
|
80
|
+
last_paragraph_to_keep_index = i
|
|
81
|
+
break
|
|
82
|
+
|
|
83
|
+
# 如果文档中的段落少于17个,则不删除任何段落
|
|
84
|
+
if last_paragraph_to_keep_index == -1 and paragraph_count < 17:
|
|
85
|
+
print(f"文档中的段落少于 17 个,不执行删除操作。")
|
|
86
|
+
else:
|
|
87
|
+
# 从第17个段落之后开始删除
|
|
88
|
+
# 从后往前删除,避免索引问题
|
|
89
|
+
for i in range(len(all_elements) - 1, last_paragraph_to_keep_index, -1):
|
|
90
|
+
element_to_delete = all_elements[i]['element']
|
|
91
|
+
parent = element_to_delete.getparent()
|
|
92
|
+
parent.remove(element_to_delete)
|
|
93
|
+
|
|
94
|
+
# 读取Markdown文件内容
|
|
95
|
+
markdown_content = _read_markdown(markdown_path)
|
|
96
|
+
parsed_data = _parse_markdown(markdown_content)
|
|
97
|
+
|
|
98
|
+
# 提取项目名称
|
|
99
|
+
project_name = parsed_data.get("项目名称", "").strip()
|
|
100
|
+
|
|
101
|
+
# 从输入文件名中提取编号
|
|
102
|
+
match = re.search(r'ja-(\d+)-out\.md', markdown_path)
|
|
103
|
+
if match:
|
|
104
|
+
number = match.group(1)
|
|
105
|
+
else:
|
|
106
|
+
number = "1"
|
|
107
|
+
|
|
108
|
+
# 构建输出文件名
|
|
109
|
+
output_path = f"{output_dir}/{number}-{project_name}-教案.docx"
|
|
110
|
+
|
|
111
|
+
# 创建表格,第一行是2-5列合并,第二行是2-3列合并,第三行是3-5列合并
|
|
112
|
+
table = document.add_table(rows=10, cols=5)
|
|
113
|
+
table.style = 'Table Grid'
|
|
114
|
+
table.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
|
115
|
+
|
|
116
|
+
# 设置列宽,默认表格总宽度是20.
|
|
117
|
+
col_widths = [1.0, 4.5, 7, 4, 3.5]
|
|
118
|
+
for i, width_cm in enumerate(col_widths):
|
|
119
|
+
table.columns[i].width = Cm(width_cm)
|
|
120
|
+
for row in table.rows:
|
|
121
|
+
row.cells[i].width = Cm(width_cm)
|
|
122
|
+
|
|
123
|
+
# 合并单元格(保持原有逻辑)
|
|
124
|
+
cell_0_0 = table.cell(0, 0)
|
|
125
|
+
cell_0_1 = table.cell(0, 1)
|
|
126
|
+
cell_0_1.merge(table.cell(0, 4)) # 第0行:1-4列合并
|
|
127
|
+
|
|
128
|
+
cell_1_1 = table.cell(1, 1)
|
|
129
|
+
cell_1_1.merge(table.cell(1, 2)) # 第1行:1-2列合并
|
|
130
|
+
|
|
131
|
+
cell_2_2 = table.cell(2, 2)
|
|
132
|
+
cell_2_2.merge(table.cell(2, 4)) # 第2行:2-4列合并
|
|
133
|
+
|
|
134
|
+
cell_3_2 = table.cell(3, 2)
|
|
135
|
+
cell_3_2.merge(table.cell(3, 4)) # 第3行:2-4列合并
|
|
136
|
+
|
|
137
|
+
cell_4_2 = table.cell(4, 2)
|
|
138
|
+
cell_4_2.merge(table.cell(4, 4)) # 第4行:2-4列合并
|
|
139
|
+
|
|
140
|
+
cell_5_1 = table.cell(5, 1)
|
|
141
|
+
cell_5_1.merge(table.cell(5, 4)) # 第5行:1-4列合并
|
|
142
|
+
|
|
143
|
+
cell_6_1 = table.cell(6, 1)
|
|
144
|
+
cell_6_1.merge(table.cell(6, 4)) # 第6行:1-4列合并
|
|
145
|
+
|
|
146
|
+
cell_7_1 = table.cell(7, 1)
|
|
147
|
+
cell_7_1.merge(table.cell(7, 4)) # 第7行:1-4列合并
|
|
148
|
+
|
|
149
|
+
cell_8_1 = table.cell(8, 1)
|
|
150
|
+
cell_8_1.merge(table.cell(8, 4)) # 第8行:1-4列合并
|
|
151
|
+
|
|
152
|
+
cell_9_1 = table.cell(9, 1)
|
|
153
|
+
cell_9_1.merge(table.cell(9, 4)) # 第9行:1-4列合并
|
|
154
|
+
|
|
155
|
+
# 设置内容(从Markdown文件中读取)
|
|
156
|
+
cell_0_0.text = "项目名称"
|
|
157
|
+
cell_0_1.text = project_name
|
|
158
|
+
|
|
159
|
+
cell_1_0 = table.cell(1, 0)
|
|
160
|
+
cell_1_0.text = "授课类型"
|
|
161
|
+
cell_1_1.text = parsed_data.get("授课类型", "").strip()
|
|
162
|
+
|
|
163
|
+
cell_1_3 = table.cell(1, 3)
|
|
164
|
+
cell_1_4 = table.cell(1, 4)
|
|
165
|
+
cell_1_3.text = parsed_data.get("授课周次", "").strip()
|
|
166
|
+
cell_1_4.text = parsed_data.get("授课学时", "").strip()
|
|
167
|
+
|
|
168
|
+
cell_2_0 = table.cell(2, 0)
|
|
169
|
+
cell_2_1 = table.cell(2, 1)
|
|
170
|
+
cell_2_0.text = "教学目标"
|
|
171
|
+
cell_2_1.text = "知识目标:"
|
|
172
|
+
cell_2_2.text = parsed_data.get("知识目标", "").strip()
|
|
173
|
+
|
|
174
|
+
cell_3_0 = table.cell(3, 0)
|
|
175
|
+
cell_3_0.merge(table.cell(2, 0)) # 合并到上一行
|
|
176
|
+
cell_3_1 = table.cell(3, 1)
|
|
177
|
+
cell_3_1.text = "能力目标:"
|
|
178
|
+
cell_3_2.text = parsed_data.get("能力目标", "").strip()
|
|
179
|
+
|
|
180
|
+
cell_4_0 = table.cell(4, 0)
|
|
181
|
+
cell_4_0.merge(table.cell(3, 0)) # 继续合并
|
|
182
|
+
cell_4_1 = table.cell(4, 1)
|
|
183
|
+
cell_4_1.text = "素质目标:"
|
|
184
|
+
cell_4_2.text = parsed_data.get("素质目标", "").strip()
|
|
185
|
+
|
|
186
|
+
cell_5_0 = table.cell(5, 0)
|
|
187
|
+
cell_5_0.text = "学情分析"
|
|
188
|
+
cell_5_1.text = parsed_data.get("学情分析", "").strip()
|
|
189
|
+
|
|
190
|
+
cell_6_0 = table.cell(6, 0)
|
|
191
|
+
cell_6_0.text = "教学重点"
|
|
192
|
+
cell_6_1.text = parsed_data.get("教学重点", "").strip()
|
|
193
|
+
|
|
194
|
+
cell_7_0 = table.cell(7, 0)
|
|
195
|
+
cell_7_0.text = "教学难点"
|
|
196
|
+
cell_7_1.text = parsed_data.get("教学难点", "").strip()
|
|
197
|
+
|
|
198
|
+
cell_8_0 = table.cell(8, 0)
|
|
199
|
+
cell_8_0.text = "教学方法"
|
|
200
|
+
cell_8_1.text = parsed_data.get("教学方法", "").strip()
|
|
201
|
+
|
|
202
|
+
cell_9_0 = table.cell(9, 0)
|
|
203
|
+
cell_9_0.text = "教材资源"
|
|
204
|
+
cell_9_1.text = parsed_data.get("教材资源", "").strip()
|
|
205
|
+
|
|
206
|
+
# 👇 设置外边框为 12
|
|
207
|
+
tbl = table._element
|
|
208
|
+
# 修正:使用正确的属性获取方法
|
|
209
|
+
tblPr = tbl.tblPr
|
|
210
|
+
if tblPr is None:
|
|
211
|
+
tblPr = OxmlElement('w:tblPr')
|
|
212
|
+
tbl.insert(0, tblPr)
|
|
213
|
+
|
|
214
|
+
tblBorders = OxmlElement('w:tblBorders')
|
|
215
|
+
|
|
216
|
+
for border_name in ['top', 'bottom', 'left', 'right']:
|
|
217
|
+
border = OxmlElement(f'w:{border_name}')
|
|
218
|
+
border.set(qn('w:val'), 'single')
|
|
219
|
+
border.set(qn('w:sz'), '12')
|
|
220
|
+
border.set(qn('w:color'), 'auto')
|
|
221
|
+
border.set(qn('w:space'), '0')
|
|
222
|
+
tblBorders.append(border)
|
|
223
|
+
|
|
224
|
+
tblPr.append(tblBorders)
|
|
225
|
+
|
|
226
|
+
# 👇 统一设置字体格式 + 垂直居中
|
|
227
|
+
for row_idx, row in enumerate(table.rows):
|
|
228
|
+
for col in range(5):
|
|
229
|
+
cell = row.cells[col]
|
|
230
|
+
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
|
|
231
|
+
|
|
232
|
+
for paragraph in cell.paragraphs:
|
|
233
|
+
for run in paragraph.runs:
|
|
234
|
+
run.font.name = '宋体'
|
|
235
|
+
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
|
|
236
|
+
run.font.size = Pt(10.5)
|
|
237
|
+
run.bold = False
|
|
238
|
+
|
|
239
|
+
if col == 0:
|
|
240
|
+
run.font.size = Pt(12)
|
|
241
|
+
run.bold = True
|
|
242
|
+
|
|
243
|
+
if col == 1 and row_idx in [2, 3, 4]:
|
|
244
|
+
run.font.size = Pt(12)
|
|
245
|
+
run.bold = True
|
|
246
|
+
|
|
247
|
+
# 设置所有行高
|
|
248
|
+
for row in table.rows:
|
|
249
|
+
row.height = Cm(1.5)
|
|
250
|
+
|
|
251
|
+
# 添加表格,共5列,第一行内容为"课前",5列合并为1列
|
|
252
|
+
table = document.add_table(rows=18, cols=5) # 修改:将行数改为8行
|
|
253
|
+
table.style = 'Table Grid'
|
|
254
|
+
table.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
|
255
|
+
|
|
256
|
+
# 设置列宽
|
|
257
|
+
col_widths = [1.0, 14.0, 1.8, 1.2, 2] # 每列宽度均为4厘米
|
|
258
|
+
for i, width_cm in enumerate(col_widths):
|
|
259
|
+
table.columns[i].width = Cm(width_cm)
|
|
260
|
+
for row in table.rows:
|
|
261
|
+
row.cells[i].width = Cm(width_cm)
|
|
262
|
+
|
|
263
|
+
# 合并第一行的5列
|
|
264
|
+
cell_0_0 = table.cell(0, 0)
|
|
265
|
+
cell_0_4 = table.cell(0, 4)
|
|
266
|
+
merged_cell = cell_0_0.merge(cell_0_4)
|
|
267
|
+
merged_cell.text = "课前"
|
|
268
|
+
|
|
269
|
+
_color_white(merged_cell)
|
|
270
|
+
|
|
271
|
+
# 第二行内容为"教学内容"、"教学活动", "设计意图"
|
|
272
|
+
# 合并第1-2列为"教学内容"
|
|
273
|
+
cell_1_0 = table.cell(1, 0)
|
|
274
|
+
cell_2_1 = table.cell(2, 1)
|
|
275
|
+
cell_2_1.merge(cell_1_0)
|
|
276
|
+
cell_1_0.text = "教学内容"
|
|
277
|
+
|
|
278
|
+
# 合并第3-4列为"教学活动"
|
|
279
|
+
cell_1_2 = table.cell(1, 2)
|
|
280
|
+
cell_1_3 = table.cell(1, 3)
|
|
281
|
+
cell_1_2.merge(cell_1_3)
|
|
282
|
+
cell_1_2.text = "教学活动"
|
|
283
|
+
|
|
284
|
+
cell_1_4 = table.cell(1, 4)
|
|
285
|
+
cell_1_4.text = "设计意图"
|
|
286
|
+
|
|
287
|
+
# 设置第二行的行高为0.6 cm
|
|
288
|
+
table.rows[1].height = Cm(0.6)
|
|
289
|
+
|
|
290
|
+
# 第三行设置表头内容
|
|
291
|
+
cell_2_2 = table.cell(2, 2)
|
|
292
|
+
cell_2_3 = table.cell(2, 3)
|
|
293
|
+
cell_2_4 = table.cell(2, 4)
|
|
294
|
+
cell_2_4.merge(cell_1_4)
|
|
295
|
+
|
|
296
|
+
cell_2_2.text = "学生活动"
|
|
297
|
+
cell_2_3.text = "教师活动"
|
|
298
|
+
|
|
299
|
+
# 设置第三行的行高为1.9 cm
|
|
300
|
+
table.rows[2].height = Cm(1.9)
|
|
301
|
+
|
|
302
|
+
# 第四行:添加新内容
|
|
303
|
+
cell_3_0 = table.cell(3, 0)
|
|
304
|
+
cell_3_1 = table.cell(3, 1)
|
|
305
|
+
cell_3_0.merge(cell_3_1) # 合并第一列和第二列
|
|
306
|
+
cell_3_0.text = parsed_data.get("课前:教学内容", "").strip()
|
|
307
|
+
|
|
308
|
+
cell_3_2 = table.cell(3, 2)
|
|
309
|
+
cell_3_2.text = parsed_data.get("课前:学生活动", "").strip()
|
|
310
|
+
|
|
311
|
+
cell_3_3 = table.cell(3, 3)
|
|
312
|
+
cell_3_3.text = parsed_data.get("课前:教师活动", "").strip()
|
|
313
|
+
|
|
314
|
+
cell_3_4 = table.cell(3, 4)
|
|
315
|
+
cell_3_4.text = parsed_data.get("课前:设计意图", "").strip()
|
|
316
|
+
|
|
317
|
+
# 合并第5行的5列
|
|
318
|
+
cell_4_0 = table.cell(4, 0)
|
|
319
|
+
cell_4_4 = table.cell(4, 4)
|
|
320
|
+
merged_cell = cell_4_0.merge(cell_4_4)
|
|
321
|
+
merged_cell.text = "课中"
|
|
322
|
+
|
|
323
|
+
_color_white(merged_cell)
|
|
324
|
+
|
|
325
|
+
# 第6行内容为"教学内容"、"教学活动", "设计意图"
|
|
326
|
+
# 合并第1-2列为"教学内容"
|
|
327
|
+
table.cell(5,0).merge(table.cell(6,0))
|
|
328
|
+
table.cell(5,0).text = "教学环节"
|
|
329
|
+
|
|
330
|
+
table.cell(5,1).merge(table.cell(6,1))
|
|
331
|
+
table.cell(5,1).text = "教学内容"
|
|
332
|
+
|
|
333
|
+
# 合并第3-4列为"教学活动"
|
|
334
|
+
cell_5_2 = table.cell(5, 2)
|
|
335
|
+
cell_5_3 = table.cell(5, 3)
|
|
336
|
+
cell_5_2.merge(cell_5_3)
|
|
337
|
+
cell_5_2.text = "教学活动"
|
|
338
|
+
|
|
339
|
+
table.cell(5,4).merge(table.cell(6,4))
|
|
340
|
+
table.cell(5,4).text = "设计意图"
|
|
341
|
+
|
|
342
|
+
# 第7行设置表头内容
|
|
343
|
+
|
|
344
|
+
cell_6_2 = table.cell(6, 2)
|
|
345
|
+
cell_6_3 = table.cell(6, 3)
|
|
346
|
+
cell_6_4 = table.cell(6, 4)
|
|
347
|
+
cell_6_4.merge(cell_6_4)
|
|
348
|
+
|
|
349
|
+
cell_6_2.text = "学生活动"
|
|
350
|
+
cell_6_3.text = "教师活动"
|
|
351
|
+
|
|
352
|
+
# 项目导入
|
|
353
|
+
table.cell(7,0).text = "项目导入"
|
|
354
|
+
table.cell(7,1).text = parsed_data.get("项目导入:教学内容", "").strip()
|
|
355
|
+
table.cell(7,2).text = parsed_data.get("项目导入:学生活动", "").strip()
|
|
356
|
+
table.cell(7,3).text = parsed_data.get("项目导入:教师活动", "").strip()
|
|
357
|
+
table.cell(7,4).text = parsed_data.get("项目导入:设计意图", "").strip()
|
|
358
|
+
|
|
359
|
+
# 内容展开
|
|
360
|
+
table.cell(8,0).text = "内容展开"
|
|
361
|
+
table.cell(8,1).text = parsed_data.get("内容展开:教学内容", "").strip()
|
|
362
|
+
table.cell(8,2).text = parsed_data.get("内容展开:学生活动", "").strip()
|
|
363
|
+
table.cell(8,3).text = parsed_data.get("内容展开:教师活动", "").strip()
|
|
364
|
+
table.cell(8,4).text = parsed_data.get("内容展开:设计意图", "").strip()
|
|
365
|
+
|
|
366
|
+
# 课堂小结
|
|
367
|
+
table.cell(9,0).text = "课堂小结"
|
|
368
|
+
table.cell(9,1).text = parsed_data.get("课堂小结:教学内容", "").strip()
|
|
369
|
+
table.cell(9,2).text = parsed_data.get("课堂小结:学生活动", "").strip()
|
|
370
|
+
table.cell(9,3).text = parsed_data.get("课堂小结:教师活动", "").strip()
|
|
371
|
+
table.cell(9,4).text = parsed_data.get("课堂小结:设计意图", "").strip()
|
|
372
|
+
|
|
373
|
+
# 课后
|
|
374
|
+
merged_cell = table.cell(10,0)
|
|
375
|
+
merged_cell.merge(table.cell(10,4))
|
|
376
|
+
merged_cell.text = "课后"
|
|
377
|
+
|
|
378
|
+
_color_white(merged_cell)
|
|
379
|
+
|
|
380
|
+
# 教学活动
|
|
381
|
+
table.cell(11,0).merge(table.cell(12,1))
|
|
382
|
+
table.cell(11,0).text = "教学内容"
|
|
383
|
+
table.cell(11,2).merge(table.cell(11,3))
|
|
384
|
+
table.cell(11,2).text = "教学活动"
|
|
385
|
+
table.cell(11,4).merge(table.cell(12,4))
|
|
386
|
+
table.cell(11,4).text = "设计意图"
|
|
387
|
+
table.cell(12,2).text = "学生活动"
|
|
388
|
+
table.cell(12,3).text = "教师活动"
|
|
389
|
+
|
|
390
|
+
# 教学内容
|
|
391
|
+
table.cell(13,0).merge(table.cell(13,1))
|
|
392
|
+
table.cell(13,0).text = parsed_data.get("课后:教学内容", "").strip()
|
|
393
|
+
table.cell(13,2).text = parsed_data.get("课后:学生活动", "").strip()
|
|
394
|
+
table.cell(13,3).text = parsed_data.get("课后:教师活动", "").strip()
|
|
395
|
+
table.cell(13,4).text = parsed_data.get("课后:设计意图", "").strip()
|
|
396
|
+
|
|
397
|
+
# 教学反思
|
|
398
|
+
merged_cell = table.cell(14, 0)
|
|
399
|
+
merged_cell.merge(table.cell(14, 4))
|
|
400
|
+
merged_cell.text = "教学反思"
|
|
401
|
+
|
|
402
|
+
_color_white(merged_cell)
|
|
403
|
+
|
|
404
|
+
# 教学效果
|
|
405
|
+
table.cell(15,0).text ="教学效果"
|
|
406
|
+
table.cell(15,1).merge(table.cell(15,4))
|
|
407
|
+
table.cell(15,1).text = parsed_data.get("教学反思:教学效果", "").strip()
|
|
408
|
+
|
|
409
|
+
# 诊断改进
|
|
410
|
+
table.cell(16,0).merge(table.cell(17,0))
|
|
411
|
+
table.cell(16,0).text = "诊断改进"
|
|
412
|
+
table.cell(16,1).merge(table.cell(16,4))
|
|
413
|
+
table.cell(16,1).text = parsed_data.get("教学反思:诊断", "").strip()
|
|
414
|
+
table.cell(17,1).merge(table.cell(17,4))
|
|
415
|
+
table.cell(17,1).text = parsed_data.get("教学反思:改进", "").strip()
|
|
416
|
+
|
|
417
|
+
# 设置第二行的行高为2.5 cm
|
|
418
|
+
table.rows[16].height = Cm(2)
|
|
419
|
+
table.rows[17].height = Cm(2)
|
|
420
|
+
|
|
421
|
+
# 设置表格字体样式和垂直居中
|
|
422
|
+
tbl = table._element
|
|
423
|
+
tblPr = tbl.tblPr
|
|
424
|
+
if tblPr is None:
|
|
425
|
+
tblPr = OxmlElement('w:tblPr')
|
|
426
|
+
tbl.insert(0, tblPr)
|
|
427
|
+
|
|
428
|
+
tblBorders = OxmlElement('w:tblBorders')
|
|
429
|
+
|
|
430
|
+
for border_name in ['top', 'bottom', 'left', 'right']:
|
|
431
|
+
border = OxmlElement(f'w:{border_name}')
|
|
432
|
+
border.set(qn('w:val'), 'single')
|
|
433
|
+
border.set(qn('w:sz'), '12') # 0.5 磅 = 14/8 磅单位
|
|
434
|
+
border.set(qn('w:color'), 'auto')
|
|
435
|
+
border.set(qn('w:space'), '0')
|
|
436
|
+
tblBorders.append(border)
|
|
437
|
+
|
|
438
|
+
tblPr.append(tblBorders)
|
|
439
|
+
|
|
440
|
+
# 设置表格字体样式和垂直居中(按单元格进行判断)
|
|
441
|
+
special_box = ["课前", "课中", "课后", "教学反思"]
|
|
442
|
+
title_box = ["教学内容", "教学活动", "学生活动", "教师活动", "设计意图", "教学环节",
|
|
443
|
+
"项目导入", "内容展开", "课堂小结", "教学效果", "诊断改进"]
|
|
444
|
+
|
|
445
|
+
for row in table.rows:
|
|
446
|
+
for cell in row.cells:
|
|
447
|
+
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
|
|
448
|
+
cell_text = cell.text.strip()
|
|
449
|
+
|
|
450
|
+
if cell_text in special_box:
|
|
451
|
+
continue
|
|
452
|
+
|
|
453
|
+
for paragraph in cell.paragraphs:
|
|
454
|
+
for run in paragraph.runs:
|
|
455
|
+
run.font.name = '宋体'
|
|
456
|
+
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
|
|
457
|
+
|
|
458
|
+
if cell_text in title_box:
|
|
459
|
+
run.font.size = Pt(12)
|
|
460
|
+
run.bold = True
|
|
461
|
+
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
|
462
|
+
else:
|
|
463
|
+
run.font.size = Pt(10.5)
|
|
464
|
+
run.bold = False
|
|
465
|
+
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
|
|
466
|
+
|
|
467
|
+
# 添加空行
|
|
468
|
+
paragraph = document.add_paragraph('')
|
|
469
|
+
|
|
470
|
+
# 添加段落,右对齐
|
|
471
|
+
paragraph = document.add_paragraph('制订时间: 2025 年 9 月')
|
|
472
|
+
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
|
|
473
|
+
run = paragraph.runs[0]
|
|
474
|
+
run.font.size = Pt(10.5) # 字号16pt
|
|
475
|
+
run.font.name = 'Calibri'
|
|
476
|
+
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
|
|
477
|
+
|
|
478
|
+
# 保存文档
|
|
479
|
+
document.save(output_path)
|
|
480
|
+
|
|
481
|
+
if __name__ == "__main__":
|
|
482
|
+
|
|
483
|
+
parser = argparse.ArgumentParser(description="Convert Markdown to DOCX.")
|
|
484
|
+
parser.add_argument("input_markdown_file", help="Path to the input Markdown file.")
|
|
485
|
+
parser.add_argument("--template", default="template.docx", help="Path to the template DOCX file.")
|
|
486
|
+
parser.add_argument("--output_dir", default=".", help="Output directory for the generated DOCX file.")
|
|
487
|
+
args = parser.parse_args()
|
|
488
|
+
|
|
489
|
+
convert_md_to_docx(args.template, args.input_markdown_file)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ciit-lesson-plan"
|
|
7
|
+
version = "0.1.2"
|
|
8
|
+
dependencies = [
|
|
9
|
+
"python-docx"
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Yongshun Song", email = "ys_song@foxmail.com"}
|
|
14
|
+
]
|
|
15
|
+
maintainers = [
|
|
16
|
+
{name = "Yongshun Song", email = "ys_song@foxmail.com"}
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
description = "这是一个用于将Markdown格式的教学计划内容转换为Word文档(.docx)的Python脚本。该脚本使用python_docx库来处理Word文档,能够读取Markdown文件内容,并根据预定义的模板生成格式化的教案文档。"
|
|
20
|
+
|
|
21
|
+
readme = "README.md"
|
|
22
|
+
|
|
23
|
+
license = "MIT"
|
|
24
|
+
license-files = ["LICENSE"]
|
|
25
|
+
keywords = ["lesson", "plan", "ciit", "teaching", "docx"]
|
|
26
|
+
|