Ogólne#
Wstęp#
W specyfikacji DOM4 występuje wiele specyficznych pojęć i algorytmów, które wprowadzane są przy każdej głównej sekcji oraz dla poszczególnych interfejsów. Są to powtarzające się zagadnienia, do których będzie nawigować wiele odsyłaczy. Wymieszanie wszystkiego w jednym miejscu zmniejsza nieco czytelność bazowej treści.
Postanowiłem wydzielić duplikowane algorytmy do osobnego działu Ogólne, przy czym każda główna sekcja kursu (białe etykiety) lub konkretne interfejsy będą miały własne podstrony, tak żeby całość była jak najbardziej funkcjonalna i czytelna. Sporo kroków z kolejnych algorytmów będzie bezpośrednio nawigowało do tej części witryny.
Pojęcia#
extensibility
DOM4 definiuje reguły rozszerzalności # (extensibility) specyfikacji, które mówią że, własnościowe specyficzne rozszerzenia dostawców (vendor-specific extensions) dla tej specyfikacji są silnie odradzane. Autorzy nie powinni korzystać z takich rozszerzeń, ponieważ zmniejsza to interoperacyjność oraz fragmentuje bazę użytkowników, dopuszczając jedynie tych użytkowników, którzy używają specyficznych agentów użytkowników, zdolnych odczytać dany kontent.
Jeśli specyficzne rozszerzenia dostawców są potrzebne, członkowie powinni zostać poprzedzeni prefiksem w postaci łańcuchów specyficznych dla danego dostawcy, aby w ten sposób zapobiec ewentualnej kolizji z przyszłymi wersjami specyfikacji DOM. Rozszerzenia muszą zostać tak zdefiniowane, aby ich stosowanie nie powodowało niezgodności z wymaganiami stawianymi w tej specyfikacji.
applicable specification
Kiedy neutralne rozszerzenia dostawców (vendor-neutral extensions) są potrzebne, wówczas specyfikacja DOM może zostać odpowiednio zaktualizowana lub rozszerzenie specyfikacji może być tak napisane, aby zastępować wymogi tej specyfikacji. Takie neutralne rozszerzenie określa się mianem obowiązującej specyfikacji # (applicable specification) i występować może w wielu miejscach specyfikacji DOM (np. jako jeden z korków w algorytmach).
context object
Obiekt kontekstu # (context object) oznacza obiekt, na którym omawiany algorytm, właściwość (atrybutowy getter czy atrybutowy setter) lub metoda zostały wywołane. Kiedy obiekt kontekstu jest jednoznaczny, to termin może zostać pominięty.
Czasami zamiast określenia "obiekt kontekstu" mogę stosować analogiczne zwrot typu "dany element", "dany atrybut", "dany obiekt" i różne ich odmiany.
Algorytmy#
Namespaces
validate
Aby zweryfikować # (validate) nazwę kwalifikowaną qualifiedName należy wykonać następujące kroki:
- Jeśli qualifiedName nie pasuje do wzorca
Name
z XML, to zrzuć wyjątek"InvalidCharacterError"
. - Jeśli qualifiedName nie pasuje do wzorca
QName
z XML, to zrzuć wyjątek"NamespaceError"
.
validate and extract
Aby zweryfikować i wydobyć # (validate and extract) przestrzeń nazw namespace i nazwę kwalifikowaną qualifiedName należy wykonać następujące kroki:
- Jeśli namespace jest pustym łańcuchem znakowym, to ustaw ją na wartość
null
. - Zweryfikuj qualifiedName. Zrzuć ponownie każdy wyjątek.
- Niech prefix będzie wartością
null
. - Niech localName będzie wartością z qualifiedName.
- Jeśli qualifiedName zawiera znak "
:
" (U+003E
), to podziel w nim łańcuch znakowy względem tego znaku, i niech prefix będzie lewą stroną podziału a localName będzie prawą stroną podziału. - Jeśli prefix ma wartość inną niż
null
i namespace ma wartośćnull
, to zrzuć wyjątek"NamespaceError"
. - Jeśli prefix ma wartość "
xml
" i namespace nie jest przestrzenią nazw XML, to zrzuć wyjątek"NamespaceError"
. - Jeśli qualifiedName lub prefix ma wartość "
xmlns
" i namespace nie jest przestrzenią nazw XMLNS, to zrzuć wyjątek"NamespaceError"
. - Jeśli namespace jest przestrzenią nazw XMLNS i jednocześnie qualifiedName lub prefix mają inną wartość niż "
xmlns
", to zrzuć wyjątek"NamespaceError"
. - Zwróć namespace, prefix, localName i qualifiedName.
Selectors
match a relative selectors string
Aby dopasować łańcuch znakowy selektorów relatywnych # (match a relative selectors string) relativeSelectors na zestawie set należy wykonać następujące kroki:
- Niech s będzie wynikiem parsowania selektora relatywnego relativeSelectors z użyciem zestawu elementów referencyjnych set.
- Jeśli s jest błędem to zrzuć wyjątek
"SyntaxError"
. - Zwróć wynik dopasowania selektora s z użyciem zestawu elementów referencyjnych set.
scope-match a selectors string
Aby zawężająco dopasować łańcuch znakowy selektorów # (scope-match a selectors string) selectors na węźle node należy wykonać następujące kroki:
- Niech s będzie wynikiem parsowania selektora selectors.
- Jeśli s jest błędem to zrzuć wyjątek
"SyntaxError"
. - Zwróć wynik dopasowania selektora s na korzeniu node z użyciem zawężającego korzenia w postaci node i filtrującej metody zawężenia.