? mail-decode-full-html4-entities.patch
Index: includes/mail.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/mail.inc,v
retrieving revision 1.7
diff -u -p -r1.7 mail.inc
--- includes/mail.inc 4 Sep 2007 21:10:45 -0000 1.7
+++ includes/mail.inc 23 Jan 2008 23:45:41 -0000
@@ -388,7 +388,9 @@ function drupal_html_to_text($string, $a
// Process blocks of text.
else {
// Convert inline HTML text to plain text.
- $value = trim(preg_replace('/\s+/', ' ', decode_entities($value)));
+ $value = trim(preg_replace('/\s+/', ' ', html_entity_decode(
+ preg_replace_callback('/&([a-zA-Z][a-zA-Z0-9}+);/', '_drupal_decode_entities',
+ $value), 'ENT_COMPAT', 'ISO-8859-1')));
if (strlen($value)) {
$chunk = $value;
}
@@ -413,6 +415,105 @@ function drupal_html_to_text($string, $a
}
/**
+ * Helper function for drupal_html_to_text().
+ *
+ * Full HTML 4 entity lookup.
+ */
+function _drupal_decode_entities($matches) {
+ static $table = array('quot' => '"','amp' => '&','lt' => '<','gt' => '>',
+ 'OElig' => 'Œ','oelig' => 'œ','Scaron' => 'Š',
+ 'scaron' => 'š','Yuml' => 'Ÿ','circ' => 'ˆ',
+ 'tilde' => '˜','ensp' => ' ','emsp' => ' ',
+ 'thinsp' => ' ','zwnj' => '','zwj' => '',
+ 'lrm' => '','rlm' => '','ndash' => '–',
+ 'mdash' => '—','lsquo' => '‘','rsquo' => '’',
+ 'sbquo' => '‚','ldquo' => '“','rdquo' => '”',
+ 'bdquo' => '„','dagger' => '†','Dagger' => '‡',
+ 'permil' => '‰','lsaquo' => '‹','rsaquo' => '›',
+ 'euro' => '€','fnof' => 'ƒ','Alpha' => 'Α',
+ 'Beta' => 'Β','Gamma' => 'Γ','Delta' => 'Δ',
+ 'Epsilon' => 'Ε','Zeta' => 'Ζ','Eta' => 'Η',
+ 'Theta' => 'Θ','Iota' => 'Ι','Kappa' => 'Κ',
+ 'Lambda' => 'Λ','Mu' => 'Μ','Nu' => 'Ν',
+ 'Xi' => 'Ξ','Omicron' => 'Ο','Pi' => 'Π',
+ 'Rho' => 'Ρ','Sigma' => 'Σ','Tau' => 'Τ',
+ 'Upsilon' => 'Υ','Phi' => 'Φ','Chi' => 'Χ',
+ 'Psi' => 'Ψ','Omega' => 'Ω','alpha' => 'α',
+ 'beta' => 'β','gamma' => 'γ','delta' => 'δ',
+ 'epsilon' => 'ε','zeta' => 'ζ','eta' => 'η',
+ 'theta' => 'θ','iota' => 'ι','kappa' => 'κ',
+ 'lambda' => 'λ','mu' => 'μ','nu' => 'ν',
+ 'xi' => 'ξ','omicron' => 'ο','pi' => 'π',
+ 'rho' => 'ρ','sigmaf' => 'ς','sigma' => 'σ',
+ 'tau' => 'τ','upsilon' => 'υ','phi' => 'φ',
+ 'chi' => 'χ','psi' => 'ψ','omega' => 'ω',
+ 'thetasym' => 'ϑ','upsih' => 'ϒ','piv' => 'ϖ',
+ 'bull' => '•','hellip' => '…','prime' => '′',
+ 'Prime' => '″','oline' => '‾','frasl' => '⁄',
+ 'weierp' => '℘','image' => 'ℑ','real' => 'ℜ',
+ 'trade' => '™','alefsym' => 'ℵ','larr' => '←',
+ 'uarr' => '↑','rarr' => '→','darr' => '↓',
+ 'harr' => '↔','crarr' => '↵','lArr' => '⇐',
+ 'uArr' => '⇑','rArr' => '⇒','dArr' => '⇓',
+ 'hArr' => '⇔','forall' => '∀','part' => '∂',
+ 'exist' => '∃','empty' => '∅','nabla' => '∇',
+ 'isin' => '∈','notin' => '∉','ni' => '∋',
+ 'prod' => '∏','sum' => '∑','minus' => '−',
+ 'lowast' => '∗','radic' => '√','prop' => '∝',
+ 'infin' => '∞','ang' => '∠','and' => '∧',
+ 'or' => '∨','cap' => '∩','cup' => '∪',
+ 'int' => '∫','there4' => '∴','sim' => '∼',
+ 'cong' => '≅','asymp' => '≈','ne' => '≠',
+ 'equiv' => '≡','le' => '≤','ge' => '≥',
+ 'sub' => '⊂','sup' => '⊃','nsub' => '⊄',
+ 'sube' => '⊆','supe' => '⊇','oplus' => '⊕',
+ 'otimes' => '⊗','perp' => '⊥','sdot' => '⋅',
+ 'lceil' => '⌈','rceil' => '⌉','lfloor' => '⌊',
+ 'rfloor' => '⌋','lang' => '〈','rang' => '〉',
+ 'loz' => '◊','spades' => '♠','clubs' => '♣',
+ 'hearts' => '♥','diams' => '♦','nbsp' => ' ',
+ 'iexcl' => '¡','cent' => '¢','pound' => '£',
+ 'curren' => '¤','yen' => '¥','brvbar' => '¦',
+ 'sect' => '§','uml' => '¨','copy' => '©',
+ 'ordf' => 'ª','laquo' => '«','not' => '¬',
+ 'shy' => '','reg' => '®','macr' => '¯',
+ 'deg' => '°','plusmn' => '±','sup2' => '²',
+ 'sup3' => '³','acute' => '´','micro' => 'µ',
+ 'para' => '¶','middot' => '·','cedil' => '¸',
+ 'sup1' => '¹','ordm' => 'º','raquo' => '»',
+ 'frac14' => '¼','frac12' => '½','frac34' => '¾',
+ 'iquest' => '¿','Agrave' => 'À','Aacute' => 'Á',
+ 'Acirc' => 'Â','Atilde' => 'Ã','Auml' => 'Ä',
+ 'Aring' => 'Å','AElig' => 'Æ','Ccedil' => 'Ç',
+ 'Egrave' => 'È','Eacute' => 'É','Ecirc' => 'Ê',
+ 'Euml' => 'Ë','Igrave' => 'Ì','Iacute' => 'Í',
+ 'Icirc' => 'Î','Iuml' => 'Ï','ETH' => 'Ð',
+ 'Ntilde' => 'Ñ','Ograve' => 'Ò','Oacute' => 'Ó',
+ 'Ocirc' => 'Ô','Otilde' => 'Õ','Ouml' => 'Ö',
+ 'times' => '×','Oslash' => 'Ø','Ugrave' => 'Ù',
+ 'Uacute' => 'Ú','Ucirc' => 'Û','Uuml' => 'Ü',
+ 'Yacute' => 'Ý','THORN' => 'Þ','szlig' => 'ß',
+ 'agrave' => 'à','aacute' => 'á','acirc' => 'â',
+ 'atilde' => 'ã','auml' => 'ä','aring' => 'å',
+ 'aelig' => 'æ','ccedil' => 'ç','egrave' => 'è',
+ 'eacute' => 'é','ecirc' => 'ê','euml' => 'ë',
+ 'igrave' => 'ì','iacute' => 'í','icirc' => 'î',
+ 'iuml' => 'ï','eth' => 'ð','ntilde' => 'ñ',
+ 'ograve' => 'ò','oacute' => 'ó','ocirc' => 'ô',
+ 'otilde' => 'õ','ouml' => 'ö','divide' => '÷',
+ 'oslash' => 'ø','ugrave' => 'ù','uacute' => 'ú',
+ 'ucirc' => 'û','uuml' => 'ü','yacute' => 'ý',
+ 'thorn' => 'þ','yuml' => 'ÿ');
+
+ if(isset($table[$matches[1]])) {
+ return $table[$matches[1]];
+ }
+ else {
+ return $matches[0];
+ }
+}
+
+/**
* Helper function for array_walk in drupal_wrap_mail().
*
* Wraps words on a single line.