跳到主要内容

书签管理

浏览器书签

  • 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)