2008 年 12 月 09 日
您一定听说过 Wikipedia(维基百科全书),但是您是否知道还有一些与 Wikipedia 相关的站点,它们可以提供同样有价值的由用户生成的内容?大量隶属于Wikipedia 的相关站点对 Web 开发人员非常有用。了解如何通过 Wikipedia以外的资源丰富您的信息空间,包括应用这些站点的数据的小部件示例。
Wikipedia一直被认为是最流行的和最知名的 Web 站点之一。从想要完成家庭作业的学生,到希望利用用户生成内容的 Web 开发人员等等,都可以通过Wikipedia 满足需求。但是就提供有用信息而言,Wikipedia 仅仅是一个更庞大资源的一部分。WikimediaFoundation (维基媒体基金会)组织不仅运营Wikipedia,并且还运行很多其他站点。它在主页中这样声明:“想像这样一个世界,它让每个人都可以自由分享所有的知识。这就是我们的承诺。”这是一个伟大的宣言,它不是一个庞大的百科全书就可以实现的。您可能已经了解到 Wikipedia拥有大量不同语言的版本。(令我感到吃惊和欣慰的是,我发现了大量有关 Igbo 语的 Wikipedia文章,这是我的母语)。但是您是否知道多长时间才会出现使用其他语言表示的有用信息(未翻译为英语)?您以前是否听说过Wiktionary、Wikinews、Wikibooks、Wikisource、Wikiversity以及类似内容?您是否知道可以通过利用这个庞大的信息源为您的 Web 项目获得一些好处?我将在本文中向您展示更优秀的Wikimedia,并给出一些代码帮助您的站点的用户 “自由地分享所有知识”。
下面将简单介绍除知名的 Wikipedia 以外,Wikipedia 家族中涵盖的其他一些站点。
Wiktionary是与 Wikipedia相对应的字典站点。很多人对这个开放内容的百科全书的实用性表示怀疑,并且不受关注的字典编纂工作似乎是一项更加艰难的任务。在 “有效”条目的数量方面,法语版本的站点规模最大,紧随其后的是英语版本的站点,后者拥有目前为止最全面的条目和编辑。排在第三位的土耳其语版本与前两者差距比较大,但是有 9 个语言版本的站点至少具有 1000,000 个“有效条目”,大量其他语言版本也接近这个规模,这些站点联合起来就形成了一个令人吃惊的规模。其中一些站点通过使用自动程序从一些免费的信息源导入条目来进行扩展。例如 French Wiktionary,它包括大量来自 Dictionnaire de l'Académie française这种旧式的、免费的字典的条目。很多 Wiktionary条目包括到其他语言的翻译,因此另一个特性就是大量导入其他语言版本中列出的翻译。条目类型众多,从无实际内容的存根(尤其是那些没有被分类为“有效”条目的内容),到包含丰富内容的条目,比如词源、用例、发音(包含音标字母和声音文件)、交叉参考、不同语法形式、翻译,甚至包含对重要文本(例如Project Gutenberg)的外形分析。
Wikinews是获得有关新闻和时事文章的站点,它的理念是具有某些知识或参与某些事件的人士可以帮助填充相关页面的内容。其原则是必须秉持中立的观点撰写文章。Wikinews 可以包含新闻报道、多媒体报道、采访等内容。随后出现了 WikimediaRadio,并最终发展为一个固定的流式音频广播站点,包括各种节目和新闻,并且这些内容大部分来自 Wikinews 和其他 Wikimedia项目。通常,Wikinews 覆盖范围往往倾向于那些拥有大量贡献者的地区和主题,这限制站点本身发展为综合性站点。此外,Wikipedia的流行意味着它经常及时地更新站点的文章,甚至按照匹配新闻报道的速度进行更新,因为它经常从 Wikinews 项目获得内容。
对百科全书文章进行的最大扩展就是将它的主题变成一本完整的书籍,而这正是 Wikibooks 的领域。它包含了Wikijunior,一个面向儿童和儿童教育的文本集合,它可能很快将成为独立的完整项目。Wikiversity 曾经也是 Wikibooks的一部分,它成为了一个完整的 Wikimedia 站点。Wikiversity鼓励以小组或社区的方式进行学习,参与者编辑学习项目页面并进行有助于理解的实践。它被编排成各种学科,主要侧重于所有结合了教科书的支持资源。Wikibooks 托管教科书并且还支持协作式社区开发,Wiki页面将扩充后的零碎内容并入到完整的书籍中。书籍和学科涵盖了各种内容,包括学习语言、计算机科学、有机化学和法律等。从事生物科学的教育者还应关注Wikispecies,这是一个有关生命形式的分类字典,类似于一个有关生物学的、具有适当结构的 Wikipedia。
Wikisource(也称为 The Free Library)将所有这些二次信息处理为原始文档,用于收集源文本、注释、翻译和辅助材料。文本可以是小说或非小说作品、历史记载、公共文档或任何重要的并且不受版权限制的内容。
Wikiquote是一个开放的参考资料站点,包括各种语言的引用自历史和文化方面的语录。对于 Wikiquote最近存在争议,一些人考虑到内容的合适性和版权侵犯,认为应该撤销这个网站。有人认为应该将语录添加到 Wikisource中。然而,还有很多人认为如果 Wikisource 存在任何内容问题,社区在采取关闭 wiki这种过激举措之前,首先应该尝试解决这些问题。当然,这种行为在短时间内是不可能发生的。
WikimediaCommons 是 Wikimedia家族的姊妹站点,托管图像、视频、音频和其他任何免费的媒体文件。它是一个非常大型的资源库,包含数百万个文件。它的目标是成为这类媒体文件的文化资源库,并试图通过对重要的图像进行分类和认定进一步实现这个目标。
Wikimedia 空间的行为的广度和高度为相互交流和 Wikimedia 以外的有用应用程序提供了众多机遇。这就是 Web 2.0 的精髓。用户可以获取目前尚未集成的开放数据流,并超越原始发布者的最初意图,将它们转换为全新的应用程序。
目前,有关如何跨各种 Wikimedia属性进行搜索并不明确。一些独立的项目提供了一种聚合搜索,但是其实用性分为多个级别,因此,完全有理由实现自己的搜索。Google 的其中一个计划Google Co-op提供了一个自定义搜索引擎(CSE)工具,它允许您根据自己的规范定义并创建搜索工具,甚至可以通过详细的注释维护。我创建了一个自定义搜索“Wikimedia plus”,包含了所有受支持的语言,以及其他一些有趣的相关站点。清单 1 显示了搜索的主要条件。
*.wikipedia.org/* *.wiktionary.org/* *.wikibooks.org/* *.wikiversity.org/* *.wikinews.org/* *.wikimedia.org/* *.wikiquote.org/* *.wikisource.org/* *.wikia.com/* *.uncyclopedia.org/* |
注意通配符形式,这是 CSE 的特性之一。Google 为 CSE 提供了一个小部件表单。清单 2 展示了用例。
清单 2. “Wikimedia plus” 搜索引擎部件的用法示例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > <head> <title>Hello Wikimedia world</title> </head> <body> <p>Use the following gadget to search Wikimedia and selected Wikia sites.</p> <hr/> <!-- Remove line breaks in the following script element before using --> <script src="http://www.gmodules.com/ig/ifr?url= http://www.google.com/coop/api/016404950850373629424/cse/1bius8lhc7g/gadget &synd=open&w=320&h=75&title=Wikimedia+plus &border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js"></script> </body> </html> |
为了进行格式化,我将 Google 的长 URL 分解为多个行。在试用或修改该清单前,只需删除
script
元素中的换行符。图 1 展示了结果页面的截图。Google 的 JavaScript 使用包含搜索表单的 iframe 替换了该元素。当输入搜索时,将在一个独立的窗口打开结果页面。
图 1. 使用 Google Wikimedia plus 部件的示例页面
在第二个示例中,我将展示如何使用 Wiktionary 中的 word-of-the-day提要创建自己的小部件。编辑每天都要使用一个有趣的词作为当天的特色内容。这个小部件将选中的词与该词在 Wikimedia commons上的搜索结果(图像、声音文件、视频等等)结合在一起。清单 3(wotd.js)展示了部件的 JavaScript 代码。
清单 3(wotd.js)JavaScript word-of-the-day 小部件
/* Word of the day widget code. Requires jQuery: http://www.jquery.com (tested with version 1.2.6) */ var wotd = { //Some variavles global to the wotd namespace wotdfeedurl: "wotd_feed_proxy", commonssearch: "commons_search_proxy/", commonsbase: "http://commons.wikimedia.org", mediatargetid: "target", wotdtargetid: "wotd", word: "", worddesc: "", wiktionarylink: "", //Invoked once the main HTML DOM is ready loadPage: function() { wotd.medianode = $("#" + wotd.mediatargetid); wotd.wotdnode = $("#" + wotd.wotdtargetid); $.get(wotd.wotdfeedurl, wotd.processFeed); }, //Invoked with the result of the AJAX call to the Wiktionary feed processFeed: function(feed) { var item = $("item:first", feed); var title = item.find("title").text(); wotd.word = title.substring(title.indexOf(':')+2); wotd.wikionarylink = item.find("link").text(); //Update the target spot on the main page with the word of the day link wotd.wotdnode.append(wotd.word); wotd.wotdnode.attr("href", wotd.wikionarylink); $.get(wotd.commonssearch + wotd.word, wotd.processSearch); }, //Invoked with the result of the AJAX call to the Wikimedia commons search processSearch: function(result) { //Narrow in on the search results page narrowed = $(result).find(".mw-search-results"); //Fix up relative link and image URLs narrowed.find("a, link").attr("href", function (arr) { return wotd.commonsbase + $(this).attr("href"); }); narrowed.find("img").attr("src", function (arr) { return wotd.commonsbase + $(this).attr("src"); }); //Update the target spot on the main page with the search results narrowed.find("table td a").each(function (){ $('<div></div>').html($(this)).appendTo(wotd.medianode); }) }, } $(document).ready(function() { wotd.loadPage(); }); |
这段代码进行了良好的注释。它对 Ajax 库使用了 jQuery 库,并处理结果页面。像这类部件还必须有一个服务器端组件,因为安全性限制将阻止您在域之间发出 Ajax 请求。JavaScript 调用了一个相关的 URL
wotd_feed_proxy
,这实际上是远程 Wikimedia 站点页面的代理。这是使用所选的服务器工具可以实现的一个常见模式。我使用清单 4(wotd_server.py)所示的 Python/CherryPy 服务器代码。
清单 4(wotd_server.py)word-of-the-day 部件的 Python/CherryPy 服务器代码
# encoding: utf-8 """ wotd_server.py Requires: CherryPy http://cherrypy.py""" import os import urllib2 import cherrypy #Wikimedia commons search doesn't like bots, so pretend to be a browser HEADERS = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' } #Tell the server where to find local, static files such as index.html LOCAL_DIR = os.path.join(os.getcwd(), os.path.dirname(__file__)) #The URLs to be proxied WOTD_FEED_URL = "http://toolserver.org/~cmackenzie/wotd-rss.php" COMMONS_SEARCH_BASE = "http://commons.wikimedia.org/wiki/Special:Search?search=" #The server code class class Wotd: #Set up a local, static file server default = cherrypy.tools.staticdir.handler( section="/", dir=LOCAL_DIR) #Proxy the Wiktionary feed _cnnew1@cherrypy.expose def wotd_feed_proxy(self): cherrypy.response.headers['Content-Type'] = 'text/xml' return urllib2.urlopen(WOTD_FEED_URL).read() #Proxy Wikimedia commons search @cherrypy.expose def commons_search_proxy(self, word): url = COMMONS_SEARCH_BASE + word req = urllib2.Request(url, None, HEADERS) response = urllib2.urlopen(req) cherrypy.response.headers['Content-Type'] = 'text/html' return response.read() #Launch the server cherrypy.server.socket_port = 8888 cherrypy.server.socket_host = 'localhost' cherrypy.quickstart(Wotd()) |
同样,这些代码也进行了良好的注释。清单 5(index.html)是小部件的示例托管页面。
清单 5(index.html)word-of-the-day 小部件的示例托管页面
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > <head> <title>Wikimedia word of the day</title> <script src="jquery-1.2.6.js" type="text/javascript"></script> <script src="json2.js" type="text/javascript"></script> <script src="wotd.js" type="text/javascript"></script> </head> <body> <p>Wiktionary word of the day: <a id="wotd"></a></p> <p>Related items on Wikimedia commons:</p> <div id="target"></div> </body> </html> |
图 2. 使用 word-of-the-day 小部件的示例页面
|
|
如果您对这些站点中的技术和组织感兴趣,可以访问 Meta-Wiki,这是 “一个致力于协调和归档 Wikimedia Foundation的项目及其相关事务的网站”。Wikimedia Foundation 是一个非盈利性组织,但它的类似开放信息目标启发了商业公司(通常称为商业Wiki farms)。规模最大的此类商业站点是 Wikia,它的一名创始人还是 Wikimedia共同创始人之一。该站点托管了大量可能不适合 Wikimedia 站点的主题(例如各种Uncyclopedia,它对实际的主题进行了虚构的描述)。Wikileaks是一个针对激进主义者,举报者和其他想要匿名发布政府、企业或其他组织希望保密的机密文档的人员的 wiki。由于涉及敏感性话题,因此Wikileaks 不属于传统意义上的 wiki,在发布之前需要在内部进行审核。
由于在 Wikimedia 站点中使用了Creative Commons Attribution许可(知识共享许可),您可以免费使用所有这些资料,甚至可以用于商业活动,惟一的要求是必须添加返回链接并清晰地说明来源归属。Wikimedia的目标令人瞩目,其实现过程也是如此。具有创造力的网络管理员需要处理大量的信息。