svg.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. include_spip('inc/autoriser');
  13. /**
  14. * Determiner les dimensions d'un svg, et enlever ses scripts si necessaire
  15. * on utilise safehtml qui n'est pas apropriee pour ca en attendant mieux
  16. * cf http://www.slideshare.net/x00mario/the-image-that-called-me
  17. * http://heideri.ch/svgpurifier/SVGPurifier/index.php
  18. *
  19. * @param string $file
  20. * @return array
  21. */
  22. // http://code.spip.net/@traite_svg
  23. function metadata_svg_dist($file){
  24. $meta = array();
  25. $texte = spip_file_get_contents($file);
  26. // Securite si pas autorise : virer les scripts et les references externes
  27. // sauf si on est en mode javascript 'ok' (1), cf. inc_version
  28. if ($GLOBALS['filtrer_javascript']<1
  29. AND !autoriser('televerser', 'script')
  30. ){
  31. include_spip('inc/texte');
  32. $new = trim(safehtml($texte));
  33. // petit bug safehtml
  34. if (substr($new, 0, 2)==']>') $new = ltrim(substr($new, 2));
  35. if ($new!=$texte) ecrire_fichier($file, $texte = $new);
  36. }
  37. $width = $height = 150;
  38. if (preg_match(',<svg[^>]+>,', $texte, $s)){
  39. $s = $s[0];
  40. if (preg_match(',\WviewBox\s*=\s*.\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+),i', $s, $r)){
  41. $width = $r[3];
  42. $height = $r[4];
  43. }
  44. else {
  45. // si la taille est en centimetre, estimer le pixel a 1/64 de cm
  46. if (preg_match(',\Wwidth\s*=\s*.(\d+)([^"\']*),i', $s, $r)){
  47. if ($r[2]!='%'){
  48. $width = $r[1];
  49. if ($r[2]=='cm') $width <<= 6;
  50. }
  51. }
  52. if (preg_match(',\Wheight\s*=\s*.(\d+)([^"\']*),i', $s, $r)){
  53. if ($r[2]!='%'){
  54. $height = $r[1];
  55. if ($r[2]=='cm') $height <<= 6;
  56. }
  57. }
  58. }
  59. }
  60. $meta['largeur'] = $width;
  61. $meta['hauteur'] = $height;
  62. return $meta;
  63. }