9

对一个具有易于使用且可配置的 api 的好的解析器有什么想法吗?我希望为其提供数据,例如http://wikitravel.org/wiki/en/api.php?format=xml&action=parse&prop=wikitext&page=San%20Francisco,选择我想要的数据部分,然后输出自定义 html每个独特类型的元素?Java 将是首选,但如果有与大多数 (99%+) wikitext 兼容的 php/js 解决方案,那也可以。

4

4 回答 4

15

Sweble可能是最好的 wikitext Java 解析器。它声称 100% 符合wikitext,但我对此表示严重怀疑。它将 wikitext 解析为抽象语法树,然后您必须对其进行处理(例如将其转换为 HTML)。

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

于 2012-07-23T18:52:22.377 回答
15

这个问题在几年前就得到了回答,但我想为未来的访问者节省我必须花费的精力来弄清楚如何使用 Sweble。

您可以在他们的网站上尝试文档,但我无法弄清楚。只需查看示例源代码。在https://repo1.maven.org/maven2/org/sweble/wikitext/swc-example-basic/2.0.0/swc-example-basic-2.0.0-sources下载 swc-example-basic 的源 jar .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("**");
}

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

于 2015-06-28T21:15:25.270 回答
2

我刚刚在 Bliki 上取得了成功:https ://bitbucket.org/axelclk/info.bliki.wiki/wiki/Mediawiki2HTML

Bliki 是 XWiki 使用的,使用非常简单:

String htmlText = WikiModel.toHtml("This is a simple [[Hello World]] wiki tag");

以下是下载列表: https ://oss.sonatype.org/content/repositories/snapshots/info/bliki/wiki/bliki-core/

但是在 Maven 中使用它要容易得多。

于 2016-12-14T18:20:29.873 回答
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查看更多示例

希望能帮助到你。

于 2015-08-02T16:20:01.057 回答