Хороший вопрос.Вы можете вычислить смещения (и, следовательно, необходимые позиции каретки в JEditorPane
) в соответствии с несколькими правилами - вы уже упомянули самые важные из них.
Возможно, есть несколько ключевых тегов:
<head>
+ 1 <title>
+ 2 <meta>
+ 1 <p>
длина текста +1 (дляCR)
Если вы еще не нашли его, самый простой способ просмотреть этот список смещений и их разбивку - HTMLDocument.dump(System.out);
.Например, для приведенного выше примера HTML:
<html
name=html
>
<head
name=head
>
<p-implied
name=p-implied
>
<title
name=title
>
[0,1][ ]
<title
endtag=true
name=title
>
[1,2][ ]
<content
CR=true
name=content
>
[2,3][
]
<body
name=body
>
<div
id=BOX
name=div
>
<p
name=p
>
<content
name=content
>
[3,14][Paragraph 1]
<content
CR=true
name=content
>
[14,15][
]
<p
name=p
>
<content
name=content
>
[15,26][Paragraph 2]
<content
CR=true
name=content
>
[26,27][
]
<bidi root>
<bidi level
bidiLevel=0
>
[0,27][
Paragraph 1
Paragraph 2
]
Если вам интересно углубиться в детали, это будет означать изучение правил в логике синтаксического анализа Swing для HTML.Существует множество правил для разных типов тегов - вы можете увидеть список в source .
Каждый тег использует класс 'Action' в этой иерархии:
![swing-html-actions](https://i.stack.imgur.com/EJ8hQ.png)
Например, <p>
- это ParagraphAction
, <head>
- это HeadAction
, и оба типа BlockAction
.A <div>
также является BlockAction
.
A BlockAction
может добавить этот дополнительный элемент <content CR...>
, чтобы завершить блок, следовательно, дополнительные +1 на смещении.Обычно это происходит, только если в теге было прямое текстовое содержимое.Для <head>
, однако, подкласс HeadAction
добавляет <p-implied>
, который вы видите в дампе выше, что вызывает одно из дополнительных смещений.(Вы не можете видеть это в этом примере, но стоит отметить, что <div>
с текстовым содержимым также добавляет дополнительные <p-implied>
- для хранения текста блока).
С этого момента все более определенно становится более конкретным,Например, <title>
(вместе с <applet>
и <object>
) кажутся "непустыми" HiddenActions
.Это означает, что элемент вставляется для начального и конечного тегов.<meta>
хотя, например, это пустой HiddenAction
, поэтому просто получает один элемент для начального тега.
Надеюсь, этого достаточно для объяснения того, как вычислить смещение для любого данного тега.При просмотре исходного кода для классов XxxActions
ищите строки, подобные new ElementSpec(..., 0, 1)
- последний параметр - это длина.
Вы также упоминали, что пропуски игнорируются.По крайней мере, это нормально при разборе HTML, и в браузерах тоже.Пробелы между тегами или до и после текста обычно игнорируются - сохраняется только пробел между словами.И затем последовательности пробелов объединяются в один пробел.
При всем этом я до сих пор не понимаю, зачем нужны дополнительные смещения для <head>
и <title>
.Например, если вы используете setCaretPosition(x)
против JEditorPane
на основе doc
и htmlKit
выше, вы увидите только, если x
равно 3 или больше.Возможно, кто-то еще может пролить свет на это ...