2012-07-23 79 views
3

任何想法与一个易于使用的API可配置的一个很好的解析器?我正在为它提供数据,如http://wikitravel.org/wiki/en/api.php?format=xml&action=parse&prop=wikitext&page=San%20Francisco,选择我想要的数据部分,并为每种独特类型的元素输出自定义html? Java是首选,但如果有一个与大多数(99%以上)wiki文本兼容的php/js解决方案,那也是可以的。爪哇Wikitext分析器

+0

要怎样解析wikitext?或者:您如何定制HTML? – Bergi 2012-07-23 12:05:18

+0

我想将wikitext转换为html,但能够改变kind输出,例如将italizing('')改为其他的。 – 2012-07-23 18:50:02

+0

你不能这样做,即将更改为其他内容? – Bergi 2012-07-23 18:55:02

回答

11

Sweble可能是wikitext的最佳Java解析器。它带有wiki文本,但我严重怀疑这一点。它将wikitext解析为一个抽象语法树,然后你必须做些事情(比如将其转换为HTML)。

There is a page on mediawiki.org列出了各种编程语言的wikitext解析器。但我不认为他们中的任何人都能做到99 +%的wiki文本。一般来说,解析wikitext是一个非常复杂的问题。 Wikitext甚至没有在MediaWiki解析器本身之外的任何地方正式定义。

+0

优秀的答案,我会写同样的:-) – Bergi 2012-07-23 18:55:48

+0

你甚至怎么使用Sweble?我之前看过它,但是我无法在Java中找到api来访问它,我无法通过命令行调用jar解析任何东西。 – 2012-07-23 18:56:31

+1

是的,他们的文档不是很好。你有没有看到这个例子:http://sweble.org/wiki/Sweble_Wikitext_Parser/Guide/Demo_Project? – Christian 2012-07-23 18:57:34

6

这个问题在几年前就已经回答了,但我想为未来的访问者保存我不得不花费的精力来弄清楚如何使用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是在上面提到的例子中你会发现一个类。定制它做你想做的任何事情。例如,下面的操作确保所有粗体文字是由“**”包围:

public void visit(WtBold b) 
{ 
    write("**"); 
    iterate(b); 
    write("**"); 
} 

有一堆关于该类每种类型,您会遇到元素的访问方法。

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

希望它能帮助。