1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* This file is part of dispositif/wikibot application |
4
|
|
|
* 2019 : Philippe M. <[email protected]> |
5
|
|
|
* For the full copyright and MIT license information, please view the LICENSE file. |
6
|
|
|
*/ |
7
|
|
|
|
8
|
|
|
declare(strict_types=1); |
9
|
|
|
|
10
|
|
|
namespace App\Domain\Models\Wiki; |
11
|
|
|
|
12
|
|
|
/** |
13
|
|
|
* Parameters names changed on hydration (alias) |
14
|
|
|
* Raw datas : Value are not normalized (see rather OuvrageClean class for optimized values) |
15
|
|
|
* Note : Avec serialization(), extraction de plume=,extrait=,commentaire= (obsolètes) |
16
|
|
|
* sur {{plume}}, {{citationbloc}},{{commentaire biblio}}... |
17
|
|
|
* Class OuvrageTemplate. |
18
|
|
|
*/ |
19
|
|
|
class OuvrageTemplate extends AbstractWikiTemplate |
20
|
|
|
{ |
21
|
|
|
const MODEL_NAME = 'Ouvrage'; // todo |
22
|
|
|
|
23
|
|
|
const REQUIRED_PARAMETERS |
24
|
|
|
= [ |
25
|
|
|
// 'langue' => '', // inutile avec 'fr' |
26
|
|
|
// 'auteur1' => '', // duplicate with prénom1/nom1 |
27
|
|
|
'titre' => '', // obligatoire |
28
|
|
|
'éditeur' => '', |
29
|
|
|
'année' => '', // géré dans serialize |
30
|
|
|
// 'pages totales' => '', |
31
|
|
|
// 'passage' => '', // pas pertinent sur biblio et liste oeuvres |
32
|
|
|
'isbn' => '', |
33
|
|
|
]; |
34
|
|
|
|
35
|
|
|
/** |
36
|
|
|
* update 18 sept 2019. |
37
|
|
|
*/ |
38
|
|
|
const PARAM_ALIAS |
39
|
|
|
= [ |
40
|
|
|
'numéro dans la collection' => 'numéro dans collection', |
41
|
|
|
'lang' => 'langue', |
42
|
|
|
'lien langue' => 'langue', |
43
|
|
|
'prénom' => 'prénom1', // fréquent : ajouté sur params normaux |
44
|
|
|
'first1' => 'prénom1', |
45
|
|
|
'first2' => 'prénom2', |
46
|
|
|
'first3' => 'prénom3', |
47
|
|
|
'nom' => 'nom1', // fréquent : ajouté sur params normaux |
48
|
|
|
'last1' => 'nom1', |
49
|
|
|
'last2' => 'nom2', |
50
|
|
|
'last3' => 'nom3', |
51
|
|
|
'postnom' => 'postnom1', |
52
|
|
|
'lien auteur' => 'lien auteur1', |
53
|
|
|
'auteur' => 'auteur1', // fréquent : ajouté sur params normaux malgré alias |
54
|
|
|
'directeur' => 'directeur1', |
55
|
|
|
// non-documenté (Aristote) |
56
|
|
|
'author1' => 'auteur1', |
57
|
|
|
'author2' => 'auteur2', |
58
|
|
|
'author3' => 'auteur3', |
59
|
|
|
'author4' => 'auteur4', |
60
|
|
|
'et alii' => 'et al.', |
61
|
|
|
'trad' => 'traducteur', |
62
|
|
|
'traduction' => 'traducteur', |
63
|
|
|
'title' => 'titre', |
64
|
|
|
'titre vo' => 'titre original', |
65
|
|
|
'location' => 'lieu', |
66
|
|
|
'year' => 'année', |
67
|
|
|
'édition' => 'éditeur', |
68
|
|
|
'publisher' => 'éditeur', |
69
|
|
|
'numéro édition' => "numéro d'édition", |
70
|
|
|
'origyear' => 'année première édition', |
71
|
|
|
'publi' => 'réimpression', |
72
|
|
|
// 'pages' => 'pages totales', // doc - mis temporairement en paramètre normal |
73
|
|
|
// 'page' => 'passage', // Doc - mis temporairement en paramètre normal |
74
|
|
|
// 'format' => 'format livre', // ou 'format électronique' (pdf) |
75
|
|
|
'ISBN' => 'isbn', |
76
|
|
|
'isbn1' => 'isbn', |
77
|
|
|
'ISBN1' => 'isbn', |
78
|
|
|
'ISBN2' => 'isbn2', |
79
|
|
|
'ISBN3' => 'isbn3', |
80
|
|
|
'issn1' => 'issn', |
81
|
|
|
'iSSN' => 'issn', |
82
|
|
|
'iSSN1' => 'issn', |
83
|
|
|
'ISSN2' => 'issn2', |
84
|
|
|
'ISSN3' => 'issn3', |
85
|
|
|
'E-ISSN' => 'e-issn', |
86
|
|
|
'ASIN' => 'asin', |
87
|
|
|
'résumé' => 'présentation en ligne', |
88
|
|
|
'url résumé' => 'présentation en ligne', |
89
|
|
|
'url' => 'lire en ligne', |
90
|
|
|
'url texte' => 'lire en ligne', |
91
|
|
|
'accessdate' => 'consulté le', |
92
|
|
|
'numéro' => 'numéro chapitre', |
93
|
|
|
'chapitre' => 'numéro chapitre', |
94
|
|
|
'chap' => 'titre chapitre', |
95
|
|
|
'chapter' => 'titre chapitre', |
96
|
|
|
'ref' => 'référence simplifiée', |
97
|
|
|
// TODO: desactive ? |
98
|
|
|
/* |
99
|
|
|
* Conversion enwiki {{cite book}} => {{ouvrage}} (2012) |
100
|
|
|
*/ |
101
|
|
|
'author1-link' => 'lien auteur1', |
102
|
|
|
'author2-link' => 'lien auteur2', |
103
|
|
|
'author3-link' => 'lien auteur3', |
104
|
|
|
'author4-link' => 'lien auteur4', |
105
|
|
|
'author5-link' => 'lien auteur5', |
106
|
|
|
'author6-link' => 'lien auteur6', |
107
|
|
|
'author7-link' => 'lien auteur7', |
108
|
|
|
'author8-link' => 'lien auteur8', |
109
|
|
|
'author9-link' => 'lien auteur9', |
110
|
|
|
'last' => 'nom1', |
111
|
|
|
'first' => 'prénom1', |
112
|
|
|
'last4' => 'nom4', |
113
|
|
|
'first4' => 'prénom4', |
114
|
|
|
'last5' => 'nom5', |
115
|
|
|
'first5' => 'prénom5', |
116
|
|
|
'last6' => 'nom6', |
117
|
|
|
'first6' => 'prénom6', |
118
|
|
|
'last7' => 'nom7', |
119
|
|
|
'first7' => 'prénom7', |
120
|
|
|
'last8' => 'nom8', |
121
|
|
|
'first8' => 'prénom8', |
122
|
|
|
'last9' => 'nom9', |
123
|
|
|
'first9' => 'prénom9', |
124
|
|
|
'author' => 'auteur', |
125
|
|
|
'authorlink' => 'lien auteur', |
126
|
|
|
'coauthors' => 'co-auteur', |
127
|
|
|
// 'editor' => '', |
128
|
|
|
// 'editor-link' => '', |
129
|
|
|
// 'others' => '', |
130
|
|
|
'trans_title' => 'titre traduit', |
131
|
|
|
// 'type' => '', |
132
|
|
|
'edition' => "numéro d'édition", |
133
|
|
|
// 'series' => '', |
134
|
|
|
'date' => 'date', |
135
|
|
|
'month' => 'mois', |
136
|
|
|
'language' => 'langue', |
137
|
|
|
'trans_chapter' => 'titre chapitre traduit', |
138
|
|
|
'quote' => 'extrait', |
139
|
|
|
/* END {{cite book}} to {{ouvrage}} convertion */ |
140
|
|
|
'publication-place' => 'lieu', |
141
|
|
|
// 'editor-last', 'editor-first', 'editor2-last', etc |
142
|
|
|
'publication-date' => 'date', |
143
|
|
|
'author-link' => 'lien auteur1', |
144
|
|
|
'première édition' => 'année première édition', |
145
|
|
|
'citation' => 'extrait', |
146
|
|
|
'chapter-url' => 'lire en ligne', |
147
|
|
|
'p' => 'passage', |
148
|
|
|
]; |
149
|
|
|
|
150
|
|
|
public $externalTemplates = []; |
151
|
|
|
|
152
|
|
|
protected $parametersByOrder |
153
|
|
|
= [ |
154
|
|
|
'id', // déconseillé. En tête pour visibilité, car utilisé comme ancre |
155
|
|
|
'langue', |
156
|
|
|
'langue originale', |
157
|
|
|
'auteurs', // déconseillé => auteur1, auteur2... |
158
|
|
|
'co-auteur', // obsolète |
159
|
|
|
// 'auteur', // alias de auteur1 mais très fréquent (conservation style) |
160
|
|
|
'auteur1', |
161
|
|
|
'prénom1', |
162
|
|
|
// 'prénom', // alias mais fréquent |
163
|
|
|
'nom1', |
164
|
|
|
// 'nom', // alias mais fréquent |
165
|
|
|
'postnom1', |
166
|
|
|
'lien auteur1', |
167
|
|
|
'directeur1', |
168
|
|
|
'responsabilité1', |
169
|
|
|
'auteur2', |
170
|
|
|
'prénom2', |
171
|
|
|
'nom2', |
172
|
|
|
'postnom2', |
173
|
|
|
'lien auteur2', |
174
|
|
|
'directeur2', |
175
|
|
|
'responsabilité2', |
176
|
|
|
'auteur3', |
177
|
|
|
'prénom3', |
178
|
|
|
'nom3', |
179
|
|
|
'postnom3', |
180
|
|
|
'lien auteur3', |
181
|
|
|
'directeur3', |
182
|
|
|
'responsabilité3', |
183
|
|
|
'auteur4', |
184
|
|
|
'prénom4', |
185
|
|
|
'nom4', |
186
|
|
|
'postnom4', |
187
|
|
|
'lien auteur4', |
188
|
|
|
'directeur4', |
189
|
|
|
'responsabilité4', |
190
|
|
|
'auteur5', |
191
|
|
|
'prénom5', |
192
|
|
|
'nom5', |
193
|
|
|
'postnom5', |
194
|
|
|
'lien auteur5', |
195
|
|
|
'directeur5', |
196
|
|
|
'responsabilité5', |
197
|
|
|
'auteur6', |
198
|
|
|
'prénom6', |
199
|
|
|
'nom6', |
200
|
|
|
'postnom6', |
201
|
|
|
'lien auteur6', |
202
|
|
|
'directeur6', |
203
|
|
|
'responsabilité6', |
204
|
|
|
'auteur7', |
205
|
|
|
'prénom7', |
206
|
|
|
'nom7', |
207
|
|
|
'postnom7', |
208
|
|
|
'lien auteur7', |
209
|
|
|
'directeur7', |
210
|
|
|
'responsabilité7', |
211
|
|
|
'auteur8', |
212
|
|
|
'prénom8', |
213
|
|
|
'nom8', |
214
|
|
|
'postnom8', |
215
|
|
|
'lien auteur8', |
216
|
|
|
'directeur8', |
217
|
|
|
'responsabilité8', |
218
|
|
|
'auteur9', |
219
|
|
|
'prénom9', |
220
|
|
|
'nom9', |
221
|
|
|
'postnom9', |
222
|
|
|
'lien auteur9', |
223
|
|
|
'directeur9', |
224
|
|
|
'responsabilité9', |
225
|
|
|
'auteur10', |
226
|
|
|
'prénom10', |
227
|
|
|
'nom10', |
228
|
|
|
'postnom10', |
229
|
|
|
'lien auteur10', |
230
|
|
|
'directeur10', |
231
|
|
|
'responsabilité10', |
232
|
|
|
'auteur11', |
233
|
|
|
'prénom11', |
234
|
|
|
'nom11', |
235
|
|
|
'postnom11', |
236
|
|
|
'lien auteur11', |
237
|
|
|
'directeur11', |
238
|
|
|
'responsabilité11', |
239
|
|
|
'auteur12', |
240
|
|
|
'prénom12', |
241
|
|
|
'nom12', |
242
|
|
|
'postnom12', |
243
|
|
|
'lien auteur12', |
244
|
|
|
'directeur12', |
245
|
|
|
'responsabilité12', |
246
|
|
|
'auteur13', |
247
|
|
|
'prénom13', |
248
|
|
|
'nom13', |
249
|
|
|
'postnom13', |
250
|
|
|
'lien auteur13', |
251
|
|
|
'directeur13', |
252
|
|
|
'responsabilité13', |
253
|
|
|
'auteur14', |
254
|
|
|
'prénom14', |
255
|
|
|
'nom14', |
256
|
|
|
'postnom14', |
257
|
|
|
'lien auteur14', |
258
|
|
|
'directeur14', |
259
|
|
|
'responsabilité14', |
260
|
|
|
'auteur15', |
261
|
|
|
'prénom15', |
262
|
|
|
'nom15', |
263
|
|
|
'postnom15', |
264
|
|
|
'lien auteur15', |
265
|
|
|
'directeur15', |
266
|
|
|
'responsabilité15', |
267
|
|
|
'auteur16', |
268
|
|
|
'prénom16', |
269
|
|
|
'nom16', |
270
|
|
|
'postnom16', |
271
|
|
|
'lien auteur16', |
272
|
|
|
'directeur16', |
273
|
|
|
'responsabilité16', |
274
|
|
|
'auteur17', |
275
|
|
|
'prénom17', |
276
|
|
|
'nom17', |
277
|
|
|
'postnom17', |
278
|
|
|
'lien auteur17', |
279
|
|
|
'directeur17', |
280
|
|
|
'responsabilité17', |
281
|
|
|
'auteur18', |
282
|
|
|
'prénom18', |
283
|
|
|
'nom18', |
284
|
|
|
'postnom18', |
285
|
|
|
'lien auteur18', |
286
|
|
|
'directeur18', |
287
|
|
|
'responsabilité18', |
288
|
|
|
'auteur19', |
289
|
|
|
'prénom19', |
290
|
|
|
'nom19', |
291
|
|
|
'postnom19', |
292
|
|
|
'lien auteur19', |
293
|
|
|
'directeur19', |
294
|
|
|
'responsabilité19', |
295
|
|
|
/**/ |
296
|
|
|
'et al.', |
297
|
|
|
'auteur institutionnel', |
298
|
|
|
'traducteur', |
299
|
|
|
'traductrice', |
300
|
|
|
'préface', |
301
|
|
|
'postface', |
302
|
|
|
'illustrateur', |
303
|
|
|
'photographe', |
304
|
|
|
'editor', // provisoire |
305
|
|
|
'editor1', // provisoire |
306
|
|
|
'editor2', // provisoire |
307
|
|
|
'editor3', // provisoire |
308
|
|
|
'champ libre', |
309
|
|
|
'titre', |
310
|
|
|
'sous-titre', |
311
|
|
|
'lien titre', |
312
|
|
|
'titre original', |
313
|
|
|
'traduction titre', |
314
|
|
|
'volume', |
315
|
|
|
'tome', |
316
|
|
|
'titre volume', |
317
|
|
|
'titre tome', // alias 'titre volume' à utilisé avec 'tome' |
318
|
|
|
'éditeur', |
319
|
|
|
'lien éditeur', // obsolète |
320
|
|
|
'collection', |
321
|
|
|
'lieu', |
322
|
|
|
'nature ouvrage', |
323
|
|
|
'série', |
324
|
|
|
'numéro dans collection', |
325
|
|
|
'année', |
326
|
|
|
'mois', |
327
|
|
|
'jour', |
328
|
|
|
'date', |
329
|
|
|
"numéro d'édition", |
330
|
|
|
'année première édition', |
331
|
|
|
'réimpression', |
332
|
|
|
'pages totales', |
333
|
|
|
'page', // temporaire |
334
|
|
|
'pages', // temporaire |
335
|
|
|
'format livre', |
336
|
|
|
'format', // obsolete |
337
|
|
|
'passage', |
338
|
|
|
'isbn', |
339
|
|
|
'isbn10', |
340
|
|
|
'isbn2', |
341
|
|
|
'isbn3', |
342
|
|
|
'isbn erroné', |
343
|
|
|
'isbn invalide', // not official // pour bot |
344
|
|
|
'issn', |
345
|
|
|
'issn2', |
346
|
|
|
'issn3', |
347
|
|
|
'e-issn', |
348
|
|
|
'ismn', |
349
|
|
|
'ean', |
350
|
|
|
'asin', |
351
|
|
|
'oclc', |
352
|
|
|
'bnf', |
353
|
|
|
'lccn', |
354
|
|
|
'dnb', |
355
|
|
|
'doi', |
356
|
|
|
'pmid', |
357
|
|
|
'jstor', |
358
|
|
|
'bibcode', |
359
|
|
|
'math reviews', |
360
|
|
|
'zbl', |
361
|
|
|
'arxiv', |
362
|
|
|
'sudoc', |
363
|
|
|
'wikisource', |
364
|
|
|
'présentation en ligne', |
365
|
|
|
'lire en ligne', |
366
|
|
|
'écouter en ligne', |
367
|
|
|
'format électronique', |
368
|
|
|
'consulté le', |
369
|
|
|
'partie', |
370
|
|
|
'numéro chapitre', |
371
|
|
|
'titre chapitre', |
372
|
|
|
'libellé', |
373
|
|
|
'référence', |
374
|
|
|
'référence simplifiée', |
375
|
|
|
'plume', // obsolete {{plume}} |
376
|
|
|
'extrait', // obsolete => {{citation bloc}} |
377
|
|
|
'commentaire', // obsolete => {{commentaire biblio}} |
378
|
|
|
]; |
379
|
|
|
|
380
|
|
|
private $source; |
381
|
|
|
|
382
|
|
|
/** |
383
|
|
|
* @return mixed |
384
|
|
|
*/ |
385
|
|
|
public function getSource() |
386
|
|
|
{ |
387
|
|
|
return $this->source; |
388
|
|
|
} |
389
|
|
|
|
390
|
|
|
/** |
391
|
|
|
* @param mixed $source |
392
|
|
|
*/ |
393
|
|
|
public function setSource($source): void |
394
|
|
|
{ |
395
|
|
|
$this->source = $source; |
396
|
|
|
} |
397
|
|
|
|
398
|
|
|
|
399
|
|
|
|
400
|
|
|
/** |
401
|
|
|
* @param bool|null $cleanOrder |
402
|
|
|
* |
403
|
|
|
* @return string |
404
|
|
|
*/ |
405
|
|
|
public function serialize(?bool $cleanOrder = false): string |
406
|
|
|
{ |
407
|
|
|
$serial = parent::serialize($cleanOrder); |
408
|
|
|
$serial = $this->anneeOrDateSerialize($serial); |
409
|
|
|
$serial = $this->stripIsbnBefore1970($serial); |
410
|
|
|
|
411
|
|
|
return $serial.$this->serializeExternalTemplates(); |
412
|
|
|
} |
413
|
|
|
|
414
|
|
|
/** |
415
|
|
|
* todo move to abstract ? + refac |
416
|
|
|
* dirty. |
417
|
|
|
*/ |
418
|
|
|
public function serializeExternalTemplates(): string |
419
|
|
|
{ |
420
|
|
|
$res = ''; |
421
|
|
|
if (!empty($this->externalTemplates)) { |
422
|
|
|
foreach ($this->externalTemplates as $externalTemplate) { |
423
|
|
|
$res .= $externalTemplate->raw; |
424
|
|
|
} |
425
|
|
|
} |
426
|
|
|
|
427
|
|
|
return $res; |
428
|
|
|
} |
429
|
|
|
|
430
|
|
|
/** |
431
|
|
|
* Strip empty 'isbn' before 1970. |
432
|
|
|
* |
433
|
|
|
* @param string $serial |
434
|
|
|
* |
435
|
|
|
* @return string |
436
|
|
|
*/ |
437
|
|
|
private function stripIsbnBefore1970(string $serial): string |
438
|
|
|
{ |
439
|
|
|
if (preg_match("#\|[\n ]*isbn=[\n ]*[|}]#", $serial) > 0 |
440
|
|
|
&& preg_match("#\|[\n ]*année=([0-9]+)[}| \n]#", $serial, $matches) > 0 |
441
|
|
|
) { |
442
|
|
|
$year = intval($matches[1]); |
443
|
|
|
if ($year > 0 && $year < 1970) { |
444
|
|
|
$serial = preg_replace("#\|[\n ]*isbn=[\n ]*#", '', $serial); |
445
|
|
|
} |
446
|
|
|
} |
447
|
|
|
|
448
|
|
|
return $serial; |
449
|
|
|
} |
450
|
|
|
|
451
|
|
|
/** |
452
|
|
|
* Pas de serialization année vide si date non vide. |
453
|
|
|
* |
454
|
|
|
* @param string $serial |
455
|
|
|
* |
456
|
|
|
* @return string |
457
|
|
|
*/ |
458
|
|
|
private function anneeOrDateSerialize(string $serial): string |
459
|
|
|
{ |
460
|
|
|
if (preg_match("#\|[\n ]*année=[\n ]*\|#", $serial) > 0 |
461
|
|
|
&& preg_match("#\|[\n ]*date=#", $serial) > 0 |
462
|
|
|
) { |
463
|
|
|
$serial = preg_replace("#\|[\n ]*année=[\n ]*#", '', $serial); |
464
|
|
|
} |
465
|
|
|
|
466
|
|
|
return $serial; |
467
|
|
|
} |
468
|
|
|
|
469
|
|
|
/** |
470
|
|
|
* Détermine l'id d'ancrage <span> de l'ouvrage. |
471
|
|
|
* Utilisable par titre#ancrage ou {{harvsp}}. |
472
|
|
|
* Voir http://fr.wikipedia.org/wiki/Modèle:Module_biblio/span_initial |
473
|
|
|
*/ |
474
|
|
|
public function getSpanInitial(): string |
475
|
|
|
{ |
476
|
|
|
// Identifiant paramétré |
477
|
|
|
if ($this->getParam('id')) { |
478
|
|
|
return $this->getParam('id'); |
|
|
|
|
479
|
|
|
} |
480
|
|
|
|
481
|
|
|
// Identifiant déduit : auteur1,2,3,4,année |
482
|
|
|
$id = ''; |
483
|
|
|
for ($i = 1; $i < 4; $i++) { |
484
|
|
|
$id .= ($this->getParam('nom'.$i)) ?? $this->getParam('auteur'.$i) ?? ''; |
485
|
|
|
} |
486
|
|
|
$id .= $this->getParam('année') ?? ''; |
487
|
|
|
|
488
|
|
|
return $id; |
489
|
|
|
} |
490
|
|
|
|
491
|
|
|
} |
492
|
|
|
|