Ogólne#

CharacterData#

W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w interfejsie CharacterData i dziedziczących po nim interfejsach Text, Comment oraz ProcessingInstruction.

Pojęcia#

data

Każdy węzeł dziedziczący po interfejsie CharacterData jest skojarzony ze zmiennym łańcuchem znakowym # (mutable string), potocznie zwanym danymi # (data).

Z racji tego, że określenie "dane" jest nazbyt ogólnikowe, to w kontekście interfejsu CharacterData (i pochodnych) najczęściej będę posługiwał się określeniem "dane tekstowe".

contiguous Text nodes

Przyległymi węzłami tekstowymi # (contiguous Text nodes) dla danego węzła tekstowego będzie węzeł we własnej osobie, brat poprzedzający typu Text (jeśli istnieje) oraz jego przyległe węzły tekstowe, brat następujący typu Text (jeśli istnieje) oraz jego przyległe węzły tekstowe, z wykluczeniem duplikatów.

target

Obiekty typu ProcessingInstruction są skojarzone z celem # (target).

Algorytmy#

replace data

Aby zastąpić dane tekstowe # (replace data) węzła node, z przesunięciem offset, licznikiem count oraz danymi tekstowymi data, należy wykonać następujące kroki:

  1. Niech length będzie wartością atrybutu length w node.
  2. Jeśli offset jest większe od length, to zrzuć wyjątek "IndexSizeError".
  3. Jeśli offset plus count jest większy od length niech count będzie miał wartość length minus offset.
  4. Kolejkuj zapis zmian z typem "characterData", celem node oraz poprzednią wartością będącą danymi tekstowymi w node.
  5. Wstaw data do danych tekstowych w node za tyloma jednostkami kodowymi ile wskazuje offset.
  6. Niech delete offset będzie miał wartość offset plus ilość jednostek kodowych w data.
  7. Zaczynając od jednostek kodowych wskazywanych przez delete offset, usuń z danych tekstowych w node jednostki kodowe w ilości count.
  8. Dla każdego (for each) zakresu, którego węzłem początkowym jest node i przesunięcie początkowe jest większe od offset, ale mniejsze lub równe offset plus count, ustaw jego przesunięcie początkowe na offset.
  9. Dla każdego (for each) zakresu, którego węzłem końcowym jest node i przesunięcie końcowe jest większe od offset, ale mniejsze lub równe offset plus count, ustaw jego przesunięcie końcowe na offset.
  10. Dla każdego (for each) zakresu, którego węzłem początkowym jest node i przesunięcie początkowe jest większe od offset plus count, zwiększ jego przesunięcie początkowe o liczbę jednostek kodowych w data, a następnie zmniejsz o count.
  11. Dla każdego (for each) zakresu, którego węzłem końcowym jest node i przesunięcie końcowe jest większe od offset plus count, zwiększ jego przesunięcie końcowe o liczbę jednostek kodowych w data, a następnie zmniejsz o count.

substring data

Aby wydobyć część danych tekstowych # (substring data) węzła node, z przesunięciem offset oraz licznikiem count, należy wykonać następujące kroki:

  1. Niech length będzie wartością atrybutu length w node.
  2. Jeśli offset jest większe od length, to zrzuć wyjątek "IndexSizeError".
  3. Jeśli offset plus count jest większy od length, to zwróć łańcuch znakowy, którego wartością są jednostki kodowe z danych tekstowych w node, zaczynając od jednostki kodowej wskazywanej przez offset do końca danych tekstowych w node i pomiń kolejne kroki.
  4. Zwróć łańcuch znakowy, którego wartością są jednostki kodowe z danych tekstowych w node, zaczynając od jednostki kodowej wskazywanej przez offset do jednostki kodowej wskazywanej przez offset plus count.

split

Aby podzielić # (split) węzeł tekstowy node z przesunięciem offset, należy wykonać następujące kroki:

  1. Niech length będzie wartością atrybutu length w node.
  2. Jeśli offset jest większe od length, to zrzuć wyjątek "IndexSizeError".
  3. Niech count będzie miał wartość length minus offset.
  4. Niech new data będzie wynikiem wydobywania część danych tekstowych węzła node, z przesunięciem offset oraz licznikiem count.
  5. Niech new node będzie nowym węzłem typu Text, z tym samym właścicielem, co w node. Ustaw dane tekstowe w new node na new data.
  6. Niech parent wskazuje na rodzica w node.
  7. Jeśli parent nie ma wartości null, to wykonaj poniższe podkroki:

    1. Wstaw new node do parent przed bratem następującym dla node.
    2. Dla każdego (for each) zakresu, którego węzłem początkowym jest node i przesunięcie początkowe jest większe od offset, ustaw jego węzeł początkowy na new node i zmniejsz jego przesunięcie początkowe o offset.
    3. Dla każdego (for each) zakresu, którego węzłem końcowym jest node i przesunięcie końcowe jest większe od offset, ustaw jego węzeł końcowy na new node i zmniejsz jego przesunięcie końcowe o offset.
    4. Dla każdego (for each) zakresu, którego węzłem początkowym jest parent i przesunięcie początkowe jest równe indeksowi w node + 1, zwiększ jego przesunięcie początkowe o jeden.
    5. Dla każdego (for each) zakresu, którego węzłem końcowym jest parent i przesunięcie końcowe jest równe indeksowi w node + 1, zwiększ jego przesunięcie końcowe o jeden.
  8. Zastąp dane tekstowe węzła node, z przesunięciem offset, licznikiem count oraz danymi tekstowymi w postaci pustego łańcucha znakowego.
  9. Jeśli parent ma wartości null, to wykonaj poniższe podkroki:

    1. Dla każdego (for each) zakresu, którego węzłem początkowym jest node i przesunięcie początkowe jest większe od offset, ustaw jego przesunięcie początkowe na offset.
    2. Dla każdego (for each) zakresu, którego węzłem początkowym jest node i przesunięcie końcowe jest większe od offset, ustaw jego przesunięcie końcowe na offset.
  10. Zwróć new node.
Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Ogólne (H1) CharacterData (H2) Pojęcia (H3) data (H4) contiguous Text nodes (H4) character node (H4) target (H4) Algorytmy (H3) replace data (H4) substring data (H4) split (H4)