markmap/serve.py
2026-08-12 16:54:48 +08:00

90 lines
2.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()