Ogólne#

Nodes#

W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w dziale NODES, czyli mogą mieć one zastosowanie dla wszystkich interfejsów z tego działu.

Pojęcia#

node document

Każdy węzeł jest skojarzony z właścicielem # (node document), którym jest dokument (np. węzeł typu Document lub inny dziedziczący po nim), i który jest ustawiany automatycznie w czasie tworzenia tego węzła. Z dowolnego węzła można pobrać jego właściciela za pomocą właściwości Node.ownerDocument, pamiętając jednocześnie o tym, że dla dokumentów zwracana będzie wartość null.

Właściciel dla danego węzła może zostać zmieniony już po jego utworzeniu. Odbywa się to wyłącznie za pośrednictwem algorytmu adoptującego wykorzystywanego w niektórych metodach, np. Document.adoptNode(), Node.appendChild(), Node.insertBefore() czy Node.replaceChild().

length

Długość # (length) w węźle node zależy od jego typu:

empty

Węzeł jest uznawany za pusty # (empty) jeśli jego długość wynosi zero.

Algorytmy#

adopting steps

Obowiązujące specyfikacje mogą definiować dodatkowe kroki adoptowania # (adopting steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywane są argumenty node i oldDocument, jak w poniższym algorytmie adoptowania.

adopt

Aby adoptować # (adopt) węzeł node do dokumentu document należy wykonać następujące kroki:

  1. Niech oldDocument będzie właścicielem w node.
  2. Jeśli rodzic w node nie ma wartości null, to usuń node z jego rodzica.
  3. Jeśli document nie jest taki sam jak oldDocument, to wykonaj poniższe podkroki:

    1. Dla każdego (for each) potomka obejmującego descendant z potomków obejmujących w node, zgodnie z porządkiem drzewa, ustaw właściciela w descendant na document.
    2. Dla każdego (for each) potomka obejmującego descendant z potomków obejmujących w node, zgodnie z porządkiem drzewa, uruchom dodatkowe kroki adoptowania z przekazaniem descendant i oldDocument.

adopt

Obowiązujące specyfikacje mogą definiować dodatkowe kroki klonowania # (cloning steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywane są argumenty copy, node, document i opcjonalnie clone children flag, jak w poniższym algorytmie klonowania.

Specyfikacja HTML5 określa dodatkowe kroki klonowania dla skryptów oraz pól wejściowych formularza. SVG powinien robić to samo dla swoich elementów skryptowych, ale w tym momencie tego nie czyni.

clone

Aby sklonować # (clone) węzeł node, z opcjonalnym dokumentem document i flagą klonowania dzieci clone children flag, należy wykonać następujące kroki:

  1. Jeśli document nie został przekazany, to niech document wskazuje na właściciela w node.
  2. Niech copy będzie nowym węzłem implementującym ten sam interfejs jak w node, i w zależności od node, wykonaj poniższe podkroki:

    Dla węzła typu Document
    1. Ustaw kodowanie, typ zawartości, adres URL, typ oraz tryb w copy na te same wartości, co w node.
    Dla węzła typu DocumentType
    1. Ustaw nazwę, identyfikator publiczny oraz identyfikator systemowy w copy na te same wartości, co w node.
    Dla węzła typu Element
    1. Ustaw przestrzeń nazw, prefiks przestrzeni nazw oraz nazwę lokalną w copy na te same wartości, co w node.
    2. Dla każdego (for each) atrybutu attribute w liście atrybutów skojarzonej z node, zgodnie z kolejnością, wykonaj poniższe wewnętrzne podkroki:

      1. Niech copyAttribute będzie nowym obiektem typu Attr.
      2. Ustaw przestrzeń nazw, prefiks przestrzeni nazw, nazwę lokalną oraz wartość w copyAttribute na te same wartości, co w attribute.
      3. Dodaj copyAttribute do listy atrybutów skojarzonej z copy.
    Dla węzła typu Text i Comment
    1. Ustaw dane tekstowe w copy na te same wartości, co w node.
    Dla węzła typu ProcessingInstruction
    1. Ustaw cel oraz dane tekstowe w copy na te same wartości, co w node.
    Dla pozostałych węzłów
    1. Niczego nie rób.
  3. Jeśli copy jest węzłem typu Document, to ustaw właściciela w copy oraz document na copy, w przeciwnym razie ustaw właściciela w copy na document.
  4. Uruchom wszystkie dodatkowe kroki klonowania dla node zdefiniowane w innych obowiązujących specyfikacjach, z przekazaniem copy, node, document i clone children flag (jeśli ustawiona).
  5. Jeśli clone children flag jest ustawiona, to klonuj wszystkie dzieci w node i dołącz je do copy, z przekazaniem document i clone children flag.
  6. Zwróć copy.

equals

Węzeł A jest zgodny # (equals) z węzłem B jeśli wszystkie poniższe warunki są prawdziwe:

locate a namespace prefix

Aby zlokalizować prefiks przestrzeni nazw # (locate a namespace prefix) dla elementu element przy pomocy przestrzeni nazw namespace należy wykonać następujące kroki:

  1. Jeśli przestrzenią nazw w element jest namespace i jego prefiks przestrzeni nazw nie ma wartości null, to zwróć jego prefiks przestrzeni nazw.
  2. Jeśli element posiada jakiś atrybut, którego prefiks przestrzeni nazw ma wartość "xmlns" i jego wartością jest namespace, to zwróć nazwę lokalną pierwszego takiego atrybutu z element.
  3. Jeśli rodzicem elementowym w element nie jest wartość null, to zwróć wynik lokalizacji prefiksu przestrzeni nazw dla element z przekazaniem namespace. W przeciwnym razie zwróć wartość null.

locate a namespace

Aby zlokalizować przestrzeń nazw # (locate a namespace ) dla węzła node przy pomocy prefiksu przestrzeni nazw prefix należy, w zależności od node, wykonać następujące kroki:

Dla węzła typu Element
  1. Jeśli jego przestrzenią nazw nie jest wartość null i jego prefiksem przestrzeni nazw jest prefix, to zwróć jego przestrzeń nazw.
  2. Jeśli posiada on atrybut, którego przestrzenią nazw jest przestrzeń nazw XMLNS, prefiksem przestrzeni nazw jest "xmlns" i nazwą lokalną jest prefix, lub jeśli prefix ma wartość null i posiada on atrybut, którego przestrzenią nazw jest przestrzeń nazw XMLNS, prefiksem przestrzeni nazw jest wartość null i nazwą lokalną jest "xmlns":

    1. Niech value będzie jego wartością jeśli nie jest ona pustym łańcuchem znakowym, w przeciwnym razie niech będzie wartością null.
    2. Zwróć value.
  3. Jeśli jego rodzicem elementowym jest wartość null, to zwróć wartość null.
  4. Zwróć wynik lokalizacji przestrzeni nazw na jego rodzicu elementowym z przekazaniem prefix.
Dla węzła typu Document
  1. Jeśli jego elementem dokumentowym jest wartość null, to zwróć wartość null.
  2. Zwróć wynik lokalizacji przestrzeni nazw na jego elemencie dokumentowym z przekazaniem prefix.
Dla węzła typu DocumentType i DocumentFragment
  1. Zwróć wartość null.
Dla pozostałych węzłów
  1. Jeśli jego rodzicem elementowym jest wartość null, to zwróć wartość null.
  2. Zwróć wynik lokalizacji przestrzeni nazw na jego rodzicu elementowym z przekazaniem prefix.

list of elements with qualified name qualifiedName

Lista elementów z nazwą kwalifikowaną qualifiedName # (list of elements with qualified name qualifiedName) dla węzła root jest kolekcją typu HTMLCollection zwróconą zgodnie z poniższym algorytmem:

  1. Jeśli qualifiedName ma wartość "*" (U+002A), to zwróć kolekcję typu HTMLCollection zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typu Element.
  2. W przeciwnym razie, jeśli właścicielem w root jest dokument HTML, to zwróć kolekcję typu HTMLCollection zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typu Element spełniających następujące reguły:

  3. W przeciwnym razie zwróć kolekcję typu HTMLCollection zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typu Element mających nazwę kwalifikowaną wskazywaną przez qualifiedName.

Po kolejnym wywołaniu metody z tym samym argumentem, i tak długo jak typ we właścicielu skojarzonym z root nie uległ zmianie (tj. z wartości "html" na "xml" lub odwrotnie), może zostać zwrócony ten sam obiekt HTMLCollection, który utworzony i zwrócony został we wcześniejszym wywołaniu metody (szczegóły).

list of elements with namespace namespace and local name localName

Lista elementów z przestrzenią nazw namespace i nazwą lokalną localName # (list of elements with namespace namespace and local name localName) dla węzła root jest kolekcją typu HTMLCollection zwróconą zgodnie z poniższym algorytmem:

  1. Jeśli namespace jest pustym łańcuchem znakowym, to ustaw ją na wartość null.
  2. Jeśli jednocześnie namespace i localName ma wartość "*" (U+002A), to zwróć kolekcję typu HTMLCollection zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typu Element.
  3. W przeciwnym razie, jeśli tylko namespace ma wartość "*" (U+002A), to zwróć kolekcję typu HTMLCollection, której filtr pasuje jedynie do jego potomkowych węzłów typu Element mających nazwę lokalną wskazywaną przez localName.
  4. W przeciwnym razie, jeśli tylko localName ma wartość "*" (U+002A), to zwróć kolekcję typu HTMLCollection, której filtr pasuje jedynie do jego potomkowych węzłów typu Element mających przestrzeń nazw wskazywaną przez namespace.
  5. W przeciwnym razie zwróć kolekcję typu HTMLCollection, której filtr pasuje jedynie do jego potomkowych węzłów typu Element mających przestrzeń nazw wskazywaną przez namespace i nazwę lokalną wskazywaną przez localName.

Po kolejnym wywołaniu metody z tymi samymi argumentami może zostać zwrócony ten sam obiekt HTMLCollection, który utworzony i zwrócony został we wcześniejszym wywołaniu metody (szczegóły).

list of elements with class names classNames

Lista elementów z nazwami klas classNames # (list of elements with class names classNames) dla węzła root jest kolekcją typu HTMLCollection zwróconą zgodnie z poniższym algorytmem:

  1. Niech classes będzie wynikiem parsowania uporządkowanego zestawu na classNames.
  2. Jeśli classes jest pustym zestawem, to zwróć pustą kolekcję typu HTMLCollection.
  3. Zwróć kolekcję typu HTMLCollection zakorzenioną w root, której filtr pasuje jedynie do jego potomkowych węzłów typu Element mających wszystkie klasy z classes.

    Jeśli właścicielem w root jest dokument z trybem "quirks", to porównywanie dla klas jest wykonywane pod względem nieczułości na wielkość znaków ASCII, w przeciwnym razie porównywanie jest czułe na wielkość znaków.

Po kolejnym wywołaniu metody z tym samym argumentem może zostać zwrócony ten sam obiekt HTMLCollection, który utworzony i zwrócony został we wcześniejszym wywołaniu metody (szczegóły).

convert nodes into a node

Aby skonwertować nodes do węzła # (convert nodes into a node) należy wykonać następujące kroki:

  1. Niech node będzie wartością null.
  2. Zastąp każdy łańcuch znakowy w nodes przez węzeł typu Text, którego danymi tekstowymi będzie łańcuch znakowy we własnej postaci.
  3. Jeśli nodes zawiera pojedynczy węzeł, to ustaw node na ten pojedynczy węzeł.
  4. W przeciwnym razie ustaw node na nowy węzeł typu DocumentFragment, a następnie dodaj każdy węzeł z nodes, jeśli w ogóle istnieje, do node. Zrzuć ponownie każdy wyjątek.
  5. Zwróć node.

Mutation algorithms

Mutation algorithms

ensure pre-insertion validity

Aby zagwarantować poprawność przed wstawieniem # (ensure pre-insertion validity) węzła node do rodzica parent przed dzieckiem child należy wykonać następujące kroki:

  1. Jeśli parent nie jest węzłem typu Document, DocumentFragment lub Element, to zrzuć wyjątek "HierarchyRequestError".
  2. Jeśli node jest przodkiem obejmującym włącznie z hostem dla parent, to zrzuć wyjątek "HierarchyRequestError".
  3. Jeśli child nie ma wartości null i jego rodzicem nie jest parent, to zrzuć wyjątek "NotFoundError".
  4. Jeśli node nie jest węzłem typu DocumentFragment, DocumentType, Element, Text, ProcessingInstruction lub Comment, to zrzuć wyjątek "HierarchyRequestError".
  5. Jeśli node jest węzłem typu Text i parent jest węzłem typu Document, lub node jest węzłem typu DocumentType i parent nie jest węzłem typu Document, to zrzuć wyjątek "HierarchyRequestError".
  6. Jeśli parent jest węzłem typu Document, to wykonaj poniższe podkroki:

    1. Jeśli node jest węzłem typu DocumentFragment, to wykonaj poniższe wewnętrzne podkroki:

      1. Jeśli node posiada więcej niż jedno dziecko typu Element lub posiada dziecko typu Text, to zrzuć wyjątek "HierarchyRequestError".
      2. Jeśli node posiada jedno dziecko typu Element, i albo parent posiada dziecko typu Element, child jest węzłem typu DocumentType, lub child nie ma wartości null i węzeł typu DocumentType w parent następuje po child, to zrzuć wyjątek "HierarchyRequestError".
    2. Jeśli node jest węzłem typu Element, i albo parent posiada dziecko typu Element, child jest węzłem typu DocumentType, lub child nie ma wartości null i węzeł typu DocumentType w parent następuje po child, to zrzuć wyjątek "HierarchyRequestError".
    3. Jeśli node jest węzłem typu DocumentType, i albo parent posiada dziecko typu DocumentType, child nie ma wartości null i węzeł typu Element w parent poprzedza child, lub child ma wartości null i parent ma dziecko typu Element, to zrzuć wyjątek "HierarchyRequestError".
pre-insert

Przed wstawieniem # (pre-insert) węzła node do rodzica parent przed dzieckiem child należy wykonać następujące kroki:

  1. Zagwarantuj poprawność przed wstawieniem node do parent przed child.
  2. Niech reference child wskazuje na child.
  3. Jeśli reference child jest naszym node, to ustaw go na brata następującego w node.
  4. Adoptuj node do właściciela w parent.
  5. Wstaw node do parent przed reference child.
  6. Zwróć node.
insertion steps

Obowiązujące specyfikacje mogą definiować dodatkowe kroki wstawiania # (insertion steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywany jest argument newNode, jak w poniższym algorytmie wstawiania.

insert

Aby wstawić # (insert) węzeł node do rodzica parent przed dzieckiem child, z opcjonalną flagą tłumienia obserwatorów suppress observers flag, należy wykonać następujące kroki:

  1. Niech count będzie liczbą dzieci w node jeśli jest nim węzeł typu DocumentFragment, w przeciwnym razie niech będzie liczbą jeden.
  2. Jeśli child nie ma wartości null, to wykonaj poniższe podkroki:

    1. Dla każdego (for each) zakresu, którego węzłem początkowym jest parent i przesunięcie początkowe jest większe od indeksu w child, zwiększ jego przesunięcie początkowe o count.
    2. Dla każdego (for each) zakresu, którego węzłem końcowym jest parent i przesunięcie końcowe jest większe od indeksu w child, zwiększ jego przesunięcie końcowe o count.
  3. Niech nodes będą dziećmi w node jeśli node jest węzłem typu DocumentFragment, w przeciwnym razie niech będą listą zawierającą wyłącznie node.
  4. Jeśli node jest węzłem typu DocumentFragment, to usuń jego dzieci z ustawieniem suppress observers flag.
  5. Jeśli node jest węzłem typu DocumentFragment, to kolejkuj zapis zmian z typem "childList", celem node oraz usuniętymi węzłami wskazywanymi przez nodes.

    Ten krok celowo nie skupia uwagi na suppress observers flag.

  6. Dla każdego (for each) węzła newNode w nodes, zgodnie z porządkiem drzewa, wykonaj poniższe podkroki:

    1. Dodaj newNode do parent przed child lub, jeśli child ma wartość null, to na końcu parent.
    2. Uruchom dodatkowe kroki wstawiania z przekazaniem newNode.
  7. Jeśli suppress observers flag nie jest ustawiona, to kolejkuj zapis zmian z typem "childList", celem parent, dodanymi węzłami wskazywanymi przez nodes, bratem następującym wskazywanym przez child i bratem poprzedzającym będącym bratem poprzedzającym w child lub, jeśli child ma wartość null, to ostatnim dzieckiem w parent.
append

Aby dodać # (append) węzeł node do rodzica parent należy wykonać przed wstawianie node do parent przed null.

replace

Aby zastąpić # (replace) dziecko child węzłem node w rodzicu parent należy wykonać następujące kroki:

  1. Jeśli parent nie jest węzłem typu Document, DocumentFragment lub Element, to zrzuć wyjątek "HierarchyRequestError".
  2. Jeśli node jest przodkiem obejmującym włącznie z hostem dla parent, to zrzuć wyjątek "HierarchyRequestError".
  3. Jeśli rodzicem w child nie jest parent, to zrzuć wyjątek "NotFoundError".
  4. Jeśli node nie jest węzłem typu DocumentFragment, DocumentType, Element, Text, ProcessingInstruction lub Comment, to zrzuć wyjątek "HierarchyRequestError".
  5. Jeśli node jest węzłem typu Text i parent jest węzłem typu Document, lub node jest węzłem typu DocumentType i parent nie jest węzłem typu Document, to zrzuć wyjątek "HierarchyRequestError".
  6. Jeśli parent jest węzłem typu Document, to wykonaj poniższe podkroki:

    1. Jeśli node jest węzłem typu DocumentFragment, to wykonaj poniższe wewnętrzne podkroki:

      1. Jeśli node posiada więcej niż jedno dziecko typu Element lub posiada dziecko typu Text, to zrzuć wyjątek "HierarchyRequestError".
      2. Jeśli node posiada jedno dziecko typu Element, i albo parent posiada dziecko typu Element, którym nie jest child, albo węzeł typu DocumentType w parent następuje po child, to zrzuć wyjątek "HierarchyRequestError".
    2. Jeśli node jest węzłem typu Element, i albo parent posiada dziecko typu Element, którym nie jest child, albo węzeł typu DocumentType w parent następuje po child, to zrzuć wyjątek "HierarchyRequestError".
    3. Jeśli node jest węzłem typu DocumentType, i albo parent posiada dziecko typu DocumentType, którym nie jest child, albo węzeł typu Element w parent poprzedza child, to zrzuć wyjątek "HierarchyRequestError".
  7. Niech reference child będzie bratem następującym w child.
  8. Jeśli reference child jest naszym node, to ustaw go na brata następującego w node.
  9. Niech previousSibling będzie bratem poprzedzającym w node.
  10. Adoptuj node do właściciela w parent.
  11. Niech removedNodes będzie pustą listą.
  12. Jeśli rodzic w child nie ma wartość null, to wykonaj poniższe wewnętrzne podkroki:

    1. Ustaw removedNodes na listę zawierającą wyłącznie child.
    2. Usuń child z jego parent z ustawieniem flagi tłumienia obserwatorów.

    Powyższe kroki nie zostaną spełnione jedynie w sytuacji, kiedy child jest referencją do node.

  13. Niech nodes będzie listą ze wszystkimi dziećmi w node jeśli node jest węzłem typu DocumentFragment, w przeciwnym razie niech będzie listą zawierającą wyłącznie node.
  14. Wstaw node do parent przed reference child z ustawieniem flagi tłumienia obserwatorów.
  15. Kolejkuj zapis zmian z typem "childList", celem parent, dodanymi węzłami wskazywanymi przez nodes, usuniętymi węzłami wskazywanymi przez removedNodes, bratem następującym wskazywanym przez child oraz bratem poprzedzającym wskazywanym przez previousSibling.
  16. Zwróć child.
replace all

Aby zastąpić wszystko # (replace all) węzłem node w rodzicu parent należy wykonać następujące kroki:

  1. Jeśli node nie ma wartości null, to adoptuj node do właściciela w parent.
  2. Niech removedNodes będzie listą ze wszystkimi dziećmi w parent.
  3. Niech addedNodes będzie pustą listą jeśli node ma wartość null, dziećmi w node jeśli node jest węzłem typu DocumentFragment, w przeciwnym razie niech będzie listą zawierającą wyłącznie node.
  4. Usuń, zgodnie z porządkiem drzewa, wszystkie dzieci w parent z ustawieniem flagi tłumienia obserwatorów.
  5. Jeśli node nie ma wartości null, to wstaw node do parent przed null z ustawieniem flagi tłumienia obserwatorów.
  6. Kolejkuj zapis zmian z typem "childList", celem parent, dodanymi węzłami wskazywanymi przez addedNodes oraz usuniętymi węzłami wskazywanymi przez removedNodes.

Algorytm ten nie wprowadza żadnych kontroli w odniesieniu do ograniczeń dla drzewa węzłów. Autorzy specyfikacji powinni używać go z rozwagą.

pre-remove

Przed usunięciem # (pre-remove) dziecka child z rodzica parent należy wykonać następujące kroki:

  1. Jeśli rodzicem w child nie jest parent , to zrzuć wyjątek "NotFoundError".
  2. Usuń child z parent.
  3. Zwróć child.
removing steps

Obowiązujące specyfikacje mogą definiować dodatkowe kroki usuwania # (removing steps) dla wszystkich lub poszczególnych węzłów. Do algorytmu przekazywane są argumenty removedNode, oldParent i oldPreviousSibling, jak w poniższym algorytmie usuwania.

remove

Aby usunąć # (remove) węzeł node z rodzica parent, z opcjonalną flagą tłumienia obserwatorów suppress observers flag, należy wykonać następujące kroki:

  1. Niech index będzie indeksem w node.
  2. Dla każdego (for each) zakresu, którego węzeł początkowy jest potomkiem obejmującym dla node, ustaw jego początek na (parent, index).
  3. Dla każdego (for each) zakresu, którego węzeł końcowy jest potomkiem obejmującym node, ustaw jego koniec na (parent, index).
  4. Dla każdego (for each) zakresu, którego węzłem początkowym jest parent i przesunięcie początkowe jest większe od index, zmniejsz 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 większe od index, zmniejsz jego przesunięcie końcowe o jeden.
  6. Dla każdego (for each) obiektu typu NodeIterator iterator, którego właścicielem w korzeniu skojarzonym z iterator jest właściciel w node, uruchom kroki przed-usuwania z przekazaniem node i iterator.
  7. Niech oldPreviousSibling będzie bratem poprzedzającym w node.
  8. Niech oldNextSibling będzie bratem następującym w node.
  9. Usuń node z parent.
  10. Uruchom dodatkowe kroki usuwania z przekazaniem node, parent i oldPreviousSibling.
  11. Dla każdego (for each) przodka obejmującego ancestor w node, jeśli ancestor ma jakichkolwiek zarejestrowanych obserwatorów, w których właściwość subtree z opcji ma boolowską wartość true, to dla każdego (for each) takiego zarejestrowanego obserwatora registered dodaj do listy zarejestrowanych obserwatorów skojarzonej z node przejściowego zarejestrowanego obserwatora z obserwatorem i opcjami identycznymi jak w registered, a także ze źródłem będącym registered.
  12. Jeśli suppress observers flag nie jest ustawiona, to kolejkuj zapis zmian z typem "childList", celem parent, usuniętymi węzłami wskazywanymi przez listę zawierającą wyłącznie node, bratem następującym wskazywanym przez oldNextSibling oraz bratem poprzedzającym wskazywanym przez oldPreviousSibling.
Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Ogólne (H1) Nodes (H2) Pojęcia (H3) node document (H4) length (H4) empty (H4) Algorytmy (H3) adopting steps (H4) adopt (H4) adopt (H4) clone (H4) equals (H4) locate a namespace prefix (H4) locate a namespace (H4) list of elements with qualified name qualifiedName (H4) list of elements with namespace namespace and local name localName (H4) list of elements with class names classNames (H4) convert nodes into a node (H4) mutation-method-macro (H4) Mutation algorithms (H4) ensure pre-insertion validity (H5) pre-insert (H5) insertion steps (H5) insert (H5) append (H5) replace (H5) replace all (H5) pre-remove (H5) removing steps (H5) remove (H5)