#!/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![流程图 '$mermaid_count']('$image_file')\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