markmap/serve.py

90 lines
2.6 KiB
Python
Raw Normal View History

2026-08-12 16:54:48 +08:00
#!/usr/bin/env python3
"""
Markmap 本地服务器
启动一个简单的 HTTP 服务器用于本地预览 Markmap 编辑器
支持 Python 3.x无需安装任何额外依赖
用法:
python serve.py # 默认端口 8080
python serve.py 3000 # 指定端口 3000
python serve.py 3000 0.0.0.0 # 绑定到所有网络接口
"""
import http.server
import socketserver
import sys
import os
import webbrowser
# 默认配置
DEFAULT_PORT = 8080
DEFAULT_HOST = '127.0.0.1'
def main():
port = DEFAULT_PORT
host = DEFAULT_HOST
# 解析命令行参数
if len(sys.argv) >= 2:
try:
port = int(sys.argv[1])
except ValueError:
print(f'无效的端口号: {sys.argv[1]}')
sys.exit(1)
if len(sys.argv) >= 3:
host = sys.argv[2]
# 切换到脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
handler = http.server.SimpleHTTPRequestHandler
# 添加 CORS 头和正确的 MIME 类型
class MarkmapHandler(handler):
def end_headers(self):
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Cache-Control', 'no-cache')
super().end_headers()
def guess_type(self, path):
mimetype = super().guess_type(path)
# 确保正确的 MIME 类型
if path.endswith('.mjs') or path.endswith('.js'):
return 'application/javascript'
if path.endswith('.css'):
return 'text/css'
if path.endswith('.svg'):
return 'image/svg+xml'
if path.endswith('.md'):
return 'text/markdown'
if path.endswith('.woff2'):
return 'font/woff2'
return mimetype
try:
with socketserver.TCPServer((host, port), MarkmapHandler) as httpd:
url = f'http://{host}:{port}'
print(f'')
print(f' Markmap 编辑器已启动')
print(f' 访问地址: {url}')
print(f' 按 Ctrl+C 停止服务器')
print(f'')
# 自动打开浏览器
webbrowser.open(url)
httpd.serve_forever()
except KeyboardInterrupt:
print(f'\n服务器已停止')
except OSError as e:
if e.errno == 48 or 'Address already in use' in str(e):
print(f'端口 {port} 已被占用,请尝试其他端口')
else:
print(f'启动失败: {e}')
sys.exit(1)
if __name__ == '__main__':
main()