diff --git a/bibcite_footnotes.module b/bibcite_footnotes.module index 08d9987..b3d9a0b 100644 --- a/bibcite_footnotes.module +++ b/bibcite_footnotes.module @@ -69,16 +69,13 @@ function bibcite_footnotes_preprocess_footnote_list(&$variables) { ], ]; $build = []; - $reference_entity_id = _bibcite_footnotes_get_reference_entity_id_from_bibcite_footnote($fn['text']); + $reference_entity_id = _bibcite_footnotes_get_reference_entity_id_from_bibcite_footnote($fn['reference']); - $footnote_link_text = $dont_show_backlink_text && $reference_entity_id ? '^' : $fn['value']; + $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; + $build['footnote-link'] = $link; } else { // Output footnote that has more than one reference to it in the body. @@ -88,7 +85,7 @@ function bibcite_footnotes_preprocess_footnote_list(&$variables) { $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(); + $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']]); @@ -96,11 +93,28 @@ function bibcite_footnotes_preprocess_footnote_list(&$variables) { $i++; } + } + if (!empty($fn['text'])) { + // Handle the case where an endnote contains text and a reference. + // It will appear in both lists. But the link text for the endnote should + // always be the title of the note. So make a copy of the biuld arrray + // and change the link text. + $note_build = $build + ['#type' => 'markup', '#markup' => ' ' . $fn['text'] . '']; + $note_build['footnote-link'] = Link::fromTextAndUrl($fn['value'], $url)->toRenderable(); + if (!empty($reference_entity_id)) { + $citation_build = $citation_tools->getRenderableReference($reference_entity_id); + $note_build[] = $citation_build; + } + $note_item = [] + $item; + $note_item['#markup'] = render($note_build); + + $notes['#items'][] = $note_item; } if (!empty($reference_entity_id)) { $citation_build = $citation_tools->getRenderableReference($reference_entity_id); + $build[] = $citation_build; $render = render($build); $item['#markup'] = $render; @@ -108,13 +122,7 @@ function bibcite_footnotes_preprocess_footnote_list(&$variables) { $references['#items'][] = $item; } - else { - $build[] = ['#type' => 'markup', '#markup' => ' ' . $fn['text']]; - $render = render($build); - $item['#markup'] = $render; - $notes['#items'][] = $item; - } } $variables['notes'] = $notes; @@ -125,15 +133,6 @@ function bibcite_footnotes_preprocess_footnote_list(&$variables) { $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']) : ''); @@ -149,7 +148,7 @@ function bibcite_footnotes_preprocess_footnote_link(&$variables) { $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_entity_id = $fn['reference']; $citation_data = $citation_tools->getRenderableReference($citation_entity_id); // Citation contains a page reference, so construct parenthetical footnote. diff --git a/js/plugins/reference_footnotes/dialogs/footnotes.js b/js/plugins/reference_footnotes/dialogs/footnotes.js index e616600..4723972 100644 --- a/js/plugins/reference_footnotes/dialogs/footnotes.js +++ b/js/plugins/reference_footnotes/dialogs/footnotes.js @@ -12,13 +12,13 @@ elements: [ { - id: 'reference_footnote', + id: 'reference', type: 'select', items: editor.config.referenceFootnotes_list, label: Drupal.t('Reference Footnote item:'), setup: function (element) { if (isEdit) - this.setValue(element.getText()); + this.setValue(element.getAttribute('reference')); } }, { @@ -27,10 +27,10 @@ label: Drupal.t('Or add free-form footnote text :'), setup: function (element) { if (isEdit) { - var text = element.getText(); - if (!text.match(/\[bibcite_reference:(\d*)\]/)) { - this.setValue(text); - } + var text = element.getText(); + + this.setValue(text); + } } }, @@ -68,11 +68,10 @@ this.setupContent( this.realObj ); }, onOk : function() { - var referenceNote = this.getValueOf('info', 'reference_footnote'); + var referenceNote = this.getValueOf('info', 'reference'); var textNote = this.getValueOf('info', 'footnote'); - var value = textNote ? textNote : referenceNote; var page = this.getValueOf('info', 'page'); - CKEDITOR.plugins.reference_footnotes.createFootnote( editor, this.realObj, value, this.getValueOf('info', 'value'), page); + CKEDITOR.plugins.reference_footnotes.createFootnote( editor, this.realObj, textNote, this.getValueOf('info', 'value'), referenceNote, page); delete this.fakeObj; delete this.realObj; } diff --git a/js/plugins/reference_footnotes/plugin.js b/js/plugins/reference_footnotes/plugin.js index c2392d7..41f2e90 100644 --- a/js/plugins/reference_footnotes/plugin.js +++ b/js/plugins/reference_footnotes/plugin.js @@ -29,10 +29,10 @@ init: function( editor ) { editor.addCommand('createreferencefootnotes', new CKEDITOR.dialogCommand('createreferencefootnotes', { - allowedContent: 'fn[value][page]' + allowedContent: 'fn[value]' })); editor.addCommand('editreferencefootnotes', new CKEDITOR.dialogCommand('editreferencefootnotes', { - allowedContent: 'fn[value][page]' + allowedContent: 'fn[value]' })); // Drupal Wysiwyg requirement: The first argument to editor.ui.addButton() @@ -94,7 +94,7 @@ })(); CKEDITOR.plugins.reference_footnotes = { - createFootnote: function( editor, origElement, text, value, page) { + createFootnote: function( editor, origElement, text, value, reference, page) { if (!origElement) { var realElement = CKEDITOR.dom.element.createFromHtml(''); } @@ -109,6 +109,9 @@ CKEDITOR.plugins.reference_footnotes = { if (page && page.length > 0) { realElement.setAttribute('page', page); } + if (reference && reference.length > 0) { + realElement.setAttribute('reference', reference); + } var fakeElement = editor.createFakeElement( realElement , 'cke_reference_footnote', 'hiddenfield', false ); editor.insertElement(fakeElement); diff --git a/src/Plugin/CKEditorPlugin/ReferenceFootnotes.php b/src/Plugin/CKEditorPlugin/ReferenceFootnotes.php index 1851a21..2b94cc5 100644 --- a/src/Plugin/CKEditorPlugin/ReferenceFootnotes.php +++ b/src/Plugin/CKEditorPlugin/ReferenceFootnotes.php @@ -89,7 +89,7 @@ class ReferenceFootnotes extends CKEditorPluginBase { $render = render($build); $output = trim(strip_tags($render)); //$options[] = [$output, $ref_id]; - $options[] = [$output, "[bibcite_reference:$ref_id]"]; + $options[] = [$output, $ref_id]; } return ['referenceFootnotes_list' => $options]; diff --git a/src/Plugin/Filter/ReferenceFootnotesFilter.php b/src/Plugin/Filter/ReferenceFootnotesFilter.php index 1af1fae..3b24eed 100644 --- a/src/Plugin/Filter/ReferenceFootnotesFilter.php +++ b/src/Plugin/Filter/ReferenceFootnotesFilter.php @@ -163,7 +163,7 @@ class ReferenceFootnotesFilter extends FootnotesFilter { // (fixes http://drupal.org/node/194558). $randstr = $this->randstr(); - $value = $this->extractAtribute($matches, 'value'); + $value = $this->extractAttribute($matches, 'value'); if ($value) { // A value label was found. If it is numeric, record it in $n so further @@ -191,7 +191,8 @@ class ReferenceFootnotesFilter extends FootnotesFilter { // attribute. $value_id = preg_replace('|[^\w\-]|', '', $value); - $page = $this->extractAtribute($matches, 'page'); + $page = $this->extractAttribute($matches, 'page'); + $reference = $this->extractAttribute($matches, 'reference'); // Create a sanitized version of $text that is suitable for using as HTML // attribute value. (In particular, as the title attribute to the footnote @@ -211,6 +212,7 @@ class ReferenceFootnotesFilter extends FootnotesFilter { 'text' => $matches[2], 'text_clean' => $text_clean, 'page' => $page, + 'reference' => $reference, 'fn_id' => 'footnote' . $value_id . '_' . $randstr, 'ref_id' => 'footnoteref' . $value_id . '_' . $randstr, ]; @@ -286,7 +288,7 @@ class ReferenceFootnotesFilter extends FootnotesFilter { * * @return string */ - protected function extractAtribute($matches, $attribute): string { + protected function extractAttribute($matches, $attribute): string { $value = ''; // Did the pattern match anything in the tag? if ($matches[1]) {