有没有关于一个易于使用的API的好的解析器的想法,它是可配置的?我想要将数据传入它,比如http://wikitravel.org/wiki/en/api.php?format=xml&action=parse&prop=wikitext&page=San%20Francisco,选择我想要的数据部分,并为每种独特的元素类型输出自定义的HTML?最好是Java,但如果有一个与大多数(99%以上)维基文本兼容的PHP/js解决方案,那也可以。
这个问题已经几年前就得到了答复,但我想为将来的访问者节省一些工作量,帮助他们弄清如何使用Sweble。
你可以尝试在他们网站上查看文档,但我自己也没法理解。只需查看示例源代码即可。下载 swc-example-basic 的源jar包,查看App.java和TextConverter.java文件。
基本上,要解析页面并将其转换为另一种形式,您需要首先向项目添加以下依赖项:
<dependency>
<groupId>org.sweble.wikitext</groupId>
<artifactId>swc-engine</artifactId>
<version>2.0.0</version>
</dependency>
接着,执行以下操作:
public String convertWikiText(String title, String wikiText, int maxLineLength) throws LinkTargetException, EngineException {
// Set-up a simple wiki configuration
WikiConfig config = DefaultConfigEnWp.generate();
// Instantiate a compiler for wiki pages
WtEngineImpl engine = new WtEngineImpl(config);
// Retrieve a page
PageTitle pageTitle = PageTitle.make(config, title);
PageId pageId = new PageId(pageTitle, -1);
// Compile the retrieved page
EngProcessedPage cp = engine.postprocess(pageId, wikiText, null);
TextConverter p = new TextConverter(config, maxLineLength);
return (String)p.go(cp.getPage());
}
TextConverter是我之前提到的示例中的一个类。您可以自定义它以执行您想要的任何操作。例如,以下代码会确保所有加粗文本都用“**”括起来:
public void visit(WtBold b)
{
write("**");
iterate(b);
write("**");
}
那个类上有一堆用于处理你可能会遇到的每种类型元素的访问方法。
Sweble 可能是最好的 Java wikitext 解析器。它声称完全符合wikitext标准,但我对此表示怀疑。它将 wikitext 解析为抽象语法树,然后您需要对其做一些处理(例如将其转换为HTML)。
mediawiki.org 上有一个页面列出了各种编程语言中的 wikitext 解析器。然而,我认为它们都无法满足 99% 以上的 wikitext 标准,因为解析 wikitext 是一个非常复杂的问题。在 MediaWiki 解析器之外,wikitext 甚至没有被正式定义过。
String htmlText = WikiModel.toHtml("This is a simple [[Hello World]] wiki tag");
你也可以使用XWiki的渲染引擎(http://rendering.xwiki.org)。以下是如何解析一些MediaWiki内容的示例:
// Initialize Rendering components and allow getting instances
EmbeddableComponentManager componentManager = new EmbeddableComponentManager();
componentManager.initialize(this.getClass().getClassLoader());
// Get the MediaWiki Parser
Parser parser = componentManager.getInstance(Parser.class, "mediawiki/1.0);
// Parse the content in mediawiki markup and generate an AST (it's also possible to use a streaming parser for large content)
XDOM xdom = parser.parse(new StringReader("... input here"));
// Perform any transformation you wish to the XDOM here
...
// Generate XHTML out of the modified XDOM
WikiPrinter printer = new DefaultWikiPrinter();
BlockRenderer renderer = componentManager.getInstance(BlockRenderer.class, "xhtml/1.0");
renderer.render(xdom, printer);
// The result is now in the printer object
printer.toString();
请访问http://rendering.xwiki.org/xwiki/bin/view/Main/GettingStarted以获取更多示例。
希望能对您有所帮助。