Skip to content
Extraits de code Groupes Projets
Bifurcation depuis spip / spip
Le projet source a une visibilité limitée.
  • esj's avatar
    22d2f964
    Il était écrit que la prochaine version de SPIP n'allait pas sortir avec un... · 22d2f964
    esj a rédigé
    Il était écrit que la prochaine version de SPIP n'allait pas sortir avec un validateur limité. Je suis nul de ne pas y avoir pensé avant: pour vérifier les rares règles plus complexes que celle de la forme {{{(A|B|C|)*}}} il suffit de les compiler en une RegExp (ce qu'elles sont à peu près, il faut juste supprimer les virgules et normaliser l'usage des espaces) et appliquer celle-ci sur la suite des noms de balises rencontrées séparées par des espaces. Ainsi, la règle:
    {{{
    <!ELEMENT table
         (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
    }}}
    se compile en 
    {{{
    /^((caption )?((col )*|(colgroup )*)(thead )?(tfoot )?((tbody )+|(tr )+))$/
    }}}
    appliquer preg_match dessus et, par exemple, "tr caption tr ", permettra e refuser cette construction ce qui n'était pas le cas auparavant.
    
    La règle sur head, que la DTD énonce en 2 coups:
    {{{
    <!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
    
    <!ELEMENT head (%head.misc;,
         ((title, %head.misc;, (base, %head.misc;)?) |
          (base, %head.misc;, (title, %head.misc;))))>
    }}}
    est compilée en:
    {{{
    /^(((script )|(style )|(meta )|(link )|(object ))*(((title )((script )|(style )|(meta )|(link )|(object ))*((base )((script )|(style )|(meta )|(link )|(object ))*)?)|((base )((script )|(style )|(meta )|(link )|(object ))*((title )((script )|(style )|(meta )|(link )|(object ))*))))$/
    }}}
    ce qui assure qu'il y aura une et une seule balise Title et au plus une balise Base.
    
    Seul défaut de cette stratégie hyper efficace: le message d'erreur mentionnera comme ligne fautive celle contenant la balise fermant la suite problématique, sans plus de précision. Cela dit ce n'est de toutes façons pas possible d'etre plus précis dans le cas général.
    22d2f964
    Historique
    Il était écrit que la prochaine version de SPIP n'allait pas sortir avec un...
    esj a rédigé
    Il était écrit que la prochaine version de SPIP n'allait pas sortir avec un validateur limité. Je suis nul de ne pas y avoir pensé avant: pour vérifier les rares règles plus complexes que celle de la forme {{{(A|B|C|)*}}} il suffit de les compiler en une RegExp (ce qu'elles sont à peu près, il faut juste supprimer les virgules et normaliser l'usage des espaces) et appliquer celle-ci sur la suite des noms de balises rencontrées séparées par des espaces. Ainsi, la règle:
    {{{
    <!ELEMENT table
         (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
    }}}
    se compile en 
    {{{
    /^((caption )?((col )*|(colgroup )*)(thead )?(tfoot )?((tbody )+|(tr )+))$/
    }}}
    appliquer preg_match dessus et, par exemple, "tr caption tr ", permettra e refuser cette construction ce qui n'était pas le cas auparavant.
    
    La règle sur head, que la DTD énonce en 2 coups:
    {{{
    <!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
    
    <!ELEMENT head (%head.misc;,
         ((title, %head.misc;, (base, %head.misc;)?) |
          (base, %head.misc;, (title, %head.misc;))))>
    }}}
    est compilée en:
    {{{
    /^(((script )|(style )|(meta )|(link )|(object ))*(((title )((script )|(style )|(meta )|(link )|(object ))*((base )((script )|(style )|(meta )|(link )|(object ))*)?)|((base )((script )|(style )|(meta )|(link )|(object ))*((title )((script )|(style )|(meta )|(link )|(object ))*))))$/
    }}}
    ce qui assure qu'il y aura une et une seule balise Title et au plus une balise Base.
    
    Seul défaut de cette stratégie hyper efficace: le message d'erreur mentionnera comme ligne fautive celle contenant la balise fermant la suite problématique, sans plus de précision. Cela dit ce n'est de toutes façons pas possible d'etre plus précis dans le cas général.