书签管理
浏览器书签
- Firefox
- 书签工具栏
- 书签菜单(顶层)
- 其他书签
- 移动设备上的书签
- Chrome/Edge: 收藏夹
- Safari: 书签收藏等同于书签工具栏
书签分类
- 网站类
- 效率工具
- 媒体资讯
- 社交娱乐
- 生活购物
- 教育参考
- 论坛资源
- 杂项其他
- 网页类
书签同步
floccus 扩展
网络书签
- Infinity
- iTab
- WeTab
- Notion
md2bookmark
import re, html
import sys
from pathlib import Path
def parse_md(content):
"""解析Markdown内容,返回书签结构"""
lines, bookmarks, stack = content.split("\n"), [], []
for line in lines:
# 处理标题(最多6级)
if match := re.match(r"^(#{1,6})\s+(.+)$", line):
level = min(len(match.group(1)), 6) # 限制最多6级
name = match.group(2).strip()
# 调整栈结构
while stack and stack[-1]["level"] >= level:
stack.pop()
folder = {"name": name, "children": [], "level": level}
(stack[-1]["children"] if stack else bookmarks).append(folder)
stack.append(folder)
# 处理列表项中的链接
elif match := re.search(r"\[([^\]]+)\]\(([^)]+)\)", line):
bookmark = {"name": match.group(1), "url": match.group(2)}
if stack:
stack[-1]["children"].append(bookmark)
else:
bookmarks.append(bookmark) # 添加到根级别
return bookmarks
def gen_html(items, indent=0):
"""生成HTML书签内容"""
lines = []
for item in items:
if "url" in item: # 书签
lines.append(
f'{" "*indent}<DT><A HREF="{html.escape(item["url"])}">{html.escape(item["name"])}</A>'
)
else: # 文件夹
lines.append(f'{" "*indent}<DT><H3>{html.escape(item["name"])}</H3>')
lines.append(f'{" "*indent}<DL><p>')
lines.extend(gen_html(item["children"], indent + 1))
lines.append(f'{" "*indent}</DL><p>')
return lines
def convert_md_to_html(input_path, output_path=None):
"""转换Markdown书签文件为HTML格式"""
# 设置默认输出路径
output_path = output_path or Path(input_path).with_suffix(".html")
# 读取并解析Markdown
content = Path(input_path).read_text(encoding="utf-8")
bookmarks = parse_md(content)
# 生成HTML内容
html_content = [
"<!DOCTYPE NETSCAPE-Bookmark-file-1>",
'<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">',
"<TITLE>Bookmarks</TITLE>",
"<H1>Bookmarks</H1>",
"<DL><p>",
*gen_html(bookmarks, 1),
"</DL><p>",
]
# 写入文件
Path(output_path).write_text("\n".join(html_content), encoding="utf-8")
print(f"转换完成: {output_path}")
return output_path
if __name__ == "__main__":
# 参数解析优化
if len(sys.argv) < 2:
print("错误: 请提供输入文件路径")
print("用法: python script.py <输入文件> [输出文件]")
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2] if len(sys.argv) > 2 else None
convert_md_to_html(input_file, output_file)