Podstawy#

Przestrzenie nazw CSS#

Ogólne informacje na temat przestrzeni nazw (głównie XML) zamieściłem w kursie DOM. Arkusze CSS mają zastosowanie w dokumentach XML, dlatego też obsługa przestrzeni nazw w języku CSS została zaimplementowana. Całość opisywana jest w dedykowanym module "CSS Namespaces Module".

W praktyce bardzo rzadko pracuje się z różnymi przestrzeniami nazw XML, ale jeśli trafimy na taki przypadek, to umiejętność formatowania elementów należących do różnych przestrzeni nazw za pomocą reguł CSS będzie wskazana. W tym miejscu zamieszczam najważniejsze informacje pochodzące z modułu przestrzeni nazw CSS.

Pisząc "specyfikacja" lub "specyfikacja W3C" mam na myśli przytoczoną wersję. Całość uzupełniona została uwagami i przykładami z innych źródeł.

Wprowadzenie#

Moduł przestrzeni nazw CSS definiuje składnię dla używania przestrzeni nazw w CSS. Określa regułę @namespace dla zadeklarowania domyślnej przestrzeni nazw i do wiązania przestrzeni nazw z prefiksami przestrzeni nazw. Definiuje także składnię dla używania tych prefiksów do reprezentowania nazw kwalifikowanych. Nie definiuje natomiast, kiedy takie nazwy są poprawne lub co oznaczają: to zależy od ich kontekstu i jest definiowane przez język gospodarza (host language), jak w module "Selectors Level 3", który odwołuje się do składni definiowanej w module przestrzeni nazw CSS.

Należy pamiętać, że klient CSS, który nie obsługuje tego modułu, będzie (jeśli jest zgodny z zasadami parsowania reguł CSS z zachowaniem wstecznej kompatybilności) ignorował wszystkie reguły @namespace, jak również wszystkie reguły stylów korzystające z nazw kwalifikowanych w przestrzeniach nazw. Składnia ograniczająca prefiksy przestrzeni nazw w CSS została celowo dobrana tak, by klienci CSS ignorowali takie reguły, zamiast ewentualnej możliwości ich błędnego dopasowania.

Terminologia#

Poza określeniami wprowadzanymi przez tę specyfikację, przestrzenie CSS używają terminologii zdefiniowanej w specyfikacji "Namespaces in XML 1.0". Jednakże składnia definiowana w tym miejscu nie jest ograniczona do reprezentacji nazw elementów i atrybutów XML, ale może mieć zastosowanie do innego rodzaju przestrzeni nazw, jakie zdefiniowano w języku gospodarza.

W przestrzeniach nazw CSS nazwy przestrzeni nazw składające się z pustego łańcuch znakowego są używane do reprezentowania przestrzeni nazw w postaci null lub braku przestrzeni nazw.

Prosty przykład:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
@namespace empty "";
@namespace "";

Powyższe deklaracje przestrzeni nazw będą równoważne selektorom typu, takim jak elem, |elem lub empty|elem.

Deklarowanie przestrzeni nazw: reguła @namespace#

Reguła małpy w postaci @namespace deklaruje prefiks przestrzeni nazw i kojarzy go z przekazaną nazwą przestrzeni nazw (łańcuchem znakowym). Ten prefiks przestrzeni nazw może być używany w nazwach kwalifikowanych, np. w nazwach kwalifikowanych CSS określonych nieco dalej.

Prosty przykład:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
@namespace "http://www.w3.org/1999/xhtml";
@namespace svg "http://www.w3.org/2000/svg";

Pierwsza reguła deklaruje domyślną przestrzeń nazw http://www.w3.org/1999/xhtml, która będzie stosowana dla nazw niemających wyraźnie określonego komponentu przestrzeni nazw.

Druga reguła deklaruje prefiks przestrzeni nazw svg, który jest używany do stosowania przestrzeni nazw http://www.w3.org/2000/svg w sytuacji, kiedy prefiks przestrzeni nazw svg zostanie użyty.

W przestnierzniach nazw CSS, podobnie jak w przestrzeniach nazw XML 1.0, prefiks jest jednie konstrukcją składniową; jest on nazwą rozszerzoną # (expanded name), czyli krotką (tuple) nazwy lokalnej i nazwy przestrzeni nazw, które są istotne. Tak więc rzeczywiste prefiksy używane w arkuszach stylów CSS, i czy są one domyślne lub nie, są niezależne od prefiksów przestrzeni nazw używanych w znacznikach, jak i od tego, czy są one domyślne czy też nie.

Dla przykładu, w następującym dokumencie XML:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<qml:elem xmlns:qml="http://example.com/q-markup"></qml:elem>

i dla następujących deklaracji @namespace umieszczonych na początku pliku CSS:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
@namespace Q "http://example.com/q-markup";
@namespace lq "http://example.com/q-markup";

Obydwa selektory Q|elem i lq|elem w tym pliku CSS dopasują element <qml:elem>. Jednakże selektor qml|elem byłby nieprawidłowy (bo prefiks qml nie został zadeklarowany w CSS, występuje jedynie w kodzie XML).

Składnia#

Reguła @namespace wyrażana jest następującą składnią (używającą notacji z dodatku "Appendix G. Grammar of CSS 2.1"):

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
namespace
  : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S*
  ;
namespace_prefix
  : IDENT
  ;

z nowym słowem:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
@{N}{A}{M}{E}{S}{P}{A}{C}{E} {return NAMESPACE_SYM;}

Wszelkie reguły @namespace muszą występować za wszystkimi regułami @charset i @import i poprzedzać wszystkie inne nieignorowane reguły małp i zestawy reguł w arkuszu stylów. Dla składni CSS dodaje to [ namespace [S|CDO|CDC]* ]* natychmiast po [ import [S|CDO|CDC]* ] w gramatyce arkuszy stylów.

Reguła @namespace niepoprawna składniowo (zniekształcona lub źle ulokowana) musi zostać zignorowana (ignored). Arkusz stylów CSS zawierający nieprawidłową regułę @namespace nie jest poprawnym arkuszem stylów (valid style sheet).

Ciąg URI parsowany ze składni URI musi być traktowany jak dosłowny łańcuch znakowy; zgodnie ze składnią STRING, bez stosowania specyficznych normalizacji URI.

Wszystkie łańcuchy znakowe, włącznie z pustymi łańcuchami i łańcuchami reprezentującymi nieprawidłowe URI, są poprawnymi nazwami przestrzeni nazw w deklaracjach @namespace.

Zasięg#

Prefiks przestrzeni nazw jest deklarowany tylko w arkuszu stylów, w którym pojawia się jego reguła @namespce (co determinuje jego zasięg). Nie jest on deklarowany w żadnych innych importujących arkuszach stylów lub zaimportowanych przez ten arkusz stylów, ani w żadnych innych arkuszach stylów stosowanych w dokumencie.

Deklarowanie prefiksów#

Prefiks przestrzeni nazw # (namespace prefix), po zadeklarowaniu, reprezentuje przestrzeń nazw, dla której został zadeklarowany i może być używany do wskazywania przestrzeni nazw w nazwach kwalifikowanych. Prefiksy przestrzeni nazw są, podobnie jak nazwy liczników CSS, czułe na wielkość znaków.

Jeśli w deklaracji przestrzeni nazw prefiks przestrzeni nazw zostanie pominięty, to tak zadeklarowana przestrzeń nazw jest domyślną przestrzenią nazw # (default namespace). Domyślna przestrzeń nazw może być stosowana dla nazw, które nie mają wyraźnego prefiksu przestrzeni nazw; moduły używające prefiksów przestrzeni nazw muszą definiować, w jakich sytuacjach domyślna przestrzeń nazw ma zastosowanie. Dla przykładu, zgodnie z "Namespaces in XML 1.0", w module "Selectors Level 3" domyślna przestrzeń nazw ma zastosowanie do selektorów typu, ale nie do selektorów atrybutów.

Nie ma domyślnej wartości dla domyślnej przestrzeni nazw; moduły przypisujące niekwalifikowane nazwy do domyślnej przestrzeni nazw muszą określać, w jaki sposób te niekwalifikowane nazwy należy zinterpretować, kiedy domyślna przestrzeń nazw nie zostanie zadeklarowana.

Należy pamiętać, że przy użyciu domyślnych przestrzeni nazw w połączeniu z selektorami typu można spowodować, że aplikacje klienckie wspierające domyślne przestrzenie nazw i aplikacje klienckie niewspierające domyślnych przestrzeni nazw mogą zinterpretować selektory na różne sposoby.

Jeśli prefiks przestrzeni nazw lub domyślna przestrzeń nazw zostaną zadeklarowane więcej niż jeden raz, to użyta zostanie ostatnia taka deklaracja. Deklarowanie prefiksu przestrzeni nazw lub domyślnej przestrzeni nazw więcej niż jeden raz jest nieprawidłowe.

Nazwy kwalifikowane CSS#

Nazwa kwalifikowana CSS (CSS qualified name) jest nazwą wyraźnie zlokalizowaną w (powiązaną z) przestrzeni nazw. W celu utworzenia nazwy kwalifikowanej w składni CSS, prefiks przestrzeni nazw, który został zadeklarowany w ramach zasięgu, jest umieszczany przed nazwą lokalną (np. nazwą elementu lub atrybutu), a następnie oddzielany "pionową kreską" (|, U+007C). Prefiks reprezentuje przestrzeń nazw, dla której został zadeklarowany, wskazując przestrzeń nazw dla nazwy lokalnej. Prefiks w nazwie kwalifikowanej może zostać pominięty, aby wskazać, że nazwa nie należy do przestrzeni nazw, tj. że nazwa przestrzeni nazw w nazwie rozszerzonej nie ma wartości. Niektóre konteksty (definiowane w języku gospodarza) mogą zezwalać na używanie gwiazdki (*, U+002A) jako odpowiednika wieloznacznego prefiksu wskazującego nazwę w dowolnej przestrzeni nazw, włącznie z brakiem przestrzeni nazw.

Dla przykładu, wprowadzając następujące deklaracje przestrzeni nazw:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
@namespace toto "http://toto.example.org";
@namespace "http://example.com/foo";

W sytuacji, gdzie domyślna przestrzeń nazw jest stosowana, otrzymamy:

Składnia dla części nazwy kwalifikowanej CSS przed lokalną nazwą znajduje się poniżej, zarówno dla nazw kwalifikowanych zezwalających na wieloznaczne prefiksy (wqname), jak i nazw kwalifikowanych niezezwalających na wieloznaczne prefiksy (qname). Składnia używa notacji z dodatku "Appendix G. Grammar of CSS 2.1". Należy pamiętać, że komentarze, ale nie białe znaki, są domyślnie dozwolone między słowami:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
qname_prefix
  : [namespace_prefix]? '|'
  ;

wqname_prefix #
  : namespace_prefix? '|'
  | '*' '|'
  ;

Nazwy kwalifikowane CSS mogą być używane (na przykład) w selektorach i wartościach właściwości opisywanych w innych modułach. Moduły te muszą definiować obsługę prefiksów przestrzeni nazw, które nie zostały prawidłowo zadeklarowane. Taka obsługa powinna traktować niezadeklarowane prefiksy przestrzeni nazw jak błąd parsowania, który spowoduje, że selektor lub deklaracja (itp.) uznane zostaną za nieważne i, w CSS, zignorowane.

Dla przykładu, moduł "Selectors Level 3" definiuje selektor typu z niezadeklarowanym prefiksem przestrzeni nazw jako nieprawidłowy selektor, i wymagania CSS 2.1 dla zestawu reguł z błędnym selektorem nakazują zignorować go całkowicie.

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Podstawy (H1) Przestrzenie nazw CSS (H2) Wprowadzenie (H3) Terminologia (H4) Deklarowanie przestrzeni nazw: reguła @namespace (H3) Składnia (H4) Zasięg (H4) Deklarowanie prefiksów (H4) Nazwy kwalifikowane CSS (H3)