Revision 83dc60b9
Added by Andreas Kohlbecker about 5 years ago
modules/cdm_dataportal/includes/taxon.inc | ||
---|---|---|
50 | 50 |
*/ |
51 | 51 |
function cdm_taxonRelationships($taxonRelationshipsDTO, $focusedTaxon){ |
52 | 52 |
|
53 |
static $NULL_AUTHORTEAM = 'NULL_AUTHORTEAM'; |
|
54 |
|
|
55 | 53 |
if (!$taxonRelationshipsDTO || $taxonRelationshipsDTO->size < 1) { |
56 | 54 |
return null; |
57 | 55 |
} |
58 | 56 |
|
59 | 57 |
RenderHints::pushToRenderStack('taxon_relationships'); |
60 |
$footnoteListKey = 'taxon_relationships';
|
|
61 |
RenderHints::setFootnoteListKey($footnoteListKey);
|
|
58 |
$footnote_list_key = 'taxon_relationships';
|
|
59 |
RenderHints::setFootnoteListKey($footnote_list_key);
|
|
62 | 60 |
|
63 | 61 |
$misapplied = array(); |
64 |
$joinedAuthorTeams = array();
|
|
62 |
$joined_sensu_refs = array();
|
|
65 | 63 |
|
66 | 64 |
$taxon_relationship_types = variable_get(CDM_TAXON_RELATIONSHIP_TYPES, unserialize(CDM_TAXON_RELATIONSHIP_TYPES_DEFAULT)); |
67 | 65 |
|
68 | 66 |
// Aggregate misapplied names having the same fullname: |
69 | 67 |
// - deduplicate misapplied names, so that the same name it not shown multiple times in case it |
70 | 68 |
// the duplicates only have different sensu references/author teams (see #5647) |
71 |
// - show the author team as sec reference |
|
72 |
// - show the according reference as footnote to this author team |
|
73 |
// - if the sec reference has no author team it should show instead the title cache |
|
69 |
// - show only the author team as short citation for the sec reference |
|
70 |
// - show the according reference as footnote to this short citation |
|
74 | 71 |
// |
75 | 72 |
// Example: |
76 | 73 |
// "Xenoxylum foobar" sensu Grumbach¹; sensu Lem² |
... | ... | |
85 | 82 |
|
86 | 83 |
RenderHints::pushToRenderStack('misapplied_name_for'); // TODO the render path string should in future come from $taxonRelation->type->... |
87 | 84 |
|
88 |
$name = join(' ', cdm_tagged_text_values($taxon_relation->taggedText, array('name'))); |
|
89 |
|
|
90 |
$sensu_citation_footnote_str = null; |
|
91 |
|
|
92 |
if (!isset($misapplied[$name])) { |
|
93 |
// Render the first name found as representative for all others. |
|
94 |
|
|
95 |
//###OLD: $misapplied[$name]['out'] = cdm_related_taxon($taxon_relation->fromTaxon, UUID_MISAPPLIED_NAME_FOR); |
|
96 |
$name_tagged_text = array(); |
|
97 |
$secref_tagged_text = null; |
|
98 |
foreach($taxon_relation->taggedText as $tt){ |
|
99 |
if($tt->type !== 'secReference' && !$secref_tagged_text){ |
|
100 |
$name_tagged_text[] = $tt; |
|
101 |
} else { |
|
102 |
if(!$secref_tagged_text){ |
|
103 |
// initialize $secref_tagged_text |
|
104 |
$secref_tagged_text = array(); |
|
105 |
$secref_tagged_text[] = array_pop($name_tagged_text); // remmove last elemetn wich is a separator in this case |
|
106 |
} |
|
107 |
$secref_tagged_text[] = $tt; |
|
85 |
// using name tags + author as full name key |
|
86 |
$full_name_key = join(' ', cdm_tagged_text_values($taxon_relation->taggedText, array('name', 'authors'))); |
|
87 |
|
|
88 |
// Render the first name found as representative for all others. |
|
89 |
//###OLD: $misapplied[$name]['out'] = cdm_related_taxon($taxon_relation->fromTaxon, UUID_MISAPPLIED_NAME_FOR); |
|
90 |
$sensu_tagged_text = tagged_text_extract_secref($taxon_relation->taggedText, "secReference", true); |
|
91 |
$relsec_tagged_text = tagged_text_extract_secref($taxon_relation->taggedText, "relSecReference", true); |
|
92 |
|
|
93 |
if (isset($sensu_tagged_text[1])) { |
|
94 |
array_shift($sensu_tagged_text); // remove first element which contains the "sensu", this will be added later in this code |
|
95 |
$sensu_citation_short_markup = cdm_tagged_text_to_markup($sensu_tagged_text); |
|
96 |
$sensu_citation_short = cdm_tagged_text_to_string($sensu_tagged_text); |
|
97 |
$sensu_uuid = $sensu_tagged_text[0]->entityReference->uuid; |
|
98 |
$misapplied[$full_name_key]['sensu_uuids'][] = $sensu_uuid; |
|
99 |
if (!isset($joined_sensu_refs[$sensu_uuid])) { |
|
100 |
$joined_sensu_refs[$sensu_uuid] = array( |
|
101 |
'short_citation' => $sensu_citation_short, |
|
102 |
'markup' => $sensu_citation_short_markup // to be expanded later as short_citation + footnote key |
|
103 |
); |
|
104 |
} |
|
105 |
|
|
106 |
if (isset($relsec_tagged_text[1])) { |
|
107 |
array_shift($relsec_tagged_text); // remove first element which contains the "err. sec", this will be added later in this code |
|
108 |
$relsec_citation_short_markup = cdm_tagged_text_to_markup($relsec_tagged_text); |
|
109 |
$relsec_citation_short = cdm_tagged_text_to_string($relsec_tagged_text); |
|
110 |
$relsec_uuid = $relsec_tagged_text[0]->entityReference->uuid; |
|
111 |
$misapplied[$full_name_key]['relsec_uuids'][] = $relsec_uuid; |
|
112 |
if (!isset($joined_sensu_refs[$relsec_uuid])) { |
|
113 |
$joined_sensu_refs[$relsec_uuid] = array( |
|
114 |
'short_citation' => $relsec_citation_short, |
|
115 |
'markup' => $relsec_citation_short_markup // to be expanded later as short_citation + footnote key |
|
116 |
); |
|
108 | 117 |
} |
109 | 118 |
} |
110 |
$misapplied[$name]['out'] = cdm_tagged_text_to_markup($name_tagged_text); |
|
111 |
} else { |
|
112 |
// We need to add the anchors for all of the other misapplied names not |
|
113 |
// being rendered explicitly. |
|
114 |
$misapplied[$name]['out'] = uuid_anchor($taxon_relation->taxonUuid, $misapplied[$name]['out']); |
|
115 |
} |
|
116 | 119 |
|
117 |
// Collect all authors for this fullname. |
|
118 |
if (isset($authorteam_str) && $authorteam_str != $NULL_AUTHORTEAM) { |
|
119 |
// prepare entry for the footnote key of the sensu citation footnote |
|
120 |
$misapplied[$name]['authorteam'][$authorteam_str] = ''; |
|
121 |
// map sensu citation footnote to the authorteam string |
|
122 |
$joinedAuthorTeams[$authorteam_str] = $sensu_citation_footnote_str; |
|
120 |
if (!isset($misapplied[$full_name_key]['out'])) { |
|
121 |
$misapplied[$full_name_key]['out'] = cdm_tagged_text_to_markup($taxon_relation->taggedText); |
|
122 |
} else { |
|
123 |
// We need to add the anchors for all of the other misapplied names not |
|
124 |
// being rendered explicitly. |
|
125 |
$misapplied[$full_name_key]['out'] = uuid_anchor($taxon_relation->taxonUuid, $misapplied[$full_name_key]['out']); |
|
126 |
} |
|
127 |
} else { |
|
128 |
RenderHints::pushToRenderStack('other_taxon_relationship'); |
|
129 |
// All relationship types except misapplied_name_for and invalid_designation_for. |
|
130 |
$taxon_relationships_lines[] = cdm_taxonRelationship($taxon_relation, TRUE, _is_invers_taxonRelationship($taxon_relation, $focusedTaxon)); |
|
123 | 131 |
} |
124 | 132 |
|
125 |
} else { |
|
126 |
RenderHints::pushToRenderStack('other_taxon_relationship'); |
|
127 |
// All relationship types except misapplied_name_for and invalid_designation_for. |
|
128 |
$taxon_relationships_lines[] = cdm_taxonRelationship($taxon_relation, TRUE, _is_invers_taxonRelationship($taxon_relation, $focusedTaxon)); |
|
133 |
RenderHints::popFromRenderStack(); |
|
129 | 134 |
} |
130 |
|
|
131 |
RenderHints::popFromRenderStack(); |
|
132 | 135 |
} |
133 |
} |
|
136 |
} // END loop over $taxonRelationshipsDTO->relations
|
|
134 | 137 |
} |
135 | 138 |
|
136 |
// Sort the joinedAuthorTeams and create footnotes and footnotekeys. |
|
137 |
ksort($joinedAuthorTeams); |
|
138 |
$author_team_cnt = 0; |
|
139 |
foreach ($joinedAuthorTeams as $authorteam_str => $sensu_citation) { |
|
140 |
$footnoteKey = ''; |
|
141 |
if(!empty($sensu_citation)) { |
|
142 |
$footnoteKey = FootnoteManager::addNewFootnote($footnoteListKey, $sensu_citation); |
|
143 |
$footnoteKey = theme('cdm_footnote_key', array('footnoteKey' => $footnoteKey)); |
|
139 |
// Sort the $joined_sensu_refs and create footnotes and footnote keys. |
|
140 |
uasort($joined_sensu_refs, function($a, $b) { |
|
141 |
if ($a['short_citation'] == $b['short_citation']) { |
|
142 |
return 0; |
|
144 | 143 |
} |
145 |
$sensu = ''; |
|
146 |
if($authorteam_str != $NULL_AUTHORTEAM){ |
|
147 |
$sensu = ++$author_team_cnt == 0 ? '' : 'sensu ' . $authorteam_str; |
|
144 |
return ($a['short_citation'] < $b['short_citation']) ? -1 : 1; |
|
145 |
}); |
|
146 |
|
|
147 |
|
|
148 |
foreach ($joined_sensu_refs as $sensu_uuid => $sensu_strings) { |
|
149 |
$footnote_key = ''; |
|
150 |
if(!empty($sensu_strings)) { |
|
151 |
$sensu_reference = cdm_ws_get(CDM_WS_REFERENCE, $sensu_uuid); |
|
152 |
if(!$sensu_reference){ |
|
153 |
drupal_set_message("Problem fetching sensu reference with uuid " . $sensu_uuid, 'error'); |
|
154 |
} |
|
155 |
$footnote_key = FootnoteManager::addNewFootnote($footnote_list_key, $sensu_reference->titleCache); |
|
156 |
$footnote_key = theme('cdm_footnote_key', array('footnoteKey' => $footnote_key)); |
|
148 | 157 |
} |
149 |
$joinedAuthorTeams[$authorteam_str] = '<span class="sensu">' . $sensu . $footnoteKey .'</span>';
|
|
158 |
$joined_sensu_refs[$sensu_uuid]['markup'] = '<span class="sensu">' . $sensu_strings['markup'] . $footnote_key . '</span>';
|
|
150 | 159 |
} |
151 | 160 |
|
152 | 161 |
// ---- Generate output ---- // |
153 |
|
|
154 | 162 |
$out = '<div class="taxon-relationships">'; |
155 | 163 |
if (is_array($misapplied) && count($misapplied) > 0) { |
164 |
ksort($misapplied); // order the misapplied by scientific name |
|
156 | 165 |
$out .= '<ul class="misapplied">'; |
166 |
|
|
157 | 167 |
foreach ($misapplied as $misapplied_name) { |
168 |
$misapplied_name_markup = $misapplied_name['out']; |
|
158 | 169 |
|
159 |
$out .= '<li class="synonym"><span class="misapplied">' . $misapplied_name['out'] . ' </span>'; |
|
170 |
if (isset($misapplied_name['sensu_uuids'])) { |
|
171 |
$sensu_refs_with_fkey = array(); |
|
172 |
foreach ($misapplied_name['sensu_uuids'] as $sensu_uuid) { |
|
173 |
$sensu_refs_with_fkey[$joined_sensu_refs[$sensu_uuid]['short_citation']] = $joined_sensu_refs[$sensu_uuid]['markup']; |
|
174 |
} |
|
175 |
ksort($sensu_refs_with_fkey); |
|
176 |
$sensu_refs_with_fkey_markup = join('; ', $sensu_refs_with_fkey); |
|
177 |
$misapplied_name_markup = str_replace('{PLACEHOLDER_secReference}', ' sensu ' . $sensu_refs_with_fkey_markup, $misapplied_name_markup); |
|
178 |
} |
|
160 | 179 |
|
161 |
if (isset($misapplied_name['authorteam'])) {
|
|
162 |
// Fill authors with the renderedFootnoteKey and sorting 'em.
|
|
163 |
foreach ($misapplied_name['authorteam'] as $authorteam_str => &$renderedFootnoteKey) {
|
|
164 |
$renderedFootnoteKey = $joinedAuthorTeams[$authorteam_str];
|
|
180 |
if (isset($misapplied_name['relsec_uuids'])) {
|
|
181 |
$relsec_refs_with_fkey = array();
|
|
182 |
foreach ($misapplied_name['relsec_uuids'] as $relsec_uuid) {
|
|
183 |
$relsec_refs_with_fkey[$joined_sensu_refs[$relsec_uuid]['short_citation']] = $joined_sensu_refs[$relsec_uuid]['markup'];
|
|
165 | 184 |
} |
166 |
ksort($misapplied_name['authorteam']); |
|
167 |
$out .= join('; ', $misapplied_name['authorteam']); |
|
185 |
ksort($relsec_refs_with_fkey); |
|
186 |
$relsec_refs_with_fkey_markup = join('; ', $relsec_refs_with_fkey); |
|
187 |
$misapplied_name_markup = str_replace('{PLACEHOLDER_relSecReference}', ', err. sec. ' . $relsec_refs_with_fkey_markup, $misapplied_name_markup); |
|
168 | 188 |
} |
189 |
|
|
190 |
$out .= '<li class="synonym"><span class="misapplied">' . $misapplied_name_markup . ' </span>'; |
|
169 | 191 |
$out .= '</li>'; |
170 | 192 |
} |
171 | 193 |
$out .= '</ul>'; |
... | ... | |
179 | 201 |
$out .= '</ul>'; |
180 | 202 |
} |
181 | 203 |
|
182 |
$footnotes = theme('cdm_footnotes', array('footnoteListKey' => $footnoteListKey, 'enclosingTag' => 'li')); |
|
183 |
$footnotes .= theme('cdm_annotation_footnotes', array('footnoteListKey' => $footnoteListKey, 'enclosingTag' => 'li')); |
|
184 |
|
|
185 |
// AK: why splitting footnotes at the sensu string ??? this is weired and hacky |
|
186 |
// TODO remove below dead code |
|
187 |
// $tr_footnotes_exploded = explode('sensu', $tr_footnotes); |
|
188 |
// $tr_footnotes_aux = ''; |
|
189 |
// foreach ($tr_footnotes_exploded as $element) { |
|
190 |
// $tr_footnotes_aux .= $element; |
|
191 |
// } |
|
204 |
$footnotes = theme('cdm_footnotes', array('footnoteListKey' => $footnote_list_key, 'enclosingTag' => 'li')); |
|
205 |
$footnotes .= theme('cdm_annotation_footnotes', array('footnoteListKey' => $footnote_list_key, 'enclosingTag' => 'li')); |
|
192 | 206 |
|
193 | 207 |
$out .= '<ul class="footnotes">' . $footnotes . '</ul>'; |
194 |
|
|
195 | 208 |
$out .= '</div>'; |
196 | 209 |
|
197 | 210 |
RenderHints::popFromRenderStack(); |
Also available in: Unified diff
ref #7658 adapting cdm_taxonRelationships() to new taxon relationship DTO webservice