ダウンロードは下記サイトのDownloadから。WikiText Standaloneというのを落とすと中に必要なjarがひと通り入っている。
Mylyn/WikiText
http://wiki.eclipse.org/Mylyn/Incubator/WikiText
Mavenもあるらしい。なぜかscala-toolsのレポジトリの中にいた。
<repository>
<id>scala-tools.org</id>
<name>releases</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
<dependency>
<groupId>org.eclipse.mylyn.wikitext</groupId>
<artifactId>wikitext</artifactId>
<version>0.9.4.I20090220-1600-e3x</version>
</dependency>
<dependency>
<groupId>org.eclipse.mylyn.wikitext</groupId>
<artifactId>wikitext.mediawiki</artifactId>
<version>0.9.4.I20090220-1600-e3x</version>
</dependency>
今回はMediaWiki関連の記述を扱うので、wikitextとwikitext.mediawikiの2つだけ入れる。MediaWiki以外にも、TWiki、Confluence、TracWiki、Textileが用意されているらしい。
とりあえずWiki記法の文字列をHTMLに変換してみる。
import java.io.StringWriter
import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder
import org.eclipse.mylyn.wikitext.core.parser.MarkupParser
import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage
// Wikipediaの記事から拝借
val wikiText = """
== 概要 ==
専門家によるオンライン百科事典プロジェクト[[Nupedia]](ヌーペディア)を前身として[[2001年]]1月、[[ラリー・サンガー]] (Larry Sanger) と[[ジミー・ウェールズ]](Jimmy Donal "Jimbo" Wales)により英語でプロジェクトが開始された。ウェブサイトには[[広告]]は一切掲載せず、資金的には個人や団体などからの[[寄付]]により運営している。
"""
// 上のテキストをHTMLに変換する
val writer = new StringWriter()
val builder = new HtmlDocumentBuilder(writer)
val parser = new MarkupParser(new MediaWikiLanguage())
parser.setBuilder(builder)
parser.parse(wikiText)
val html = writer.toString()
println(html)
結果は以下のようになった。
<?xml version='1.0' encoding='utf-8' ?><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body><h2 id=".E6.A6.82.E8.A6.81">概要</h2><p>専門家によるオンライン百科事典プロジェクト<a href="/wiki/Nupedia" title="Nupedia">Nupedia</a>(ヌーペディア)を前身として<a href="/wiki/2001年" title="2001年">2001年</a>1月、<a href="/wiki/ラリー・サンガー" title="ラリー・サンガー">ラリー・サンガー</a> (Larry Sanger) と<a href="/wiki/ジミー・ウェールズ" title="ジミー・ウェールズ">ジミー・ウェールズ</a>(Jimmy Donal "Jimbo" Wales)により英語でプロジェクトが開始された。ウェブサイトには<a href="/wiki/広告" title="広告">広告</a>は一切掲載せず、資金的には個人や団体などからの<a href="/wiki/寄付" title="寄付">寄付</a>により運営している。</p></body></html>
今回この子に手を出したの、Wikiからテキストだけ抽出したかったから。
見ての通り、結果はXHMLで出力されるのでXMLパーサを利用すればテキストだけ抜き出すことができる。Scalaの場合はこんな感じで一行で書けたりする。
val text = XML.loadString(html).text
println(text)
出力結果は以下。
概要専門家によるオンライン百科事典プロジェクトNupedia(ヌーペディア)を前身として2001年1月、ラリー・サンガー (Larry Sanger) とジミー・ウェールズ(Jimmy Donal "Jimbo" Wales)により英語でプロジェクトが開始された。ウェブサイトには広告は一切掲載せず、資金的には個人や団体などからの寄付により運営している。
「概要専門家」のように前のブロックと文字がくっついてしまっているのが気になる。タグ間をスペース区切りにする分には、以下の記述でいけるような気がする。
val buf = new ArrayBuffer[String]()
def loop(node: Node): Unit = {
if (node.isAtom) buf += node.text
else node.child foreach loop
}
loop(XML.loadString(html))
println(buf mkString " ")
でも、実際にWikipediaの記事を食わせてみたらパース中にエラーが起きたりした。
仕方ないのでJSoupを噛ませてみる。JSoupはタグの除去をする際にはけっこう便利。
def removeWikiSyntax(text: String): String = {
// Wiki記法の文字列 → HTMLの文字列
def wikiTextToHtml(text: String): String = {
val writer = new StringWriter()
val builder = new HtmlDocumentBuilder(writer)
val parser = new MarkupParser(new MediaWikiLanguage())
parser.setBuilder(builder)
parser.parse(text)
writer.toString()
}
Jsoup.parse(wikiTextToHtml(text)).text()
}
なんとなく出来た感があるけど、Wiki → HTML → Textと変換するくらいなら、最初からWiki → Textとする方法を探した方が良い気がする。PEARではそういうライブらいを見かけたけど、Javaではあるのだろうか。
自前で作ると面倒だしいろいろ条件見落としそうだから、どこかで良いライブラリを見つけたら使ってみよう。