我应该如何处理Wiki页面内容中的自动链接?
我的意思是自动链接是将页面内容中内联的Wiki链接生成为页面的超链接(如果存在)或者创建链接(如果页面不存在)的过程。
使用我正在使用的解析器,这首先是一个两步过程,将解析页面内容,并从源标记中提取到Wiki页面的所有链接。然后,在生成最终的HTML标记之前,我将现有页面的数组反馈给解析器。
处理此过程的最佳方法是什么?似乎我需要保留网站上每个页面的缓存列表,而不必每次都提取页面标题的索引。还是最好单独检查每个链接以查看其是否存在?如果未缓存列表,则可能导致大量数据库查找。这对于拥有数千个页面的大型Wiki网站仍然可行吗?
解决方案
回答
在我自己的Wiki中,我检查了所有链接(没有缓存),但是内部只有少数人使用我的Wiki。我们应该对这样的东西进行基准测试。
回答
在我自己的Wiki系统中,当页面更新时,我的缓存系统非常简单,它会检查链接以确保其有效,并对无效的链接应用正确的格式/位置。缓存的页面另存为HTML页面,位于我的缓存根目录中。
在页面更新期间将标记为"未创建"的页面插入到保存该页面的数据库表中,然后将其链接到页面的csv中。
当某人创建该页面时,它将启动扫描以浏览每个链接页面,并使用正确的链接和格式重新缓存该链接页面。
如果我们不希望突出显示未创建的页面,则可以使用一个检查器来查看该页面在尝试访问时是否已创建,如果没有,则重定向到创建页面。然后,只需按其他文章中的常规链接即可链接到页面。
回答
我的想法是查询诸如"从文章中选择标题"之类的标题,然后简单地检查每个Wikilink是否在该字符串数组中。如果是,则链接到页面,如果不是,则链接到创建页面。
回答
我曾经尝试过一次,那真是一场噩梦!我的解决方案是SQL过程中的一个讨厌循环,我不建议这样做。
困扰我的一件事是决定在多字词短语上使用哪个链接。假设我们有一段文字说"我正在使用堆栈溢出",而Wiki有3个页面,分别称为"堆栈","溢出"和"堆栈溢出"...。短语的哪一部分链接到哪里?它会发生!
回答
在我通过Markdown运行内容之后,我用Sinatra(链接文本)制作了一个个人项目,我用gsub替换了wiki单词和其他内容(例如Here is my link和诸如此类的东西),并用适当的链接替换了每个单词检查页面是否存在,并链接以创建或者查看。
这不是最好的,但我在构建此应用程序时并未考虑到缓存/速度。这是资源贫乏的简单Wiki。
如果速度更为重要,则可以将应用程序包装在某种形式中以对其进行缓存。例如,sinatra可以用Rack缓存包装。