一个好的解析器有一个易于使用的api可配置的任何想法吗?我想提供http://wikitravel.org/wiki/en/api.php?format=xml&action=parse&prop=wikitext&page=San%20Francisco等数据,选择我想要的数据部分,并为每种独特的元素类型输出自定义html? Java将是首选,但如果有一个php / js解决方案与大多数(99%+)wikitext兼容,那也没关系。
答案 0 :(得分:12)
Sweble可能是wikitext的最佳Java解析器。它claims to be 100% compliant与wikitext,但我严重怀疑。它将wikitext解析为一个抽象语法树,然后你必须做一些事情(比如把它转换成HTML)。
There is a page on mediawiki.org列出了各种编程语言中的wiki文本解析器。我不认为他们中的任何人做了99 +%的wikitext。一般来说,解析wikitext是一个非常复杂的问题。 Wikitext甚至不能在MediaWiki解析器本身之外的任何地方正式定义。
答案 1 :(得分:9)
这个问题在几年前得到了回答,但我想为未来的访问者节省我必须采取的努力来弄清楚如何使用Sweble。
您可以在他们的网站上试用文档,但我无法弄明白。只需看看示例源代码。在https://repo1.maven.org/maven2/org/sweble/wikitext/swc-example-basic/2.0.0/swc-example-basic-2.0.0-sources.jar下载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是您在上面提到的示例中找到的类。自定义它可以做任何你想做的事情。例如,以下内容确保所有粗体文本都包含在&#34; **&#34;:
中public void visit(WtBold b)
{
write("**");
iterate(b);
write("**");
}
对于您遇到的每种元素,该类都有一堆访问方法。
答案 2 :(得分:2)
我刚刚与Bliki取得了成功:https://bitbucket.org/axelclk/info.bliki.wiki/wiki/Mediawiki2HTML
Bliki是XWiki使用的,使用非常简单:
\s*
以下是下载列表: https://oss.sonatype.org/content/repositories/snapshots/info/bliki/wiki/bliki-core/
但是使用Maven更容易。
答案 3 :(得分:0)
您也可以使用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
上查看更多示例希望它有所帮助。