cdm-dataportal / modules / cdm_dataportal / includes / name.inc @ 26f042e4
History | View | Annotate | Download (77.3 KB)
1 |
<?php |
---|---|
2 |
/** |
3 |
* @file |
4 |
* Functions for dealing with CDM entities from the package model.name |
5 |
* |
6 |
* @copyright |
7 |
* (C) 2007-2015 EDIT |
8 |
* European Distributed Institute of Taxonomy |
9 |
* http://www.e-taxonomy.eu |
10 |
* |
11 |
* The contents of this module are subject to the Mozilla |
12 |
* Public License Version 1.1. |
13 |
* @see http://www.mozilla.org/MPL/MPL-1.1.html |
14 |
* |
15 |
* @author |
16 |
* - Andreas Kohlbecker <a.kohlbecker@BGBM.org> |
17 |
*/ |
18 |
|
19 |
/** |
20 |
* @defgroup compose Compose functions |
21 |
* @{ |
22 |
* Functions which are composing Drupal render arays |
23 |
* |
24 |
* The cdm_dataportal module needs to compose rather complex render arrays from |
25 |
* the data returned by the CDM REST service. The compose functions are |
26 |
* responsible for creating the render arrays. |
27 |
* |
28 |
* All these functions are also implementations of the compose_hook() |
29 |
* which is used in the proxy_content() function. |
30 |
* @} |
31 |
*/ |
32 |
|
33 |
|
34 |
/** |
35 |
* Provides the name render template to be used within the page elements identified the the $renderPath. |
36 |
* |
37 |
* The render templates arrays contains one or more name render templates to be used within the page elements identified the the |
38 |
* renderPath. The renderPath is the key of the subelements whereas the value is the name render template. |
39 |
* |
40 |
* The render paths used for a cdm_dataportal page can be visualized by supplying the HTTP query parameter RENDER_PATH=1. |
41 |
* |
42 |
* It will be tried to find the best matching default RenderTemplate by stripping the dot separated render path |
43 |
* element by element. If no matching template is found the DEFAULT will be used: |
44 |
* |
45 |
* - related_taxon.heterotypicSynonymyGroup.taxon_page_synonymy |
46 |
* - related_taxon.heterotypicSynonymyGroup.taxon_page_synonymy |
47 |
* - related_taxon.heterotypicSynonymyGroup.taxon_page_synonymy |
48 |
* |
49 |
* A single render template can be used for multiple render paths. In this case the according key of the render templates |
50 |
* array element should be the list of these render paths concatenated by ONLY a comma character without any whitespace. |
51 |
* |
52 |
* A render template is an associative array. The keys of this array are referring to the keys as defined in the part |
53 |
* definitions array. |
54 |
* @see get_partDefinition($taxonNameType) for more information |
55 |
* |
56 |
* The value of the render template element must be set to TRUE in order to let this part being rendered. |
57 |
* The namePart, nameAuthorPart and referencePart can also hold an associative array with a single |
58 |
* element: array('#uri' => TRUE). The value of the #uri element will be replaced by the according |
59 |
* links if the parameters $nameLink or $refenceLink are set. |
60 |
* |
61 |
* @param string $render_path |
62 |
* The render path can consist of multiple dot separated elements |
63 |
* @see RenderHints::getRenderPath() |
64 |
* @param string $nameLink |
65 |
* The link path or URL to be used for name parts if a link is forseen in the template |
66 |
* matching the given $renderPath. |
67 |
* @param string $referenceLink |
68 |
* The link path ot URL to be used for nomenclatural reference parts if a link is forseen |
69 |
* in the template matching the given $renderPath. |
70 |
* @return array |
71 |
* An associative array, the render template |
72 |
*/ |
73 |
function get_nameRenderTemplate($render_path, $nameLink = NULL, $referenceLink = NULL) { |
74 |
|
75 |
static $default_render_templates = NULL; |
76 |
static $split_render_templates = NULL; |
77 |
|
78 |
|
79 |
if (!isset($default_render_templates)) { |
80 |
$default_render_templates = unserialize(CDM_NAME_RENDER_TEMPLATES_DEFAULT); |
81 |
} |
82 |
if($split_render_templates == NULL) { |
83 |
$render_templates = variable_get(CDM_NAME_RENDER_TEMPLATES, $default_render_templates); |
84 |
// needs to be converted to an array |
85 |
$render_templates = (object_to_array($render_templates)); |
86 |
|
87 |
// separate render templates which are combined with a comma |
88 |
$split_render_templates = array(); |
89 |
foreach($render_templates as $key => $template){ |
90 |
if(strpos($key, ',')){ |
91 |
foreach(explode(',', $key) as $path){ |
92 |
$split_render_templates[$path] = $template; |
93 |
} |
94 |
} else { |
95 |
$split_render_templates[$key] = $template; |
96 |
} |
97 |
} |
98 |
} |
99 |
|
100 |
// get the base element of the renderPath |
101 |
if (($separatorPos = strpos($render_path, '.')) > 0) { |
102 |
$renderPath_base = substr($render_path, 0, $separatorPos); |
103 |
} else { |
104 |
$renderPath_base = $render_path; |
105 |
} |
106 |
|
107 |
$template = NULL; |
108 |
// 1. try to find a template using the render path base element |
109 |
if(array_key_exists($renderPath_base, $split_render_templates)){ |
110 |
$template = (array)$split_render_templates[$renderPath_base]; |
111 |
} |
112 |
|
113 |
// 2. Find best matching default RenderTemplate |
114 |
// by stripping the dot separated render path element by element |
115 |
// if no matching template is found the DEFAULT will be used. |
116 |
while (!is_array($template) && strlen($render_path) > 0) { |
117 |
foreach ($split_render_templates as $path => $t) { |
118 |
if ($path == $render_path) { |
119 |
$template = $t; |
120 |
break; |
121 |
} |
122 |
} |
123 |
// shorten by one element |
124 |
$render_path = substr($render_path, strrpos($render_path, '.') + 1, strlen($render_path)); |
125 |
} |
126 |
|
127 |
|
128 |
// 3. Otherwise get default RenderTemplate from theme. |
129 |
if (!is_array($template)) { |
130 |
$template = $split_render_templates['#DEFAULT']; |
131 |
} |
132 |
|
133 |
// --- set the link uris to the according template fields if they exist |
134 |
if(isset($template['nameAuthorPart']) && isset($template['nameAuthorPart']['#uri'])) { |
135 |
if ($nameLink) { |
136 |
$template['nameAuthorPart']['#uri'] = $nameLink; |
137 |
} |
138 |
else { |
139 |
unset($template['nameAuthorPart']['#uri']); |
140 |
} |
141 |
} |
142 |
|
143 |
if ($nameLink && isset($template['namePart']['#uri'])) { |
144 |
$template['namePart']['#uri'] = $nameLink; |
145 |
} |
146 |
else { |
147 |
unset($template['namePart']['#uri']); |
148 |
} |
149 |
|
150 |
if ($referenceLink && isset($template['referencePart']['#uri'])) { |
151 |
$template['referencePart']['#uri'] = $referenceLink; |
152 |
} |
153 |
else { |
154 |
unset($template['referencePart']['#uri']); |
155 |
} |
156 |
|
157 |
return $template; |
158 |
} |
159 |
|
160 |
/** |
161 |
* The part definitions define the specific parts of which a rendered taxon name plus additional information will consist. |
162 |
* |
163 |
* A full taxon name plus additional information can consist of the following elements: |
164 |
* |
165 |
* - name: the taxon name inclugin rank nbut without author |
166 |
* - authorTeam: The authors of a reference, also used in taxon names |
167 |
* - authors: The authors of a reference, also used in taxon names |
168 |
* - reference: the nomenclatural reference, |
169 |
* - microreference: Volume, page number etc. |
170 |
* - status: The nomenclatural status of a name |
171 |
* - description: name descriptions like protologues etc ... |
172 |
* |
173 |
* These elements are combined in the part definitions array to from the specific parts to be rendered. |
174 |
* Usually the following parts are formed: |
175 |
* |
176 |
* The name "Lapsana communis L., Sp. Pl.: 811. 1753" shall be an example here: |
177 |
* - namePart: the name and rank (in example: "Lapsana communis") |
178 |
* - authorshipPart: the author (in example: "L.") |
179 |
* - nameAuthorPart: the combination of name and author part (in example: "Lapsana communis L."). |
180 |
* This is useful for zoological names where the authorshipPart belongs to the name and both should |
181 |
* be combined when a link to the taxon is rendered. |
182 |
* - referencePart: the nomencaltural reference (in example: "Sp. Pl. 1753") |
183 |
* - microreferencePart: usually the page number (in example ": 811.") |
184 |
* - statusPart: the nomenclatorical status |
185 |
* - descriptionPart: |
186 |
* |
187 |
* Each set of parts is dedicated to render a specific TaxonName type, the type names are used as keys for the |
188 |
* specific parts part definitions: |
189 |
* |
190 |
* - BotanicalName |
191 |
* - ZoologicalName |
192 |
* - #DEFAULT: covers ViralNames and general NonViralNames |
193 |
* |
194 |
* An example: |
195 |
* @code |
196 |
* array( |
197 |
* 'ZoologicalName' => array( |
198 |
* 'namePart' => array('name' => TRUE), |
199 |
* 'referencePart' => array('authorTeam' => TRUE), |
200 |
* 'microreferencePart' => array('microreference' => TRUE), |
201 |
* 'statusPart' => array('status' => TRUE), |
202 |
* 'descriptionPart' => array('description' => TRUE), |
203 |
* ), |
204 |
* 'BotanicalName' => array( |
205 |
* 'namePart' => array( |
206 |
* 'name' => TRUE, |
207 |
* 'authors' => TRUE, |
208 |
* ), |
209 |
* 'referencePart' => array( |
210 |
* 'reference' => TRUE, |
211 |
* 'microreference' => TRUE, |
212 |
* ), |
213 |
* 'statusPart' => array('status' => TRUE), |
214 |
* 'descriptionPart' => array('description' => TRUE), |
215 |
* ), |
216 |
* ); |
217 |
* @endcode |
218 |
* |
219 |
* @param object $taxonNameType |
220 |
* A cdm TaxonNameType entity |
221 |
* |
222 |
*/ |
223 |
function get_partDefinition($taxonNameType) { |
224 |
|
225 |
static $default_part_definitions = null; |
226 |
if (!isset($default_part_definitions)) { |
227 |
$default_part_definitions= unserialize(CDM_PART_DEFINITIONS_DEFAULT); |
228 |
} |
229 |
|
230 |
static $part_definitions = null; |
231 |
if (!isset($part_definitions)) { |
232 |
$part_definitions = object_to_array(variable_get(CDM_PART_DEFINITIONS, $default_part_definitions)); |
233 |
} |
234 |
|
235 |
$dtype = nameTypeToDTYPE($taxonNameType); |
236 |
if (array_key_exists($taxonNameType, $part_definitions)) { |
237 |
return $part_definitions[$taxonNameType]; |
238 |
} else if (array_key_exists($dtype, $part_definitions)) { |
239 |
return $part_definitions[$dtype]; |
240 |
} else { |
241 |
return $part_definitions['#DEFAULT']; // covers ViralNames and general NonViralNames |
242 |
} |
243 |
|
244 |
} |
245 |
|
246 |
|
247 |
/** |
248 |
* Renders the markup for a CDM TaxonName instance. |
249 |
* |
250 |
* The layout of the name representation is configured by the |
251 |
* part_definitions and render_templates (see get_partDefinition() and |
252 |
* get_nameRenderTemplate()) |
253 |
* |
254 |
* @param $taxonName |
255 |
* cdm TaxonName instance |
256 |
* @param $name_link |
257 |
* URI to the taxon, @see path_to_taxon(), must be processed by url() before passing to this method |
258 |
* @param $reference_link |
259 |
* URI to the reference, @see path_to_reference(), must be processed by url() before passing to this method |
260 |
* @param $show_annotations |
261 |
* turns the display of annotations on |
262 |
* @param $is_type_designation |
263 |
* To indicate that the supplied taxon name is a name type designation. |
264 |
* @param $skiptags |
265 |
* an array of name elements tags like 'name', 'rank' to skip. The name part |
266 |
* 'authors' will not ber affected by this filter. This part is managed though the render template |
267 |
* mechanism. |
268 |
* @param $is_invalid |
269 |
* Indicates that this taxon is invalid. In this case the name part will be shown in double quotes. |
270 |
* This is useful when rendering taxon relation ships. |
271 |
* |
272 |
* @return string |
273 |
* The markup for a taxon name. |
274 |
* |
275 |
*/ |
276 |
function render_taxon_or_name($taxon_name_or_taxon_base, $name_link = NULL, $reference_link = NULL, |
277 |
$show_annotations = true, $is_type_designation = false, $skiptags = array(), $is_invalid = false) { |
278 |
|
279 |
$is_doubtful = false; |
280 |
|
281 |
if($taxon_name_or_taxon_base->class == 'Taxon' || $taxon_name_or_taxon_base->class == 'Synonym'){ |
282 |
if(isset($taxon_name_or_taxon_base->name)){ |
283 |
$taxonName = $taxon_name_or_taxon_base->name; |
284 |
} else { |
285 |
$taxonName = cdm_ws_get(CDM_WS_TAXON . '/$0/name', array($taxon_name_or_taxon_base->uuid)); |
286 |
} |
287 |
$is_doubtful = $taxon_name_or_taxon_base->doubtful; |
288 |
// use the TaxonBase.tagged_title so we have the secRef |
289 |
$tagged_title = $taxon_name_or_taxon_base->taggedTitle; |
290 |
} else { |
291 |
// assuming this is a TaxonName |
292 |
$taxonName = $taxon_name_or_taxon_base; |
293 |
if(isset($taxonName->taggedFullTitle)){ |
294 |
$tagged_title = $taxon_name_or_taxon_base->taggedFullTitle; |
295 |
} else { |
296 |
$tagged_title = $taxon_name_or_taxon_base->taggedName; |
297 |
} |
298 |
} |
299 |
|
300 |
|
301 |
$renderTemplate = get_nameRenderTemplate(RenderHints::getRenderPath(), $name_link, $reference_link); |
302 |
$partDefinition = get_partDefinition($taxonName->nameType); |
303 |
|
304 |
// Apply definitions to template. |
305 |
foreach ($renderTemplate as $part => $uri) { |
306 |
|
307 |
if (isset($partDefinition[$part])) { |
308 |
$renderTemplate[$part] = $partDefinition[$part]; |
309 |
} |
310 |
if (is_array($uri) && isset($uri['#uri'])) { |
311 |
$renderTemplate[$part]['#uri'] = $uri['#uri']; |
312 |
} |
313 |
} |
314 |
|
315 |
$secref_tagged_text = tagged_text_extract_reference_and_detail($tagged_title); |
316 |
// taxon names will have the nomenclatural reference in the tagged full title: |
317 |
$nomref_tagged_text = tagged_text_extract_reference($tagged_title); |
318 |
$nom_status_tagged_text = tagged_text_extract_nomstatus($tagged_title); |
319 |
$appended_phrase_tagged_text = array(); // this is filled later |
320 |
|
321 |
normalize_tagged_text($tagged_title); |
322 |
|
323 |
$is_valid_tagged_title = |
324 |
isset($tagged_title) |
325 |
&& is_array($tagged_title) |
326 |
&& isset($tagged_title[0]->text) |
327 |
&& is_string($tagged_title[0]->text) |
328 |
&& $tagged_title[0]->text != '' |
329 |
&& isset($tagged_title[0]->type); |
330 |
$lastAuthorElementString = FALSE; |
331 |
|
332 |
$name_encasement = $is_invalid ? '"' : ''; |
333 |
$doubtful_marker = $is_doubtful ? '? ' : ''; //   = NARROW NO-BREAK SPACE |
334 |
$doubtful_marker_markup = ''; |
335 |
|
336 |
if($doubtful_marker){ |
337 |
$doubtful_marker_markup = '<span class="doubtful">' . $doubtful_marker . '</span>'; |
338 |
if($tagged_title[0]->text == '?' ){ |
339 |
// remove the first tagged text element |
340 |
unset($tagged_title[0]); |
341 |
} |
342 |
} |
343 |
|
344 |
// split off all appendedPhrase item from the end of the array (usually there only should be one) |
345 |
while($tagged_title[count($tagged_title)-1]->type == "appendedPhrase"){ |
346 |
$appended_phrase_tagged_text[] = array_pop($tagged_title); |
347 |
} |
348 |
|
349 |
// Got to use second entry as first one, see ToDo comment below ... |
350 |
if ($is_valid_tagged_title) { |
351 |
|
352 |
$taggedName = $tagged_title; |
353 |
$hasNamePart_with_Authors = isset($renderTemplate['namePart']) && isset($renderTemplate['namePart']['authors']); |
354 |
$hasNameAuthorPart_with_Authors = isset($renderTemplate['nameAuthorPart']) && isset($renderTemplate['nameAuthorPart']['authors']); |
355 |
|
356 |
|
357 |
if (!(($hasNamePart_with_Authors) || ($hasNameAuthorPart_with_Authors))) { |
358 |
// Find author and split off from name. |
359 |
// TODO expecting to find the author as the last element. |
360 |
/* |
361 |
if($taggedName[count($taggedName)- 1]->type == 'authors'){ |
362 |
$authorTeam = $taggedName[count($taggedName)- 1]->text; |
363 |
unset($taggedName[count($taggedName)- 1]); |
364 |
} |
365 |
*/ |
366 |
|
367 |
// Remove all authors. |
368 |
$taggedNameNew = array(); |
369 |
foreach ($taggedName as $element) { |
370 |
if ($element->type != 'authors') { |
371 |
$taggedNameNew[] = $element; |
372 |
} |
373 |
else { |
374 |
$lastAuthorElementString = $element->text; |
375 |
} |
376 |
} |
377 |
$taggedName = $taggedNameNew; |
378 |
unset($taggedNameNew); |
379 |
} |
380 |
$name = '<span class="' . $taxonName->class . '">' . $doubtful_marker_markup . $name_encasement . cdm_tagged_text_to_markup($taggedName, $skiptags) . $name_encasement . '</span>'; |
381 |
} |
382 |
else { |
383 |
// use titleCache instead |
384 |
$name = '<span class="' . $taxonName->class . '_titleCache">' . $doubtful_marker_markup . $name_encasement . $taxonName->titleCache . $name_encasement . '</span>'; |
385 |
} |
386 |
|
387 |
|
388 |
if(isset($appended_phrase_tagged_text[0])){ |
389 |
$name .= ' <span class="appended-phrase">'. cdm_tagged_text_to_markup($appended_phrase_tagged_text) . '</span>'; |
390 |
} |
391 |
|
392 |
// Fill name into $renderTemplate. |
393 |
array_setr('name', $name , $renderTemplate); |
394 |
|
395 |
// Fill with authorTeam. |
396 |
/* |
397 |
if($authorTeam){ |
398 |
$authorTeamHtml = ' <span class="authorTeam">'.$authorTeam.'</span>'; |
399 |
array_setr('authorTeam', $authorTeamHtml, $renderTemplate); |
400 |
} |
401 |
*/ |
402 |
|
403 |
// Fill with reference. |
404 |
if (isset($renderTemplate['referencePart']) && !$is_type_designation) { |
405 |
|
406 |
$registrations = cdm_ws_get(CDM_WS_NAME, array($taxonName->uuid, "registrations")); |
407 |
$registration_markup = render_registrations($registrations); |
408 |
|
409 |
// default separator |
410 |
$separator = ''; |
411 |
|
412 |
// [Eckhard]:"Komma nach dem Taxonnamen ist grunsätzlich falsch, |
413 |
// Komma nach dem Autornamen ist überall dort falsch, wo ein "in" folgt." |
414 |
if (isset($renderTemplate['referencePart']['reference'])) { |
415 |
$microreference = NULL; |
416 |
if (isset($renderTemplate['referencePart']['microreference'])&& isset($taxonName->nomenclaturalMicroReference)) { |
417 |
$microreference = $taxonName->nomenclaturalMicroReference; |
418 |
} |
419 |
if(count($nomref_tagged_text) == 0 && isset($taxonName->nomenclaturalReference)){ |
420 |
// TODO is this case still relevant? The tagged text should already contain all information! |
421 |
$citation = cdm_ws_getNomenclaturalReference($taxonName->nomenclaturalReference->uuid, $microreference); |
422 |
// Find preceding element of the reference. |
423 |
$precedingKey = get_preceding_contentElementKey('reference', $renderTemplate); |
424 |
if (str_beginsWith($citation, ", in")) { |
425 |
$citation = substr($citation, 2); |
426 |
$separator = ' '; |
427 |
} |
428 |
elseif (!str_beginsWith($citation, "in") && $precedingKey == 'authors') { |
429 |
$separator = ', '; |
430 |
} else { |
431 |
$separator = ' '; |
432 |
} |
433 |
$referenceArray['#separator'] = $separator; |
434 |
$referenceArray['#html'] = '<span class="reference">' . $citation . '</span>' . $registration_markup; |
435 |
} else { |
436 |
// this ist the case for taxon names |
437 |
$referenceArray['#html'] = cdm_tagged_text_to_markup($nomref_tagged_text); |
438 |
} |
439 |
|
440 |
|
441 |
array_setr('reference', $referenceArray, $renderTemplate); |
442 |
} |
443 |
|
444 |
// If authors have been removed from the name part the last named authorteam |
445 |
// should be added to the reference citation, otherwise, keep the separator |
446 |
// out of the reference. |
447 |
if (isset($renderTemplate['referencePart']['authors']) && $lastAuthorElementString) { |
448 |
// If the nomenclaturalReference citation is not included in the |
449 |
// reference part but display of the microreference |
450 |
// is wanted, append the microreference to the authorTeam. |
451 |
$citation = ''; |
452 |
if (!isset($renderTemplate['referencePart']['reference']) && isset($renderTemplate['referencePart']['microreference'])) { |
453 |
$separator = ": "; |
454 |
$citation = $taxonName->nomenclaturalMicroReference; |
455 |
} |
456 |
$referenceArray['#html'] = ' <span class="reference">' . $lastAuthorElementString . $separator . $citation . '</span>'; |
457 |
array_setr('authors', $referenceArray, $renderTemplate); |
458 |
} |
459 |
} |
460 |
|
461 |
$is_reference_year = false; |
462 |
if (isset($renderTemplate['referenceYearPart']['reference.year'])) { |
463 |
if(isset($taxonName->nomenclaturalReference->datePublished)){ |
464 |
$referenceArray['#html'] = ' <span class="reference">' . timePeriodToString($taxonName->nomenclaturalReference->datePublished) . '</span>'; |
465 |
array_setr('reference.year', $referenceArray, $renderTemplate); |
466 |
$is_reference_year = true; |
467 |
} |
468 |
} |
469 |
|
470 |
// Fill with status. |
471 |
if(isset($renderTemplate['statusPart']['status'])){ |
472 |
if (isset($nom_status_tagged_text[0])) { |
473 |
$tt_to_markup_options = array('html' => false); |
474 |
foreach ($nom_status_tagged_text as &$tt){ |
475 |
if($tt->type == 'nomStatus'&& isset($tt->entityReference)) { |
476 |
$nom_status = cdm_ws_get(CDM_WS_NOMENCLATURALSTATUS, array($tt->entityReference->uuid)); |
477 |
$nom_status_fkey = nomenclatural_status_footnote_markup($nom_status); |
478 |
$tt->text .= $nom_status_fkey; |
479 |
$tt_to_markup_options['html'] = true; |
480 |
} |
481 |
} |
482 |
array_setr( |
483 |
'status', |
484 |
'<span class="nomenclatural_status">' . cdm_tagged_text_to_markup($nom_status_tagged_text, array('postSeparator'), 'span', $tt_to_markup_options) . '</span>', |
485 |
$renderTemplate); |
486 |
} |
487 |
} |
488 |
|
489 |
if (isset($renderTemplate['secReferencePart'])){ |
490 |
if(isset($secref_tagged_text[1])){ |
491 |
$post_separator_markup = $is_reference_year ? '.': ''; |
492 |
if(isset($nom_status_tagged_text[count($nom_status_tagged_text) - 1]) && ($nom_status_tagged_text[count($nom_status_tagged_text) - 1]->type == 'postSeparator')){ |
493 |
$post_separator_markup = cdm_tagged_text_to_markup(array($nom_status_tagged_text[count($nom_status_tagged_text) - 1 ])); |
494 |
}; |
495 |
array_setr('secReference', |
496 |
$post_separator_markup |
497 |
. ' <span class="sec_reference">' |
498 |
. join('', cdm_tagged_text_values($secref_tagged_text)) |
499 |
. '</span>', $renderTemplate); |
500 |
} |
501 |
} |
502 |
|
503 |
// Fill with protologues etc... |
504 |
$descriptionHtml = ''; |
505 |
if (array_setr('description', TRUE, $renderTemplate)) { |
506 |
$descriptions = cdm_ws_get(CDM_WS_PORTAL_NAME_DESCRIPTIONS, $taxonName->uuid); |
507 |
if($descriptions){ |
508 |
foreach ($descriptions as $description) { |
509 |
if (!empty($description)) { |
510 |
foreach ($description->elements as $description_element) { |
511 |
$second_citation = ''; |
512 |
if (isset($description_element->multilanguageText_L10n) && $description_element->multilanguageText_L10n->text) { |
513 |
if(isset($description_element->feature) && $description_element->feature->uuid == UUID_ADDITIONAL_PUBLICATION){ |
514 |
$prefix = '& '; |
515 |
} else { |
516 |
$prefix = ''; |
517 |
} |
518 |
$second_citation = ' [' . $prefix . $description_element->multilanguageText_L10n->text . '].'; |
519 |
} |
520 |
$descriptionHtml .= $second_citation; |
521 |
$descriptionHtml .= cdm_description_element_media( |
522 |
$description_element, |
523 |
array( |
524 |
'application/pdf', |
525 |
'image/png', |
526 |
'image/jpeg', |
527 |
'image/gif', |
528 |
'text/html', |
529 |
) |
530 |
); |
531 |
|
532 |
} |
533 |
} |
534 |
} |
535 |
} |
536 |
array_setr('description', $descriptionHtml, $renderTemplate); |
537 |
} |
538 |
|
539 |
// Render. |
540 |
$out = ''; |
541 |
if(isset($_REQUEST['RENDER_PATH'])){ |
542 |
// developer option to show the render path with each taxon name |
543 |
$out .= '<span class="render-path">' . RenderHints::getRenderPath() . '</span>'; |
544 |
} |
545 |
$out .= '<span class="' . html_class_attribute_ref($taxon_name_or_taxon_base) |
546 |
. '" data-cdm-ref="/name/' . $taxonName->uuid . '" data-cdm-render-path="' . RenderHints::getRenderPath() .'">'; |
547 |
|
548 |
foreach ($renderTemplate as $partName => $part) { |
549 |
$separator = ''; |
550 |
$partHtml = ''; |
551 |
$uri = FALSE; |
552 |
if (!is_array($part)) { |
553 |
continue; |
554 |
} |
555 |
if (isset($part['#uri']) && is_string($part['#uri'])) { |
556 |
$uri = $part['#uri']; |
557 |
unset($part['#uri']); |
558 |
} |
559 |
foreach ($part as $key => $content) { |
560 |
$html = ''; |
561 |
if (is_array($content)) { |
562 |
$html = $content['#html']; |
563 |
if(isset($content['#separator'])) { |
564 |
$separator = $content['#separator']; |
565 |
} |
566 |
} |
567 |
elseif (is_string($content)) { |
568 |
$html = $content; |
569 |
} |
570 |
$partHtml .= '<span class="' . $key . '">' . $html . '</span>'; |
571 |
} |
572 |
if ($uri) { |
573 |
// cannot use l() here since the #uri aleady should have been processed through uri() at this point |
574 |
$out .= $separator . '<a href="' . $uri . '" class="' . $partName . '">' . $partHtml . '</a>'; |
575 |
|
576 |
} |
577 |
else { |
578 |
$out .= $separator . $partHtml; |
579 |
} |
580 |
} |
581 |
$out .= '</span>'; |
582 |
if ($show_annotations) { |
583 |
// $out .= theme('cdm_entities_annotations_as_footnotekeys', $taxonName); |
584 |
} |
585 |
return $out; |
586 |
} |
587 |
|
588 |
|
589 |
|
590 |
/** |
591 |
* Composes information for a registration from a dto object. |
592 |
* |
593 |
* Registrations which are not yet published are suppressed. |
594 |
* |
595 |
* @param $registration_dto |
596 |
* @param $with_citation |
597 |
* Whether to show the citation. |
598 |
* |
599 |
* @return array |
600 |
* A drupal render array with the elements: |
601 |
* - 'name' |
602 |
* - 'name-relations' |
603 |
* - 'specimen_type_designations' |
604 |
* - 'name_type_designations' |
605 |
* - 'citation' |
606 |
* - 'registration_date_and_institute' |
607 |
* @ingroup compose |
608 |
*/ |
609 |
function compose_registration_dto_full($registration_dto, $with_citation = true) |
610 |
{ |
611 |
$render_array = array( |
612 |
'#prefix' => '<div class="registration">', |
613 |
'#suffix' => '</div>' |
614 |
); |
615 |
|
616 |
if(!(isset($registration_dto->identifier) && $registration_dto->status == 'PUBLISHED')){ |
617 |
return $render_array; |
618 |
} |
619 |
|
620 |
$render_array['sub_headline'] = markup_to_render_array(join(", ", registration_types($registration_dto)),-10, '<h3 class="registration_type">' . t('Event: '), '</h3>' ); |
621 |
$render_array['nomenclatural_act'] = array( |
622 |
'#weight' => 0, |
623 |
'#prefix' => '<div class="nomenclatural_act">', |
624 |
|
625 |
'#suffix' => '</div>' |
626 |
); |
627 |
|
628 |
// name |
629 |
$name_relations = null; |
630 |
if($registration_dto->nameRef){ |
631 |
$name = cdm_ws_get(CDM_WS_PORTAL_NAME, $registration_dto->nameRef->uuid); |
632 |
cdm_load_tagged_full_title($name); |
633 |
$render_array['nomenclatural_act']['published_name'] = markup_to_render_array('<div class="published-name">' . render_taxon_or_name($name, url(path_to_name($name->uuid))) . '</div>', 0); |
634 |
$name_relations = cdm_ws_fetch_all(str_replace("$0", $registration_dto->nameRef->uuid, CDM_WS_PORTAL_NAME_NAME_RELATIONS)); |
635 |
// need to create the name relationships later, so that the foot notes are in correct order, see section // name relations |
636 |
} else { |
637 |
// in this case the registration must have a |
638 |
$name = cdm_ws_get(CDM_WS_PORTAL_NAME, $registration_dto->typifiedNameRef->uuid); |
639 |
$render_array['typified_name'] = markup_to_render_array('<p class="typified-name">for ' . render_taxon_or_name($name, url(path_to_name($name->uuid))) . '</p>', 40); |
640 |
} |
641 |
|
642 |
// typedesignation in detail |
643 |
if(is_object($registration_dto->orderdTypeDesignationWorkingSets)) { |
644 |
$field_unit_uuids = array(); |
645 |
$specimen_type_designation_refs = array(); |
646 |
$name_type_designation_refs = array(); |
647 |
foreach ((array)$registration_dto->orderdTypeDesignationWorkingSets as $workingset_ref => $obj) { |
648 |
$tokens = explode("#", $workingset_ref); |
649 |
$types_in_fieldunit = get_object_vars($obj); // convert into associative array |
650 |
|
651 |
if ($tokens[0] == 'NameTypeDesignation') { |
652 |
foreach ($types_in_fieldunit as $type_status => $entity_reference_list) { |
653 |
if(!isset($name_type_designation_refs[$type_status])){ |
654 |
$name_type_designation_refs[$type_status] = $entity_reference_list; |
655 |
} else { |
656 |
array_push($name_type_designation_refs[$type_status] ,$entity_reference_list); |
657 |
} |
658 |
} |
659 |
} else if ($tokens[0] == 'FieldUnit'){ |
660 |
$field_unit_uuids[] = $tokens[1]; |
661 |
foreach ($types_in_fieldunit as $type_status => $entity_reference_list) { |
662 |
if(!isset($specimen_type_designation_refs[$type_status])){ |
663 |
$specimen_type_designation_refs[$type_status] = $entity_reference_list; |
664 |
} else { |
665 |
array_push($specimen_type_designation_refs[$type_status], $entity_reference_list); |
666 |
} |
667 |
} |
668 |
} else { |
669 |
drupal_set_message("Unimplemented type: " . $tokens[0], 'error'); |
670 |
} |
671 |
} |
672 |
// type designations which are in this nomenclatural act. |
673 |
if (count($name_type_designation_refs) > 0) { |
674 |
$render_array['nomenclatural_act']['name_type_designations'] = compose_name_type_designations($name_type_designation_refs); |
675 |
$render_array['nomenclatural_act']['name_type_designations']['#prefix'] = '<p class="name_type_designations">'; |
676 |
$render_array['nomenclatural_act']['name_type_designations']['#suffix'] = '</p>'; |
677 |
$render_array['nomenclatural_act']['name_type_designations']['#weight'] = 20; |
678 |
} |
679 |
if (count($field_unit_uuids) > 0) { |
680 |
$specimen_type_designations_array = compose_specimen_type_designations($specimen_type_designation_refs, true); |
681 |
$render_array['nomenclatural_act']['specimen_type_designations'] = $specimen_type_designations_array['type_designations']; |
682 |
$render_array['map'] = $specimen_type_designations_array['map']; |
683 |
$render_array['map']['#weight'] = $render_array['nomenclatural_act']['#weight'] + 20; |
684 |
} |
685 |
} |
686 |
|
687 |
// name relations |
688 |
if($name_relations){ |
689 |
$render_array['nomenclatural_act']['name_relations'] = compose_name_relationships_list($name_relations, $registration_dto->nameRef->uuid, null); |
690 |
$render_array['nomenclatural_act']['name_relations']['#weight'] = 10; |
691 |
} |
692 |
|
693 |
// citation |
694 |
if ($with_citation) { |
695 |
$render_array['citation'] = markup_to_render_array( |
696 |
"<div class=\"citation nomenclatural_act_citation" . html_class_attribute_ref(new TypedEntityReference("Reference", $registration_dto->citationUuid)) . "\">" |
697 |
. "<span class=\"label\">published in: </span>" |
698 |
. $registration_dto->bibliographicInRefCitationString |
699 |
. l(custom_icon_font_markup('icon-interal-link-alt-solid', array('class' => array('superscript'))), path_to_reference($registration_dto->citationUuid), array('html' => true)) |
700 |
. "</div>", |
701 |
$render_array['nomenclatural_act']['#weight'] + 10 ); |
702 |
} |
703 |
|
704 |
$render_array['nomenclatural_act']['footnotes'] = markup_to_render_array(render_cdm_footnotes(), |
705 |
100 |
706 |
); |
707 |
|
708 |
// registration date and office |
709 |
$registration_date_insitute_markup = render_registration_date_and_institute($registration_dto); |
710 |
if($registration_date_insitute_markup){ |
711 |
$render_array['registration_date_and_institute'] = markup_to_render_array( |
712 |
$registration_date_insitute_markup . '</p>', |
713 |
100); |
714 |
} |
715 |
|
716 |
|
717 |
return $render_array; |
718 |
} |
719 |
|
720 |
|
721 |
/** |
722 |
* Composes a compact representation for a registrationDTO object |
723 |
* |
724 |
* Registrations which are not yet published are suppressed. |
725 |
* |
726 |
* @param $registration_dto |
727 |
* @param $style string |
728 |
* The style of how to compose the 'identifier' and 'registration_date_and_institute' part with the summary |
729 |
* - 'citation': Similar to the arrearance of nomenclatural acts in print media |
730 |
* - 'list-item' : style suitable for result lists etc |
731 |
* |
732 |
* @return array |
733 |
* A drupal render array with the elements: |
734 |
* - 'registration-metadata' when $style == 'list-item' |
735 |
* - 'summary' |
736 |
* @ingroup compose |
737 |
*/ |
738 |
function compose_registration_dto_compact($registration_dto, $style = 'citation', $tag_enclosing_summary = 'p') |
739 |
{ |
740 |
$render_array = array(); |
741 |
$media_link_map = array(); |
742 |
|
743 |
if(!(isset($registration_dto->identifier) && $registration_dto->status == 'PUBLISHED')){ |
744 |
return $render_array; |
745 |
} |
746 |
|
747 |
$registration_date_insitute_markup = render_registration_date_and_institute($registration_dto, 'span'); |
748 |
$itentifier_markup = l($registration_dto->identifier, path_to_registration($registration_dto->identifier), array('attributes' => array('class' => array('identifier')))); |
749 |
|
750 |
$tagged_text_options = array(); |
751 |
if(isset($registration_dto->nameRef)){ |
752 |
$tagged_text_options[] = array( |
753 |
'filter-type' => 'name', |
754 |
'prefix' => '<span class="registered_name">', |
755 |
'suffix' => '</span>', |
756 |
); |
757 |
} else { |
758 |
$tagged_text_options[] = array( |
759 |
'filter-type' => 'name', |
760 |
'prefix' => '<span class="referenced_typified_name">', |
761 |
'suffix' => '</span>', |
762 |
); |
763 |
} |
764 |
cdm_tagged_text_add_options($registration_dto->summaryTaggedText, $tagged_text_options); |
765 |
$taggged_text_expanded = cdm_tagged_text_expand_entity_references($registration_dto->summaryTaggedText); |
766 |
foreach ($taggged_text_expanded as $tagged_text){ |
767 |
if(isset($tagged_text->entityReference->type) && $tagged_text->entityReference->type == 'SpecimenTypeDesignation') { |
768 |
$mediaDTOs = cdm_ws_get('typedesignation/$0/media', array($tagged_text->entityReference->uuid)); |
769 |
if(isset($mediaDTOs[0]->uri)){ |
770 |
$media_url_key = '{link-' . $mediaDTOs[0]->uuid . '}'; |
771 |
$tagged_text->text = str_replace('[icon]', '[icon]' . $media_url_key, $tagged_text->text); |
772 |
$media_link_map[$media_url_key] = cdm_external_uri($mediaDTOs[0]->uri, true); |
773 |
} |
774 |
} |
775 |
} |
776 |
$registation_markup = cdm_tagged_text_to_markup($taggged_text_expanded); |
777 |
foreach($media_link_map as $media_url_key => $link){ |
778 |
$registation_markup = str_replace($media_url_key, $link, $registation_markup); |
779 |
} |
780 |
if($style == 'citation') { |
781 |
$registation_markup = $registation_markup . ' ' . $itentifier_markup . ' ' . $registration_date_insitute_markup; |
782 |
} else { |
783 |
$render_array['registration-metadata'] = markup_to_render_array('<div class="registration-metadata">' . $itentifier_markup . ' ' . $registration_date_insitute_markup. "</div>", -10); |
784 |
} |
785 |
$render_array['summary'] = markup_to_render_array('<' . $tag_enclosing_summary . ' class="registration-summary">' . $registation_markup . '</' . $tag_enclosing_summary . '>', 0); |
786 |
|
787 |
return $render_array; |
788 |
} |
789 |
|
790 |
|
791 |
/** |
792 |
* Renders the registrationDate and institutionTitleCache of the $registration_dto as markup. |
793 |
* |
794 |
* @param $registration_dto |
795 |
* @return string |
796 |
* The markup or an empty string |
797 |
*/ |
798 |
function render_registration_date_and_institute($registration_dto, $enclosing_tag = 'p') { |
799 |
$registration_date_institute_markup = ''; |
800 |
if ($registration_dto->registrationDate) { |
801 |
$date_string = format_datetime($registration_dto->registrationDate); |
802 |
if (isset($registration_dto->institutionTitleCache) && $registration_dto->institutionTitleCache) { |
803 |
$registration_date_institute_markup = |
804 |
t("Registration on @date in @institution", array( |
805 |
'@date' => $date_string, |
806 |
'@institution' => $registration_dto->institutionTitleCache, |
807 |
)); |
808 |
} else { |
809 |
$registration_date_institute_markup = |
810 |
t("Registration on @date", array( |
811 |
'@date' => $date_string |
812 |
)); |
813 |
} |
814 |
$registration_date_institute_markup = '<' .$enclosing_tag . ' class="registration-date-and-institute">'. $registration_date_institute_markup . '</' .$enclosing_tag . '>'; |
815 |
} |
816 |
return $registration_date_institute_markup; |
817 |
} |
818 |
|
819 |
|
820 |
/** |
821 |
* @param $registrations |
822 |
* @return string |
823 |
*/ |
824 |
function render_registrations($registrations) |
825 |
{ |
826 |
$registration_markup = ''; |
827 |
$registration_markup_array = array(); |
828 |
if ($registrations) { |
829 |
foreach ($registrations as $reg) { |
830 |
$registration_markup_array[] = render_registration($reg); |
831 |
} |
832 |
$registration_markup = " Registration" . (count($registration_markup_array) > 1 ? 's: ' : ': ') |
833 |
. join(', ', $registration_markup_array); |
834 |
} |
835 |
return $registration_markup; |
836 |
} |
837 |
|
838 |
|
839 |
/** |
840 |
* Renders a registration |
841 |
* |
842 |
* TODO replace by compose_registration_dto_compact |
843 |
* @param $registration |
844 |
*/ |
845 |
function render_registration($registration){ |
846 |
$markup = ''; |
847 |
|
848 |
if(isset($registration->identifier) && $registration->status == 'PUBLISHED'){ |
849 |
$office_class_attribute = ''; |
850 |
if(isset($registration->institution->titleCache)){ |
851 |
$office_class_attribute = registration_intitute_class_attribute($registration); |
852 |
} |
853 |
$markup = "<span class=\"registration $office_class_attribute\">" . l($registration->identifier, path_to_registration($registration->identifier)) . ', ' |
854 |
. preg_replace('/^([^T]*)(.*)$/', '${1}', $registration->registrationDate) |
855 |
. '</span>'; |
856 |
} |
857 |
return $markup; |
858 |
} |
859 |
|
860 |
/** |
861 |
* @param $registration |
862 |
* @return string |
863 |
*/ |
864 |
function registration_intitute_class_attribute($registration_dto) |
865 |
{ |
866 |
if(isset($registration_dto->institutionTitleCache)){ |
867 |
$institutionTitleCache = $registration_dto->institutionTitleCache; |
868 |
} else { |
869 |
// fall back option to also support cdm entities |
870 |
$institutionTitleCache = @$registration_dto->institution->titleCache; |
871 |
} |
872 |
return $institutionTitleCache ? 'registration-' . strtolower(preg_replace('/[^a-zA-Z0-9]/', '-', $institutionTitleCache)) : ''; |
873 |
} |
874 |
|
875 |
|
876 |
/** |
877 |
* Renders and array of CDM TypeDesignations |
878 |
* |
879 |
* - NameTypeDesignation |
880 |
* - SpecimenTypeDesignation |
881 |
* - TextualTypeDesignation |
882 |
* |
883 |
* @param object $type_designations an array of cdm TypeDesignation entities |
884 |
* to render |
885 |
* @param string $enclosing_tag the tag element type to enclose the whole list |
886 |
* of type designation with. By default this DOM element is <ul> |
887 |
* @param string $element_tag the tag element type to be used for each |
888 |
* type designation item. |
889 |
* @param bool $link_to_specimen_page whether a specimen in type designation element |
890 |
* should be a link or not. |
891 |
* |
892 |
* @return string The markup. |
893 |
* |
894 |
* @InGroup Render |
895 |
*/ |
896 |
function render_type_designations($type_designations, $enclosing_tag = 'ul', $element_tag = 'li', $link_to_specimen_page = true) { |
897 |
|
898 |
// need to add element to render path since type designations |
899 |
// need other name render template |
900 |
RenderHints::pushToRenderStack('typedesignations'); |
901 |
|
902 |
$out = '<' . $enclosing_tag .' class="typeDesignations">'; |
903 |
$specimen_type_designations = array(); |
904 |
$name_type_designations = array(); |
905 |
$textual_type_designations = array(); |
906 |
$separator = ','; |
907 |
|
908 |
foreach ($type_designations as $type_designation) { |
909 |
switch ($type_designation->class) { |
910 |
case 'SpecimenTypeDesignation': |
911 |
$specimen_type_designations[] = $type_designation; |
912 |
break; |
913 |
case 'NameTypeDesignation': |
914 |
$name_type_designations[] = $type_designation; |
915 |
break; |
916 |
case 'TextualTypeDesignation': |
917 |
$textual_type_designations[] = $type_designation; |
918 |
break; |
919 |
default: throw new Exception('Unknown type designation class: ' . $type_designation->class); |
920 |
} |
921 |
} |
922 |
|
923 |
// NameTypeDesignation .................................. |
924 |
if(!empty($name_type_designations)){ |
925 |
usort($name_type_designations, "compare_type_designations_by_status"); |
926 |
foreach($name_type_designations as $name_type_designation){ |
927 |
if ($name_type_designation->notDesignated) { |
928 |
$out .= '<'. $element_tag .' class="' . html_class_attribute_ref($name_type_designation) . '">' . type_designation_status_label_markup($name_type_designation) . ': ' |
929 |
. t('not designated') . '</'. $element_tag .'>'; |
930 |
} |
931 |
elseif (isset($name_type_designation->typeName)) { |
932 |
$link_to_name_page = url(path_to_name($name_type_designation->typeName->uuid)); |
933 |
$out .= '<'. $element_tag .' class="' . html_class_attribute_ref($name_type_designation) . '">' . type_designation_status_label_markup($name_type_designation) ; |
934 |
|
935 |
if (!empty($name_type_designation->citation)) { |
936 |
$out .= type_designation_citation_layout($name_type_designation, $separator); // TODO type_designation_citation_layout() needs most probably to be replaced |
937 |
|
938 |
} |
939 |
$referenceUri = ''; |
940 |
if (isset($name_type_designation->typeName->nomenclaturalReference)) { |
941 |
$referenceUri = url(path_to_reference($name_type_designation->typeName->nomenclaturalReference->uuid)); |
942 |
} |
943 |
$out .= ': ' . render_taxon_or_name($name_type_designation->typeName, $link_to_name_page, $referenceUri, TRUE, TRUE); |
944 |
} |
945 |
$annotations_and_sources = handle_annotations_and_sources( |
946 |
$name_type_designation, |
947 |
typedesignations_annotations_and_sources_config(), |
948 |
'', |
949 |
RenderHints::getFootnoteListKey()); |
950 |
$out .= $annotations_and_sources['foot_note_keys']; |
951 |
} |
952 |
} // END NameTypeDesignation |
953 |
|
954 |
// SpecimenTypeDesignation ................................... |
955 |
if (!empty($specimen_type_designations)) { |
956 |
usort($specimen_type_designations, "compare_specimen_type_designation"); |
957 |
foreach ($specimen_type_designations as $specimen_type_designation) { |
958 |
$type_citation_markup = ''; |
959 |
|
960 |
if (!empty($specimen_type_designation->citation)) { |
961 |
|
962 |
$citation_footnote_str = cdm_reference_markup($specimen_type_designation->citation, null, false, true); |
963 |
$author_team = cdm_ws_get(CDM_WS_REFERENCE_AUTHORTEAM, $specimen_type_designation->citation->uuid); |
964 |
|
965 |
if (!empty($author_team->titleCache)) { |
966 |
$year = @timePeriodToString($specimen_type_designation->citation->datePublished, true, 'YYYY'); |
967 |
$authorteam_str = $author_team->titleCache . ($year ? ' ' : '') . $year; |
968 |
if ($authorteam_str == $specimen_type_designation->citation->titleCache) { |
969 |
$citation_footnote_str = ''; |
970 |
} |
971 |
} else { |
972 |
$authorteam_str = $citation_footnote_str; |
973 |
// no need for a footnote in case in case it is used as replacement for missing author teams |
974 |
$citation_footnote_str = ''; |
975 |
} |
976 |
|
977 |
// for being registered a typedesignation MUST HAVE a citation, so it is save to handle the |
978 |
// Registration output in if condition checking if the citation is present |
979 |
$registration_markup = render_registrations($specimen_type_designation->registrations); |
980 |
$citation_footnote_str .= ($citation_footnote_str ? ' ' : '') . $registration_markup; |
981 |
|
982 |
$footnote_key_markup = ''; |
983 |
if ($citation_footnote_str) { |
984 |
// footnotes should be rendered in the parent element so we |
985 |
// are relying on the FootnoteListKey set there |
986 |
$_fkey2 = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), $citation_footnote_str); |
987 |
$footnote_key_markup = theme('cdm_footnote_key', array( |
988 |
'footnoteKey' => $_fkey2, |
989 |
'separator' => $separator, |
990 |
'highlightable' => TRUE, |
991 |
'separator_off' => TRUE, |
992 |
)); |
993 |
|
994 |
} |
995 |
|
996 |
$type_citation_markup .= ' (' . t('designated by') . ' <span class="typeReference">' . $authorteam_str . '</span>'; |
997 |
if (!empty($specimen_type_designation->citationMicroReference)) { |
998 |
$type_citation_markup .= ': ' . trim($specimen_type_designation->citationMicroReference); |
999 |
} |
1000 |
$type_citation_markup .= $footnote_key_markup . ')'; |
1001 |
|
1002 |
} |
1003 |
|
1004 |
|
1005 |
$out .= '<'. $element_tag .' class="' . html_class_attribute_ref($specimen_type_designation) . '">'; |
1006 |
$out .= type_designation_status_label_markup($specimen_type_designation) . $type_citation_markup; |
1007 |
|
1008 |
|
1009 |
$derivedUnitFacadeInstance = null; |
1010 |
if (isset($specimen_type_designation->typeSpecimen)) { |
1011 |
$derivedUnitFacadeInstance = cdm_ws_get(CDM_WS_DERIVEDUNIT_FACADE, $specimen_type_designation->typeSpecimen->uuid); |
1012 |
} |
1013 |
|
1014 |
if (!empty($derivedUnitFacadeInstance->titleCache)) { |
1015 |
$specimen_markup = $derivedUnitFacadeInstance->titleCache; |
1016 |
if($link_to_specimen_page && isset($derivedUnitFacadeInstance->specimenLabel) && $derivedUnitFacadeInstance->specimenLabel){ |
1017 |
$specimen_markup = str_replace($derivedUnitFacadeInstance->specimenLabel, l($derivedUnitFacadeInstance->specimenLabel, path_to_specimen($specimen_type_designation->typeSpecimen->uuid)), $specimen_markup); |
1018 |
} |
1019 |
$annotations_and_sources = handle_annotations_and_sources( |
1020 |
$derivedUnitFacadeInstance, |
1021 |
typedesignations_annotations_and_sources_config(), |
1022 |
'', |
1023 |
RenderHints::getFootnoteListKey() |
1024 |
); |
1025 |
$out .= ': <span class="' . html_class_attribute_ref($specimen_type_designation->typeSpecimen) . '">' |
1026 |
. $specimen_markup |
1027 |
. '</span>'; // . ': ' . theme('cdm_specimen', array('specimenTypeDesignation' => $derivedUnitFacadeInstance)); |
1028 |
if(!empty($derivedUnitFacadeInstance->preferredStableUri)){ |
1029 |
$out .= ' ' . l($derivedUnitFacadeInstance->preferredStableUri, $derivedUnitFacadeInstance->preferredStableUri, array('absolute' => true)); |
1030 |
} |
1031 |
$out .= $annotations_and_sources['foot_note_keys']; |
1032 |
} |
1033 |
|
1034 |
|
1035 |
$out .= '</'. $element_tag .'>'; |
1036 |
|
1037 |
} |
1038 |
} // END Specimen type designations |
1039 |
|
1040 |
// TextualTypeDesignation ......................... |
1041 |
usort($textual_type_designations, 'compare_textual_type_designation'); |
1042 |
if(!empty($textual_type_designations)) { |
1043 |
foreach ($textual_type_designations as $textual_type_designation) { |
1044 |
$annotations_and_sources = handle_annotations_and_sources( |
1045 |
$textual_type_designation, |
1046 |
array( |
1047 |
'sources_as_content' => false, // as footnotes |
1048 |
'link_to_name_used_in_source' => false, |
1049 |
'link_to_reference' => true, |
1050 |
'add_footnote_keys' => true, |
1051 |
'bibliography_aware' => false |
1052 |
), |
1053 |
'', |
1054 |
RenderHints::getFootnoteListKey() // passing a defined key to avoid a separate annotation footnote key see https://dev.e-taxonomy.eu/redmine/issues/8543 |
1055 |
); |
1056 |
$encasement = $textual_type_designation->verbatim ? '"' : ''; |
1057 |
$out .= '<' . $element_tag . ' class="' . html_class_attribute_ref($textual_type_designation) . '">' . type_designation_status_label_markup(null) |
1058 |
. ': ' . $encasement . trim($textual_type_designation->text_L10n->text) . $encasement . $annotations_and_sources['foot_note_keys'] .'</' . $element_tag . '>'; |
1059 |
// if(is_array( $annotations_and_sources['source_references'])){ |
1060 |
// $citation_markup = join(', ', $annotations_and_sources['source_references']); |
1061 |
// } |
1062 |
// $out .= $citation_markup; |
1063 |
} |
1064 |
} |
1065 |
|
1066 |
// Footnotes for citations, collection acronyms. |
1067 |
// footnotes should be rendered in the parent element so we |
1068 |
// are relying on the FootnoteListKey set there |
1069 |
$_fkey = FootnoteManager::addNewFootnote( |
1070 |
RenderHints::getFootnoteListKey(), |
1071 |
(isset($derivedUnitFacadeInstance->collection->titleCache) ? $derivedUnitFacadeInstance->collection->titleCache : FALSE) |
1072 |
); |
1073 |
$out .= theme('cdm_footnote_key', array('footnoteKey' => $_fkey, 'separator' => $separator)); |
1074 |
$out .= '</' . $enclosing_tag .'>'; |
1075 |
|
1076 |
RenderHints::popFromRenderStack(); |
1077 |
|
1078 |
return $out; |
1079 |
} |
1080 |
|
1081 |
|
1082 |
/** |
1083 |
* Composes the textual representation for the type designation of taxon name identified by the uuid in with a map for the location data. |
1084 |
* |
1085 |
* @param $taxon_name_uuid |
1086 |
* @param $show_specimen_details |
1087 |
* @return array |
1088 |
* A drupal render array with the following elements: |
1089 |
* - 'type_designations' |
1090 |
* - 'map' |
1091 |
* - 'specimens' |
1092 |
* |
1093 |
* @ingroup compose |
1094 |
*/ |
1095 |
function compose_type_designations($taxon_name_uuid, $show_specimen_details = false) |
1096 |
{ |
1097 |
$render_array = array( |
1098 |
'type_designations' => array(), |
1099 |
'map' => array(), |
1100 |
); |
1101 |
$type_designations = cdm_ws_get(CDM_WS_PORTAL_NAME_TYPEDESIGNATIONS, $taxon_name_uuid); |
1102 |
if ($type_designations) { |
1103 |
usort($type_designations, 'compare_specimen_type_designation'); |
1104 |
$render_array['type_designations'] = markup_to_render_array( |
1105 |
render_type_designations($type_designations, 'div', 'div') |
1106 |
); |
1107 |
|
1108 |
$render_array['map'] = compose_type_designations_map($type_designations); |
1109 |
} |
1110 |
return $render_array; |
1111 |
} |
1112 |
|
1113 |
|
1114 |
/** |
1115 |
* Composes the TypedEntityReference to name type designations passed as associatve array. |
1116 |
* |
1117 |
* @param $type_entity_refs_by_status array |
1118 |
* an associative array of name type type => TypedEntityReference for name type designations as |
1119 |
* produced by the eu.etaxonomy.cdm.api.service.name.TypeDesignationSetManager |
1120 |
* |
1121 |
* @ingroup compose |
1122 |
*/ |
1123 |
function compose_name_type_designations($type_entity_refs_by_status){ |
1124 |
$render_array = array(); |
1125 |
$preferredStableUri = ''; |
1126 |
foreach($type_entity_refs_by_status as $type_status => $name_type_entityRefs){ |
1127 |
foreach ($name_type_entityRefs as $name_type_entity_ref){ |
1128 |
$type_designation = cdm_ws_get(CDM_WS_TYPEDESIGNATION, array($name_type_entity_ref->uuid, 'preferredUri')); |
1129 |
$footnote_keys = ''; |
1130 |
|
1131 |
if(isset($type_designation->typeSpecimen->preferredStableUri) && $type_designation->typeSpecimen->preferredStableUri){ |
1132 |
$preferredStableUri = $type_designation->typeSpecimen->preferredStableUri; |
1133 |
} |
1134 |
// annotations and sources for the $derived_unit_facade_dto |
1135 |
$annotations_and_sources = handle_annotations_and_sources( |
1136 |
$name_type_entity_ref, |
1137 |
typedesignations_annotations_and_sources_config(), |
1138 |
'', |
1139 |
RenderHints::getFootnoteListKey() |
1140 |
); |
1141 |
|
1142 |
$render_array[] = markup_to_render_array('<div class="name_type_designation ' . html_class_attribute_ref($name_type_entity_ref) . '"><span class="type-status">'. ucfirst($type_status) . "</span>: " |
1143 |
. $name_type_entity_ref->label |
1144 |
. ($preferredStableUri ? " ". l($preferredStableUri, $preferredStableUri) : '') |
1145 |
. $annotations_and_sources['foot_note_keys'] |
1146 |
. '</div>'); |
1147 |
} |
1148 |
} |
1149 |
return $render_array; |
1150 |
} |
1151 |
|
1152 |
/** |
1153 |
* Composes the specimen type designations with map from the the $type_entity_refs |
1154 |
* |
1155 |
* @param $type_entity_refs array |
1156 |
* an associative array of specimen type type => TypedEntityReference for specimen type designations as |
1157 |
* produced by the eu.etaxonomy.cdm.api.service.name.TypeDesignationSetManager |
1158 |
* |
1159 |
* @param $show_media_specimen |
1160 |
* @return array |
1161 |
* A drupal render array with the following elements: |
1162 |
* - 'type_designations' |
1163 |
* - 'map' |
1164 |
* |
1165 |
* @ingroup compose |
1166 |
* |
1167 |
*/ |
1168 |
function compose_specimen_type_designations($type_entity_refs, $show_media_specimen){ |
1169 |
|
1170 |
$render_array = array(); |
1171 |
|
1172 |
$type_designation_list = array(); |
1173 |
uksort($type_entity_refs, "compare_type_designation_status_labels"); |
1174 |
foreach($type_entity_refs as $type_status => $type_designation_entity_refs){ |
1175 |
foreach($type_designation_entity_refs as $type_designation_entity_ref){ |
1176 |
|
1177 |
$type_designation = cdm_ws_get(CDM_WS_PORTAL_TYPEDESIGNATION, array($type_designation_entity_ref->uuid)); |
1178 |
$type_designation_list[] = $type_designation; // collect for the map |
1179 |
|
1180 |
$derived_unit_facade_dto = cdm_ws_get(CDM_WS_PORTAL_DERIVEDUNIT_FACADE, $type_designation->typeSpecimen->uuid); |
1181 |
// the media specimen is not contained in the $type_designation returned by CDM_PORTAL_TYPEDESIGNATION, so we need to fetch it separately |
1182 |
$mediaSpecimen = cdm_ws_get(CDM_WS_PORTAL_OCCURRENCE, array($type_designation->typeSpecimen->uuid, 'mediaSpecimen')); |
1183 |
|
1184 |
|
1185 |
$preferredStableUri = ''; |
1186 |
$citation_markup = ''; |
1187 |
$media = ''; |
1188 |
|
1189 |
// annotations and sources for the $derived_unit_facade_dto |
1190 |
$annotations_and_sources = handle_annotations_and_sources( |
1191 |
$derived_unit_facade_dto, |
1192 |
typedesignations_annotations_and_sources_config(), |
1193 |
'', |
1194 |
RenderHints::getFootnoteListKey() |
1195 |
); |
1196 |
$source_citations = $annotations_and_sources['source_references']; |
1197 |
$foot_note_keys = $annotations_and_sources['foot_note_keys']; |
1198 |
|
1199 |
// preferredStableUri |
1200 |
if(isset($type_designation->typeSpecimen->preferredStableUri) && $type_designation->typeSpecimen->preferredStableUri){ |
1201 |
$preferredStableUri = $type_designation->typeSpecimen->preferredStableUri; |
1202 |
} |
1203 |
|
1204 |
if($show_media_specimen && $mediaSpecimen){ |
1205 |
// compose output |
1206 |
// mediaURI |
1207 |
if(isset($mediaSpecimen->representations[0])) { |
1208 |
$gallery_settings = getGallerySettings(CDM_DATAPORTAL_SPECIMEN_GALLERY_NAME); |
1209 |
$captionElements = array( |
1210 |
'#uri' => t('open media'), |
1211 |
'elements' => array('-none-'), |
1212 |
'sources_as_content' => true |
1213 |
); |
1214 |
$media = compose_cdm_media_gallerie(array( |
1215 |
'mediaList' => array($mediaSpecimen), |
1216 |
'galleryName' => CDM_DATAPORTAL_TYPE_SPECIMEN_GALLERY_NAME . '_' . $type_designation_entity_ref->uuid, |
1217 |
'maxExtend' => $gallery_settings['cdm_dataportal_media_maxextend'], |
1218 |
'cols' => $gallery_settings['cdm_dataportal_media_cols'], |
1219 |
'captionElements' => $captionElements, |
1220 |
)); |
1221 |
} |
1222 |
// citation and detail for the media specimen |
1223 |
$annotations_and_sources = handle_annotations_and_sources( |
1224 |
$mediaSpecimen, |
1225 |
typedesignations_annotations_and_sources_config(), |
1226 |
'', |
1227 |
null |
1228 |
); |
1229 |
if(is_array( $annotations_and_sources['source_references'])){ |
1230 |
$source_citations = array_merge($source_citations, $annotations_and_sources['source_references']); |
1231 |
} |
1232 |
if($annotations_and_sources['foot_note_keys']){ |
1233 |
$foot_note_keys .= ', ' . $annotations_and_sources['foot_note_keys']; |
1234 |
} |
1235 |
} |
1236 |
|
1237 |
$citation_markup = join(', ', $source_citations); |
1238 |
|
1239 |
$specimen_markup = $derived_unit_facade_dto->titleCache; |
1240 |
if(isset($derived_unit_facade_dto->specimenLabel) && $derived_unit_facade_dto->specimenLabel){ |
1241 |
$specimen_markup = str_replace( |
1242 |
$derived_unit_facade_dto->specimenLabel, |
1243 |
l($derived_unit_facade_dto->specimenLabel, path_to_specimen($type_designation->typeSpecimen->uuid)), $specimen_markup); |
1244 |
} |
1245 |
|
1246 |
$type_designation_render_array = markup_to_render_array( |
1247 |
'<div class="type_designation_entity_ref ' . html_class_attribute_ref($type_designation_entity_ref) . '"> |
1248 |
<span class="type-status">' . ucfirst($type_status) . "</span>: " |
1249 |
. $specimen_markup . $foot_note_keys |
1250 |
. ($citation_markup ? ' '. $citation_markup : '') |
1251 |
. ($preferredStableUri ? " ". l($preferredStableUri, $preferredStableUri) : '') |
1252 |
. $media |
1253 |
. '</div>'); |
1254 |
|
1255 |
$render_array['type_designations'][] = $type_designation_render_array; |
1256 |
} |
1257 |
} |
1258 |
if(count($type_designation_list) > 0 ){ |
1259 |
$render_array['map'] = compose_type_designations_map($type_designation_list); |
1260 |
} else { |
1261 |
$render_array['map'] = array(); |
1262 |
} |
1263 |
return $render_array; |
1264 |
} |
1265 |
|
1266 |
/** |
1267 |
* Provides the default configuration for typedesignations which |
1268 |
* are passed to the handle_annotations_and_sources() |
1269 |
* function: |
1270 |
* - 'sources_as_content' => TRUE, |
1271 |
* - 'link_to_name_used_in_source' => FALSE, |
1272 |
* - 'link_to_reference' => TRUE, |
1273 |
* - 'add_footnote_keys' => FALSE, |
1274 |
* - 'bibliography_aware' => FALSE |
1275 |
* |
1276 |
* @return array |
1277 |
*/ |
1278 |
function typedesignations_annotations_and_sources_config() { |
1279 |
static $annotations_and_sources_config = [ |
1280 |
'sources_as_content' => TRUE, |
1281 |
'link_to_name_used_in_source' => FALSE, |
1282 |
'link_to_reference' => TRUE, |
1283 |
'add_footnote_keys' => FALSE, |
1284 |
'bibliography_aware' => FALSE |
1285 |
]; |
1286 |
return $annotations_and_sources_config; |
1287 |
} |
1288 |
|
1289 |
/** |
1290 |
* @param $name_rel |
1291 |
* @param $current_name_uuid |
1292 |
* @param $current_taxon_uuid |
1293 |
* @param $suppress_if_current_name_is_source // FIXME UNUSED !!!! |
1294 |
* @param $show_name_cache_only |
1295 |
* The nameCache will be shown instead of the titleCache if this parameter is true. |
1296 |
* @return null|string |
1297 |
* The markup or null |
1298 |
*/ |
1299 |
function name_relationship_markup($name_rel, $current_name_uuid, $current_taxon_uuid, $show_name_cache_only = false){ |
1300 |
|
1301 |
$relationship_markup = null; |
1302 |
|
1303 |
$current_name_is_toName = $current_name_uuid == $name_rel->toName->uuid; |
1304 |
|
1305 |
if($current_name_is_toName){ |
1306 |
$name = $name_rel->fromName; |
1307 |
} else { |
1308 |
$name = $name_rel->toName; |
1309 |
} |
1310 |
|
1311 |
cdm_load_tagged_full_title($name); |
1312 |
|
1313 |
$highlited_synonym_uuid = isset ($name->taxonBases[0]->uuid) ? $name->taxonBases[0]->uuid : ''; |
1314 |
if(!$show_name_cache_only){ |
1315 |
$relationship_markup = render_taxon_or_name($name, |
1316 |
url(path_to_name($name->uuid, $current_taxon_uuid, $highlited_synonym_uuid, false)) |
1317 |
); |
1318 |
} else { |
1319 |
$relationship_markup = l( |
1320 |
'<span class="' . html_class_attribute_ref($name) . '"">' . $name->nameCache . '</span>', |
1321 |
path_to_name($name->uuid, $current_taxon_uuid, $highlited_synonym_uuid, false), |
1322 |
array('html' => true) |
1323 |
); |
1324 |
} |
1325 |
|
1326 |
return $relationship_markup; |
1327 |
} |
1328 |
|
1329 |
|
1330 |
/** |
1331 |
* Composes an inline representation of selected name relationships |
1332 |
* |
1333 |
* The output of this function will be usually appended to taxon name representations. |
1334 |
* Only the following types are displayed: LATER_HOMONYM, TREATED_AS_LATER_HOMONYM, BLOCKING_NAME_FOR, ORTHOGRAPHIC_VARIANT |
1335 |
* |
1336 |
* LATER_HOMONYM, TREATED_AS_LATER_HOMONYM, BLOCKING_NAME_FOR are displayed as |
1337 |
* non {titleCache} nec {titleCache} nec {titleCache} whereas the related names |
1338 |
* are ordered alphabetically. |
1339 |
* |
1340 |
* ORTHOGRAPHIC_VARIANT is displayed as 'ort. var. {nameCache}' |
1341 |
* |
1342 |
* Related issues: |
1343 |
* - https://dev.e-taxonomy.eu/redmine/issues/5697 "Show name conserved against as [non xxx]" |
1344 |
* - https://dev.e-taxonomy.eu/redmine/issues/6678 "How to correctly show name relationship "orth. var." in dataportal" |
1345 |
* - https://dev.e-taxonomy.eu/redmine/issues/5857 |
1346 |
* - https://dev.e-taxonomy.eu/redmine/issues/2001 "[Cichorieae Portal] Name Relationship -> blocking name are not shown" |
1347 |
* |
1348 |
* @param $name_relations |
1349 |
* The list of CDM NameRelationsips |
1350 |
* @param $current_name_uuid |
1351 |
* The Uuid of the name for which the relations are to be rendered, the current name will be hidden when |
1352 |
* rendering the relation an only the other name is shown. Parameter is REQUIRED. |
1353 |
* @param $suppress_if_current_name_is_source |
1354 |
* The display of the relation will be |
1355 |
* suppressed is the current name is on the source of the relation edge. |
1356 |
* That is if it is on the from side of the relation. Except for 'blocking name for' which is |
1357 |
* an inverse relation. For this relation type the toName is taken in to account. |
1358 |
* @param $current_taxon_uuid |
1359 |
* The taxon to be omitted from related taxa. This is only used to create links, see path_to_name() |
1360 |
* @return array |
1361 |
* A drupal render array |
1362 |
* |
1363 |
* @ingroup Compose |
1364 |
*/ |
1365 |
function compose_name_relationships_inline($name_relations, $current_name_uuid, $current_taxon_uuid, $suppress_if_current_name_is_source = true) { |
1366 |
|
1367 |
RenderHints::pushToRenderStack('homonym'); |
1368 |
// the render stack element homonyms is being used in the default render templates !!!, see CDM_NAME_RENDER_TEMPLATES_DEFAULT |
1369 |
|
1370 |
$selected_name_rel_uuids = variable_get(CDM_NAME_RELATIONSHIP_INLINE_TYPES, unserialize(CDM_NAME_RELATIONSHIP_INLINE_TYPES_DEFAULT)); |
1371 |
$name_rel_type_filter = array('direct' => array(), 'inverse' => array()); |
1372 |
foreach ($selected_name_rel_uuids as $uuid){ |
1373 |
$name_rel_type_filter['direct'][$uuid] = $uuid; |
1374 |
if($uuid != UUID_NAMERELATIONSHIPTYPE_MISSPELLING){ |
1375 |
$name_rel_type_filter['inverse'][$uuid] = $uuid; |
1376 |
} |
1377 |
} |
1378 |
|
1379 |
$list_prefix = '<span class="name_relationships">['; |
1380 |
$list_suffix = ']</span>'; |
1381 |
$item_prefix = '<span class="item">'; |
1382 |
$item_suffix = '</span> '; |
1383 |
$render_array = compose_name_relationships($name_relations, $name_rel_type_filter, $current_name_uuid, $current_taxon_uuid, $list_prefix, $list_suffix, $item_prefix, $item_suffix); |
1384 |
|
1385 |
// remove the glue space from the last item element which has been added by the $item_suffix = '</span> ' |
1386 |
$items_ctn = count($render_array['list']['items']); |
1387 |
if($items_ctn){ |
1388 |
$render_array['list']['items'][$items_ctn - 1]['#suffix'] = '</span>'; |
1389 |
} |
1390 |
|
1391 |
RenderHints::popFromRenderStack(); |
1392 |
return $render_array; |
1393 |
} |
1394 |
|
1395 |
/** |
1396 |
* Composes an list representation of the name relationships. |
1397 |
* |
1398 |
* The output of this function will be usually appended to taxon name representations. |
1399 |
* |
1400 |
* Related issues: |
1401 |
* - https://dev.e-taxonomy.eu/redmine/issues/5697 "Show name conserved against as [non xxx]" |
1402 |
* - https://dev.e-taxonomy.eu/redmine/issues/6678 "How to correctly show name relationship "orth. var." in dataportal" |
1403 |
* - https://dev.e-taxonomy.eu/redmine/issues/5857 |
1404 |
* |
1405 |
* @param $name_relations |
1406 |
* The list of CDM NameRelationsips |
1407 |
* @param $current_name_uuid |
1408 |
* The Uuid of the name for which the relations are to be rendered, the current name will be hidden when |
1409 |
* rendering the relation an only the other name is shown. Parameter is REQUIRED. |
1410 |
* @param $current_taxon_uuid |
1411 |
* The taxon to be omitted from related taxa. This is only used to create links, see path_to_name() |
1412 |
* @return array |
1413 |
* A drupal render array |
1414 |
* |
1415 |
* @ingroup Compose |
1416 |
*/ |
1417 |
function compose_name_relationships_list($name_relations, $current_name_uuid, $current_taxon_uuid) { |
1418 |
|
1419 |
// $ordered_name_relation_type_uuids = array_keys(cdm_terms_by_type_as_option('NameRelationshipType', CDM_ORDER_BY_ORDER_INDEX_ASC)); |
1420 |
|
1421 |
$key = 'name_relationships'; |
1422 |
RenderHints::pushToRenderStack($key); |
1423 |
if(!RenderHints::getFootnoteListKey()){ |
1424 |
RenderHints::setFootnoteListKey($key); |
1425 |
} |
1426 |
// the render stack element homonyms is being used in the default render templates !!!, see CDM_NAME_RENDER_TEMPLATES_DEFAULT |
1427 |
|
1428 |
$selected_name_rel_uuids = variable_get(CDM_NAME_RELATIONSHIP_LIST_TYPES, cdm_vocabulary_as_defaults(UUID_NAME_RELATIONSHIP_TYPE)); |
1429 |
$name_rel_type_filter = array('direct' => array(), 'inverse' => array()); |
1430 |
foreach ($selected_name_rel_uuids as $uuid){ |
1431 |
$name_rel_type_filter['direct'][$uuid] = $uuid; |
1432 |
$name_rel_type_filter['inverse'][$uuid] = $uuid; |
1433 |
} |
1434 |
|
1435 |
$list_prefix = '<div class="relationships_list name_relationships">'; |
1436 |
$list_suffix = '</div>'; |
1437 |
$item_prefix = '<div class="item">'; |
1438 |
$item_suffix = '</div>'; |
1439 |
|
1440 |
$render_array = compose_name_relationships($name_relations, $name_rel_type_filter, $current_name_uuid, $current_taxon_uuid, $list_prefix, $list_suffix, $item_prefix, $item_suffix); |
1441 |
|
1442 |
RenderHints::popFromRenderStack(); |
1443 |
if(RenderHints::getFootnoteListKey() == $key) { |
1444 |
$render_array['footnotes'] = markup_to_render_array(theme('cdm_footnotes', array('footnoteListKey' => RenderHints::getFootnoteListKey()))); |
1445 |
RenderHints::clearFootnoteListKey(); |
1446 |
} |
1447 |
return $render_array; |
1448 |
} |
1449 |
|
1450 |
/** |
1451 |
* @param $name_relations |
1452 |
* @param $name_rel_type_filter |
1453 |
* Associative array with two keys: |
1454 |
* - 'direct': the relationship type uuids for the direct direction of the relation edge to be included |
1455 |
* - 'inverse': the relationship type uuids for the direct direction of the relation edge to be included |
1456 |
* @param $current_name_uuid |
1457 |
* @param $current_taxon_uuid |
1458 |
* @param $list_prefix |
1459 |
* @param $list_suffix |
1460 |
* @param $item_prefix |
1461 |
* @param $item_suffix |
1462 |
* @return array |
1463 |
* |
1464 |
* @ingroup Compose |
1465 |
*/ |
1466 |
function compose_name_relationships($name_relations, $name_rel_type_filter, $current_name_uuid, $current_taxon_uuid, |
1467 |
$list_prefix, $list_suffix, $item_prefix, $item_suffix) |
1468 |
{ |
1469 |
$non_nec_name_reltype_uuids = array(UUID_NAMERELATIONSHIPTYPE_LATER_HOMONYM, |
1470 |
UUID_NAMERELATIONSHIPTYPE_TREATED_AS_LATER_HOMONYM, |
1471 |
UUID_NAMERELATIONSHIPTYPE_CONSERVED_AGAINST, |
1472 |
UUID_NAMERELATIONSHIPTYPE_MISSPELLING, |
1473 |
UUID_NAMERELATIONSHIPTYPE_BLOCKING_NAME_FOR); |
1474 |
|
1475 |
$render_array = array( |
1476 |
'list' => array( |
1477 |
'#prefix' => $list_prefix, |
1478 |
'#suffix' => $list_suffix, |
1479 |
'items' => array() |
1480 |
), |
1481 |
'footnotes' => array() |
1482 |
); |
1483 |
|
1484 |
if ($name_relations) { |
1485 |
|
1486 |
// remove all relations which are not selected in the settings and |
1487 |
// separate all LATER_HOMONYM, TREATED_AS_LATER_HOMONYM, BLOCKING_NAME_FOR relations and ORTHOGRAPHIC_VARIANTs |
1488 |
// for special handling |
1489 |
$filtered_name_rels = array(); |
1490 |
$non_nec_name_rels = array(); |
1491 |
$orthographic_variants = array(); |
1492 |
foreach ($name_relations as $name_rel) { |
1493 |
$rel_type_uuid = $name_rel->type->uuid; |
1494 |
$is_inverse_relation = $current_name_uuid == $name_rel->toName->uuid; |
1495 |
if ((!$is_inverse_relation && isset($name_rel_type_filter['direct'][$rel_type_uuid]) && $name_rel_type_filter['direct'][$rel_type_uuid]) |
1496 |
||($is_inverse_relation && isset($name_rel_type_filter['inverse'][$rel_type_uuid]) && $name_rel_type_filter['inverse'][$rel_type_uuid])) { |
1497 |
|
1498 |
if (array_search($rel_type_uuid, $non_nec_name_reltype_uuids) !== false && ( |
1499 |
$current_name_uuid == $name_rel->fromName->uuid && $rel_type_uuid != UUID_NAMERELATIONSHIPTYPE_BLOCKING_NAME_FOR |
1500 |
|| $current_name_uuid == $name_rel->toName->uuid && $rel_type_uuid == UUID_NAMERELATIONSHIPTYPE_BLOCKING_NAME_FOR |
1501 |
) |
1502 |
){ |
1503 |
$non_nec_name_rels[] = $name_rel; |
1504 |
} else if (UUID_NAMERELATIONSHIPTYPE_ORTHOGRAPHIC_VARIANT == $rel_type_uuid) { |
1505 |
$orthographic_variants[] = $name_rel; |
1506 |
} else { |
1507 |
|
1508 |
$filtered_name_rels[] = $name_rel; |
1509 |
} |
1510 |
} |
1511 |
} |
1512 |
$name_relations = $filtered_name_rels; |
1513 |
|
1514 |
usort($name_relations, 'compare_name_relations_by_term_order_index'); |
1515 |
|
1516 |
// compose |
1517 |
foreach ($name_relations as $name_rel) { |
1518 |
|
1519 |
$is_inverse_relation = $current_name_uuid == $name_rel->toName->uuid; |
1520 |
|
1521 |
$rel_footnote_key_markup = name_relationship_footnote_markup($name_rel); |
1522 |
$relationship_markup = name_relationship_markup($name_rel, $current_name_uuid, $current_taxon_uuid); |
1523 |
|
1524 |
$label = cdm_relationship_type_term_abbreviated_label($name_rel->type, $is_inverse_relation); |
1525 |
$symbol = cdm_relationship_type_term_symbol($name_rel->type, $is_inverse_relation); |
1526 |
$symbol_markup = '<span class="symbol" title="' . $label . '">' . $symbol . '</span>' . $rel_footnote_key_markup . ' '; |
1527 |
$relationship_markup = $symbol_markup . $relationship_markup; |
1528 |
if ($relationship_markup) { |
1529 |
$render_array['list']['items'][] = markup_to_render_array($relationship_markup, |
1530 |
null, |
1531 |
$item_prefix, |
1532 |
$item_suffix); |
1533 |
} |
1534 |
} |
1535 |
|
1536 |
// name relationships to be displayed as non nec |
1537 |
if (count($non_nec_name_rels) > 0) { |
1538 |
$non_nec_markup = ''; |
1539 |
foreach ($non_nec_name_rels as $name_rel) { |
1540 |
$is_inverse_relation = $current_name_uuid == $name_rel->toName->uuid; |
1541 |
$rel_footnote_key_markup = name_relationship_footnote_markup($name_rel); |
1542 |
$relationship_markup = name_relationship_markup($name_rel, $current_name_uuid, $current_taxon_uuid); |
1543 |
$label = cdm_relationship_type_term_abbreviated_label($name_rel->type, $is_inverse_relation); |
1544 |
$symbol = $non_nec_markup ? ' nec ' : 'non'; |
1545 |
$symbol_markup = '<span class="symbol" title="' . $label . '">' . $symbol . '</span>' . $rel_footnote_key_markup . ' '; |
1546 |
$non_nec_markup .= $symbol_markup . $relationship_markup; |
1547 |
} |
1548 |
if ($non_nec_markup) { |
1549 |
$render_array['list']['items'][] = markup_to_render_array($non_nec_markup, |
1550 |
null, |
1551 |
$item_prefix, |
1552 |
$item_suffix); |
1553 |
} |
1554 |
} |
1555 |
|
1556 |
// orthographic variants |
1557 |
if (count($orthographic_variants) > 0) { |
1558 |
foreach ($orthographic_variants as $name_rel) { |
1559 |
|
1560 |
$is_inverse_relation = $current_name_uuid == $name_rel->toName->uuid; |
1561 |
$rel_footnote_key_markup = name_relationship_footnote_markup($name_rel); |
1562 |
$relationship_markup = name_relationship_markup($name_rel, $current_name_uuid, $current_taxon_uuid, TRUE); |
1563 |
$nomref_footnote_key_markup = nomenclatural_reference_footnote_key_markup($name_rel->toName); |
1564 |
$label = cdm_relationship_type_term_abbreviated_label($name_rel->type, $is_inverse_relation); |
1565 |
$symbol = cdm_relationship_type_term_symbol($name_rel->type, $is_inverse_relation); |
1566 |
$symbol_markup = '<span class="symbol" title="' . $label . '">' . $symbol . '</span>' . $rel_footnote_key_markup . ' '; |
1567 |
$relationship_markup = $symbol_markup . $relationship_markup . $nomref_footnote_key_markup; |
1568 |
} |
1569 |
if (isset($relationship_markup) && $relationship_markup) { |
1570 |
$render_array['list']['items'][] = markup_to_render_array($relationship_markup, |
1571 |
null, |
1572 |
$item_prefix, |
1573 |
$item_suffix); |
1574 |
} |
1575 |
} |
1576 |
} |
1577 |
return $render_array; |
1578 |
} |
1579 |
|
1580 |
/** |
1581 |
* @param $name_rel |
1582 |
* @return string |
1583 |
*/ |
1584 |
function name_relationship_footnote_markup($name_rel) |
1585 |
{ |
1586 |
$footnote_markup = ''; |
1587 |
$footnote_key_markup = ''; |
1588 |
if (isset($name_rel->ruleConsidered) && $name_rel->ruleConsidered) { |
1589 |
$footnote_markup = '<span class="rule_considered">' . $name_rel->ruleConsidered . '</span> '; |
1590 |
} |
1591 |
if (isset($name_rel->citation)) { |
1592 |
$footnote_markup .= '<span class="reference">' . $name_rel->citation->titleCache . '</span>'; |
1593 |
} |
1594 |
if (isset($name_rel->citationMicroReference) && $name_rel->citationMicroReference) { |
1595 |
$footnote_markup .= (isset($name_rel->citation) ? ':' : '') . ' <span class="reference_detail">' . $name_rel->citationMicroReference . '</span>'; |
1596 |
} |
1597 |
if ($footnote_markup) { |
1598 |
$fnkey = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), $footnote_markup); |
1599 |
$footnote_key_markup = theme('cdm_footnote_key', array( |
1600 |
'footnoteKey' => $fnkey, |
1601 |
'separator' => ',', |
1602 |
'highlightable' => TRUE, |
1603 |
'separator_off' => TRUE, |
1604 |
)); |
1605 |
} |
1606 |
return $footnote_key_markup; |
1607 |
} |
1608 |
|
1609 |
/** |
1610 |
* @param $nom_status |
1611 |
* @return string |
1612 |
*/ |
1613 |
function nomenclatural_status_footnote_markup($nom_status) |
1614 |
{ |
1615 |
// NomenclaturalStatus is a subclass of ReferencedEntityBase |
1616 |
// and has the same structure as TaxonNameRelationship |
1617 |
return name_relationship_footnote_markup($nom_status); |
1618 |
} |
1619 |
|
1620 |
/** |
1621 |
* @param $name |
1622 |
* @return string |
1623 |
*/ |
1624 |
function nomenclatural_reference_footnote_key_markup($name) |
1625 |
{ |
1626 |
$footnote_markup = ''; |
1627 |
$footnote_key_markup = ''; |
1628 |
if (isset($name->nomenclaturalReference) && $name->nomenclaturalReference) { |
1629 |
$footnote_markup .= '<span class="reference">' . $name->nomenclaturalReference->titleCache . '</span>'; |
1630 |
} |
1631 |
if (isset($name->nomenclaturalMicroReference)) { |
1632 |
$footnote_markup .= ($footnote_key_markup ? ':' : '') . '<span class="reference_detail">' . $name->nomenclaturalMicroReference . '</span>'; |
1633 |
} |
1634 |
if ($footnote_markup) { |
1635 |
$fnkey = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), $footnote_markup); |
1636 |
$footnote_key_markup = theme('cdm_footnote_key', array( |
1637 |
'footnoteKey' => $fnkey, |
1638 |
'separator' => ',', |
1639 |
'highlightable' => TRUE, |
1640 |
'separator_off' => TRUE, |
1641 |
)); |
1642 |
} |
1643 |
return $footnote_key_markup; |
1644 |
} |
1645 |
|
1646 |
|
1647 |
/** |
1648 |
* @param $taxon |
1649 |
* @return array |
1650 |
*/ |
1651 |
function cdm_name_relationships_for_taxon($taxon) |
1652 |
{ |
1653 |
$from_name_relations = cdm_ws_get(CDM_WS_PORTAL_TAXON_FROM_NAMERELATIONS, $taxon->uuid); |
1654 |
$to_name_relations = cdm_ws_get(CDM_WS_PORTAL_TAXON_TO_NAMERELATIONS, $taxon->uuid); |
1655 |
$name_relations = array_merge($from_name_relations, $to_name_relations); |
1656 |
return $name_relations; |
1657 |
} |
1658 |
|
1659 |
|
1660 |
/** |
1661 |
* Recursively searches the array for the $key and sets the given value. |
1662 |
* |
1663 |
* @param mixed $key |
1664 |
* Key to search for. |
1665 |
* @param mixed $value |
1666 |
* Value to set.' |
1667 |
* @param array $array |
1668 |
* Array to search in. |
1669 |
* |
1670 |
* @return bool |
1671 |
* True if the key has been found. |
1672 |
*/ |
1673 |
function &array_setr($key, $value, array &$array) { |
1674 |
$res = NULL; |
1675 |
foreach ($array as $k => &$v) { |
1676 |
if ($key == $k) { |
1677 |
$v = $value; |
1678 |
return $array; |
1679 |
} |
1680 |
elseif (is_array($v)) { |
1681 |
$innerArray = array_setr($key, $value, $v); |
1682 |
if ($innerArray) { |
1683 |
return $array; |
1684 |
} |
1685 |
} |
1686 |
} |
1687 |
return $res; |
1688 |
} |
1689 |
|
1690 |
/** |
1691 |
* @todo Please document this function. |
1692 |
* @see http://drupal.org/node/1354 |
1693 |
*/ |
1694 |
function &get_preceding_contentElement($contentElementKey, array &$renderTemplate) { |
1695 |
$res = NULL; |
1696 |
$precedingElement = NULL; |
1697 |
foreach ($renderTemplate as &$part) { |
1698 |
foreach ($part as $key => &$element) { |
1699 |
if ($key == $contentElementKey) { |
1700 |
return $precedingElement; |
1701 |
} |
1702 |
$precedingElement = $element; |
1703 |
} |
1704 |
} |
1705 |
return $res; |
1706 |
} |
1707 |
|
1708 |
/** |
1709 |
* @todo Please document this function. |
1710 |
* @see http://drupal.org/node/1354 |
1711 |
*/ |
1712 |
function &get_preceding_contentElementKey($contentElementKey, array &$renderTemplate) { |
1713 |
$res = NULL; |
1714 |
$precedingKey = NULL; |
1715 |
foreach ($renderTemplate as &$part) { |
1716 |
if (is_array($part)) { |
1717 |
foreach ($part as $key => &$element) { |
1718 |
if ($key == $contentElementKey) { |
1719 |
return $precedingKey; |
1720 |
} |
1721 |
if (!str_beginsWith($key, '#')) { |
1722 |
$precedingKey = $key; |
1723 |
} |
1724 |
} |
1725 |
} |
1726 |
} |
1727 |
return $res; |
1728 |
} |
1729 |
|
1730 |
function nameTypeToDTYPE($dtype){ |
1731 |
static $nameTypeLabelMap = array( |
1732 |
"ICNB" => "BacterialName", |
1733 |
"ICNAFP" => "BotanicalName", |
1734 |
"ICNCP" => "CultivarPlantName", |
1735 |
"ICZN" => "ZoologicalName", |
1736 |
"ICVCN" => "ViralName", |
1737 |
"Any taxon name" => "TaxonName", |
1738 |
"NonViral" => "TaxonName", |
1739 |
"Fungus" => "BotanicalName", |
1740 |
"Plant" => "BotanicalName", |
1741 |
"Algae" => "BotanicalName", |
1742 |
); |
1743 |
return $nameTypeLabelMap[$dtype]; |
1744 |
|
1745 |
} |
1746 |
|
1747 |
|
1748 |
function compare_name_relations_by_term_order_index($name_rel1, $name_rel2){ |
1749 |
return compare_terms_by_order_index($name_rel1->type, $name_rel2->type); |
1750 |
} |
1751 |
|
1752 |
/** |
1753 |
* Provides an array with the different registration types covered by the passed registration. |
1754 |
* |
1755 |
* The labels in the returned array are translatable. |
1756 |
* |
1757 |
* See also https://dev.e-taxonomy.eu/redmine/issues/8016 |
1758 |
* |
1759 |
* @param $registration_dto |
1760 |
* @return array |
1761 |
* An array of the labels describing the different registration types covered by the passed registration. |
1762 |
*/ |
1763 |
function registration_types($registration_dto){ |
1764 |
$reg_type_labels = array(); |
1765 |
if(isset($registration_dto->nameRef)){ |
1766 |
$reg_type_labels["name"] = t("new name"); |
1767 |
$reg_type_labels["taxon"] = t("new taxon"); |
1768 |
$name_relations = cdm_ws_fetch_all(str_replace("$0", $registration_dto->nameRef->uuid, CDM_WS_PORTAL_NAME_NAME_RELATIONS)); |
1769 |
$is_new_combination = true; |
1770 |
foreach($name_relations as $name_rel){ |
1771 |
if(isset($name_rel->type->uuid)){ |
1772 |
$name_is_from_name = $registration_dto->nameRef->uuid == $name_rel->fromName->uuid; |
1773 |
switch($name_rel->type->uuid) { |
1774 |
case UUID_NAMERELATIONSHIPTYPE_BASIONYM: |
1775 |
if(!$name_is_from_name){ |
1776 |
$reg_type_labels["basionym"] = t("new combination"); |
1777 |
$is_new_combination = true; |
1778 |
} |
1779 |
break; |
1780 |
case UUID_NAMERELATIONSHIPTYPE_REPLACED_SYNONYM: |
1781 |
if(!$name_is_from_name) { |
1782 |
$is_new_combination = true; |
1783 |
} |
1784 |
break; |
1785 |
case UUID_NAMERELATIONSHIPTYPE_VALIDATED_BY_NAME: |
1786 |
if(!$name_is_from_name) { |
1787 |
$reg_type_labels["validation"] = t("validation"); |
1788 |
} |
1789 |
break; |
1790 |
case UUID_NAMERELATIONSHIPTYPE_ORTHOGRAPHIC_VARIANT: |
1791 |
if(!$name_is_from_name) { |
1792 |
$reg_type_labels["orth_var"] = t("orthographical correction"); |
1793 |
}break; |
1794 |
default: |
1795 |
// NOTHING |
1796 |
} |
1797 |
} |
1798 |
} |
1799 |
if($is_new_combination){ |
1800 |
unset($reg_type_labels["taxon"]); |
1801 |
} |
1802 |
} |
1803 |
if(isset($registration_dto->orderdTypeDesignationWorkingSets)){ |
1804 |
$reg_type_labels[] = t("new nomenclatural type"); |
1805 |
} |
1806 |
return $reg_type_labels; |
1807 |
} |
1808 |
|
1809 |
/** |
1810 |
* Collects and deduplicates the type designations associated with the passes synonyms. |
1811 |
* |
1812 |
* @param $synonymy_group |
1813 |
* An array containing a homotypic or heterotypic group of names. |
1814 |
* @param $accepted_taxon_name_uuid |
1815 |
* The uuid of the accepted taxon name. Optional parameter which is required when composing |
1816 |
* the information for the homotypic group. In this case the accepted taxon is not included |
1817 |
* in the $synonymy_group and must therefor passed in this second parameter. |
1818 |
* |
1819 |
* @return array |
1820 |
* The type designations |
1821 |
*/ |
1822 |
function type_designations_for_synonymy_group($synonymy_group, $accepted_taxon_name_uuid = null) |
1823 |
{ |
1824 |
if (count($synonymy_group) > 0) { |
1825 |
$name_uuid = array_pop($synonymy_group)->name->uuid; |
1826 |
} else { |
1827 |
$name_uuid = $accepted_taxon_name_uuid; |
1828 |
} |
1829 |
if ($name_uuid) { |
1830 |
$type_designations = cdm_ws_get(CDM_WS_PORTAL_NAME_TYPEDESIGNATIONS_IN_HOMOTYPICAL_GROUP, $name_uuid); |
1831 |
if ($type_designations) { |
1832 |
return $type_designations; |
1833 |
} |
1834 |
} |
1835 |
|
1836 |
return array(); |
1837 |
} |
1838 |
|
1839 |
|
1840 |
/** |
1841 |
* Compares two SpecimenTypeDesignations |
1842 |
* |
1843 |
* @param object $a |
1844 |
* A SpecimenTypeDesignation. |
1845 |
* @param object $b |
1846 |
* SpecimenTypeDesignation. |
1847 |
*/ |
1848 |
function compare_specimen_type_designation($a, $b) { |
1849 |
|
1850 |
$cmp_by_status = compare_type_designations_by_status($a,$b); |
1851 |
if($cmp_by_status !== 0){ |
1852 |
return $cmp_by_status; |
1853 |
} |
1854 |
|
1855 |
$aQuantifier = FALSE; |
1856 |
$bQuantifier = FALSE; |
1857 |
if ($aQuantifier == $bQuantifier) { |
1858 |
// Sort alphabetically. |
1859 |
$a_text = isset($a->typeSpecimen->titleCache) ? preg_replace('/[\[\]\"]/', '', $a->typeSpecimen->titleCache) : ''; |
1860 |
$b_text = isset($b->typeSpecimen->titleCache) ? preg_replace('/[\[\]\"]/', '', $b->typeSpecimen->titleCache) : ''; |
1861 |
return strcasecmp($a_text, $b_text); |
1862 |
} |
1863 |
return ($aQuantifier < $bQuantifier) ? -1 : (($aQuantifier > $bQuantifier) ? 1 : 0); |
1864 |
} |
1865 |
|
1866 |
/** |
1867 |
* Compares the status of two TypeDesignations |
1868 |
* |
1869 |
* @param object $a |
1870 |
* A TypeDesignation |
1871 |
* @param object $b |
1872 |
* TypeDesignation |
1873 |
*/ |
1874 |
function compare_type_designations_by_status($a, $b) { |
1875 |
$status_a = isset($a->typeStatus) ? $a->typeStatus : null; |
1876 |
$status_b = isset($b->typeStatus) ? $b->typeStatus : null; |
1877 |
return compare_type_designation_status($status_a, $status_b); |
1878 |
} |
1879 |
|
1880 |
/** |
1881 |
* Compares two TypeDesignationStatusBase |
1882 |
* |
1883 |
* @param object $a |
1884 |
* A TypeDesignationStatusBase. |
1885 |
* @param object $b |
1886 |
* TypeDesignationStatusBase. |
1887 |
*/ |
1888 |
function compare_type_designation_status($a, $b) { |
1889 |
$type_status_order = type_status_order(); |
1890 |
$aQuantifier = FALSE; |
1891 |
$bQuantifier = FALSE; |
1892 |
if (isset($a->label) && isset($b->label)) { |
1893 |
$aQuantifier = array_search($a->label, $type_status_order); |
1894 |
$bQuantifier = array_search($b->label, $type_status_order); |
1895 |
} |
1896 |
return ($aQuantifier < $bQuantifier) ? -1 : (($aQuantifier > $bQuantifier) ? 1 : 0); |
1897 |
} |
1898 |
|
1899 |
/** |
1900 |
* Compares the two TextualTypeDesignations |
1901 |
* |
1902 |
* @param object $a |
1903 |
* A TextualTypeDesignations. |
1904 |
* @param object $b |
1905 |
* TextualTypeDesignations. |
1906 |
*/ |
1907 |
function compare_textual_type_designation($a, $b) { |
1908 |
|
1909 |
$cmp_by_status = compare_type_designations_by_status($a,$b); |
1910 |
if($cmp_by_status !== 0){ |
1911 |
return $cmp_by_status; |
1912 |
} |
1913 |
|
1914 |
$aQuantifier = FALSE; |
1915 |
$bQuantifier = FALSE; |
1916 |
if ($aQuantifier == $bQuantifier) { |
1917 |
// Sort alphabetically. |
1918 |
$a_text = isset($a->text_L10n->text) ? $a->text_L10n->text : ''; |
1919 |
$b_text = isset($b->text_L10n->text) ? $b->text_L10n->text : ''; |
1920 |
return strcasecmp($a_text, $b_text); |
1921 |
} |
1922 |
return ($aQuantifier < $bQuantifier) ? -1 : (($aQuantifier > $bQuantifier) ? 1 : 0); |
1923 |
} |
1924 |
|
1925 |
|
1926 |
/** |
1927 |
* Compares two SpecimenTypeDesignation status labels |
1928 |
* |
1929 |
* @param string $a |
1930 |
* A TypeDesignationStatus label. |
1931 |
* @param string $b |
1932 |
* A TypeDesignationStatus label. |
1933 |
*/ |
1934 |
function compare_type_designation_status_labels($a, $b) { |
1935 |
|
1936 |
$type_status_order = type_status_order(); |
1937 |
|
1938 |
$aQuantifier = FALSE; |
1939 |
$bQuantifier = FALSE; |
1940 |
if (isset($a) && isset($b)) { |
1941 |
$aQuantifier = array_search($a, $type_status_order); |
1942 |
$bQuantifier = array_search($b, $type_status_order); |
1943 |
} |
1944 |
return ($aQuantifier < $bQuantifier) ? -1 : 1; |
1945 |
} |
1946 |
|
1947 |
/** |
1948 |
* @return array |
1949 |
*/ |
1950 |
function type_status_order() |
1951 |
{ |
1952 |
/* |
1953 |
This is the desired sort order as of now: Holotype Isotype Lectotype |
1954 |
Isolectotype Syntype. |
1955 |
TODO Basically, what we are trying to do is, we define |
1956 |
an ordered array of TypeDesignation-states and use the index of this array |
1957 |
for comparison. This array has to be filled with the cdm- TypeDesignation |
1958 |
states and the order should be parameterisable inside the dataportal. |
1959 |
*/ |
1960 |
// Make that static for now. |
1961 |
$type_status_order = array( |
1962 |
'Epitype', |
1963 |
'Holotype', |
1964 |
'Isotype', |
1965 |
'Lectotype', |
1966 |
'Isolectotype', |
1967 |
'Syntype', |
1968 |
'Paratype' |
1969 |
); |
1970 |
return $type_status_order; |
1971 |
} |
1972 |
|
1973 |
/** |
1974 |
* Return HTML for the lectotype citation with the correct layout. |
1975 |
* |
1976 |
* This function prints the lectotype citation with the correct layout. |
1977 |
* Lectotypes are renderized in the synonymy tab of a taxon if they exist. |
1978 |
* |
1979 |
* @param mixed $typeDesignation |
1980 |
* Object containing the lectotype citation to print. |
1981 |
* |
1982 |
* @return string |
1983 |
* Valid html string. |
1984 |
*/ |
1985 |
function type_designation_citation_layout($typeDesignation, $footnote_separator = ',') { |
1986 |
$res = ''; |
1987 |
$citation = $typeDesignation->citation; |
1988 |
$pages = $typeDesignation->citationMicroReference; |
1989 |
if(isset($typeDesignation->typeStatus->uuid) && isset($typeDesignation->typeStatus->representation_L10n)) { |
1990 |
if ( $typeDesignation->typeStatus->uuid == UUID_NTD_ORIGINAL_DESIGNATION || $typeDesignation->typeStatus->uuid == UUID_NTD_MONOTYPY) { |
1991 |
$res = ' (' . $typeDesignation->typeStatus->representation_L10n . ')'; |
1992 |
return $res; |
1993 |
} |
1994 |
} |
1995 |
|
1996 |
if ($citation) { |
1997 |
// $type = $typeDesignation_citation->type; |
1998 |
$year = isset($citation->datePublished->start) ? substr($citation->datePublished->start, 0, 4) : ''; |
1999 |
$author = isset($citation->authorship->titleCache) ? $citation->authorship->titleCache : ''; |
2000 |
$res .= ' (designated by '; |
2001 |
$res .= $author; |
2002 |
$res .= ($year ? ' ' . $year : ''); |
2003 |
$res .= ($pages ? ': ' . $pages : ''); |
2004 |
// $res .= ')'; |
2005 |
|
2006 |
// footnotes should be rendered in the parent element so we |
2007 |
// are relying on the FootnoteListKey set there |
2008 |
$fkey_typeDesignation = FootnoteManager::addNewFootnote(RenderHints::getFootnoteListKey(), $typeDesignation->citation->titleCache); |
2009 |
$res .= theme('cdm_footnote_key', array( |
2010 |
'footnoteKey' => $fkey_typeDesignation, |
2011 |
'separator' => $footnote_separator, |
2012 |
'highlightable' => TRUE, |
2013 |
'separator_off' => TRUE, |
2014 |
)) . ')'; |
2015 |
} |
2016 |
return $res; |
2017 |
} |
2018 |
|
2019 |
/** |
2020 |
* Creates markup for the status of a type designation. In case the status or its representation is missing the label will be set to "Type" |
2021 |
* |
2022 |
* @param $type_designation |
2023 |
* @return string |
2024 |
*/ |
2025 |
function type_designation_status_label_markup($type_designation) |
2026 |
{ |
2027 |
return '<span class="type-status">' |
2028 |
. ((isset($type_designation->typeStatus->representation_L10n)) ? ucfirst($type_designation->typeStatus->representation_L10n) : t('Type')) . '</span>' |
2029 |
; |
2030 |
} |