222 lines
7.0 KiB
Bash
Executable File
222 lines
7.0 KiB
Bash
Executable File
#!/bin/zsh
|
||
|
||
# Mermaid图表处理脚本
|
||
# 将Markdown文档中的Mermaid图表转换为图片,以便在Word文档中正确显示
|
||
|
||
echo "🔄 开始处理Mermaid图表..."
|
||
|
||
# 确保必要的工具已安装
|
||
check_dependencies() {
|
||
echo "📋 检查依赖工具..."
|
||
|
||
if ! command -v node &> /dev/null; then
|
||
echo "❌ 错误: 需要安装Node.js"
|
||
echo "请访问 https://nodejs.org/ 下载安装"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查mermaid-cli
|
||
if ! npx mmdc --version &> /dev/null && ! command -v mmdc &> /dev/null; then
|
||
echo "📦 安装mermaid-cli..."
|
||
npm install @mermaid-js/mermaid-cli --save-dev
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ mermaid-cli安装成功"
|
||
else
|
||
echo "❌ mermaid-cli安装失败"
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "✅ mermaid-cli已安装"
|
||
fi
|
||
|
||
if ! command -v pandoc &> /dev/null; then
|
||
echo "❌ 错误: 需要安装pandoc"
|
||
echo "macOS: brew install pandoc"
|
||
echo "其他系统: https://pandoc.org/installing.html"
|
||
exit 1
|
||
else
|
||
echo "✅ pandoc已安装"
|
||
fi
|
||
}
|
||
|
||
# 处理单个Markdown文件中的Mermaid图表
|
||
process_mermaid_file() {
|
||
local input_file="$1"
|
||
local output_file="$2"
|
||
local temp_dir="temp_mermaid_$$"
|
||
|
||
echo "📄 处理文件: $input_file"
|
||
|
||
# 创建临时目录
|
||
mkdir -p "$temp_dir"
|
||
|
||
# 复制原文件
|
||
cp "$input_file" "$temp_dir/temp.md"
|
||
|
||
# 提取并转换Mermaid图表
|
||
local mermaid_count=0
|
||
local in_mermaid=false
|
||
local mermaid_content=""
|
||
local processed_content=""
|
||
|
||
while IFS= read -r line; do
|
||
if [[ "$line" =~ ^\`\`\`mermaid ]]; then
|
||
in_mermaid=true
|
||
mermaid_content=""
|
||
continue
|
||
elif [[ "$line" =~ ^\`\`\`$ ]] && [ "$in_mermaid" = true ]; then
|
||
# 处理Mermaid图表
|
||
mermaid_count=$((mermaid_count + 1))
|
||
local mermaid_file="$temp_dir/diagram_$mermaid_count.mmd"
|
||
local image_file="$temp_dir/diagram_$mermaid_count.png"
|
||
|
||
# 保存Mermaid代码到文件
|
||
echo "$mermaid_content" > "$mermaid_file"
|
||
|
||
# 转换为PNG图片
|
||
echo "🖼️ 转换图表 $mermaid_count..."
|
||
npx mmdc -i "$mermaid_file" -o "$image_file" -w 1200 -H 800 --backgroundColor white 2>/dev/null || {
|
||
mmdc -i "$mermaid_file" -o "$image_file" -w 1200 -H 800 --backgroundColor white 2>/dev/null || {
|
||
echo "⚠️ 警告: 图表 $mermaid_count 转换失败,将保留原始代码"
|
||
processed_content+="$(echo $'\n```mermaid\n'"$mermaid_content"$'\n```\n')"
|
||
in_mermaid=false
|
||
continue
|
||
}
|
||
}
|
||
|
||
if [ -f "$image_file" ]; then
|
||
# 替换为图片引用
|
||
processed_content+="$(echo $'\n\n')"
|
||
echo "✅ 图表 $mermaid_count 转换成功"
|
||
else
|
||
# 如果转换失败,保留原始代码
|
||
processed_content+="$(echo $'\n```mermaid\n'"$mermaid_content"$'\n```\n')"
|
||
echo "⚠️ 图表 $mermaid_count 转换失败,保留原始代码"
|
||
fi
|
||
|
||
in_mermaid=false
|
||
elif [ "$in_mermaid" = true ]; then
|
||
mermaid_content+="$line"$'\n'
|
||
else
|
||
processed_content+="$line"$'\n'
|
||
fi
|
||
done < "$input_file"
|
||
|
||
# 保存处理后的内容
|
||
echo "$processed_content" > "$output_file"
|
||
|
||
echo "📊 共处理 $mermaid_count 个图表"
|
||
|
||
# 清理临时文件
|
||
# rm -rf "$temp_dir"
|
||
}
|
||
|
||
# 处理所有Markdown文件
|
||
process_all_files() {
|
||
local output_dir="processed_docs"
|
||
mkdir -p "$output_dir"
|
||
|
||
echo "🔄 处理所有设计文档..."
|
||
|
||
local doc_files=(
|
||
"water_biz_system_architecture.md"
|
||
"water_biz_module_design.md"
|
||
"water_biz_database_design.md"
|
||
"water_biz_interface_design.md"
|
||
"water_biz_deployment_design.md"
|
||
"water_biz_security_design.md"
|
||
)
|
||
|
||
for doc in "${doc_files[@]}"; do
|
||
if [ -f "$doc" ]; then
|
||
echo "📄 处理: $doc"
|
||
process_mermaid_file "$doc" "$output_dir/$doc"
|
||
else
|
||
echo "⚠️ 文件不存在: $doc"
|
||
fi
|
||
done
|
||
|
||
echo "✅ 所有文件处理完成,输出目录: $output_dir"
|
||
}
|
||
|
||
# 生成带图片的Word文档
|
||
export_to_docx_with_images() {
|
||
local processed_dir="processed_docs"
|
||
local output_dir="output"
|
||
mkdir -p "$output_dir"
|
||
|
||
echo "📝 导出Word文档..."
|
||
|
||
# 合并处理后的文档
|
||
local merged_file="$output_dir/merged_processed_docs.md"
|
||
|
||
echo "---" > "$merged_file"
|
||
echo "title: \"福建水务营收系统概要设计文档\"" >> "$merged_file"
|
||
echo "author: \"系统设计团队\"" >> "$merged_file"
|
||
echo "date: \"$(date '+%Y年%m月%d日')\"" >> "$merged_file"
|
||
echo "---" >> "$merged_file"
|
||
echo "" >> "$merged_file"
|
||
|
||
# 按顺序合并文档
|
||
local doc_order=(
|
||
"water_biz_system_architecture.md"
|
||
"water_biz_module_design.md"
|
||
"water_biz_database_design.md"
|
||
"water_biz_interface_design.md"
|
||
"water_biz_deployment_design.md"
|
||
"water_biz_security_design.md"
|
||
)
|
||
|
||
for doc in "${doc_order[@]}"; do
|
||
if [ -f "$processed_dir/$doc" ]; then
|
||
echo "" >> "$merged_file"
|
||
echo "---" >> "$merged_file"
|
||
echo "" >> "$merged_file"
|
||
cat "$processed_dir/$doc" >> "$merged_file"
|
||
fi
|
||
done
|
||
|
||
# 使用pandoc转换为Word
|
||
local output_docx="$output_dir/福建水务营收系统概要设计文档_含图表.docx"
|
||
|
||
echo "🔄 使用pandoc转换为Word格式..."
|
||
pandoc "$merged_file" -o "$output_docx" \
|
||
--reference-doc=templates/reference.docx \
|
||
--extract-media="$output_dir/media" \
|
||
2>/dev/null || \
|
||
pandoc "$merged_file" -o "$output_docx" \
|
||
--extract-media="$output_dir/media"
|
||
|
||
if [ -f "$output_docx" ]; then
|
||
echo "✅ Word文档导出成功: $output_docx"
|
||
echo "📂 媒体文件目录: $output_dir/media"
|
||
else
|
||
echo "❌ Word文档导出失败"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
echo "🚀 福建水务营收系统 - Mermaid图表处理工具"
|
||
echo "================================="
|
||
|
||
check_dependencies
|
||
process_all_files
|
||
export_to_docx_with_images
|
||
|
||
echo ""
|
||
echo "🎉 处理完成!"
|
||
echo "📄 包含图表的Word文档: output/福建水务营收系统概要设计文档_含图表.docx"
|
||
echo "📁 处理后的Markdown文件: processed_docs/"
|
||
echo ""
|
||
echo "💡 提示:"
|
||
echo " - 如果某些图表未正确显示,请检查Mermaid语法"
|
||
echo " - 图片文件保存在 output/media/ 目录中"
|
||
echo " - 可以手动调整图片大小和位置"
|
||
}
|
||
|
||
# 如果直接运行此脚本
|
||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||
main "$@"
|
||
fi |