[SPIP] ~maj v2.1.25-->2.1.26
[velocampus/web/www.git] / www / plugins / auto / couteau_suisse / couteau_suisse / outils / typo_exposants.php
1 <?php
2 // Filtre typographique exposants pour langue francaise
3 // serieuse refonte 2006 : Patrice Vanneufville
4 // Toutes les infos sur : http://www.spip-contrib.net/?article1564
5
6 // TODO : raccourci pour les exposants et indices (Pouce^2 ou Pouce^2^, H_2O ou H_2_O ou H,,2,,O
7 // exemple : http://zone.spip.org/trac/spip-zone/wiki/WikiFormatting
8
9 include_spip('inc/charsets');
10 @define('_TYPO_class', '<sup class="typo_exposants">');
11 define('_TYPO_sup', _TYPO_class.'\\1</sup>');
12 define('_TYPO_sup2', '\\1'._TYPO_class.'\\2</sup>');
13
14 // fonction simplifiee, equivalent numerique de unicode2charset($texte)
15 function caractere_charset($num) {
16 if($GLOBALS['meta']['charset']=='utf-8')
17 return caractere_utf_8($num);
18 $charset = load_charset($GLOBALS['meta']['charset']);
19 static $CHARSET_REVERSE;
20 if(!is_array($CHARSET_REVERSE))
21 $CHARSET_REVERSE = array_flip($GLOBALS['CHARSET'][$charset]);
22 return isset($CHARSET_REVERSE[$num])?chr($CHARSET_REVERSE[$num]):chr($num);
23 }
24
25 // cette fonction appelee automatiquement a chaque affichage de la page privee du Couteau Suisse renvoie un tableau
26 function typo_exposants_installe_dist() {
27 // en principe, pas besoin de : caractere_utf_8(232)
28 $carre = caractere_charset(178).'|&(?:#178|sup2);';
29 $egrave = caractere_charset(232).'|&(?:#232|egrave);';
30 $eaigu1 = caractere_charset(233).'|&(?:#233|eacute);';
31 $eaigu2 = caractere_charset(201).'|&(?:#201|Eacute);';
32 // $accents = unicode2charset('&#224;&#225;&#226;&#228;&#229;&#230;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#242;&#243;&#244;&#246;&#249;&#250;&#251;&#252;');
33 $accents = join('', array_map('caractere_charset', array(224,225,226,228,229,230,232,233,234,235,236,237,238,239,242,243,244,246,249,250,251,252)));
34 $typo = array( array(
35 '/(?<=\bM)e?(lles?)\b/', // Mlle(s), Mme(s) et erreurs Melle(s)
36 '/(?<=\bM)(gr|mes?)\b/', // Mme(s) et Mgr
37 '/(?<=\b[DP])(r)(?=[\s\.-])/', // Dr, Pr suivis d'un espace d'un point ou d'un tiret
38
39 "/m(?:$carre)/", '/(?<=\bm)([23])\b/', // m2, m3, m²
40 '/(?<=\b[Mm])([nd]s?)\b/', // millions, milliards
41 '/(?<=\bV)(ve)\b/', '/(?<=\bC)(ies?)\b/', // Vve et Cie(s)
42 "/(?<=\bS)(t(?:$eaigu1)s?)(?=\W)/", "/(?<=\W)(?:E|$eaigu2)ts\b/", // Societes(s), Etablissements
43
44 '/(?<=\b[1I])i?(ers?)\b/', // 1er(s), Erreurs 1(i)er(s), I(i)er(s)
45 "/(?<=\b[1I])i?(?:e|$egrave)(res?)\b/", // Erreurs 1(i)ere(s) + accents
46 '/(?<=\b1)(r?es?)\b/', // 1e(s), 1re(s)
47 '/(?<=\b2)(nde?s?)\b/', // 2nd(e)(s)
48
49 "/(\b[0-9IVX]+)i?(?:e|$egrave)?me(s?)\b/", // Erreurs (i)(e)me(s) + accents
50 '/\b([0-9IVX]+)(es?)\b/', // 2e(s), IIIe(s)... (les 1(e?r?s?) ont deja ete remplaces)
51 "/(?<![;$accents])\b(\d+|r|v)o(?=(?:&nbsp;|[\s,;:!\/\?\.-]))/", // recto, verso, primo, secondo, etc.
52 '/(?<=\bM)(e)(?= [A-Z])/', // Maitre (suivi d'un espace et d'une majuscule)
53 ), array(
54 _TYPO_sup, _TYPO_sup, // Mlle(s), Mme(s), Mgr
55 _TYPO_sup, // Dr, Pr,
56
57 'm'._TYPO_class.'2</sup>', _TYPO_sup, // m2, m3, m²
58 _TYPO_sup, _TYPO_sup, _TYPO_sup, // Vve, Mn(s), Md(s), Bd(s), Cie(s)
59 _TYPO_sup, '&#201;'._TYPO_class.'ts</sup>', // Sté(s), Ets
60
61 _TYPO_sup, _TYPO_sup, _TYPO_sup, // 1er et Cie
62 _TYPO_sup, // 2nd(e)(s)
63
64 '$1'._TYPO_class.'e$2</sup>', // Erreurs me, eme, ème, ième + pluriels
65 _TYPO_sup2, // 2e(s), IIIe(s)...
66 '$1'._TYPO_class.'o</sup>', // ro, vo, 1o, 2o, etc.
67 _TYPO_sup, // Me
68 // remplacements en str_replace()
69 ), array('<sup>'), array(_TYPO_class));
70
71 if(defined('_CS_EXPO_BOFBOF')) {
72 $typo[0] = array_merge($typo[0], array(
73 '/(?<=\bS)(te?s?)(?=[\s\.-])/', // St(e)(s) suivis d'un espace d'un point ou d'un tiret
74 '/(?<=\bB)(x|se|ses)(?=[\s\.-])/', // Bx, Bse(s) suivis d'un espace d'un point ou d'un tiret
75 '/(?<=\b[Bb])(ds?)\b/', '/(?<=\b[Ff])(gs?)\b/', // boulevard(s) et faubourgs(s)
76 ));
77 $typo[1] = array_merge($typo[1], array(
78 _TYPO_sup, _TYPO_sup, // St(e)(s), Bx, Bse(s)
79 _TYPO_sup, _TYPO_sup, // Bd(s) et Fg(s)
80 ));
81 }
82 // renvoie les tableaux de remplacement
83 return array(
84 // anglais
85 'en'=> array( array(
86 ',(?<=1)(st)\b,',
87 ',(?<=2)(nd)\b,',
88 ',(?<=3)(rd)\b,',
89 ',(?<=\d)(th)\b,',
90 ), array(
91 _TYPO_sup, _TYPO_sup, _TYPO_sup, _TYPO_sup,
92 ), array('<sup>'), array(_TYPO_class)),
93 // francais
94 'fr' => $typo,
95 );
96 }
97
98
99 // cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script|acronym|cite
100 function typo_exposants_rempl($texte){
101 if(defined('_SPIP19300')) $lang = lang_typo();
102 else {
103 // compat avec SPIP 1.92
104 if (!$lang = $GLOBALS['lang_objet']) $lang = $GLOBALS['spip_lang'];
105 $lang = lang_typo($lang);
106 }
107 // TODO : des blocs multi ?
108 // if (strpos($texte, '<span lang=')!==false) {
109 // }
110 // suite du texte
111 $typo = cs_lire_data_outil('typo_exposants', $lang);
112 if($typo===NULL) return $texte;
113 $texte = str_replace($typo[2], $typo[3], $texte);
114 return preg_replace($typo[0], $typo[1], $texte);
115 }
116
117 function typo_exposants_echappe_balises_callback($matches) {
118 return cs_code_echappement($matches[1], 'EXPO');
119 }
120
121 // ici on est en pipeline post_typo
122 function typo_exposants($texte){
123 // prudence : on protege les balises <a> et <img>
124 if (strpos($texte, '<')!==false)
125 $texte = preg_replace_callback('/(<(a|img) [^>]+>)/Ums', 'typo_exposants_echappe_balises_callback', $texte);
126 $texte = cs_echappe_balises('html|code|cadre|frame|script|acronym|cite', 'typo_exposants_rempl', $texte);
127 return echappe_retour($texte, 'EXPO');
128 }
129 ?>