Add site-wide verse linking to base template

Move verse reference linking JavaScript to base.html so it works automatically
on all pages. Links verse references in .intro-text, description elements, and
paragraph tags while skipping sidebar content. This eliminates the need to
duplicate linking code in individual templates.

Includes debug logging in topic_detail.html for troubleshooting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-23 22:50:14 -05:00
parent aee39fae92
commit fd2fe866ec
2 changed files with 86 additions and 1 deletions
+82
View File
@@ -1516,6 +1516,88 @@
});
})();
// Site-wide verse linking
(function() {
function linkVerseReferences(element) {
if (!element) return;
// Get all text nodes
const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);
const textNodes = [];
let node;
while (node = walker.nextNode()) {
textNodes.push(node);
}
textNodes.forEach(function(textNode) {
let text = textNode.textContent;
let changed = false;
// First, handle comma-separated verse lists like "Psalms 7:17, 9:2, 18:13"
text = text.replace(/\b(\d?\s?[A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)\s+((?:\d+:\d+(?:-\d+)?(?:\s*,\s*)?)+)/g, function(match, book, verseList) {
book = book.trim();
if (!verseList.includes(',')) {
return match;
}
changed = true;
var verses = verseList.split(/\s*,\s*/);
var links = verses.map(function(verseRef) {
verseRef = verseRef.trim();
var parts = verseRef.match(/^(\d+):(\d+)(?:-(\d+))?$/);
if (parts) {
var chapter = parts[1];
var verseStart = parts[2];
var verseEnd = parts[3];
if (verseEnd) {
return '<a href="/book/' + book + '/chapter/' + chapter + '#verse-' + verseStart + '-' + verseEnd + '">' + book + ' ' + chapter + ':' + verseStart + '-' + verseEnd + '</a>';
} else {
return '<a href="/book/' + book + '/chapter/' + chapter + '/verse/' + verseStart + '">' + book + ' ' + chapter + ':' + verseStart + '</a>';
}
}
return verseRef;
});
return links.join(', ');
});
// Then handle individual verse references like "John 3:16" or "Romans 8:28-29"
text = text.replace(/\b(\d?\s?[A-Z][a-z]+(?:\s+[A-Z][a-z]+)?)\s+(\d+):(\d+)(?:-(\d+))?\b/g, function(match, book, chapter, verseStart, verseEnd) {
changed = true;
book = book.trim();
if (verseEnd) {
return '<a href="/book/' + book + '/chapter/' + chapter + '#verse-' + verseStart + '-' + verseEnd + '">' + match + '</a>';
} else {
return '<a href="/book/' + book + '/chapter/' + chapter + '/verse/' + verseStart + '">' + match + '</a>';
}
});
if (changed) {
const span = document.createElement('span');
span.innerHTML = text;
textNode.parentNode.replaceChild(span, textNode);
while (span.firstChild) {
span.parentNode.insertBefore(span.firstChild, span);
}
span.parentNode.removeChild(span);
}
});
}
// Link verses in common content areas
document.querySelectorAll('.intro-text, .prophet-description, .angel-description, .covenant-description, p').forEach(function(element) {
// Skip if already processed or if it's in the sidebar
if (element.closest('.nav-sidebar') || element.dataset.verseLinked) {
return;
}
element.dataset.verseLinked = 'true';
linkVerseReferences(element);
});
})();
// Gauges analytics
var _gauges = _gauges || [];
(function() {
+4 -1
View File
@@ -162,7 +162,10 @@ document.addEventListener('DOMContentLoaded', function() {
}
// Link verse references in all intro-text paragraphs (the expanded overviews)
document.querySelectorAll('.intro-text').forEach(function(paragraph) {
const introTextParagraphs = document.querySelectorAll('.intro-text');
console.log('Found ' + introTextParagraphs.length + ' intro-text paragraphs');
introTextParagraphs.forEach(function(paragraph) {
console.log('Processing paragraph:', paragraph.textContent.substring(0, 100));
linkVerseReferences(paragraph);
});
});