如何备份 Outline 导出的 Markdown 文件

在这里插入图片描述

前面,我撰写了两篇文章,介绍了:

今天,我们继续这个话题。使用 Outline 搭建知识库,如何备份自己知识库内的资料。

Outline 底层使用数据库 PostgreSQL 和 Redis 作为异步队列的承载。其数据默认存储在 PostgreSQL 里,这和一般的 Markdown 文档系统不太一样,虽然底层本质上也是 Markdown 文档,但是却不是用纯文本格式来存储。这对备份和恢复不太友好。

前文已经介绍过,导入、导出的兼容性可能不太好,不过单纯使用导出的话,实测下来,我觉得还是可以依赖的。意思就是,你单方面在 Outline 编辑文档,然后定期导出后,进行备份,不再将导出的文档导入回 Outline 系统,站内的相对链接回失效,Outline 不能正确处理。

如何导出

在这里插入图片描述
在管理员界面,点击导出,选择 Markdown 格式,可以生成异步导出的压缩包,然后再点击下载,可以得到所有的导出文档。

此前已经说过,在 Outline 里,嵌入的图片,链接都是指向自己的 Server,而不是指向图片所在的真实地址,当你导出后,你会发现,图片什么的都正常导出了,而文章中的链接也替换成了导出目录的相对链接,这一点到让我挺满意的,超出我的预期。

不过,因为 Outline 系统自己会根据每个文档集的情况,在网站左侧建立导航栏,所以,你导出的全部文档,是一个一个的文档集的目录。没有所有文档的索引,如果你要把导出的文档,都上传的 Git 去备份的话,查看这些文档是比较让人困扰的。

如何自助建立索引

不过这难不倒程序员,我们可以用 Python 扫描所有的目录,然后,按照目录的结构,手动建立一个索引,比如,我利用 Gitlab 的 Wiki 来备份我导出的所有文档,所以,我需要一个 home.md 和 _sidebar.md 来展示我整个文档集的索引。

import os

def build_tree(path):
    tree = {'name': os.path.basename(path), 'children': []}
    if os.path.isdir(path):
        all_children = os.listdir(path)
        for child in sorted(all_children):
            child_path = os.path.join(path, child)
            if child in ['home.md', '_sidebar.md', '.git', 'public', 'index.py']:
                continue
            if os.path.isdir(child_path):
                if child in [os.path.splitext(x)[0] for x in all_children if x.endswith('.md')]:
                    sub_tree = build_tree(child_path)
                    sub_tree['link'] = os.path.join(path, child)
                    tree['children'].append(sub_tree)
                else:
                    tree['children'].append(build_tree(child_path))
            else:
                if os.path.splitext(child)[0] not in [x for x in all_children if not x.endswith('.md')]:
                    tree['children'].append({'name': child, 'children': []})
    return tree

def write_line(file, level, name, link=None, isTitle=False):
    indent = '  ' * (level - 1)
    linkStr = ''
    if link is None:
        linkStr = f"{name}"
    else:
        linkStr = f"[{name}]({link})"
    if isTitle:
        file.write(f"{indent}* **{linkStr}**\n")
    else:
        file.write(f"{indent}* {linkStr}\n")

def write_tree(tree, home, sidebar, path='', level=1):
    if 'children' in tree:
        if tree['name'] != '.':
            if len(tree['children']) > 0:
                write_line(home, level, tree['name'], tree.get('link'), isTitle=True)
                write_line(sidebar, level, tree['name'], tree.get('link'))
            else:
                filename = os.path.splitext(tree['name'])[0]
                write_line(home, level, filename, os.path.join(path, filename))
                write_line(sidebar, level, filename, os.path.join(path, filename))
        for child in tree['children']:
            write_tree(child, home, sidebar, os.path.join(path, tree['name']), level + 1)

tree = build_tree('.')
with open("home.md", "w") as home, open("_sidebar.md", "w") as sidebar:
    home.write("<!--本文件使用 index.py 生成,请勿修改本文件-->\n")
    sidebar.write("<!--本文件使用 index.py 生成,请勿修改本文件-->\n")
    write_tree(tree, home, sidebar)

这段代码是我用 ChatGPT 生成的,其作用主要是:

  • build_tree 扫描所有的目录和文件,按照原有的目录结构,建立一个目录树;
  • write_tree 递归打印目录树,按照原有目录层级,处理缩进,生成一个美观的索引文件;
  • 将索引写入 home.md 和 _sidebar.md

这样我们就可以为自己导出的文档,生成一个美观的索引目录:

在这里插入图片描述
这是我将所有的文档,提交到 Gitlab 后,渲染出来的 home.md 文件。这样 Outline 也可以当成是一个文档集的编辑器来用。

总结

本文介绍了,如何从 Outline 知识库中导出文档,以及导出的文档缺乏索引的情况下,如何自己编写代码来生成一个索引文件 home.md 和 _sidebard.md。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 04:14:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 04:14:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 04:14:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 04:14:04       20 阅读

热门阅读

  1. 父类子类继承关系

    2024-04-03 04:14:04       16 阅读
  2. 存放自定义数据类型的大/小根堆定义

    2024-04-03 04:14:04       14 阅读
  3. C++经典面试题目(十四)

    2024-04-03 04:14:04       18 阅读
  4. 免试生常问的一些问题汇总---专升本学习篇

    2024-04-03 04:14:04       15 阅读
  5. python内置函数 Z

    2024-04-03 04:14:04       15 阅读
  6. Nginx-记

    Nginx-记

    2024-04-03 04:14:04      14 阅读
  7. 第7单元日考

    2024-04-03 04:14:04       17 阅读
  8. LeetCode104.二叉树的最大深度

    2024-04-03 04:14:04       14 阅读
  9. mysql 存储过程示例

    2024-04-03 04:14:04       18 阅读
  10. 以下哪个变量不是指针类型

    2024-04-03 04:14:04       16 阅读
  11. LeetCode-41. 缺失的第一个正数【数组 哈希表】

    2024-04-03 04:14:04       16 阅读