94 lines
2.9 KiB
Bash
Executable File
94 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# 生成最终 Word 文档(跳过 App 截图)
|
|
python3 - << 'PYEOF'
|
|
import os
|
|
from docx import Document
|
|
from docx.shared import Inches, Pt
|
|
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
|
|
|
BASE_DIR = "/root/.openclaw/workspaces/yzr-yxl/projects/yu-zhi-ran/content/published/2026-04-14-上海阳台种菜一年"
|
|
MD_FILE = os.path.join(BASE_DIR, "final-article-optimized.md")
|
|
IMAGES_DIR = os.path.join(BASE_DIR, "images")
|
|
OUTPUT_DOCX = os.path.join(BASE_DIR, "上海阳台种菜一年_发布版.docx")
|
|
|
|
SKIP_IMAGES = ["08-App截图.png"]
|
|
|
|
with open(MD_FILE, "r", encoding="utf-8") as f:
|
|
lines = f.readlines()
|
|
|
|
doc = Document()
|
|
doc.styles['Normal'].font.name = '微软雅黑'
|
|
doc.styles['Normal'].font.size = Pt(11)
|
|
|
|
def add_heading(text, level=1):
|
|
h = doc.add_heading(text, level=level)
|
|
h.alignment = WD_ALIGN_PARAGRAPH.LEFT
|
|
return h
|
|
|
|
for line in lines:
|
|
line = line.rstrip('\n')
|
|
|
|
if line.startswith('# '):
|
|
add_heading(line[2:], level=1)
|
|
continue
|
|
if line.startswith('## '):
|
|
add_heading(line[3:], level=2)
|
|
continue
|
|
if line.startswith('### '):
|
|
add_heading(line[4:], level=3)
|
|
continue
|
|
if line.startswith('---'):
|
|
doc.add_paragraph('_' * 60)
|
|
continue
|
|
|
|
if line.startswith('!['):
|
|
import re
|
|
m = re.match(r'!\[(.*?)\]\((images/.*?)\)', line)
|
|
if m:
|
|
alt, fname = m.groups()
|
|
if fname in SKIP_IMAGES:
|
|
p = doc.add_paragraph("[此处省略App截图,保持内容中立]")
|
|
p.italic = True
|
|
continue
|
|
img_path = os.path.join(IMAGES_DIR, os.path.basename(fname))
|
|
if os.path.exists(img_path):
|
|
try:
|
|
doc.add_picture(img_path, width=Inches(6))
|
|
last_para = doc.paragraphs[-1]
|
|
last_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
except Exception:
|
|
doc.add_paragraph(f"[图片错误: {fname}]")
|
|
else:
|
|
doc.add_paragraph(f"[缺失图片: {fname}]")
|
|
continue
|
|
|
|
if not line.strip():
|
|
doc.add_paragraph()
|
|
continue
|
|
|
|
p = doc.add_paragraph()
|
|
tmp = line
|
|
while '**' in tmp:
|
|
before = tmp[:tmp.find('**')]
|
|
if before:
|
|
p.add_run(before)
|
|
tmp = tmp[tmp.find('**')+2:]
|
|
if '**' in tmp:
|
|
bold_text = tmp[:tmp.find('**')]
|
|
run = p.add_run(bold_text)
|
|
run.bold = True
|
|
tmp = tmp[tmp.find('**')+2:]
|
|
else:
|
|
run = p.add_run(tmp)
|
|
run.bold = True
|
|
break
|
|
if '**' not in line:
|
|
p.add_run(line)
|
|
|
|
doc.save(OUTPUT_DOCX)
|
|
print(f"✅ 最终发布 Word: {OUTPUT_DOCX}")
|
|
print(f"📊 段落数: {len(doc.paragraphs)}")
|
|
print(f"💾 文件大小: {os.path.getsize(OUTPUT_DOCX)/1024:.1f} KB")
|
|
print(f"⚠️ 跳过图片: {', '.join(SKIP_IMAGES)}")
|
|
PYEOF
|