如何备份 Outline 导出的 Markdown 文件

2024-04-01 14:04
文章标签 导出 备份 markdown outline

本文主要是介绍如何备份 Outline 导出的 Markdown 文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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

  • 《如何在本地环境安装 Outline》
  • 《使用 Outline 搭建企业、个人知识库面临的问题》

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

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

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

如何导出

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

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

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

如何自助建立索引

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

import osdef 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']:continueif 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 treedef 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。

这篇关于如何备份 Outline 导出的 Markdown 文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867343

相关文章

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按