[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins / odt2spip_32 / inc / odt2spip.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0"
3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4 xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
5 xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
6 xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
7 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
8 xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
9 xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
10 xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
11 xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
12 xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
13 xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
14 xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
15 xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
16 xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
17 xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
18
19 xmlns:dc="http://purl.org/dc/elements/1.1/"
20 xmlns:xlink="http://www.w3.org/1999/xlink"
21 xmlns:math="http://www.w3.org/1998/Math/MathML"
22 xmlns:xforms="http://www.w3.org/2002/xforms"
23
24 xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
25 xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
26 xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"
27
28 xmlns:ooo="http://openoffice.org/2004/office"
29 xmlns:ooow="http://openoffice.org/2004/writer"
30 xmlns:oooc="http://openoffice.org/2004/calc"
31 xmlns:int="http://catcode.com/odf_to_xhtml/internal"
32
33 exclude-result-prefixes="office meta config text table draw presentation
34 dr3d chart form script style number anim dc xlink math xforms fo
35 svg smil ooo ooow oooc int"
36 >
37
38 <xsl:output method = "xml"
39 encoding="UTF-8"
40 indent="yes" />
41 <xsl:preserve-space elements="*" />
42
43 <!-- Récuperation des parametres venant de PHP:
44 IntertitresRiches = oui|non
45 en fct de la presence d'un des plugins enluminure_typo ou intertitres_enrichis -->
46 <xsl:param name="IntertitresRiches"/>
47
48
49 <!-- gestion des titres de façon la plus generique possible -->
50 <!-- si @text:style-name='Heading' est utilise, recuperer 'Heading' dans $STyleTitreGeneral -->
51 <xsl:variable name="StyleTitreGeneral">
52 <xsl:if test="count(//*[node()][@text:style-name='Heading']) > 0">Heading</xsl:if>
53 </xsl:variable>
54
55 <!-- trouver le niveau de titre qui servira de $NivoTitre1 (= {{{intertitres}}})... a la bourrin ! -->
56 <xsl:variable name="NivoTitre1">
57 <xsl:choose>
58 <xsl:when test="count(//*[node()][@text:outline-level='1']
59 | //*[node()][@text:style-name='Heading_20_1']) > 0">1</xsl:when>
60 <xsl:when test="count(//*[node()][@text:outline-level='2']
61 | //*[node()][@text:style-name='Heading_20_2']) > 0">2</xsl:when>
62 <xsl:when test="count(//*[node()][@text:outline-level='3']
63 | //*[node()][@text:style-name='Heading_20_3']) > 0">3</xsl:when>
64 <xsl:when test="count(//*[node()][@text:outline-level='4']
65 | //*[node()][@text:style-name='Heading_20_4']) > 0">4</xsl:when>
66 <xsl:when test="count(//*[node()][@text:outline-level='5']
67 | //*[node()][@text:style-name='Heading_20_5']) > 0">5</xsl:when>
68 <xsl:when test="count(//*[node()][@text:outline-level='6']
69 | //*[node()][@text:style-name='Heading_20_6']) > 0">6</xsl:when>
70 <xsl:when test="count(//*[node()][@text:outline-level='7']
71 | //*[node()][@text:style-name='Heading_20_7']) > 0">7</xsl:when>
72 <xsl:when test="count(//*[node()][@text:outline-level='8']
73 | //*[node()][@text:style-name='Heading_20_8']) > 0">8</xsl:when>
74 <xsl:when test="count(//*[node()][@text:outline-level='9']
75 | //*[node()][@text:style-name='Heading_20_9']) > 0">9</xsl:when>
76 <xsl:when test="count(//*[node()][@text:outline-level='10']
77 | //*[node()][@text:style-name='Heading_20_10']) > 0">10</xsl:when>
78 </xsl:choose>
79 </xsl:variable>
80 <!-- idem pour le niveau $NivoTitre2 (= {{titres_gras}}) en se basant sur le niveau de $NivoTitre1... Hue! -->
81 <xsl:variable name="NivoTitre2">
82 <xsl:choose>
83 <xsl:when test="count(//*[node()][@text:outline-level=$NivoTitre1 + 1]
84 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 1)]) > 0"><xsl:value-of select="$NivoTitre1 + 1"/></xsl:when>
85 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 2']
86 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 2)]) > 0"><xsl:value-of select="$NivoTitre1 + 2"/></xsl:when>
87 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 3']
88 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 3)]) > 0"><xsl:value-of select="$NivoTitre1 + 3"/></xsl:when>
89 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 4']
90 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 4)]) > 0"><xsl:value-of select="$NivoTitre1 + 4"/></xsl:when>
91 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 5']
92 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 5)]) > 0"><xsl:value-of select="$NivoTitre1 + 5"/></xsl:when>
93 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 6']
94 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 6)]) > 0"><xsl:value-of select="$NivoTitre1 + 6"/></xsl:when>
95 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 7']
96 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 7)]) > 0"><xsl:value-of select="$NivoTitre1 + 7"/></xsl:when>
97 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 8']
98 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 8)]) > 0"><xsl:value-of select="$NivoTitre1 + 8"/></xsl:when>
99 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre1 + 9']
100 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1 + 9)]) > 0"><xsl:value-of select="$NivoTitre1 + 9"/></xsl:when>
101 </xsl:choose>
102 </xsl:variable>
103
104 <!-- si il n'existe pas de $StyleTitreGeneral et si il n'y a qu'un seul element de $NivoTitre1 dans le doc
105 utiliser $NivoTitre1 comme $StyleTitreGeneral => $DecalerTitres = oui -->
106 <xsl:variable name="DecalerTitres">
107 <xsl:if test="not($StyleTitreGeneral = 'Heading')
108 and count(//*[@text:outline-level='$NivoTitre1']
109 | //*[@text:style-name=concat('Heading_20_',$NivoTitre1)]) = 1">oui</xsl:if>
110 </xsl:variable>
111
112 <!-- si $DecalerTitres == oui => du fait du decalage on va avoir besoin d'un $NivoTitre3
113 idem si enluminure-typo ou intertitres_enrichis -->
114 <xsl:variable name="NivoTitre3">
115 <xsl:if test="$DecalerTitres = 'oui' or $IntertitresRiches = 'oui'">
116 <xsl:choose>
117 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 1']
118 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 1)]) > 0"><xsl:value-of select="$NivoTitre2 + 1"/></xsl:when>
119 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 2']
120 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 2)]) > 0"><xsl:value-of select="$NivoTitre2 + 2"/></xsl:when>
121 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 3']
122 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 3)]) > 0"><xsl:value-of select="$NivoTitre2 + 3"/></xsl:when>
123 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 4']
124 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 4)]) > 0"><xsl:value-of select="$NivoTitre2 + 4"/></xsl:when>
125 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 5']
126 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 5)]) > 0"><xsl:value-of select="$NivoTitre2 + 5"/></xsl:when>
127 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 6']
128 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 6)]) > 0"><xsl:value-of select="$NivoTitre2 + 6"/></xsl:when>
129 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 7']
130 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 7)]) > 0"><xsl:value-of select="$NivoTitre2 + 7"/></xsl:when>
131 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre2 + 8']
132 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre2 + 8)]) > 0"><xsl:value-of select="$NivoTitre2 + 8"/></xsl:when>
133 </xsl:choose>
134 </xsl:if>
135 </xsl:variable>
136
137 <!-- super-reloud! si enluminure-typo ou intertitres_enrichis on a besoin de titre4 et titre5
138 si en plus on a $DecalerTitres == oui il faut en plus titre6
139 ca sent le besoin de pouvoir faire des boucles et/ou des fonctions en xsl... -->
140 <xsl:variable name="NivoTitre4">
141 <xsl:if test="$IntertitresRiches = 'oui'">
142 <xsl:choose>
143 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 1']
144 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 1)]) > 0"><xsl:value-of select="$NivoTitre3 + 1"/></xsl:when>
145 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 2']
146 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 2)]) > 0"><xsl:value-of select="$NivoTitre3 + 2"/></xsl:when>
147 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 3']
148 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 3)]) > 0"><xsl:value-of select="$NivoTitre3 + 3"/></xsl:when>
149 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 4']
150 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 4)]) > 0"><xsl:value-of select="$NivoTitre3 + 4"/></xsl:when>
151 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 5']
152 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 5)]) > 0"><xsl:value-of select="$NivoTitre3 + 5"/></xsl:when>
153 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 6']
154 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 6)]) > 0"><xsl:value-of select="$NivoTitre3 + 6"/></xsl:when>
155 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre3 + 7']
156 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre3 + 7)]) > 0"><xsl:value-of select="$NivoTitre3 + 7"/></xsl:when>
157 </xsl:choose>
158 </xsl:if>
159 </xsl:variable>
160 <xsl:variable name="NivoTitre5">
161 <xsl:if test="$IntertitresRiches = 'oui'">
162 <xsl:choose>
163 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre4 + 1']
164 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre4 + 1)]) > 0"><xsl:value-of select="$NivoTitre4 + 1"/></xsl:when>
165 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre4 + 2']
166 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre4 + 2)]) > 0"><xsl:value-of select="$NivoTitre4 + 2"/></xsl:when>
167 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre4 + 3']
168 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre4 + 3)]) > 0"><xsl:value-of select="$NivoTitre4 + 3"/></xsl:when>
169 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre4 + 4']
170 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre4 + 4)]) > 0"><xsl:value-of select="$NivoTitre4 + 4"/></xsl:when>
171 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre4 + 5']
172 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre4 + 5)]) > 0"><xsl:value-of select="$NivoTitre4 + 5"/></xsl:when>
173 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre4 + 6']
174 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre4 + 6)]) > 0"><xsl:value-of select="$NivoTitre4 + 6"/></xsl:when>
175 </xsl:choose>
176 </xsl:if>
177 </xsl:variable>
178 <xsl:variable name="NivoTitre6">
179 <xsl:if test="$DecalerTitres = 'oui' and $IntertitresRiches = 'oui'">
180 <xsl:choose>
181 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre5 + 1']
182 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre5 + 1)]) > 0"><xsl:value-of select="$NivoTitre5 + 1"/></xsl:when>
183 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre5 + 2']
184 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre5 + 2)]) > 0"><xsl:value-of select="$NivoTitre5 + 2"/></xsl:when>
185 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre5 + 3']
186 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre5 + 3)]) > 0"><xsl:value-of select="$NivoTitre5 + 3"/></xsl:when>
187 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre5 + 4']
188 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre5 + 4)]) > 0"><xsl:value-of select="$NivoTitre5 + 4"/></xsl:when>
189 <xsl:when test="count(//*[node()][@text:outline-level='$NivoTitre5 + 5']
190 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre5 + 5)]) > 0"><xsl:value-of select="$NivoTitre5 + 5"/></xsl:when>
191 </xsl:choose>
192 </xsl:if>
193 </xsl:variable>
194
195
196 <!-- trouver un titre general au document:
197 si $StyleTitreGeneral existe, concatener tous les elements avec ce style
198 sinon utiliser le premier element ayant le niveau de style $NivoTitre1
199 sinon utiliser le premier element text:h ou text:p et basta! -->
200 <xsl:variable name="ContenuTitreDoc">
201 <xsl:choose>
202 <xsl:when test="$StyleTitreGeneral='Heading'">
203 <xsl:for-each select="//*[node()][@text:style-name='Heading']"><xsl:value-of select="."/> </xsl:for-each>
204 </xsl:when>
205 <xsl:when test="count(//*[node()][@text:outline-level=$NivoTitre1]
206 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1)]
207 ) > 0">
208 <xsl:value-of select="//*[node()][@text:outline-level=$NivoTitre1][1]
209 | //*[node()][@text:style-name=concat('Heading_20_',$NivoTitre1)][1]"/>
210 </xsl:when>
211 <xsl:otherwise>
212 <xsl:value-of select="//text:h[node()][1] | //text:p[node()][1]"/>
213 </xsl:otherwise>
214 </xsl:choose>
215 </xsl:variable>
216
217
218 <!-- traitement de l'ensemble du doc -->
219 <xsl:template match="/office:document-content">
220 <!-- test niveaux de titres
221 t1= <xsl:value-of select="$NivoTitre1" />
222 t2= <xsl:value-of select="$NivoTitre2" />
223 t3= <xsl:value-of select="$NivoTitre3" />
224 tG= <xsl:value-of select="$StyleTitreGeneral" />
225 -->
226 <!-- test recuperation du parametre passe par PHP
227 intertitres_riches= <xsl:value-of select="$IntertitresRiches" />
228 -->
229 <!-- le XML de sortie -->
230 <articles>
231 <article>
232 <titre><xsl:value-of select="$ContenuTitreDoc"/></titre>
233 <texte>
234 <xsl:apply-templates select="office:body/office:text"/>
235 </texte>
236 </article>
237 </articles>
238 </xsl:template>
239
240
241 <!-- virer les eventuels table des matieres et index -->
242 <xsl:template match="//text:table-of-content | //text:alphabetical-index"/>
243
244
245 <!-- les paragraphes y compris les vides utilises pour saut de ligne -->
246 <xsl:template match="table:table-cell//text:p">
247 <xsl:apply-templates/>
248 <xsl:if test="count(node())=0">
249 <xsl:text>&#xA;&#xA;</xsl:text>
250 </xsl:if>
251 </xsl:template>
252 <xsl:template match="text:p">
253 <xsl:apply-templates/>
254 <xsl:text >&#xA;&#xA;</xsl:text>
255 <xsl:if test="count(node())=0">
256 <xsl:text>&#xA;&#xA;</xsl:text>
257 </xsl:if>
258 </xsl:template>
259
260
261
262 <!-- bidouiller pour ne pas afficher le titre du document dans le texte (part 1) -->
263 <xsl:template match="//*[@text:style-name='Heading']"/>
264
265 <!-- les titres de façon dynamique en fonction des niveaux presents dans le fichier -->
266 <xsl:template match="//*[node()][@text:outline-level]
267 | //*[node()][starts-with(@text:style-name,'Heading_20_')]">
268 <xsl:choose>
269 <!-- suite de la bidouille pour ne pas afficher le titre du document dans le texte -->
270 <xsl:when test="not($StyleTitreGeneral='Heading') and text()=$ContenuTitreDoc"/>
271 <xsl:otherwise>
272 <xsl:call-template name="titres"/>
273 </xsl:otherwise>
274 </xsl:choose>
275 </xsl:template>
276
277 <xsl:template name="titres">
278 <!-- si $DecalerTitres == oui, décaler les niveaux puisqu'il n'existe pas de $StyleTitreGeneral et qu'il n'y a qu'un $NivoTitre1 -->
279 <xsl:variable name="NivoTitre1_ec">
280 <xsl:choose>
281 <xsl:when test="not($DecalerTitres='oui')">
282 <xsl:value-of select="$NivoTitre1"/>
283 </xsl:when>
284 <xsl:otherwise>
285 <xsl:value-of select="$NivoTitre2"/>
286 </xsl:otherwise>
287 </xsl:choose>
288 </xsl:variable>
289 <xsl:variable name="NivoTitre2_ec">
290 <xsl:choose>
291 <xsl:when test="not($DecalerTitres='oui')">
292 <xsl:value-of select="$NivoTitre2"/>
293 </xsl:when>
294 <xsl:otherwise>
295 <xsl:value-of select="$NivoTitre3"/>
296 </xsl:otherwise>
297 </xsl:choose>
298 </xsl:variable>
299 <!-- appliquer les formatages des titres -->
300 <xsl:text >&#xA;</xsl:text>
301 <xsl:choose>
302 <!-- formatages avec enluminure_typo ou intertitres_enrichis -->
303 <xsl:when test="$IntertitresRiches = 'oui'">
304 <!-- definir les niveaux de titre 3, 4 et 5 en fonction de $DecalerTitres -->
305 <xsl:variable name="NivoTitre3_ec">
306 <xsl:choose>
307 <xsl:when test="not($DecalerTitres='oui')">
308 <xsl:value-of select="$NivoTitre3"/>
309 </xsl:when>
310 <xsl:otherwise>
311 <xsl:value-of select="$NivoTitre4"/>
312 </xsl:otherwise>
313 </xsl:choose>
314 </xsl:variable>
315 <xsl:variable name="NivoTitre4_ec">
316 <xsl:choose>
317 <xsl:when test="not($DecalerTitres='oui')">
318 <xsl:value-of select="$NivoTitre4"/>
319 </xsl:when>
320 <xsl:otherwise>
321 <xsl:value-of select="$NivoTitre5"/>
322 </xsl:otherwise>
323 </xsl:choose>
324 </xsl:variable>
325 <xsl:variable name="NivoTitre5_ec">
326 <xsl:choose>
327 <xsl:when test="not($DecalerTitres='oui')">
328 <xsl:value-of select="$NivoTitre5"/>
329 </xsl:when>
330 <xsl:otherwise>
331 <xsl:value-of select="$NivoTitre6"/>
332 </xsl:otherwise>
333 </xsl:choose>
334 </xsl:variable>
335 <!-- appliquer le formatage proprement dit -->
336 <xsl:choose>
337 <xsl:when test="@text:outline-level=$NivoTitre1_ec or @text:style-name=concat('Heading_20_',$NivoTitre1_ec)">
338 {{{<xsl:apply-templates/>}}}
339 </xsl:when>
340 <xsl:otherwise>
341 <!-- recuperer le niveau de titre en cours a la bourrin
342 (a coup sur y'a moyen de faire mieux mais on va pas se decarcasser pour ces p*** de plugins qui forkent definitivement le code spip ! -->
343 <xsl:variable name="NivoTitre_ec">
344 <xsl:choose>
345 <xsl:when test="@text:outline-level=$NivoTitre2_ec or @text:style-name=concat('Heading_20_',$NivoTitre2_ec)">2</xsl:when>
346 <xsl:when test="@text:outline-level=$NivoTitre3_ec or @text:style-name=concat('Heading_20_',$NivoTitre3_ec)">3</xsl:when>
347 <xsl:when test="@text:outline-level=$NivoTitre4_ec or @text:style-name=concat('Heading_20_',$NivoTitre4_ec)">4</xsl:when>
348 <xsl:when test="@text:outline-level=$NivoTitre5_ec or @text:style-name=concat('Heading_20_',$NivoTitre5_ec)">5</xsl:when>
349 </xsl:choose>
350 </xsl:variable>
351 {<xsl:value-of select="$NivoTitre_ec"/>{<xsl:apply-templates/>}<xsl:value-of select="$NivoTitre_ec"/>}
352 </xsl:otherwise>
353 </xsl:choose>
354 </xsl:when>
355 <!-- formatages sans enluminure_typo ou intertitres_enrichis -->
356 <xsl:otherwise>
357 <xsl:choose>
358 <xsl:when test="@text:outline-level=$NivoTitre1_ec or @text:style-name=concat('Heading_20_',$NivoTitre1_ec)">
359 {{{<xsl:apply-templates/>}}}
360 </xsl:when>
361 <xsl:when test="@text:outline-level=$NivoTitre2_ec or @text:style-name=concat('Heading_20_',$NivoTitre2_ec)">
362 {{<xsl:apply-templates/>}}
363 </xsl:when>
364 <xsl:otherwise>
365 {<xsl:apply-templates/>}
366 </xsl:otherwise>
367 </xsl:choose>
368 </xsl:otherwise>
369 </xsl:choose>
370 <xsl:text >&#xA;</xsl:text>
371 </xsl:template>
372
373
374 <!-- traitement des listes -->
375 <xsl:template match="text:list">
376 <xsl:variable name="level" select="count(ancestor::text:list)+1"/>
377
378 <!-- le type de liste est le @text:style-name de l'element <text:list> le plus exterieur des listes imbriquees -->
379 <xsl:variable name="listClass">
380 <xsl:choose>
381 <xsl:when test="$level=1">
382 <xsl:value-of select="@text:style-name"/>
383 </xsl:when>
384 <xsl:otherwise>
385 <xsl:value-of select="ancestor::text:list[last()]/@text:style-name"/>
386 </xsl:otherwise>
387 </xsl:choose>
388 </xsl:variable>
389
390 <!-- choisir le bon type de liste en fonction du <text:list-level-style-XXX> du <text:list-style> dans les styles pre-definis
391 <xsl:variable name="node" select="key('listTypes', $listClass)/*[@text:level='$level']"/> -->
392 <xsl:variable name="node" select="/office:document-content/office:automatic-styles/text:list-style[@style:name=$listClass]/*[1]"/>
393
394 <xsl:variable name="s">
395 <xsl:choose>
396 <xsl:when test="local-name($node)='list-level-style-number'">#</xsl:when>
397 <xsl:otherwise>*</xsl:otherwise>
398 </xsl:choose>
399 </xsl:variable>
400 <!-- -->
401 <xsl:call-template name="process-list">
402 <xsl:with-param name="s" select="$s"/>
403 </xsl:call-template>
404
405 <xsl:text >&#xA;</xsl:text>
406 </xsl:template>
407
408 <xsl:template name="process-list">
409 <xsl:param name="s"/>
410 <xsl:for-each select="descendant::text:list-item/text:p[node()]">
411 -<xsl:for-each select="ancestor::*"><!-- gestion des listes imbriquées -->
412 <xsl:if test="name()='text:list-item'"><xsl:value-of select="$s"/></xsl:if>
413 </xsl:for-each>
414 <xsl:apply-templates />
415 </xsl:for-each>
416 </xsl:template>
417
418
419 <!-- traitement des tableaux -->
420 <xsl:template match="table:table">
421 <xsl:text >&#xA;</xsl:text>
422 <xsl:apply-templates select="table:table-row | */table:table-row"/>
423 <xsl:text >&#xA;</xsl:text>
424 </xsl:template>
425
426 <xsl:template match="table:table-row | */table:table-row">
427 <xsl:text >&#xA;</xsl:text>|<xsl:choose>
428 <!-- si c'est la premiere ligne *et* qu'il n'y a as de cellules fusionnees verticalement utiliser {{ }} pour faire un thead -->
429 <xsl:when test="position()=1 and count(table:table-cell[@table:number-rows-spanned])=0">
430 <xsl:apply-templates select="table:table-cell | table:covered-table-cell" mode="thead"/>
431 </xsl:when>
432 <xsl:otherwise>
433 <xsl:apply-templates select="table:table-cell | table:covered-table-cell" mode="tbody"/>
434 </xsl:otherwise>
435 </xsl:choose>
436 </xsl:template>
437
438 <xsl:template match="table:table-cell" mode="thead">{{<xsl:apply-templates select="*[node()]"/>}}|</xsl:template>
439 <xsl:template match="table:table-cell" mode="tbody"><xsl:apply-templates select="*[node()]"/>|</xsl:template>
440
441 <!-- ca c'est la mauvaise bidouille pour avoir le meme traitement pour les cellules de fusion alors qu'elles ont un mode different -->
442 <xsl:template match="table:covered-table-cell" mode="thead"><xsl:call-template name="cells_fusionnees"/></xsl:template>
443 <xsl:template match="table:covered-table-cell" mode="tbody"><xsl:call-template name="cells_fusionnees"/></xsl:template>
444
445 <!-- traitement des cellules masquees du fait de fusions par colonnes/lignes
446 bidouille: si dans les cellules precedentes de la meme ligne il y a un table:number-columns-spanned="XX"
447 alors c'est une fusion de cellules d'une meme ligne (code <|) sinon fusion de cellules d'une meme colonne (code ^|) -->
448 <xsl:template name="cells_fusionnees">
449 <xsl:variable name="fusion">
450 <xsl:for-each select="preceding-sibling::*">
451 <xsl:if test="@table:number-columns-spanned &gt; 1">&lt;</xsl:if>
452 </xsl:for-each>
453 </xsl:variable>
454 <xsl:variable name="caractere_fusion">
455 <xsl:choose>
456 <xsl:when test="$fusion = ''">^</xsl:when>
457 <xsl:otherwise>&lt;</xsl:otherwise>
458 </xsl:choose>
459 </xsl:variable>
460 <xsl:value-of select="$caractere_fusion"/>|</xsl:template>
461
462
463 <!-- les liens -->
464 <xsl:template match="text:a">[<xsl:apply-templates />-><xsl:value-of select="@xlink:href" />]</xsl:template>
465
466 <!-- les ancres -->
467 <xsl:template match="text:bookmark-start|text:bookmark">[<xsl:value-of select="@text:name" />&lt;-]
468 </xsl:template>
469
470 <!-- notes de bas de page -->
471 <xsl:template match="text:note-citation"/>
472 <xsl:template match="text:note-body">[[<xsl:apply-templates />]]</xsl:template>
473
474 <!-- les sauts de ligne -->
475 <xsl:template match="text:line-break">
476 _ <xsl:apply-templates />
477 </xsl:template>
478
479 <!-- gras et italiques -->
480 <xsl:template match="text:span">
481 <xsl:variable name="StyleType" select="@text:style-name"/>
482 <xsl:variable name="weight" select="/office:document-content/office:automatic-styles/style:style[@style:name=$StyleType]/style:text-properties/@fo:font-weight"/>
483 <xsl:variable name="style" select="/office:document-content/office:automatic-styles/style:style[@style:name=$StyleType]/style:text-properties/@fo:font-style"/>
484 <xsl:choose>
485 <xsl:when test="$weight='bold'">{{<xsl:apply-templates />}}</xsl:when>
486 <xsl:when test="$style='italic'">{<xsl:apply-templates />}</xsl:when>
487 <xsl:otherwise>
488 <xsl:apply-templates />
489 </xsl:otherwise>
490 </xsl:choose>
491 </xsl:template>
492
493
494 <!-- nettement plus bricolage : les images...
495 on met le nom de fichier de l'image qu'il faudra echanger en php par son id document spip une fois qu'il sera reference dans la table documents -->
496 <xsl:template match="draw:image">
497 <!-- on filtre les elements draw:image qui ont un frere draw:object cad qui ne sont pas des images -->
498 <xsl:if test="count(parent::draw:frame/draw:object)=0">
499 <xsl:call-template name="img2texte" />
500 </xsl:if>
501 </xsl:template>
502
503 <xsl:template name="img2texte">&#60;img<xsl:value-of select="substring(@xlink:href,10)"/>;;;<xsl:value-of select="substring-before(parent::draw:frame/@svg:width,'cm')" />;;;<xsl:value-of select="substring-before(parent::draw:frame/@svg:height,'cm')" />;;;|<xsl:choose>
504 <!-- sale bidouille pour approximer la position de l'image (|left |center |right) -->
505 <xsl:when test="substring-before(parent::draw:frame/@svg:x, 'cm') &lt;= 2">left</xsl:when>
506 <xsl:when test="substring-before(parent::draw:frame/@svg:x, 'cm') &gt;= 5">right</xsl:when>
507 <xsl:otherwise>center</xsl:otherwise>
508 </xsl:choose>&#62;</xsl:template>
509
510 <!-- pour continuer dans les bidouillages: les objets integres
511 i.e. les formules de math sous forme d'un fichier MathML externe stocke dans un ss-rep: /Object X/content.xml
512 ici on cree une balise <math>Object X</math> qui sera ensuite post-traitee pour recuperer la formule -->
513 <xsl:template match="draw:object[@xlink:href]">
514 &#60;math&#62;<xsl:value-of select="substring(@xlink:href,3)"/>&#60;/math&#62;
515 </xsl:template>
516
517 <!--
518 This template is too dangerous to leave active...
519 <xsl:template match="text()">
520 <xsl:if test="normalize-space(.) !=''">
521 <xsl:value-of select="normalize-space(.)"/>
522 </xsl:if>
523 </xsl:template>
524 -->
525
526 </xsl:stylesheet>