13.1 sgmllib --- Analyseur SGML simplifié

Ce module définit une classe SGMLParser qui sert de base pour analyser des fichiers de texte formatés en SGML (Standard Generalized Mark-up Language). En fait, il ne fournit pas un analyseur de SGML complet --- il analyse seulement SGML dans la limite de son utilisation dans HTML, et le module existe seulement comme base pour le module htmllib.

SGMLParser()
La classe SGMLParser est instanciée sans arguments. L'analyseur est codé en dur pour reconnaître les concepts suivants :

  • Balises ouvrantes et fermantes de la forme "<balise attr="valeur" ...>" et "</balise>", respectivement.

  • Appels de caractères numériques de la forme "&#nom;".

  • Appels d'entité de la forme "&nom;".

  • Commentaires SGML de la forme "<!--texte-->". Notez que les espaces, tabulations et retours à la ligne sont autorisés entre le ">" final et le "--" le précédent.

Les instances de SGMLParser ont les méthodes d'interface suivantes :

reset()
Ré-initialise l'instance. Perd toutes les données non analysées. Celle-ci est appelée implicitement au moment de l'instantiation.

setnomoretags()
Arrête l'analyse des balises. Traite toute la suite de l'entrée comme une entrée littérale (CDATA). (Ceci est seulement fourni pour que la balise HTML <PLAINTEXT> puisse être réalisée.)

setliteral()
Entre en mode littéral (CDATA mode).

feed(donnee)
Introduit du texte dans l'analyseur. Il est analysé tant qu'il consiste en des éléments complets; les données incomplètes sont gardées en mémoire jusqu'à ce que d'autres données soient fournies ou que close() soit appelée.

close()
Force l'analyse de toutes les données mémorisées comme si elles étaient suivies par une marque de fin de fichier. Cette méthode peut être redéfinie par une classe dérivée pour définir des traitements additionnels à la fin de l'entrée, mais la version redéfinie devrait toujours appeler close().

get_starttag_text()
Renvoie le texte de la plus récente balise de début ouverte. Ceci ne devrait normalement pas être nécessaire pour un traitement structuré, mais peut être utile en travaillant avec HTML ``comme déployé'' ou pour recréer l'entrée avec des changements minimes (espaces blancs entre les attributs peuvent être conservés, etc.).

handle_starttag(balise, methode, attributs)
Cette méthode est appelée pour gérer les balises de début pour lesquelles une méthode start_balise() ou do_balise() a été définie. L'argument balise est le nom de la balise converti en minuscule, et l'argument methode est la méthode attachée qui devrait être utilisée pour fournir l'interprétation sémantique de la balise de début. L'argument attributs est une liste de paires (nom, valeur) contenant les attributs trouvés à l'intérieur des signes <> de la balise. Le nom a été converti en minuscule et les guillemets et les barres inversées dans la valeur ont été interprétés. Par exemple, pour la balise <A HREF="http://www.cwi.nl/">, cette méthode serait appelée par "unknown_starttag('a', [('href', 'http://www.cwi.nl/')])". L'implémentation d'origine exécute tout simplement methode avec attributs comme unique argument.

handle_endtag(balise, methode)
Cette méthode est utilisée pour gérer les balises de fin pour lesquelles une méthode end_balise() a été définie. L'argument balise est le nom de la balise converti en minuscule, et l'argument methode est la méthode attachée qui devrait être utilisée pour fournir l'interprétation sémantique de la balise de fin. Si aucune méthode end_balise() est définie pour l'élément fermant, ce gestionnaire n'est pas appelé. L'implémentation d'origine exécute tout simplement methode.

handle_data(donnee)
Cette méthode est appelée pour traiter des données quelconque. Elle est là dans l'intention d'être surchargée par une classe dérivée ; l'implémentation d'origine de la classe ne fait rien.

handle_charref(ref)
Cette méthode est utilisée pour traiter un appel de caractère de la forme "&#ref;". Dans l'implémentation d'origine, ref doit être un nombre décimal dans l'intervalle 0-255. Elle convertit le caractère en ASCII et appelle la méthode handle_data() avec le caractère en argument. Si ref est non valide ou hors de l'intervalle, la méthode unknown_charref(ref) est appelée pour gérer l'erreur. Une sous-classe doit surcharger cette méthode pour fournir un support pour les entités à caractères nominatifs.

handle_entityref(ref)
Cette méthode est utilisée pour traiter un appel d'entité général de la forme "&ref;"ref est un appel d'entité général. Elle cherche ref dans la variable d'instance (ou de classe) entitydefs qui devrait être une table associative des noms d'entité vers une traduction correspondante. Si une traduction est trouvée, elle appelle la méthode handle_data() avec la traduction; autrement, elle appelle la méthode unknown_entityref(ref). La valeur par défaut de entitydefs définit les conversions pour &amp;, &apos, &gt;, &lt;, et &quot;.

handle_comment(commentaire)
Cette méthode est appelée quand un commentaire est rencontré. L'argument commentaire est une chaîne de caractères contenant le texte entre les délimiteurs "<!--" et "-->", mais sans les délimiteurs eux-mêmes. Par exemple, le commentaire "<!--texte-->" suscitera l'appel de la méthode avec l'argument 'text'. La méthode par défaut ne fait rien.

report_unbalanced(balise)
Cette méthode est appelée quand une balise de fin est rencontrée qui ne correspond à aucun élément ouvert.

unknown_starttag(balise, attributs)
Cette méthode est utilisée pour traiter une balise de début inconnue. Cette méthode est prévue pour être surchargée dans une classe dérivée ; l'implémentation de la classe initiale ne fait rien.

unknown_endtag(balise)
Cette méthode est utilisée pour traiter une balise de fin inconnue. Cette méthode est prévue pour être surchargée dans une classe dérivée ; l'implémentation de la classe initiale ne fait rien.

unknown_charref(ref)
Cette méthode est utilisée pour traiter les appels de caractères numériques insolubles. Reportez-vous à handle_charref() pour connaître ce qui est géré par défaut. Cette méthode est prévue pour être surchargée dans une classe dérivée ; l'implémentation de la classe initiale ne fait rien.

unknown_entityref(ref)
Cette méthode est utilisée pour traiter un appel d'entité inconnue. Cette méthode est prévue pour être surchargée dans une classe dérivée ; l'implémentation de la classe initiale ne fait rien.

Mis à part la surcharge ou l'extension des méthodes listées ci-dessus, les classes dérivées peuvent aussi définir des méthodes de la forme suivante pour définir le traitement de balises spécifiques. Les noms des balises dans le flux d'entrée sont indépendants de la casse ; la balise apparaissant dans les noms des méthodes doit être minuscule.

start_balise(attributs)
Cette méthode est utilisée pour traiter une balise ouvrante balise. Elle est prend la priorité sur do_balise(). L'argument attributs a la même signification que celle décrite dans handle_starttag() ci-dessus.

do_balise(attributs)
Cette méthode est utilisée pour traiter une balise ouvrante balise qui ne vient pas avec une balise fermante appariée. L'argument attributs a la même signification que celle décrite dans handle_starttag() plus haut.

end_balise()
Cette méthode est utilisée pour traiter une balise fermante balise.

Notez que l'analyseur maintient une pile des éléments ouverts pour lesquels aucune balise de fin n'a encore été trouvée. Seules les balises traitées par start_balise() sont déposées sur cette pile. La définition d'une méthode end_balise() est facultative pour ces balises. Pour des balises traitées par do_balise() ou par unknown_tag(), aucune méthode end_balise() ne doit être définie; si définie, elle ne sera pas utilisée. Si les deux méthodes start_balise() et do_balise() existent pour une balise, la méthode start_balise() prend la priorité.