Browse Source

htmlpurifier : ajout du tag htmlpurifier-v1 et creation du trunk

svn/root/tags/v5.0.0.5
gouz@root-me.org 4 years ago
commit
9d303710f5
  1. 165
      .gitattributes
  2. 12
      HTMLPurifier.extended.php
  3. 246
      exec/test_htmlpurifier.php
  4. BIN
      htmlpurifier.png
  5. 12
      htmlpurifier_options.php
  6. 13
      inc/echapper_html_suspect.php
  7. 60
      inc/safehtml.php
  8. 446
      inc/texte.php
  9. 20
      lang/paquet-htmlpurifier_fr.php
  10. 22524
      lib/HTMLPurifier.standalone.php
  11. 48
      lib/standalone/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
  12. 144
      lib/standalone/HTMLPurifier/ConfigSchema/Builder/Xml.php
  13. 11
      lib/standalone/HTMLPurifier/ConfigSchema/Exception.php
  14. 47
      lib/standalone/HTMLPurifier/ConfigSchema/Interchange.php
  15. 89
      lib/standalone/HTMLPurifier/ConfigSchema/Interchange/Directive.php
  16. 58
      lib/standalone/HTMLPurifier/ConfigSchema/Interchange/Id.php
  17. 226
      lib/standalone/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
  18. 248
      lib/standalone/HTMLPurifier/ConfigSchema/Validator.php
  19. 130
      lib/standalone/HTMLPurifier/ConfigSchema/ValidatorAtom.php
  20. BIN
      lib/standalone/HTMLPurifier/ConfigSchema/schema.ser
  21. 8
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
  22. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
  23. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
  24. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
  25. 19
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
  26. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
  27. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
  28. 8
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
  29. 10
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
  30. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
  31. 8
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
  32. 10
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt
  33. 5
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
  34. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
  35. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
  36. 14
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
  37. 31
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
  38. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
  39. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
  40. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
  41. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
  42. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
  43. 14
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt
  44. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
  45. 15
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
  46. 46
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
  47. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
  48. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt
  49. 8
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
  50. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
  51. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
  52. 18
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
  53. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
  54. 13
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
  55. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
  56. 10
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
  57. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
  58. 14
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
  59. 13
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
  60. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
  61. 18
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
  62. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt
  63. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
  64. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
  65. 29
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
  66. 14
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
  67. 17
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
  68. 14
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
  69. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
  70. 15
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
  71. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
  72. 7
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
  73. 13
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
  74. 19
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
  75. 10
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
  76. 36
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt
  77. 34
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
  78. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
  79. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
  80. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
  81. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
  82. 12
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
  83. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
  84. 14
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
  85. 29
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
  86. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
  87. 74
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
  88. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
  89. 25
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
  90. 19
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
  91. 10
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
  92. 15
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
  93. 23
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
  94. 20
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
  95. 11
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
  96. 18
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
  97. 23
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
  98. 9
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
  99. 33
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
  100. 16
      lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
  101. Some files were not shown because too many files have changed in this diff Show More

165
.gitattributes vendored

@ -0,0 +1,165 @@
* text=auto !eol
/HTMLPurifier.extended.php -text
exec/test_htmlpurifier.php -text
/htmlpurifier.png -text
/htmlpurifier_options.php -text
inc/echapper_html_suspect.php -text
inc/safehtml.php -text
inc/texte.php -text
lang/paquet-htmlpurifier_fr.php -text
lib/HTMLPurifier.standalone.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Builder/Xml.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Exception.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Interchange.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Interchange/Directive.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Interchange/Id.php -text
lib/standalone/HTMLPurifier/ConfigSchema/InterchangeBuilder.php -text
lib/standalone/HTMLPurifier/ConfigSchema/Validator.php -text
lib/standalone/HTMLPurifier/ConfigSchema/ValidatorAtom.php -text
lib/standalone/HTMLPurifier/ConfigSchema/schema.ser -text svneol=unset#unset
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.Language.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.Base.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.Host.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt -text
lib/standalone/HTMLPurifier/ConfigSchema/schema/info.ini -text
lib/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/4.7.0,bd08c5afbc77123dbd4e9e026a723c450e9f844b,1.ser -text
lib/standalone/HTMLPurifier/EntityLookup/entities.ser -text
lib/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php -text
lib/standalone/HTMLPurifier/Filter/YouTube.php -text
lib/standalone/HTMLPurifier/Language/classes/en-x-test.php -text
lib/standalone/HTMLPurifier/Language/messages/en-x-test.php -text
lib/standalone/HTMLPurifier/Language/messages/en-x-testmini.php -text
lib/standalone/HTMLPurifier/Language/messages/en.php -text
lib/standalone/HTMLPurifier/Lexer/PH5P.php -text
lib/standalone/HTMLPurifier/Printer.php -text
lib/standalone/HTMLPurifier/Printer/CSSDefinition.php -text
lib/standalone/HTMLPurifier/Printer/ConfigForm.css -text
lib/standalone/HTMLPurifier/Printer/ConfigForm.js -text
lib/standalone/HTMLPurifier/Printer/ConfigForm.php -text
lib/standalone/HTMLPurifier/Printer/HTMLDefinition.php -text
/plugin.xml -text
wheels/htmlpurifier/echappe-js.php -text
wheels/htmlpurifier/echappe-js.yaml -text
wheels/htmlpurifier/interdire-scripts.yaml -text

12
HTMLPurifier.extended.php

@ -0,0 +1,12 @@
<?php
class HTMLPurifier_URIScheme_generic extends HTMLPurifier_URIScheme {
public function doValidate(&$uri, $config, $context){
return true;
}
}
class HTMLPurifier_URIScheme_tcp extends HTMLPurifier_URIScheme_generic {}
class HTMLPurifier_URIScheme_udp extends HTMLPurifier_URIScheme_generic {}
class HTMLPurifier_URIScheme_ssh extends HTMLPurifier_URIScheme_generic {}

246
exec/test_htmlpurifier.php

@ -0,0 +1,246 @@
<?php
function exec_test_htmlpurifier_dist() {
include_spip('inc/texte');
$texte="{{{Le texte préexiste à la mise en page}}}
C'est peut-être une évidence, mais pour mettre en page un texte, il faut que le texte existe.
Dans le cas de SPIP, ça veut dire qu'il vaut mieux (au moins dans un premier temps):
-* disposer de tout le texte sans aucun raccourcis typographique,
-* sauter une ligne à chaque changement d'idée (ce qui donne un changement de paragraphe, voire un titre),
-* faire un retour à la ligne avant chaque élément d'une énumération.
Ce n'est qu'ensuite que les raccourcis typographiques de SPIP pourront être appliqués avec discernement.
{{{Distinction entre paragraphes et caractères}}}
Certains attributs typographiques ne peuvent s'appliquer qu'à des paragraphes entiers, d'autres doivent être appliqués à des caractères dans le {{même}} paragraphe.
<doc195|center>
Dans la Barre Typographique de SPIP, les attributs de caractères forment le premier groupe sur la gauche, les attributs typographiques de paragraphes le deuxième.[definition_ancre<-]
{{{**Paragraphes}}}
Un paragraphe dans SPIP est précédé d'une ligne vide et suivi d'une ligne vide[[Sauf les listes à puce et les tableaux]].
Une règle générale est de ne mettre qu'un attribut de paragraphe par paragraphe.
Si deux paragraphes de suite ont le même attribut, il faut appliquer {{deux}} fois l'attribut, une fois pour chaque paragraphe.
Les attributs de paragraphe sont :
-* les titres <code>{</code><code>{{</code>Paragraphe du titre<code>}}</code><code>}</code> et sous-titres <code>{n{</code>Texte du titre<code>}n}</code>, n variant de 2 à 5, la barre de raccourcis ne proposant que 2 et 3.
_ [*{{Attention}}*]: il est essentiel de respecter la {{hiérarchie}} de la titraille et de ne pas commencer par un élément sans qu'il soit précédé de son niveau supérieur (on ne doit pas commencer à 2 !). Voir les exemples de [titraille->#titraille]
-* centrer <code>[|</code>Paragraphe centré<code>|]</code> : à n'utiliser que de manière {{exceptionnelle}}[[J'avais mis ça en place à l'époque de la version 1.7 de SPIP qui gérait mal le centrage des images]] !
[|Paragraphe centré|]
-* aligner à droite <code>[/</code>Paragraphe aligné à droite<code>/]</code> : essentiellement pour mettre la signature d'un auteur
[/Paragraphe aligné à droite/]
-* encadrer <code>[(</code>Paragraphe à encadrer<code>)]</code>
[(Paragraphe à encadrer)]
Certains attributs sont un peu spéciaux :
-* Poésie <code><poesie></code>Le texte de la poésie, sur plusieurs lignes, les retour à la ligne simple {{étant}} pris en compte<code></poesie></code>
<poesie>Le geai gélatineux gégnait dans le jasmin
Voici mes infins le plus beau vers de la langue française.</poesie>
-* Cadre <code><cadre></code>Texte qui apparaitra dans une zone de formulaire facilitant le copier/coller[[Essentiellement utilisé sur spip-contrib pour donner des exemples de code]]<code></cadre></code>
<cadre>
Ceci est du texte dans un cadre.
les espaces en début de ligne comptent !
Les retour à la ligne simples aussi !
</cadre>
-* Citation <code><quote></code>Texte d'une citation<code></quote></code>
<quote>C'est en forgeant que l'on devient forgeron.</quote>
{{{**Caractères}}}
Les attributs de caractères {{doivent}} être ouverts et fermés à l'intérieur du même paragraphe (pas question de débuter le gras sur un premier paragraphe et de le terminer sur un deuxième).
Mise en forme:
-* gras : <code>{{</code>texte en gras<code>}}</code>; à utiliser pour un élément que l'on souhaite appuyer (sera prononcé plus fort dans un lecteur vocal) : {{texte en gras}}
-* italique : <code>{</code>italique<code>}</code>; à utiliser pour une élément sur lequel on veut insister (sera prononcé avec emphase) : {italique}
-* mise en évidence <code>[*</code>texte en évidence<code>*]</code> : élément que l'on souhaite appuyer et attirer le regard par un changement de couleur : [*texte en évidence*]
-* mise en exposant : <code><sup></code>texte en exposant<code></sup></code> : pour l'abréviation de saint : S<sup>t</sup>
-* petites capitales : <code><sc></code>texte en petite capitales<code></sc></code> : à utiliser essentiellement pour les nom propres : Charles <sc>de Gaulle</sc>
-* code : <html><tt>&lt;code&gt;</tt></html>du code (raccourcis typographiques, html...)<html><tt>&lt;/code&gt;</tt></html> que l'on ne souhaite pas que SPIP interprète
-* biffé : <code><del></code>texte biffé<code></del></code> : pour indiquer qu'on avait pensé à un autre mot et que l'on a changé d'avis : SPIP, c'est <del>bien</del> fantastique!
Comportement spécifique:
-* bulle d'aide : <code>[GPL|Gnu Public Licence]</code> : pour donner la signifation d'un terme ou d'une abréviation : [GPL|Gnu Public Licence]
-* lien : <code>[texte du lien->https://www.spip.net/]</code> : lien : [texte du lien->https://www.spip.net/]
_ À noter qu'il est possible de faire des liens à l'intérieur du site SPIP à l'aide des {{numéros}} des éléments et de leur type (se reporter à l'aide en ligne fournie par SPIP).
-* lien avec bulle d'aide : <code>[texte du lien|Le site officiel de SPIP->https://www.spip.net/]</code> : [texte du lien|Le site officiel de SPIP->https://www.spip.net/]
-* lien avec langue des destination (non visible sur Internet Explorer) : <code>[texte du lien|{fr}->https://www.spip.net/]</code> : [texte du lien|{fr}->https://www.spip.net/]
-* lien avec bulle d'aide et angue des destination : <code>[texte du lien|Le site officiel de SPIP{fr}->https://www.spip.net/]</code> : [texte du lien|Le site officiel de SPIP{fr}->https://www.spip.net/]
-* ancre et retour à l'ancre : <code>[definition_ancre<-]</code> et <code>[retour à l'ancre->#definition_ancre]</code> : [retour à l'ancre->#definition_ancre]
-* définition dans Wikipedia : <code>[?GPL]</code> : appelle l'encyclopédie libre Wkipedia pour obtenir la définition du mot[[Si le mot n'existe pas, vous pouvez le créer vous-même!]] : [?GPL]
_ Avec bulle d'aide : <code>[?GPL|Définition sur Wikipédia]</code> : [?GPL|Définition sur Wikipédia]
-* note de bas de page : <code>texte[[note de bas de page]]</code> : crée une note de bas de page avec le texte entre les doubles crochets[[Et la note de bas de page est automatiquement numérotée, rendue clicable, pour la consulter, et pour revenir au texte l'ayant appelée]]
{{{**Listes}}}
Les listes sont à utiliser pour tout ce qui à le {{sens}} d'une énumération.
{{Attention}}: il faut entourer un bloc de listes à puces d'une ligne vide avant et après.
{{{***Listes à puces}}}
<cadre>
-* première ligne
-* deuxième ligne
-** une sous liste à puce
-* de retour dans le niveau initial
</cadre>
Donnera :
-* première ligne
-* deuxième ligne
-** une sous liste à puce
-* de retour dans le niveau initial
{{{***Listes numérotées}}}
<cadre>
-# première ligne
-# deuxième ligne
-## une sous liste à puce
-# de retour dans le niveau initial
</cadre>
Donnera :
-# première ligne
-# deuxième ligne
-## une sous liste numérotée
-# de retour dans le niveau initial
{{{**Tableaux}}}
Pour être complètement accessible, un tableau dans SPIP doit avoir un titre et une description.
Ainsi :
<cadre>
||Produits bio et prix|Ce tableau sert d'exemple de mise en forme spip||
| {{Produit}} | {{Prix €}} |
| Beurre Bio | 5€ |
| Lait Bio | 3€ |
| Choux Bio | 4€ |
</cadre>
Donnera :
||Produits bio et prix|Ce tableau sert d'exemple de mise en forme spip||
| {{Produit}} | {{Prix €}} |
| Beurre Bio | 5€ |
| Lait Bio | 3€ |
| Choux Bio | 4€ |
Notez les doubles <code>||</code> sur la première ligne du tableau !
[*Attention*]: les pièges classiques avec les tableaux sont :
-* ne pas avoir le même nombre de | sur une ligne
-* avoir un espace {{après}} le dernier | de la ligne (un moyen simple de vérifier : la touche fin du clavier amène à la fin de la ligne)
{{{**Tableaux avec fusion de cellules}}}
<cadre>
||Tableau avec fusion|Ce tableau sert d'exemple de mise en forme spip||
| {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} |
| ligne 1 | Cellule fusionnée avec la suivante |<|
| ligne 2 | Celulle fusionnée
_ avec celle du sessous | normale |
| ligne 2 |^| normale aussi |
</cadre>
Donnera :
||Tableau avec fusion|Ce tableau sert d'exemple de mise en forme spip||
| {{Colonne 1}} | {{Colonne 2}} | {{Colonne 3}} |
| ligne 1 | Cellule fusionnée avec la suivante |<|
| ligne 2 | Celulle fusionnée
_ avec celle du dessous | normale |
| ligne 2 |^| normale aussi |
{{{Images}}}
Pour les images et documents, reportez-vous à l'aide en ligne de SPIP. Seule contrainte pour l'accessibilité (et donc un meilleur référencement) : donnez un titre à {{toutes}} vos images décrivant le {{[sens|signification]}} de chacune d'elles.
{{{Caractères spéciaux}}}
-* <code>~</code> (espace insécable ou espace dur -- correspond au <code>&nbsp;</code> du [HTML|Hyper Text Markup Language]) placé entre deux mots remplace l'espace en ayant l'avantage d'être insécable, c'est-à-dire, qu'il empêchera les deux mots d'être séparés par un retour à la ligne malvenu. S'utilise en particulier entre le prénom et le nom propre.
-* <code>--></code> : --> (flèche vers la droite)
-* <code><--</code> : <-- (flèche vers la gauche)
-* <code><--></code> : <--> (flèche vers la gauche et vers droite)
-* <code>--</code> : -- (tiret cadratin) à utiliser pour les incises dans un texte
{{{Ligne horizontale}}}
<code>----</code>: 4 signes moins en seuls sur une ligne (précédés d'une ligne vide et suivis d'une ligne vide) donneront un trait de séparation horizontal.
----
{{{Éléments dangereux}}}
Il y a deux éléments {{dangereux}} dans SPIP :
-* le retour à la ligne simple : <code>_ </code> (souligné espace) en début de ligne.
_ Usage toléré pour donner adresse et numéro de téléphone/fax.
_ Usage toléré : dans une liste à puce pour passer à la ligne sans passer à une nouvelle puce (comme ici).
_ Usage {{[*interdit*]}}: pour mettre plus d'espace vertical entre deux éléments de la page.
-* le [?HTML] pur : il est {possible} dans SPIP de mettre du code [HTML|Hyper Text Markup Language]. Le faire est fortement déconseillé :
-** parce que c'est la porte ouverte à toutes les dérives, ne serait-ce que celle de sortir de la charte graphique du site, ou celle de produire un code HTML non valide (voire non interprétable ailleurs que sur [Internet Explorer->115]
-** parce que c'est partir du postulat que votre site ne sera visité qu'en tant que site web ; il pourrait très bien être un jour disponible sous forme de fichier PDF...
[titraille<-]
{{{Exemples de titraille : Titre principal}}}
<code>{</code><code>{{</code>Exemples de titraille : Titre principal<code>}}</code><code>}</code>
{{{**Titre niveau deux}}}
<code>{{{**</code>Titre niveau deux<code>}}}</code>
{{{***Titre niveau trois}}}
<code>{{{***</code>Titre niveau trois<code>}}}</code>
{{{****Titre niveau quatre}}}
<code>{{{****</code>Titre niveau quatre<code>}}}</code>
{{{*****Titre niveau cinq}}}
<code>{{{*****</code>Titre niveau cinq<code>}}}</code>";
$time_start = microtime(true);
for ($i = 1; $i <= 1; $i++) {
$resultat = safehtml(propre($texte));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Temps d'exécution $time seconds\n";
echo $resultat;
}

BIN
htmlpurifier.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

12
htmlpurifier_options.php

@ -0,0 +1,12 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS['spip_wheels']['interdire_scripts'] = array(
'htmlpurifier/interdire-scripts.yaml'
);
$GLOBALS['spip_wheels']['echappe_js'] = array(
'htmlpurifier/echappe-js.yaml'
);

13
inc/echapper_html_suspect.php

@ -0,0 +1,13 @@
<?php
function inc_echapper_html_suspect_dist($texte, $strict=true) {
if (!$texte
or strpos($texte, '<') === false or strpos($texte, '=') === false) {
return $texte;
}
if (preg_match("@^</?[a-z]{1,5}(\s+class\s*=\s*['\"][a-z _\s-]+['\"])?\s?/?>$@iS", $texte)) return $texte;
$texte = safehtml($texte);
return $texte;
}

60
inc/safehtml.php

@ -0,0 +1,60 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2017 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
function inc_safehtml($t) {
static $purifier;
include_spip('inc/memoization');
if (function_exists('cache_get')
AND $a = cache_get($cle = 'safehtml:'.md5($t)))
return $a;
include_spip('lib/HTMLPurifier.standalone');
include_spip('HTMLPurifier.extended');
$config = HTMLPurifier_Config::createDefault();
$config->set('Attr.EnableID', true);
$config->set('HTML.SafeIframe', true);
$config->set('URI.SafeIframeRegexp', "%^http[s]?://[a-z0-9\.]*".$_SERVER['HTTP_HOST']."%iS" );
$config->set('HTML.TidyLevel', 'none');
$config->set('Cache.SerializerPath', preg_replace(',/$,', '', realpath(_DIR_TMP)));
$config->set('Attr.AllowedFrameTargets', array('_blank'));
$config->set('Attr.AllowedRel', 'facebox,nofollow,print,external');
$config->set('URI.AllowedSchemes', array ('http' => true, 'https' => true, 'mailto' => true, 'ftp' => true, 'nntp' => true, 'news' => true, 'tel' => true, 'tcp'=>true, 'udp'=>true, 'ssh'=>true,));
$html = $config->getHTMLDefinition(true);
$html->manager->addModule('Forms');
$html->manager->registeredModules["Forms"]->safe = true;
if (!isset($purifier))
$purifier = new HTMLPurifier($config);
// HTML Purifier prefere l'utf-8
if ($GLOBALS['meta']['charset'] == 'utf-8')
$t = $purifier->purify($t);
else
$t = unicode_to_charset($purifier->purify(charset2unicode($t)));
if (function_exists('cache_set'))
cache_set($cle, $t);
return $t;
}

446
inc/texte.php

@ -0,0 +1,446 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2018 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* Gestion des textes et raccourcis SPIP
*
* @package SPIP\Core\Texte
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/texte_mini');
include_spip('inc/lien');
/*************************************************************************************************************************
* Fonctions inutilisees en dehors de inc/texte
*
*/
/**
* Raccourcis dépendant du sens de la langue
*
* @return array Tablea ('','')
*/
function definir_raccourcis_alineas() {
return array('', '');
}
/**
* Traitement des raccourcis de tableaux
*
* Ne fait rien ici. Voir plugin Textwheel.
*
* @param string $bloc
* @return string
*/
function traiter_tableau($bloc) {
return $bloc;
}
/**
* Traitement des listes
*
* Ne fais rien. Voir Plugin Textwheel.
* (merci a Michael Parienti)
*
* @param string $texte
* @return string
*/
function traiter_listes($texte) {
return $texte;
}
/**
* Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc.
*
* Ne fais rien ici. Voir plugin Textwheel.
*
* @pipeline_appel pre_propre
* @pipeline_appel post_propre
*
* @param string $letexte
* @return string
*/
function traiter_raccourcis($letexte) {
// Appeler les fonctions de pre_traitement
$letexte = pipeline('pre_propre', $letexte);
// APPELER ICI UN PIPELINE traiter_raccourcis ?
// $letexte = pipeline('traiter_raccourcis', $letexte);
// Appeler les fonctions de post-traitement
$letexte = pipeline('post_propre', $letexte);
return $letexte;
}
/*************************************************************************************************************************
* Fonctions utilisees en dehors de inc/texte
*/
/**
* Échapper et affichier joliement les `<script` et `<iframe`...
*
* @param string $t
* @param string $class Attributs HTML du conteneur à ajouter
* @return string
*/
function echappe_js($t, $class = ' class = "echappe-js"') {
foreach (array('script', 'iframe') as $tag) {
if (stripos($t, "<$tag") !== false
and preg_match_all(',<' . $tag . '.*?($|</' . $tag . '.),isS', $t, $r, PREG_SET_ORDER)
) {
foreach ($r as $regs) {
$t = str_replace($regs[0],
"<code$class>" . nl2br(spip_htmlspecialchars($regs[0])) . '</code>',
$t);
}
}
}
return $t;
}
/**
* Empêcher l'exécution de code PHP et JS
*
* Sécurité : empêcher l'exécution de code PHP, en le transformant en joli code
* dans l'espace privé. Cette fonction est aussi appelée par propre et typo.
*
* De la même manière, la fonction empêche l'exécution de JS mais selon le mode
* de protection passe en argument
*
* Il ne faut pas désactiver globalement la fonction dans l'espace privé car elle protège
* aussi les balises des squelettes qui ne passent pas forcement par propre ou typo après
* si elles sont appelées en direct
*
* @param string $arg
* Code à protéger
* @param int $mode_filtre
* Mode de protection
* -1 : protection dans l'espace privé et public
* 0 : protection dans l'espace public
* 1 : aucune protection
* utilise la valeur de la globale filtrer_javascript si non fourni
* @return string
* Code protégé
**/
function interdire_scripts($arg, $mode_filtre=null) {
// on memorise le resultat sur les arguments non triviaux
static $dejavu = array();
// Attention, si ce n'est pas une chaine, laisser intact
if (!$arg or !is_string($arg) or !strstr($arg, '<')) {
return $arg;
}
if (is_null($mode_filtre) or !in_array($mode_filtre, array(-1, 0, 1))) {
$mode_filtre = $GLOBALS['filtrer_javascript'];
}
if (isset($dejavu[$mode_filtre][$arg])) {
return $dejavu[$mode_filtre][$arg];
}
// echapper les tags asp/php
$t = str_replace('<' . '%', '&lt;%', $arg);
// echapper le php
$t = str_replace('<' . '?', '&lt;?', $t);
// echapper le < script language=php >
$t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '&lt;\1', $t);
// Pour le js, trois modes : parano (-1), prive (0), ok (1)
switch ($mode_filtre) {
case 0:
if (!_DIR_RESTREINT) {
$t = echappe_js($t);
}
break;
case -1:
$t = echappe_js($t);
break;
}
// pas de <base href /> svp !
$t = preg_replace(',<(base\b),iS', '&lt;\1', $t);
// Reinserer les echappements des modeles
if (defined('_PROTEGE_JS_MODELES')) {
$t = echappe_retour($t, "javascript" . _PROTEGE_JS_MODELES);
}
if (defined('_PROTEGE_PHP_MODELES')) {
$t = echappe_retour($t, "php" . _PROTEGE_PHP_MODELES);
}
return $dejavu[$mode_filtre][$arg] = $t;
}
/**
* Applique la typographie générale
*
* Effectue un traitement pour que les textes affichés suivent les règles
* de typographie. Fait une protection préalable des balises HTML et SPIP.
* Transforme les balises `<multi>`
*
* @filtre
* @uses traiter_modeles()
* @uses corriger_typo()
* @uses echapper_faux_tags()
* @see propre()
*
* @param string $letexte
* Texte d'origine
* @param bool $echapper
* Échapper ?
* @param string|null $connect
* Nom du connecteur à la bdd
* @param array $env
* Environnement (pour les calculs de modèles)
* @return string $t
* Texte transformé
**/
function typo($letexte, $echapper = true, $connect = null, $env = array()) {
// Plus vite !
if (!$letexte) {
return $letexte;
}
// les appels directs a cette fonction depuis le php de l'espace
// prive etant historiquement ecrit sans argment $connect
// on utilise la presence de celui-ci pour distinguer les cas
// ou il faut passer interdire_script explicitement
// les appels dans les squelettes (de l'espace prive) fournissant un $connect
// ne seront pas perturbes
$interdire_script = false;
if (is_null($connect)) {
$connect = '';
$interdire_script = true;
$env['espace_prive'] = test_espace_prive();
}
// Echapper les codes <html> etc
if ($echapper) {
$letexte = echappe_html($letexte, 'TYPO');
}
//
// Installer les modeles, notamment images et documents ;
//
// NOTE : propre() ne passe pas par ici mais directement par corriger_typo
// cf. inc/lien
$letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect, null, $env);
if ($letexte != $mem) {
$echapper = true;
}
unset($mem);
$letexte = corriger_typo($letexte);
$letexte = echapper_faux_tags($letexte);
// reintegrer les echappements
if ($echapper) {
$letexte = echappe_retour($letexte, 'TYPO');
}
// Dans les appels directs hors squelette, securiser ici aussi
if ($interdire_script) {
$letexte = interdire_scripts($letexte);
}
// Dans l'espace prive on se mefie de tout contenu dangereux
// https://core.spip.net/issues/3371
// et aussi dans l'espace public si la globale filtrer_javascript = -1
// https://core.spip.net/issues/4166
if ($GLOBALS['filtrer_javascript'] == -1
or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript']<=0)) {
$letexte = echapper_html_suspect($letexte);
}
return $letexte;
}
// Correcteur typographique
define('_TYPO_PROTEGER', "!':;?~%-");
define('_TYPO_PROTECTEUR', "\x1\x2\x3\x4\x5\x6\x7\x8");
define('_TYPO_BALISE', ",</?[a-z!][^<>]*[" . preg_quote(_TYPO_PROTEGER) . "][^<>]*>,imsS");
/**
* Corrige la typographie
*
* Applique les corrections typographiques adaptées à la langue indiquée.
*
* @pipeline_appel pre_typo
* @pipeline_appel post_typo
* @uses corriger_caracteres()
* @uses corriger_caracteres()
*
* @param string $letexte Texte
* @param string $lang Langue
* @return string Texte
*/
function corriger_typo($letexte, $lang = '') {
// Plus vite !
if (!$letexte) {
return $letexte;
}
$letexte = pipeline('pre_typo', $letexte);
// Caracteres de controle "illegaux"
$letexte = corriger_caracteres($letexte);
// Proteger les caracteres typographiques a l'interieur des tags html
if (preg_match_all(_TYPO_BALISE, $letexte, $regs, PREG_SET_ORDER)) {
foreach ($regs as $reg) {
$insert = $reg[0];
// hack: on transforme les caracteres a proteger en les remplacant
// par des caracteres "illegaux". (cf corriger_caracteres())
$insert = strtr($insert, _TYPO_PROTEGER, _TYPO_PROTECTEUR);
$letexte = str_replace($reg[0], $insert, $letexte);
}
}
// trouver les blocs idiomes et les traiter à part
$letexte = extraire_idiome($ei = $letexte, $lang, true);
$ei = ($ei !== $letexte);
// trouver les blocs multi et les traiter a part
$letexte = extraire_multi($em = $letexte, $lang, true);
$em = ($em !== $letexte);
// Charger & appliquer les fonctions de typographie
$typographie = charger_fonction(lang_typo($lang), 'typographie');
$letexte = $typographie($letexte);
// Les citations en une autre langue, s'il y a lieu
if ($em) {
$letexte = echappe_retour($letexte, 'multi');
}
if ($ei) {
$letexte = echappe_retour($letexte, 'idiome');
}
// Retablir les caracteres proteges
$letexte = strtr($letexte, _TYPO_PROTECTEUR, _TYPO_PROTEGER);
// pipeline
$letexte = pipeline('post_typo', $letexte);
# un message pour abs_url - on est passe en mode texte
$GLOBALS['mode_abs_url'] = 'texte';
return $letexte;
}
/**
* Paragrapher seulement
*
* /!\ appelée dans inc/filtres et public/composer
*
* Ne fait rien ici. Voir plugin Textwheel
*
* @param string $letexte
* @param null $forcer
* @return string
*/
function paragrapher($letexte, $forcer = true) {
return $letexte;
}
/**
* Harmonise les retours chariots et mange les paragraphes HTML
*
* Ne sert plus
*
* @param string $letexte Texte
* @return string Texte
**/
function traiter_retours_chariots($letexte) {
$letexte = preg_replace(",\r\n?,S", "\n", $letexte);
$letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte);
$letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte);
return $letexte;
}
/**
* Transforme les raccourcis SPIP, liens et modèles d'un texte en code HTML
*
* Filtre à appliquer aux champs du type `#TEXTE*`
*
* @filtre
* @uses echappe_html()
* @uses expanser_liens()
* @uses traiter_raccourcis()
* @uses echappe_retour_modeles()
* @see typo()
*
* @param string $t
* Texte avec des raccourcis SPIP
* @param string|null $connect
* Nom du connecteur à la bdd
* @param array $env
* Environnement (pour les calculs de modèles)
* @return string $t
* Texte transformé
**/
function propre($t, $connect = null, $env = array()) {
// les appels directs a cette fonction depuis le php de l'espace
// prive etant historiquement ecrits sans argment $connect
// on utilise la presence de celui-ci pour distinguer les cas
// ou il faut passer interdire_script explicitement
// les appels dans les squelettes (de l'espace prive) fournissant un $connect
// ne seront pas perturbes
$interdire_script = false;
if (is_null($connect)) {
$connect = '';
$interdire_script = true;
}
if (!$t) {
return strval($t);
}
// Dans l'espace prive on se mefie de tout contenu dangereux
// avant echappement des balises <html>
// https://core.spip.net/issues/3371
// et aussi dans l'espace public si la globale filtrer_javascript = -1
// https://core.spip.net/issues/4166
if ($interdire_script
or $GLOBALS['filtrer_javascript'] == -1
or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript']<=0)
or (isset($env['wysiwyg']) and $env['wysiwyg'] and $GLOBALS['filtrer_javascript']<=0)) {
$t = echapper_html_suspect($t, false);
}
$t = echappe_html($t);
$t = expanser_liens($t, $connect, $env);
$t = traiter_raccourcis($t);
$t = echappe_retour_modeles($t, $interdire_script);
return $t;
}

20
lang/paquet-htmlpurifier_fr.php

@ -0,0 +1,20 @@
<?php
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
// Fichier produit par PlugOnet
// Module: paquet-htmlpurifier
// Langue: fr
// Date: 11-03-2018 11:13:54
// Items: 2
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// H
'htmlpurifier_description' => 'Ce plugin propose de remplacer SafeHTML (plus maintenue depuis plusieurs années), par [HTML Purifier->http://htmlpurifier.org/], une librairie moderne et bien maintenue. SPIP utilise en interne la librairie SafeHTML pour sécuriser l\'affichage des textes qui proviennent potentiellement non pas des rédacteurs, mais de visiteurs non enregistrés ou de contributeurs externes, comme les forums ou les contenus des sites syndiqués.
{{Attention : ce plugin nécessite PHP5 !}}',
'htmlpurifier_slogan' => 'Sécuriser l\'affichage de certains textes',
);

22524
lib/HTMLPurifier.standalone.php

File diff suppressed because it is too large Load Diff

48
lib/standalone/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php

@ -0,0 +1,48 @@
<?php
/**
* Converts HTMLPurifier_ConfigSchema_Interchange to our runtime
* representation used to perform checks on user configuration.
*/
class HTMLPurifier_ConfigSchema_Builder_ConfigSchema
{
/**
* @param HTMLPurifier_ConfigSchema_Interchange $interchange
* @return HTMLPurifier_ConfigSchema
*/
public function build($interchange)
{
$schema = new HTMLPurifier_ConfigSchema();
foreach ($interchange->directives as $d) {
$schema->add(
$d->id->key,
$d->default,
$d->type,
$d->typeAllowsNull
);
if ($d->allowed !== null) {
$schema->addAllowedValues(
$d->id->key,
$d->allowed
);
}
foreach ($d->aliases as $alias) {
$schema->addAlias(
$alias->key,
$d->id->key
);
}
if ($d->valueAliases !== null) {
$schema->addValueAliases(
$d->id->key,
$d->valueAliases
);
}
}
$schema->postProcess();
return $schema;
}
}
// vim: et sw=4 sts=4

144
lib/standalone/HTMLPurifier/ConfigSchema/Builder/Xml.php

@ -0,0 +1,144 @@
<?php
/**
* Converts HTMLPurifier_ConfigSchema_Interchange to an XML format,
* which can be further processed to generate documentation.
*/
class HTMLPurifier_ConfigSchema_Builder_Xml extends XMLWriter
{
/**
* @type HTMLPurifier_ConfigSchema_Interchange
*/
protected $interchange;
/**
* @type string
*/
private $namespace;
/**
* @param string $html
*/
protected function writeHTMLDiv($html)
{
$this->startElement('div');
$purifier = HTMLPurifier::getInstance();
$html = $purifier->purify($html);
$this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
$this->writeRaw($html);
$this->endElement(); // div
}
/**
* @param mixed $var
* @return string
*/
protected function export($var)
{
if ($var === array()) {
return 'array()';
}
return var_export($var, true);
}
/**
* @param HTMLPurifier_ConfigSchema_Interchange $interchange
*/
public function build($interchange)
{
// global access, only use as last resort
$this->interchange = $interchange;
$this->setIndent(true);
$this->startDocument('1.0', 'UTF-8');
$this->startElement('configdoc');
$this->writeElement('title', $interchange->name);
foreach ($interchange->directives as $directive) {
$this->buildDirective($directive);
}
if ($this->namespace) {
$this->endElement();
} // namespace
$this->endElement(); // configdoc
$this->flush();
}
/**
* @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive
*/
public function buildDirective($directive)
{
// Kludge, although I suppose having a notion of a "root namespace"
// certainly makes things look nicer when documentation is built.
// Depends on things being sorted.
if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) {
if ($this->namespace) {
$this->endElement();
} // namespace
$this->namespace = $directive->id->getRootNamespace();
$this->startElement('namespace');
$this->writeAttribute('id', $this->namespace);
$this->writeElement('name', $this->namespace);
}
$this->startElement('directive');
$this->writeAttribute('id', $directive->id->toString());
$this->writeElement('name', $directive->id->getDirective());
$this->startElement('aliases');
foreach ($directive->aliases as $alias) {
$this->writeElement('alias', $alias->toString());
}
$this->endElement(); // aliases
$this->startElement('constraints');
if ($directive->version) {
$this->writeElement('version', $directive->version);
}
$this->startElement('type');
if ($directive->typeAllowsNull) {
$this->writeAttribute('allow-null', 'yes');
}
$this->text($directive->type);
$this->endElement(); // type
if ($directive->allowed) {
$this->startElement('allowed');
foreach ($directive->allowed as $value => $x) {
$this->writeElement('value', $value);
}
$this->endElement(); // allowed
}
$this->writeElement('default', $this->export($directive->default));
$this->writeAttribute('xml:space', 'preserve');
if ($directive->external) {
$this->startElement('external');
foreach ($directive->external as $project) {
$this->writeElement('project', $project);
}
$this->endElement();
}
$this->endElement(); // constraints
if ($directive->deprecatedVersion) {
$this->startElement('deprecated');
$this->writeElement('version', $directive->deprecatedVersion);
$this->writeElement('use', $directive->deprecatedUse->toString());
$this->endElement(); // deprecated
}
$this->startElement('description');
$this->writeHTMLDiv($directive->description);
$this->endElement(); // description
$this->endElement(); // directive
}
}
// vim: et sw=4 sts=4

11
lib/standalone/HTMLPurifier/ConfigSchema/Exception.php

@ -0,0 +1,11 @@
<?php
/**
* Exceptions related to configuration schema
*/
class HTMLPurifier_ConfigSchema_Exception extends HTMLPurifier_Exception
{
}
// vim: et sw=4 sts=4

47
lib/standalone/HTMLPurifier/ConfigSchema/Interchange.php

@ -0,0 +1,47 @@
<?php
/**
* Generic schema interchange format that can be converted to a runtime
* representation (HTMLPurifier_ConfigSchema) or HTML documentation. Members
* are completely validated.
*/
class HTMLPurifier_ConfigSchema_Interchange
{
/**
* Name of the application this schema is describing.
* @type string
*/
public $name;
/**
* Array of Directive ID => array(directive info)
* @type HTMLPurifier_ConfigSchema_Interchange_Directive[]
*/
public $directives = array();
/**
* Adds a directive array to $directives
* @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive
* @throws HTMLPurifier_ConfigSchema_Exception
*/
public function addDirective($directive)
{
if (isset($this->directives[$i = $directive->id->toString()])) {
throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'");
}
$this->directives[$i] = $directive;
}
/**
* Convenience function to perform standard validation. Throws exception
* on failed validation.
*/
public function validate()
{
$validator = new HTMLPurifier_ConfigSchema_Validator();
return $validator->validate($this);
}
}
// vim: et sw=4 sts=4

89
lib/standalone/HTMLPurifier/ConfigSchema/Interchange/Directive.php

@ -0,0 +1,89 @@
<?php
/**
* Interchange component class describing configuration directives.
*/
class HTMLPurifier_ConfigSchema_Interchange_Directive
{
/**
* ID of directive.
* @type HTMLPurifier_ConfigSchema_Interchange_Id
*/
public $id;
/**
* Type, e.g. 'integer' or 'istring'.
* @type string
*/
public $type;
/**
* Default value, e.g. 3 or 'DefaultVal'.
* @type mixed
*/
public $default;
/**
* HTML description.
* @type string
*/
public $description;
/**
* Whether or not null is allowed as a value.
* @type bool
*/
public $typeAllowsNull = false;
/**
* Lookup table of allowed scalar values.
* e.g. array('allowed' => true).
* Null if all values are allowed.
* @type array
*/
public $allowed;
/**
* List of aliases for the directive.
* e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))).
* @type HTMLPurifier_ConfigSchema_Interchange_Id[]
*/
public $aliases = array();
/**
* Hash of value aliases, e.g. array('alt' => 'real'). Null if value
* aliasing is disabled (necessary for non-scalar types).
* @type array
*/
public $valueAliases;
/**
* Version of HTML Purifier the directive was introduced, e.g. '1.3.1'.
* Null if the directive has always existed.
* @type string
*/
public $version;
/**
* ID of directive that supercedes this old directive.
* Null if not deprecated.
* @type HTMLPurifier_ConfigSchema_Interchange_Id
*/
public $deprecatedUse;
/**
* Version of HTML Purifier this directive was deprecated. Null if not
* deprecated.
* @type string
*/
public $deprecatedVersion;
/**
* List of external projects this directive depends on, e.g. array('CSSTidy').
* @type array
*/
public $external = array();
}
// vim: et sw=4 sts=4

58
lib/standalone/HTMLPurifier/ConfigSchema/Interchange/Id.php

@ -0,0 +1,58 @@
<?php
/**
* Represents a directive ID in the interchange format.
*/
class HTMLPurifier_ConfigSchema_Interchange_Id
{
/**
* @type string
*/
public $key;
/**
* @param string $key
*/
public function __construct($key)
{
$this->key = $key;
}
/**
* @return string
* @warning This is NOT magic, to ensure that people don't abuse SPL and
* cause problems for PHP 5.0 support.
*/
public function toString()
{
return $this->key;
}
/**
* @return string
*/
public function getRootNamespace()
{
return substr($this->key, 0, strpos($this->key, "."));
}
/**
* @return string
*/
public function getDirective()
{
return substr($this->key, strpos($this->key, ".") + 1);
}
/**
* @param string $id
* @return HTMLPurifier_ConfigSchema_Interchange_Id
*/
public static function make($id)
{
return new HTMLPurifier_ConfigSchema_Interchange_Id($id);
}
}
// vim: et sw=4 sts=4

226
lib/standalone/HTMLPurifier/ConfigSchema/InterchangeBuilder.php

@ -0,0 +1,226 @@
<?php
class HTMLPurifier_ConfigSchema_InterchangeBuilder
{
/**
* Used for processing DEFAULT, nothing else.
* @type HTMLPurifier_VarParser
*/
protected $varParser;
/**
* @param HTMLPurifier_VarParser $varParser
*/
public function __construct($varParser = null)
{
$this->varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native();
}
/**
* @param string $dir
* @return HTMLPurifier_ConfigSchema_Interchange
*/
public static function buildFromDirectory($dir = null)
{
$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
$interchange = new HTMLPurifier_ConfigSchema_Interchange();
return $builder->buildDir($interchange, $dir);
}
/**
* @param HTMLPurifier_ConfigSchema_Interchange $interchange
* @param string $dir
* @return HTMLPurifier_ConfigSchema_Interchange
*/
public function buildDir($interchange, $dir = null)
{
if (!$dir) {
$dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema';
}
if (file_exists($dir . '/info.ini')) {
$info = parse_ini_file($dir . '/info.ini');
$interchange->name = $info['name'];
}
$files = array();
$dh = opendir($dir);
while (false !== ($file = readdir($dh))) {
if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') {
continue;
}
$files[] = $file;
}
closedir($dh);
sort($files);
foreach ($files as $file) {
$this->buildFile($interchange, $dir . '/' . $file);
}
return $interchange;
}
/**
* @param HTMLPurifier_ConfigSchema_Interchange $interchange
* @param string $file
*/
public function buildFile($interchange, $file)
{
$parser = new HTMLPurifier_StringHashParser();
$this->build(
$interchange,
new HTMLPurifier_StringHash($parser->parseFile($file))
);
}
/**
* Builds an interchange object based on a hash.
* @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build
* @param HTMLPurifier_StringHash $hash source data
* @throws HTMLPurifier_ConfigSchema_Exception
*/
public function build($interchange, $hash)
{
if (!$hash instanceof HTMLPurifier_StringHash) {
$hash = new HTMLPurifier_StringHash($hash);
}
if (!isset($hash['ID'])) {
throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID');
}
if (strpos($hash['ID'], '.') === false) {
if (count($hash) == 2 && isset($hash['DESCRIPTION'])) {
$hash->offsetGet('DESCRIPTION'); // prevent complaining
} else {
throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace');
}
} else {
$this->buildDirective($interchange, $hash);
}
$this->_findUnused($hash);
}
/**
* @param HTMLPurifier_ConfigSchema_Interchange $interchange
* @param HTMLPurifier_StringHash $hash
* @throws HTMLPurifier_ConfigSchema_Exception
*/
public function buildDirective($interchange, $hash)
{
$directive = new HTMLPurifier_ConfigSchema_Interchange_Directive();
// These are required elements:
$directive->id = $this->id($hash->offsetGet('ID'));
$id = $directive->id->toString(); // convenience
if (isset($hash['TYPE'])) {
$type = explode('/', $hash->offsetGet('TYPE'));
if (isset($type[1])) {
$directive->typeAllowsNull = true;
}
$directive->type = $type[0];
} else {
throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined");
}
if (isset($hash['DEFAULT'])) {
try {
$directive->default = $this->varParser->parse(
$hash->offsetGet('DEFAULT'),
$directive->type,
$directive->typeAllowsNull
);
} catch (HTMLPurifier_VarParserException $e) {
throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'");
}
}
if (isset($hash['DESCRIPTION'])) {
$directive->description = $hash->offsetGet('DESCRIPTION');
}
if (isset($hash['ALLOWED'])) {
$directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED')));
}
if (isset($hash['VALUE-ALIASES'])) {
$directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES'));
}
if (isset($hash['ALIASES'])) {
$raw_aliases = trim($hash->offsetGet('ALIASES'));
$aliases = preg_split('/\s*,\s*/', $raw_aliases);
foreach ($aliases as $alias) {
$directive->aliases[] = $this->id($alias);
}
}
if (isset($hash['VERSION'])) {
$directive->version = $hash->offsetGet('VERSION');
}
if (isset($hash['DEPRECATED-USE'])) {
$directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE'));
}
if (isset($hash['DEPRECATED-VERSION'])) {
$directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION');
}