Completed
Push — master ( d5b8a7...cdd9b5 )
by Dispositif
02:37
created

OuvrageTemplate::setSource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
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');
1 ignored issue
show
Bug Best Practice introduced by
The expression return $this->getParam('id') could return the type null which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
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