source: spip-zone/_plugins_/latexwheel/wheels/latex/latex-tableaux.php @ 56784

Last change on this file since 56784 was 56784, checked in by maieul@…, 8 years ago

gestions des listes dans le tableau

File size: 4.9 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5//include_spip('inc/texte');
6
7/**
8 * Callback de traitement de chaque tableau
9 *
10 * @param array $m
11 * @return string
12 */
13function latex_replace_tableaux($m){
14        $m[2] = str_replace("|\r","|",$m[2]);
15        return $m[1] . latex_traiter_tableau($m[2]) . $m[3];
16}
17
18function latex_traiter_tableau($bloc) {
19        // id "unique" pour les id du tableau
20        $tabid = substr(md5($bloc),0,4);
21        // Decouper le tableau en lignes
22        preg_match_all(',([|].*)[|]\n,UmsS', $bloc, $regs, PREG_PATTERN_ORDER);
23        $lignes = array();
24        $debut_table = $summary = '';
25        $l = 0;
26        $numeric = true;
27
28        // Traiter chaque ligne
29        $reg_line1 = ',^(\|(' . _RACCOURCI_TH_SPAN . '))+$,sS';
30        $reg_line_all = ',^('  . _RACCOURCI_TH_SPAN . ')$,sS';
31        $hc = $hl = array();
32        foreach ($regs[1] as $ligne) {
33                $l ++;
34
35                // Gestion de la premiere ligne :
36                if ($l == 1) {
37                // - <caption> et summary dans la premiere ligne :
38                //   || caption | summary || (|summary est optionnel)
39                        if (preg_match(',^\|\|([^|]*)(\|(.*))?$,sS', rtrim($ligne,'|'), $cap)) {
40                                $l = 0;
41                                if ($caption = trim($cap[1]))
42                                        $debut_table .= "\caption/debut".$caption."/fin\\\\\n";
43                                // pas d'équivalent à l'attribut summary
44                        }
45                // - <thead> sous la forme |{{titre}}|{{titre}}|
46                //   Attention thead oblige a avoir tbody
47                        else if (preg_match($reg_line1, $ligne, $thead)) {
48                                preg_match_all('/\|([^|]*)/S', $ligne, $cols);
49                                $ligne='';$cols= $cols[1];
50                                $colspan=1;
51                                for($c=count($cols)-1; $c>=0; $c--) {
52                                        $attr='';
53                                        if($cols[$c]=='<') {
54                                          $colspan++;
55                                        } else {
56                                          if($colspan>1) {
57                                                $attr= " colspan='$colspan'";
58                                                $colspan=1;
59                                          }
60                                          $ligne= "$cols[$c]/sepcel$ligne";
61                                                $hc[$c] = "id{$tabid}_c$c"; // pour mettre dans les headers des td
62                                        }
63                                }
64
65                                $debut_table .= "".
66                                        $ligne."\\\\\n\endhead\n";
67                                $l = 0;
68                        }
69                }
70
71                // Sinon ligne normale
72                if ($l) {
73                        // Gerer les listes a puce dans les cellules
74                        if (strpos($ligne,"\n-*")!==false OR strpos($ligne,"\n-#")!==false)
75                                $ligne = appliquer_regles_wheel($ligne,array('latex/latex-listes.yaml'));
76
77
78                        // tout mettre dans un tableau 2d
79                        preg_match_all('/\|([^|]*)/S', $ligne, $cols);
80                        $lignes[]= $cols[1];
81                }
82        }
83
84        // maintenant qu'on a toutes les cellules
85        // on prepare une liste de rowspan par defaut, a partir
86        // du nombre de colonnes dans la premiere ligne.
87        // Reperer egalement les colonnes numeriques pour les cadrer a droite
88        $rowspans = $numeric = array();
89        $n = count($lignes[0]);
90        $k = count($lignes);
91        // Si on va veur le HTML, on distingue les colonnes numeriques a point ou a virgule,
92        // pour les alignements eventuels sur "," ou "."
93        // pour le moment on ne gère pas encore cela, car il faut que je regarde comme faire en latex
94//      $numeric_class = array('.'=>'point',','=>'virgule');
95//      for($i=0;$i<$n;$i++) {
96//        $align = true;
97//        for ($j=0;$j<$k;$j++) {
98//                $rowspans[$j][$i] = 1;
99//                      if ($align AND preg_match('/^\d+([.,]?)\d*$/', trim($lignes[$j][$i]), $r)){
100//                              if ($r[1])
101//                                      $align = $r[1];
102//                      }
103//                      else
104//                              $align = '';
105//        }
106//        $numeric[$i] = $align ? (" class='numeric ".$numeric_class[$align]."'") : '';
107//      }
108
109        for ($j=0;$j<$k;$j++) {
110                if (preg_match($reg_line_all, $lignes[$j][0])) {
111                        $hl[$j] = "id{$tabid}_l$j"; // pour mettre dans les headers des td
112                }
113                else
114                        unset($hl[0]);
115        }
116        if (!isset($hl[0]))
117                $hl = array(); // toute la colonne ou rien
118
119        // et on parcourt le tableau a l'envers pour ramasser les
120        // colspan et rowspan en passant
121        $html = '';
122
123        for($l=count($lignes)-1; $l>=0; $l--) {
124                $cols= $lignes[$l];
125                $colspan=1;
126                $ligne='';
127
128                for($c=count($cols)-1; $c>=0; $c--) {
129                        $attr= $numeric[$c]; 
130                        $cell = trim($cols[$c]);
131                        if($cell=='<') {
132                          $colspan++;
133
134                        } elseif($cell=='^') {
135                          $rowspans[$l-1][$c]+=$rowspans[$l][$c];
136
137                        } else {
138                          if($colspan>1) {
139                                $attr .= " colspan='$colspan'";
140                                $colspan=1;
141                          }
142                          if(($x=$rowspans[$l][$c])>1) {
143                                $attr.= " rowspan='$x'";
144                          }
145                          $b = ($c==0 AND isset($hl[$l]))?'th':'td';
146                                $h = (isset($hc[$c])?$hc[$c]:'').' '.(($b=='td' AND isset($hl[$l]))?$hl[$l]:'');
147                                // inutile de garder le strong qui n'a servi que de marqueur
148                                if ($b=='th') {
149                                        $cols[$c] = str_replace(array('{','}'), '', $cols[$c]);
150                                }
151                          $ligne= "\n".$cols[$c]."/sepcel".$ligne;
152                        }
153                }
154
155                // ligne complete
156                $html = "$ligne\\\\\n$html";
157        }
158       
159        // calcul des alignements de tableaux : par défaut, p{1/cellule*\textwith}
160        $largeur_cellule = round(1/$k,2,PHP_ROUND_HALF_DOWN);   // par défaut, taille de colonne constante
161        $alignement = '/debut'.str_repeat(p.'/debut'.$largeur_cellule.'\textwidth/fin',$k).'/fin';
162
163        // en latex, contrairement au html, on ne marque pas la fin de la dernière cellule d'une ligne
164        $debut_table    = str_replace('/sepcel\\','\\',$debut_table);
165        $html                   = str_replace('/sepcel\\','\\',$html);
166       
167        return "\n\n\begin/debutlongtable/fin$alignement\n"
168                . $debut_table
169                . $html
170                . "\end/debutlongtable/fin\n\n";
171}
Note: See TracBrowser for help on using the repository browser.