Я пытаюсь понять, как позиции/смещения работают в HTMLDocument
. Позиция/семантика офсетной описана здесь. Моя интерпретация заключается в том, что это индексы в последовательности экранных символов, представленных HTMLDocument
.
Рассмотрим пример HTML из документации HTMLDocument
:
<html>
<head>
<title>An example HTMLDocument</title>
<style type="text/css">
div { background-color: silver; }
ul { color: red; }
</style>
</head>
<body>
<div id="BOX">
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</div>
</body>
</html>
Когда я открываю этот HTML-код в браузере, я вижу только "Параграф 1" и "Параграф 2" (и никаких ведущих пробелов или новых строк). Поэтому я думаю, что "Пункт 1" начинается со смещения 0
.
Но рассмотрим следующий код, где я печатаю текст в примере HTML и смещение тела:
import java.io.StringReader;
import javax.swing.text.Element;
import javax.swing.text.html.*;
public class Test {
public static void main(String[] args) throws Exception {
String html = " <html>\n"
+ " <head>\n"
+ " <title>An example HTMLDocument</title>\n"
+ " <style type=\"text/css\">\n"
+ " div { background-color: silver; }\n"
+ " ul { color: red; }\n"
+ " </style>\n"
+ " </head>\n"
+ " <body>\n"
+ " <div id=\"BOX\">\n"
+ " <p>Paragraph 1</p>\n"
+ " <p>Paragraph 2</p>\n"
+ " </div>\n"
+ " </body>\n"
+ " </html>\n";
HTMLEditorKit htmlKit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) htmlKit.createDefaultDocument();
htmlKit.read(new StringReader(html), doc, 0);
System.out.println("doc length: " + doc.getLength());
String text = doc.getText(0, doc.getLength());
System.out.println("doc text, surrounded by quotes, with newlines replaced with /: \""
+ text.replace('\n', '/') + "\"");
Element element = doc.getDefaultRootElement().getElement(1);
System.out.println("element name: " + element.getName());
int offset = element.getStartOffset();
System.out.println("offset of body: " + offset);
}
}
Выход:
doc length: 26
doc text, surrounded by quotes, with newlines replaced with /: " /Paragraph 1/Paragraph 2"
element name: body
offset of body: 3
Основные вопросы: Почему "Пункт 1" (начало тела) по индексу 3
? Откуда берутся первые три символа (два пробела и новая строка) текста? Я неверно истолковываю, что означает "смещение"?
Заданный вопрос: учитывая некоторый HTML (достаточно простой, чтобы полностью понять путем проверки), как я могу точно определить смещения всех элементов DOM вручную?
Больше информации:
Если я удалю тег style
из HTML, я получаю тот же результат (смещение тела 3
). Если я также удалю title
, я получаю смещение тела 1
. Если я окончательно удалю head
целиком, я получаю смещение тела 0
(как и ожидалось). Таким образом, по-видимому, style
вносит 0, title
вносит 2, а head
вносит 1 в смещение тела? Каковы причины этого?
На это также не влияет пробел в строке HTML.