"""
API路由模块
处理所有Markdown编辑器的API端点
"""
import os
import re
from flask import Blueprint, request, jsonify, send_file
from utils.markdown_parser import MarkdownParser
from utils.file_manager import FileManager
from utils.regex_processor import RegexProcessor
# 创建API蓝图
api_bp = Blueprint('api', __name__)
# 初始化工具类
markdown_parser = MarkdownParser()
file_manager = FileManager()
regex_processor = RegexProcessor()
@api_bp.route('/health', methods=['GET'])
def health_check():
"""
健康检查端点
Returns:
JSON: 服务状态信息
"""
return jsonify({
'status': 'healthy',
'service': 'markdown-editor-api'
})
@api_bp.route('/parse', methods=['POST'])
def parse_markdown():
"""
解析Markdown文本为HTML
Request Body:
{
"content": "# Hello World"
}
Returns:
JSON: {
"html": "
Hello World
",
"metadata": {...}
}
"""
try:
data = request.get_json()
if not data or 'content' not in data:
return jsonify({'error': 'Missing content field'}), 400
content = data['content']
result = markdown_parser.parse(content)
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/files', methods=['GET'])
def list_files():
"""
获取指定目录的文件列表
Query Parameters:
path: 目录路径(相对于工作目录)
Returns:
JSON: 文件列表信息
"""
try:
path = request.args.get('path', '')
files = file_manager.list_files(path)
return jsonify({'files': files})
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/files/read', methods=['GET'])
def read_file():
"""
读取文件内容
Query Parameters:
path: 文件路径
Returns:
JSON: 文件内容和元数据
"""
try:
path = request.args.get('path')
if not path:
return jsonify({'error': 'Missing path parameter'}), 400
content = file_manager.read_file(path)
return jsonify({'content': content})
except FileNotFoundError:
return jsonify({'error': 'File not found'}), 404
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/files/write', methods=['POST'])
def write_file():
"""
写入文件内容
Request Body:
{
"path": "文件路径",
"content": "文件内容"
}
Returns:
JSON: 操作结果
"""
try:
data = request.get_json()
if not data or 'path' not in data or 'content' not in data:
return jsonify({'error': 'Missing required fields'}), 400
path = data['path']
content = data['content']
file_manager.write_file(path, content)
return jsonify({'message': 'File saved successfully'})
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/files/delete', methods=['DELETE'])
def delete_file():
"""
删除文件
Request Body:
{
"path": "文件路径"
}
Returns:
JSON: 操作结果
"""
try:
data = request.get_json()
if not data or 'path' not in data:
return jsonify({'error': 'Missing path field'}), 400
file_manager.delete_file(data['path'])
return jsonify({'message': 'File deleted successfully'})
except FileNotFoundError:
return jsonify({'error': 'File not found'}), 404
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/regex/replace', methods=['POST'])
def regex_replace():
"""
使用正则表达式批量替换文本
Request Body:
{
"content": "原始文本",
"pattern": "正则表达式",
"replacement": "替换内容",
"flags": "gi"
}
Returns:
JSON: {
"result": "替换后的文本",
"matches": 3,
"groups": [...]
}
"""
try:
data = request.get_json()
required_fields = ['content', 'pattern', 'replacement']
if not data or not all(field in data for field in required_fields):
return jsonify({'error': 'Missing required fields'}), 400
content = data['content']
pattern = data['pattern']
replacement = data['replacement']
flags = data.get('flags', '')
result = regex_processor.replace(content, pattern, replacement, flags)
return jsonify(result)
except re.error as e:
return jsonify({'error': f'Invalid regex pattern: {str(e)}'}), 400
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/regex/extract', methods=['POST'])
def regex_extract():
"""
使用正则表达式提取文本中的匹配项
Request Body:
{
"content": "文本内容",
"pattern": "正则表达式",
"flags": "gi"
}
Returns:
JSON: 匹配项列表
"""
try:
data = request.get_json()
if not data or 'content' not in data or 'pattern' not in data:
return jsonify({'error': 'Missing required fields'}), 400
content = data['content']
pattern = data['pattern']
flags = data.get('flags', '')
matches = regex_processor.extract(content, pattern, flags)
return jsonify({'matches': matches})
except re.error as e:
return jsonify({'error': f'Invalid regex pattern: {str(e)}'}), 400
except Exception as e:
return jsonify({'error': str(e)}), 500
@api_bp.route('/files/download')
def download_file():
"""
下载文件
Query Parameters:
path: 文件路径
Returns:
File: 文件内容
"""
try:
path = request.args.get('path')
if not path:
return jsonify({'error': 'Missing path parameter'}), 400
return send_file(path, as_attachment=True)
except FileNotFoundError:
return jsonify({'error': 'File not found'}), 404
except Exception as e:
return jsonify({'error': str(e)}), 500