4 septembre 2001

23 L'extensibilité


Contenu


 

23.1 Les espaces de nommage étrangers et les données privées

SVG autorise l'inclusion d'éléments issus d'espaces de nommage étrangers partout dans le contenu SVG. En général, l'agent utilisateur SVG incluera les éléments inconnus dans le DOM mais cependant les ignorera. (Une exception notable est décrite dans la section L'incorporation de types d'objet étranger.)

En complément, SVG autorise l'inclusion d'attributs issus d'espaces de nommage étrangers sur tout élément SVG. L'agent utilisateur SVG incluera les attributs inconnus dans le DOM mais cependant les ignorera.

On peut utiliser cette capacité de SVG pour l'inclusion d'espaces de nommage étrangers pour les deux raisons suivantes :

En illustration, une application d'édition graphique d'entreprise peut vouloir inclure certaines données privées dans un document SVG, de manière à pouvoir reconstruire correctement un diagramme (ici un diagramme « en camembert ») lors d'une relecture :

<?xml version="1.0" standalone="yes"?>
<svg width="4in" height="3in"
     xmlns = 'http://www.w3.org/2000/svg'>
  <defs>
    <monappli:camembert xmlns:monappli="http://exemple.org/monappli"
                    title="Ventes par région">
      <monappli:tranche label="Région Nord" value="1.23"/>
      <monappli:tranche label="Région Est" value="2.53"/>
      <monappli:tranche label="Région Sud" value="3.89"/>
      <monappli:tranche label="Région Ouest" value="2.04"/>
      <!-- D'autres données privées se placent ici -->
    </monappli:camembert>
  </defs>
  <desc>Ce diagramme inclut des données privées d'un autre espace de nommage
  </desc>
  <!-- Ici se placeraient les éléments graphiques SVG effectifs
       qui dessinent le diagramme en camembert -->
</svg>

23.2 L'incorporation de types d'objet étranger

Un but de SVG est de fournir un mécanisme suivant lequel d'autres processeurs de langage XML peuvent effectuer un rendu dans une aire d'un dessin SVG, ces rendus étant assujettis aux transformations et aux paramètres de composition divers en vigueur sur un point donné de l'arbre de contenu SVG. Un exemple particulier serait de fournir un cadre pour un contenu XML, stylé avec CSS ou XSL, tel qu'un texte s'écoulant dynamiquement (assujetti aux transformations SVG et à la composition) pourrait s'insérer au milieu d'un certain contenu SVG. Un autre exemple serait l'insertion d'une expression MathML dans un dessin SVG.

L'élément 'foreignObject' permet l'inclusion d'un espace de nommage étranger dont le contenu graphique est dessiné par un agent utilisateur différent. Le contenu graphique étranger inclus est assujetti aux transformations et à la composition de SVG.

Le contenu d'un élément 'foreignObject' est sensé provenir d'un espace de nommage différent. Aucun élément SVG, dans un élément 'foreignObject', ne sera dessiné, sauf si un sous-document SVG convenablement défini avec un attribut xmlns correct (voir « Les espaces de nommage dans XML » [XML-NS vf.]) y est incorporé récursivement. Cette situation peut se produire quand un fragment de document SVG est incorporé dans un autre fragment de document non-SVG, celui-ci étant à son tour incorporé dans un fragment de document SVG (par exemple, un fragment de document SVG contenant un fragment de document XHTML qui contient un autre fragment de document SVG).

Un élément 'foreignObject' sera habituellement employé en conjonction avec l'élément 'switch' et l'attribut requiredExtensions, ceux-ci offrant une vérification correcte des capacités de l'agent utilisateur et offrant un rendu alternatif au cas où l'agent utilisateur ne disposait pas des capacités nécessaires.


23.3 L'élément 'foreignObject'

<!ENTITY % foreignObjectExt "" >
<!ELEMENT foreignObject (#PCDATA %ceExt;%foreignObjectExt;)* >
<!ATTLIST foreignObject
  %stdAttrs;
  %testAttrs;
  %langSpaceAttrs;
  externalResourcesRequired %Boolean; #IMPLIED
  class %ClassList; #IMPLIED
  style %StyleSheet; #IMPLIED
  %PresentationAttributes-All;
  transform %TransformList; #IMPLIED
  %graphicsElementEvents;
  x %Coordinate; #IMPLIED
  y %Coordinate; #IMPLIED
  width %Length; #REQUIRED
  height %Length; #REQUIRED
  %StructuredText; >

Définitions des attributs :

x = "<coordonnée>"
La coordonnée sur l'axe-x d'un coin de la région rectangulaire dans laquelle le graphique, associé au contenu de l'élément 'foreignObject', sera rendu.
Si l'attribut n'est pas spécifié, l'effet produit est comme si une valeur de "0" était spécifiée.
Animable : oui.
y = "<coordonnée>"
La coordonnée sur l'axe-y d'un coin de la région rectangulaire dans laquelle le document appelé est placé.
Si l'attribut n'est pas spécifié, l'effet produit est comme si une valeur de "0" était spécifiée.
Animable : oui.
width = "<longueur>"
La largeur de la région rectangulaire dans laquelle le document appelé est placé.
Une valeur négative provoque une erreur (voir Le traitement des erreurs). Une valeur de zéro désactive le rendu de l'élément.
Animable : oui.
height = "<longueur>"
La hauteur de la région rectangulaire dans laquelle le document appelé est placé.
Une valeur négative provoque une erreur (voir Le traitement des erreurs). Une valeur de zéro désactive le rendu de l'élément.
Animable : oui.

Attributs définis ailleurs :
%stdAttrs;, %langSpaceAttrs;, class, transform, %graphicsElementEvents;, %testAttrs;, externalResourcesRequired, style, %PresentationAttributes-All;.

23.4 Un exemple

Voici un exemple :

<?xml version="1.0" standalone="yes"?>
<svg width="4in" height="3in"
 xmlns = 'http://www.w3.org/2000/svg'>
  <desc>Cet exemple utilise l'élément 'switch' pour fournir
        une représentation graphique de repli d'un paragraphe, 
        si XMHTML n'est pas géré.</desc>
  <!-- L'élément 'switch' traitera le premier élément enfant
       dont le test des attributs est vérifié.-->
  <switch>

    <!-- Traite le document XHTML incorporé si l'attribut 'requiredExtensions'
         est vérifié (i.e., l'agent utilisateur gère XHTML
         incorporé dans SVG). -->
    <foreignObject width="100" height="50"
                   requiredExtensions="http://exemple.com/SVGExtensions/EmbeddedXHTML">
      <!-- Le contenu XHTML se place ici -->
      <html xmlns="http://www.w3.org/1999/xhtml">
      <body>
        <p>Voici un paragraphe qui requiert une césure.</p>
      </body>
      </html>
    </foreignObject>

    <!-- Sinon, traite le fragment SVG alternatif suivant.
         Remarquer qu'il n'y a pas d'attribut de test sur l'élément 'text'.
         Si aucun attribut de test n'est fourni, c'est comme s'il y en avait un
         et qu'il était vérifié.-->
    <text font-size="10" font-family="Verdana">
      <tspan x="10" y="10">Voici un paragraphe qui</tspan>
      <tspan x="10" y="20">requiert une césure.</tspan>
    </text>

  </switch>
</svg>

L'agent utilisateur n'est pas obligé d'avoir la capacité d'invoquer d'autres agents utilisateurs arbitraires pour la gestion de types d'objet étranger incorporé ; cependant, tous les agents utilisateurs SVG conformes devraient gérer l'élément 'switch' et doivent être capable de rendre des éléments SVG valides quand ceux-ci surviennent comme l'une des alternatives dans un élément 'switch'.

Au final, il est prévu que les navigateurs Web commerciaux gèrent la possibilité de SVG d'incorporer des contenus issus d'autres grammaires XML qui utilisent CSS ou XSL pour le formatage de leur contenu, ce contenu résultant avec une mise en forme CSS ou XSL étant assujetti aux transformations et à la composition de SVG. Pour l'instant, cette capacité n'est pas requise.


23.5 L'ajout d'éléments et d'attributs privés au DTD

Le DTD de SVG autorise l'extension du langage SVG du sous-ensemble du DTD interne. Dans le sous-ensemble du DTD interne, on peut ajouter des éléments et des attributs personnalisés pour la plupart des éléments SVG.

Le DTD définit une entité d'extension pour la plupart des éléments SVG. Par exemple, l'élément 'view' est défini dans le DTD comme suit :

<!ENTITY % viewExt "" >
<!ELEMENT view (%descTitleMetadata;%viewExt;) >
<!ATTLIST view
  %stdAttrs;
  externalResourcesRequired %Boolean; #IMPLIED
  viewBox %ViewBoxSpec; #IMPLIED
  preserveAspectRatio %PreserveAspectRatioSpec; 'xMidYMid meet'
  zoomAndPan (disable | magnify) 'magnify' 
  viewTarget CDATA #IMPLIED >

On peut définir l'entité viewExt dans le sous-ensemble du DTD interne pour lui ajouter un sous-élément personnalisé ou des attributs personnalisés à l'élément 'view' dans un document donné. Par exemple, ce qui suit étend l'élément la définition de l'élément 'view' avec un élément enfant 'customNS:customElement' et un attribut customNS:customAttr supplémentaires :

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" 
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
[
<!ENTITY % viewExt "| customNS:customElement" >
<!ATTLIST view
  xmlns:customNS CDATA #FIXED "http://www.exemple.org/customNS"
  customNS:customAttr CDATA #IMPLIED >

<!ELEMENT customNS:customElement EMPTY>
<!ATTLIST customNS:customElement
  xmlns:customNS CDATA #FIXED "http://www.exemple.org/customNS"
  info CDATA #IMPLIED>
]>
<svg width="8cm" height="4cm"
     xmlns="http://www.w3.org/2000/svg">
  <desc>Étend la définition de l'élément 'view'
  	via le sous-ensemble du DTD interne</desc>

  <!-- Un graphique magnifique se placerait certainement ici. -->

  <view viewBox="100 110 20 30" customNS:customAttr="123">
    <customNS:customElement info="abc"/>
  </view>
</svg>

23.6 Les interfaces du DOM

Les interfaces suivantes sont définies ci-dessous : SVGForeignObjectElement.


L'interface SVGForeignObjectElement

L'interface SVGForeignObjectElement correspond à l'élément 'foreignObject'.


Définition IDL
interface SVGForeignObjectElement : 
                SVGElement,
                SVGTests,
                SVGLangSpace,
                SVGExternalResourcesRequired,
                SVGStylable,
                SVGTransformable,
                events::EventTarget { 

  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

attributs
readonly SVGAnimatedLength x
Correspond à l'attribut x sur l'élément 'foreignObject' donné.
readonly SVGAnimatedLength y
Correspond à l'attribut y sur l'élément 'foreignObject' donné.
readonly SVGAnimatedLength width
Correspond à l'attribut width sur l'élément 'foreignObject' donné.
readonly SVGAnimatedLength height
Correspond à l'attribut height sur l'élément 'foreignObject' donné.