mirror of
https://github.com/kennethreitz/kjvstudy.org.git
synced 2026-06-05 23:00:16 +00:00
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:
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user