kael-shipman / gwiki
将Google Drive文件夹转换为wiki的简单应用程序
Requires
- jmcmanus/pagedown-extra: ~0.1
- stackexchange/pagedown: ~1.1
README
一个简单的单页应用程序,可以将任何Google Drive文件夹转换为可遍历的wiki
注意:我正在构建这个库的v2版本。您可以在
v2.x
分支中找到它,尽管在撰写本文时在此版本上取得的实际进展很少。我对v2的目标如下:
- 转换为TypeScript
- 将gwiki概念正式化为一个库,而不是一个应用程序
- 使用该库实现一个完整的应用程序
将此转换为纯库可能需要将其视为对云存储的一般抽象和扩展。到这个过程结束时,我希望能够将其用作类似于为服务于wiki而设计的存储提供商的API SDK。
无论如何,您可以在
v2.x
分支中跟踪进度。
Google Drive是一个出色的共享文档解决方案,总会有将其转换为wiki的诱惑。在其许多其他优秀品质中,它拥有一个非常强大和高度细粒度的权限系统,允许您将文档层次结构的特定部分与任意人员共享,甚至匿名网络用户(这个权限系统是我最吸引人的特点之一)。
然而,它不适合用作wiki,因为每个文档都会打开自己的标签页,没有任何共享的导航。这既尴尬又令人沮丧,更不用说几十个沉重的标签页开始充斥您的浏览器了。
因此,我的解决方案是使用Google的API将文档串联起来形成一个可导航的wiki,这就是它。
主要功能
- 从一个父文件夹提供基本、层次化的导航,用于子文件夹和后代文件夹;
- 通过HTML导出渲染文档;
- 渲染Markdown(以及纯文本作为markdown);
- 通过iframe渲染其他类型的Google文档;
- 尝试解析文档中的链接,以便允许在层次结构内链接打开在应用程序本身中,而不是在外部打开;
安装和使用
虽然我将设置Gwiki在自己的域名上供任何人使用,但您也可以自己托管它。如果您选择这样做,以下是您需要遵循的步骤:
- 将仓库克隆到您想要的位置。
- 运行
composer install
(是的,我使用了Composer,尽管这是一个JavaScript项目,因为我更喜欢它而不是NPM)。 - 转到https://console.developers.google.com并创建一个OAuth客户端ID和一个API密钥(如果您需要帮助,请参阅此指南)。
- 请确保将您的域名添加到客户端ID和API密钥的白名单中。
- 最后,如果您使用的是我的默认设置,您必须将
src/config.local.js.template
复制到src/config.local.js
并输入您的新凭据。 - 如果您不使用我的默认设置,请查看
examples/index.html
以了解我如何初始化一切。这个过程有点复杂,因为我是这样构建应用程序的(请参见下面的实现细节)。
有了这些,您应该能够启动并运行。
技巧和窍门
- 如果您创建的文件与包含它的文件夹同名,则该文件成为子菜单标题。
- 您可以添加用于排序的数字前缀,这些前缀在页面标题显示时将被移除。
- 您可以添加后缀(如
.md
),这些后缀也会被移除。这允许您在不实际在Google Drive中设置特殊MIME类型的情况下,表示特殊的MIME类型。
实现细节
Gwiki的实际实现可以说是一个实验。我被通过事件驱动架构分离关注点这一想法深深吸引,决定尝试使用三个不同的子应用来构建应用。
Gwiki状态容器
所谓“引擎”,可以说是Gwiki
类。这可以被认为是状态容器。当UI上发生事件(例如,“主文件夹更改”或“项目选择”)时,Gwiki
会相应地更新其状态,并在状态转换时抛出自己的事件。UI随后捕获这些状态更新事件,从Gwiki读取状态以向用户渲染当前的应用表示。
Gwiki桥接器
为了保持应用和(相当差的)Google API客户端之间的松散耦合,我实现了一个名为GwikiBridge
的适配器客户端。此类仅提供一些特定方法来访问云存储的某些功能,如登录、通过ID获取对象、获取对象的子对象(如果有)、下载对象的内
容或导出对象的内容(即转换为不同的形式)。从理论上讲,可以使用不同的GwikiBridge
客户端来允许应用在不同的云存储上运行,例如DropBox,尽管没有为此场景泛化其余应用的努力。
Gwiki UI
GwikiUI实际上是应用逻辑的主要发生地。它也是您最可能修改或替换以更改应用外观和感觉的组件。如果您对它所做或如何工作感兴趣,您最好直接阅读源代码。