Merge branch 'wip-MDL-36297-m25' of git://github.com/samhemelryk/moodle
authorDan Poltawski <dan@moodle.com>
Mon, 14 Jan 2013 07:05:15 +0000 (15:05 +0800)
committerDan Poltawski <dan@moodle.com>
Mon, 14 Jan 2013 07:05:15 +0000 (15:05 +0800)
1  2 
lib/weblib.php

diff --combined lib/weblib.php
@@@ -1384,7 -1384,7 +1384,7 @@@ function format_text_email($text, $form
          case FORMAT_WIKI:
              // there should not be any of these any more!
              $text = wikify_links($text);
 -            return strtr(strip_tags($text), array_flip(get_html_translation_table(HTML_ENTITIES)));
 +            return textlib::entities_to_utf8(strip_tags($text), true);
              break;
  
          case FORMAT_HTML:
          case FORMAT_MARKDOWN:
          default:
              $text = wikify_links($text);
 -            return strtr(strip_tags($text), array_flip(get_html_translation_table(HTML_ENTITIES)));
 +            return textlib::entities_to_utf8(strip_tags($text), true);
              break;
      }
  }
@@@ -1578,8 -1578,21 +1578,21 @@@ function is_purify_html_necessary($text
  function purify_html($text, $options = array()) {
      global $CFG;
  
-     $type = !empty($options['allowid']) ? 'allowid' : 'normal';
      static $purifiers = array();
+     static $caches = array();
+     $type = !empty($options['allowid']) ? 'allowid' : 'normal';
+     if (!array_key_exists($type, $caches)) {
+         $caches[$type] = cache::make('core', 'htmlpurifier', array('type' => $type));
+     }
+     $cache = $caches[$type];
+     $filteredtext = $cache->get($text);
+     if ($filteredtext !== false) {
+         return $filteredtext;
+     }
      if (empty($purifiers[$type])) {
  
          // make sure the serializer dir exists, it should be fine if it disappears later during cache reset
  
      $multilang = (strpos($text, 'class="multilang"') !== false);
  
+     $filteredtext = $text;
      if ($multilang) {
-         $text = preg_replace('/<span(\s+lang="([a-zA-Z0-9_-]+)"|\s+class="multilang"){2}\s*>/', '<span xxxlang="${2}">', $text);
+         $filteredtext = preg_replace('/<span(\s+lang="([a-zA-Z0-9_-]+)"|\s+class="multilang"){2}\s*>/', '<span xxxlang="${2}">', $filteredtext);
      }
-     $text = $purifier->purify($text);
+     $filteredtext = $purifier->purify($filteredtext);
      if ($multilang) {
-         $text = preg_replace('/<span xxxlang="([a-zA-Z0-9_-]+)">/', '<span lang="${1}" class="multilang">', $text);
+         $filteredtext = preg_replace('/<span xxxlang="([a-zA-Z0-9_-]+)">/', '<span lang="${1}" class="multilang">', $filteredtext);
      }
+     $cache->set($text, $filteredtext);
  
-     return $text;
+     return $filteredtext;
  }
  
  /**