7

这似乎是一个如此简单的问题,但我遇到了这样的困难。

问题:

我有一些文本要插入到HTMLDocument. 该文本有时也会指定一些 html。例如:

Some <br />Random <b>HTML</b>

HTMLEditorKit.insertHTML用来在指定的偏移量处插入它。这工作正常,除非偏移量位于文档的开头(偏移量 = 1)。在这种情况下,文本被插入到head文档中而不是body.

例子:

editorKitInstance.insertHTML(doc, offset, "<font>"+stringToInsert+"</font>", 0, 0, HTML.Tag.FONT);

我使用字体标签,所以我现在插入的内容将位于没有属性的字体标签中,因此不会影响格式。我需要知道这一点,因为最后一个参数 ,是必需的,直到运行时insertTag我才能知道它的内容。stringToInsert如果文档中已有文本(例如“1234567890”),则输出如下:

<html>
  <head>

  </head>
  <body>
    <p style="margin-top: 0">
      1234567890 <font>something <br />Some <br />Random <b>HTML</b></font>
    </p>
  </body>
</html>

但是,如果偏移量为 1 并且文档为空,则结果如下:

<html>
  <head>

<font>Some <br />Random <b>HTML</b></font>
  </head>
  <body>
  </body>
</html>

其他注意事项:

  • 这一切都是在JEditorPane. 如果有更好的方法JEditorPane用潜在的 HTML 替换 a 中的文本,我也会对这些想法持开放态度。

任何帮助,将不胜感激。 谢谢!

4

1 回答 1

8

关于 HTMLDocument 的内部结构,您应该了解几件事。

  • 首先 - 正文不是从位置 0 开始。文档的所有文本内容都存储在javax.swing.text.AbstractDocument$Content. 这也包括标题和脚本标签。ANY 文档和编辑器工具包函数的位置/偏移参数是指此 Content 实例中的文本!您必须确定 body 元素的开始才能正确地将内容插入到正文中。顺便说一句:即使您没有在 HTML 中定义 body 元素,它也会由解析器自动生成。
  • 简单地插入一个位置往往会产生意想不到的副作用。您需要知道要将内容相对于该位置的 (HTML) 元素放在哪里。例如,如果您的文档中有以下文本:“ ...</span><span>...”-“在第一个跨度的末尾”、“在跨度之间”和“在第二个跨度的开头”只有一个位置(指 Content 实例)跨度”。为了解决这个问题,HTMLDocument API 中有 4 个函数:
    • 插入后结束
    • 插入后开始
    • 插入前结束
    • insertBeforeStart

作为结论:对于一般解决方案,您必须找到 BODY 元素来告诉文档“insertAfterStart”正文和正文元素的起始偏移量。

以下截图在任何情况下都应该起作用:

HTMLDocument htmlDoc = ...;
Element[] roots = htmlDoc.getRootElements(); // #0 is the HTML element, #1 the bidi-root
Element body = null;
for( int i = 0; i < roots[0].getElementCount(); i++ ) {
    Element element = roots[0].getElement( i );
    if( element.getAttributes().getAttribute( StyleConstants.NameAttribute ) == HTML.Tag.BODY ) {
        body = element;
        break;
    }
}
htmlDoc.insertAfterStart( body, "<font>text</font>" );

如果您确定标头始终为空,则还有另一种方法:

kit.read( new StringReader( "<font>test</font>" ), htmlDoc, 1 );

但是,如果标头不为空,这将引发 RuntimeException。

顺便说一句,我更喜欢使用JWebEngine来处理和呈现 HTML 内容,因为它保持标题和内容分开,所以在位置 0 插入总是有效的。

于 2010-08-19T07:41:52.190 回答