Java Wikitext Parser

10

你想解析维基文本吗?或者说,你想如何自定义HTML? - Bergi
我想将维基文本转换为HTML,但要能够更改输出类型,例如将斜体('')转换为其他内容。 - No_name
你不能之后再做吗,比如将<i>改成其他的东西? - Bergi
转换次数越少,越好。 - No_name
4个回答

15

这个问题已经几年前就得到了答复,但我想为将来的访问者节省一些工作量,帮助他们弄清如何使用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("**");
}

那个类上有一堆用于处理你可能会遇到的每种类型元素的访问方法。


15

Sweble 可能是最好的 Java wikitext 解析器。它声称完全符合wikitext标准,但我对此表示怀疑。它将 wikitext 解析为抽象语法树,然后您需要对其做一些处理(例如将其转换为HTML)。

mediawiki.org 上有一个页面列出了各种编程语言中的 wikitext 解析器。然而,我认为它们都无法满足 99% 以上的 wikitext 标准,因为解析 wikitext 是一个非常复杂的问题。在 MediaWiki 解析器之外,wikitext 甚至没有被正式定义过。


非常好的答案,我也会写同样的 :-) - Bergi
你怎么使用Sweble呢?我之前看过它,但是我找不到在Java中访问它的API,也无法通过调用命令行中的jar来解析任何内容。 - No_name
1
是的,他们的文档不太好。你看过这个例子吗:http://sweble.org/wiki/Sweble_Wikitext_Parser/Guide/Demo_Project? - Christian
我看了这个例子,但是我尝试了很多来自http://mojo.informatik.uni-erlangen.de/nexus/content/repositories/public-releases/org/sweble/wikitext/的jar包。它们都显示“没有主清单属性”。 - No_name

2

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以获取更多示例。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接