[ 'render element' => 'fn', 'template' => 'bibcite-footnote-link', ], 'bibcite_footnote_list' => [ 'render element' => 'footnotes', 'path' => drupal_get_path('module', 'bibcite_footnotes') . '/templates', 'template' => 'bibcite-footnote-list', 'variables' => [ 'notes' => [], 'note_type' => [], 'config' => [], ], ], ]; } /** * Implements hook_help(). */ function bibcite_footnotes_help($route_name, RouteMatchInterface $route_match) { switch ($route_name) { // Main module help for the bibcite_footnotes module. case 'help.page.bibcite_footnotes': $output = ''; $output .= '
' . t('Inline footnote links for BibCite References') . '
'; return $output; default: } } /** * Implementation of hook_preprocess_bibcite_footnote_list(). * * Gatehrs all notes and prints out Notes and References as separate lists. * * @param $variables Theme variables. * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ function bibcite_footnotes_preprocess_bibcite_footnote_list(&$variables) { $config = $variables['config']; $footnotes = $variables['notes']; $notes = [ '#theme' => 'item_list', '#list_type' => 'ul', '#title' => $variables['note_type'] == ReferenceFootnotesFilter::ENDNOTE ? $config['notes_section_label'] : $config['references_section_label'], '#attributes' => ['class' => 'footnotes'], '#wrapper_attributes' => ['class' => 'container'], ]; $notes['#attached']['library'][] = 'bibcite_footnotes/reference_footnote'; $dont_show_backlink_text = $config['reference_dont_show_backlink_text']; $sort_references_by = $config['reference_sort_by']; $citation_tools = new CitationTools(); if (empty($footnotes)) { return; } foreach ($footnotes as $fn) { $item = [ '#id' => $fn['fn_id'], '#wrapper_attributes' => [ 'class' => ['footnote'], ], ]; $build = []; $reference_entity_id = $fn['reference']; $footnote_link_text = ($dont_show_backlink_text && $reference_entity_id) ? '^' : $fn['value']; if (!is_array($fn['ref_id'])) { $url = Url::fromUserInput('#' . $fn['ref_id'], ['attributes' => ['id' => $fn['fn_id'], 'class' => 'footnote-link']]); $link = Link::fromTextAndUrl(($footnote_link_text), $url)->toRenderable(); $build['footnote-link'] = $link; $override_page_in_citation = $fn['page'] ? $fn['page'] : FALSE; } else { // Output footnote that has more than one reference to it in the body. // The only difference is to insert backlinks to all references. // Helper: we need to enumerate a, b, c... $abc = str_split("abcdefghijklmnopqrstuvwxyz"); $i = 0; $url = Url::fromUserInput('#' . $fn['ref_id'][0], ['attributes' => ['id' => $fn['fn_id'], 'class' => 'footnote-link']]); $build['footnote-link'] = Link::fromTextAndUrl($footnote_link_text, $url)->toRenderable(); foreach ($fn['ref_id'] as $ref) { $url = Url::fromUserInput( '#' . $ref, ['attributes' => ['id' => $fn['fn_id'], 'class' => 'footnote-multi']]); $build[] = Link::fromTextAndUrl($abc[$i], $url)->toRenderable(); $i++; } $override_page_in_citation = FALSE; } if (isset($fn['ibid']) && $fn['ibid']) { $build['footnote-text'] = [ '#type' => 'markup', '#markup' => ' ' . t('Ibid') . '.' . (!empty($fn['page']) ? ', ' . $fn['page'] : '') . '', ]; } else if (!empty($fn['text']) && $variables['note_type'] == ReferenceFootnotesFilter::ENDNOTE) { $build['footnote-link'] = Link::fromTextAndUrl($fn['value'], $url)->toRenderable(); $build['footnote-text'] = [ '#type' => 'markup', '#markup' => ' ' . $fn['text'] . '', ]; } if (!empty($reference_entity_id)) { if (empty($fn['ibid'])) { $citation_build = $citation_tools->getRenderableReference($reference_entity_id); if ($override_page_in_citation) { $citation_build['#data']['page'] = $override_page_in_citation; } $build[] = $citation_build; } $render = render($build); $item['sort'] = trim(strip_tags(render($citation_build))); } // $item['#markup'] = $render; $notes['#items'][] = $build; $reference_entity_id = FALSE; $render = FALSE; } if ($sort_references_by == 'alphabetical' && $variables['note_type'] == ReferenceFootnotesFilter::REFERENCE) { usort($notes['#items'], '_bibcite_footnotes_reference_array_cmp'); } $variables['notes'] = $notes; } /** * Comparator function for sorting lists of references. * * @param $a First item to compare * @param $b Second item to compare * @return int Result of the comparison. */ function _bibcite_footnotes_reference_array_cmp($a, $b) { $a1 = (!empty($a['sort']) ? strtolower($a['sort']) : ''); $b1 = (!empty($b['sort']) ? strtolower($b['sort']) : ''); return strcmp($a1, $b1); } /** * Implementation of hook_preprocess_bibcite_footnote_link(). * * Construct a link inside a block of text so that it points to the reference list. * * @param $variables */ function bibcite_footnotes_preprocess_bibcite_footnote_link(&$variables) { // $variables['fn']['fn']['#type'] = 'markeup'; // $variables['fn']['fn']['#markup'] = '