' . t('About') . ''; $output .= '

' . t('Inline footnote links for BibCite References') . '

'; return $output; default: } } /** * Implementation of hook_preprocess_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_footnote_list(&$variables) { $config = \Drupal::config('filter.format.rich_text_references');//filters.filter_reference_footnotes.settings'); $footnotes = $variables['footnotes']; $notes = [ '#theme' => 'item_list', '#list_type' => 'ul', '#title' => $config->get('filters.filter_reference_footnotes.settings.notes_section_label'), '#attributes' => ['class' => 'footnotes'], '#wrapper_attributes' => ['class' => 'container'], ]; $references= [ '#theme' => 'item_list', '#list_type' => 'ul', '#title' => $config->get('filters.filter_reference_footnotes.settings.references_section_label'), '#attributes' => ['class' => 'footnotes'], '#wrapper_attributes' => ['class' => 'container'], ]; $references['#attached']['library'][] = 'bibcite_footnotes/reference_footnote'; $dont_show_backlink_text = $config->get('filters.filter_reference_footnotes.settings.reference_dont_show_backlink_text'); $sort_references_by = $config->get('filters.filter_reference_footnotes.settings.reference_sort_by'); $citation_tools = new CitationTools(); foreach ($footnotes as $fn) { $item = [ '#id' => $fn['fn_id'], '#wrapper_attributes' => [ 'class' => ['footnote'], ], ]; $build = []; $reference_entity_id = _bibcite_footnotes_get_reference_entity_id_from_bibcite_footnote($fn['text']); $footnote_link_text = $dont_show_backlink_text && $reference_entity_id ? '^' : $fn['value']; if (!is_array($fn['ref_id'])) { // Output normal footnote. $url = Url::fromUserInput('#' . $fn['ref_id'], ['attributes' => ['id' => $fn['fn_id'], 'class' => 'footnote-link']]); $link = Link::fromTextAndUrl(($footnote_link_text), $url)->toRenderable(); $build[] = $link; } 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[] = 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++; } } if (!empty($reference_entity_id)) { $citation_build = $citation_tools->getRenderableReference($reference_entity_id); $build[] = $citation_build; $render = render($build); $item['#markup'] = $render; $item['sort'] = trim(strip_tags(render($citation_build))); $references['#items'][] = $item; } else { $build[] = ['#type' => 'markup', '#markup' => ' ' . $fn['text']]; $render = render($build); $item['#markup'] = $render; $notes['#items'][] = $item; } } $variables['notes'] = $notes; if ($sort_references_by == 'alphabetical') { usort($references['#items'], '_bibcite_footnotes_reference_array_cmp'); } $variables['references'] = $references; } /** * @param $text The text of the bibcite reference placeholder. * @return Entity id of the Reference. */ function _bibcite_footnotes_get_reference_entity_id_from_bibcite_footnote($text){ preg_match('/\[bibcite_reference:(\d*)\]/', $text, $matches); return $matches[1]; } 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); } function bibcite_footnotes_preprocess_footnote_link(&$variables) { // $variables['fn']['fn']['#type'] = 'markeup'; // $variables['fn']['fn']['#markup'] = '

Hello!

'; $fn = $variables['fn']['fn']; // TODO: Make a more formal way to denote inline citations. $class = 'see-footnote'; // Generate the hover text $citation_tools = new CitationTools(); $citation_entity_id = _bibcite_footnotes_get_reference_entity_id_from_bibcite_footnote($fn['text']); $citation_data = $citation_tools->getRenderableReference($citation_entity_id); // Citation contains a page reference, so construct parenthetical footnote. if (!empty($fn['page'])) { $fn['value'] = "({$fn['value']}, {$fn['page']})"; $citation_data['#data']['page'] = $fn['page']; $class .= '-inline'; } $title = trim(strip_tags(render($citation_data))); $url = Url::fromUserInput('#' . $fn['fn_id'], ['attributes' => ['id' => $fn['ref_id'], 'class' => $class, 'title' => $title]]); $link = Link::fromTextAndUrl($fn['value'], $url)->toRenderable(); $variables['fn']['fn'][] = $link; } function bibcite_footnotes_theme_registry_alter(&$theme_registry) { unset($theme_registry['footnote_list']['function']); $theme_registry['footnote_list']['path'] = drupal_get_path('module', 'bibcite_footnotes') . '/templates'; $theme_registry['footnote_list']['template'] = 'footnote-list'; $theme_registry['footnote_list']['variables']['notes'] = []; $theme_registry['footnote_list']['variables']['references'] = []; $theme_registry['footnote_list']['variables']['footnotes'] = []; unset($theme_registry['footnote_link']['function']); $theme_registry['footnote_link']['path'] = drupal_get_path('module', 'bibcite_footnotes') . '/templates'; $theme_registry['footnote_link']['template'] = 'footnote-link'; }