From 6973fdcbdc2395c53b4f888001d303e811a736a9 Mon Sep 17 00:00:00 2001 From: Caleb Campbell Date: Sat, 20 Dec 2025 09:25:59 +1100 Subject: [PATCH 1/3] 2 - Added support for Bible Linker style Bible formatting. --- main.ts | 5 ++- src/local-bible-ref-setting-tab.ts | 27 +++++++++++++ src/passage-suggest.ts | 61 ++++++++++++++++++++++++------ src/settings.ts | 4 +- 4 files changed, 83 insertions(+), 14 deletions(-) diff --git a/main.ts b/main.ts index 3f6c07b..fd1e26e 100644 --- a/main.ts +++ b/main.ts @@ -1,5 +1,5 @@ import { Plugin } from 'obsidian'; -import LocalBibleRefSettingTab from 'src/local-bible-ref-setting-tab'; +import LocalBibleRefSettingTab, { BibleFormat } from 'src/local-bible-ref-setting-tab'; import { PassageFormat } from 'src/passage-reference'; import { PassageSuggest } from 'src/passage-suggest'; import { LocalBibleRefSettings } from 'src/settings'; @@ -20,7 +20,8 @@ export default class LocalBibleRefPlugin extends Plugin { this.settings ??= { biblesPath: '', defaultVersionShorthand: '', - defaultPassageFormat: PassageFormat.Callout + defaultPassageFormat: PassageFormat.Callout, + bibleFormat: BibleFormat.LocalBibleRef, }; } diff --git a/src/local-bible-ref-setting-tab.ts b/src/local-bible-ref-setting-tab.ts index ab0a77a..c5cebd3 100644 --- a/src/local-bible-ref-setting-tab.ts +++ b/src/local-bible-ref-setting-tab.ts @@ -16,6 +16,10 @@ export default class LocalBibleRefSettingTab extends PluginSettingTab { const { containerEl } = this; containerEl.empty(); + new Setting(containerEl) + .setName('Configurations') + .setHeading(); + let biblesPathTimeout: number; new Setting(containerEl) .setName('Bibles path') @@ -48,6 +52,10 @@ export default class LocalBibleRefSettingTab extends PluginSettingTab { new PathSuggest(this.app, text.inputEl); }); + new Setting(containerEl) + .setName('Defaults') + .setHeading(); + let defaultVersionTimeout: number; const defaultVersionSetting = new Setting(containerEl) .setName('Default version shorthand') @@ -90,5 +98,24 @@ export default class LocalBibleRefSettingTab extends PluginSettingTab { this.plugin.settings.defaultPassageFormat = value as PassageFormat; await this.plugin.saveSettings(); })); + + new Setting(containerEl) + .setName('Bible Format') + .setDesc('The formatting style you use for your vault bibles. Local Bible Ref relies on this to parse passages correctly.') + .addDropdown(dropdown => dropdown + .addOptions({ + localBibleRef: 'Local Bible Ref', + bibleLinker: 'Bible Linker', + }) + .setValue(this.plugin.settings.bibleFormat) + .onChange(async (value) => { + this.plugin.settings.bibleFormat = value as BibleFormat; + await this.plugin.saveSettings(); + })); } +} + +export enum BibleFormat { + LocalBibleRef = 'localBibleRef', + BibleLinker = 'bibleLinker', } \ No newline at end of file diff --git a/src/passage-suggest.ts b/src/passage-suggest.ts index bc7be6e..4e4d143 100644 --- a/src/passage-suggest.ts +++ b/src/passage-suggest.ts @@ -12,6 +12,7 @@ import { } from "obsidian"; import { PassageFormat, PassageReference } from "./passage-reference"; import { LocalBibleRefSettings } from "./settings"; +import { BibleFormat } from "./local-bible-ref-setting-tab"; export class PassageSuggest extends EditorSuggest { private settings: LocalBibleRefSettings; @@ -105,7 +106,7 @@ export class PassageSuggest extends EditorSuggest { }); // suggest - const excerpt = this.generateExcerpt(texts[0]); + const excerpt = this.generateExcerpt(texts[0]); const text = this.formatTexts(texts, passageRef, context); return [{ excerpt, text }]; } @@ -164,9 +165,17 @@ export class PassageSuggest extends EditorSuggest { text: string, ref: PassageReference ): string | null { - const regExp = new RegExp( - `(?:[>-] )*(?:\\*\\*\\d{1,3}\\*\\* )?${ref.startVerse}` - ); + let pattern = ''; + if (this.settings.bibleFormat === BibleFormat.BibleLinker) { + pattern = `#{1,6} [a-zA-Z]*${ref.startVerse}[a-zA-Z]*\\n\\w+`; + } else { + const quoteOrList = '(?:[>-] )*'; + const chapterNum = '(?:\\*\\*\\d{1,3}\\*\\* )?'; + const verseNum = `${ref.startVerse}`; + pattern = quoteOrList + chapterNum + verseNum; + } + + const regExp = new RegExp(pattern); const match = text.match(regExp); if (!match) return null; @@ -181,10 +190,17 @@ export class PassageSuggest extends EditorSuggest { ref: PassageReference ): string | null { if (ref.endVerse === -1) return text; - const regex = new RegExp( - `(?:^(?:> |- )*)?${ref.endVerse + 1}`, - "m" - ); + + let pattern = ''; + if (this.settings.bibleFormat === BibleFormat.BibleLinker) { + pattern = `#{1,6} [a-zA-Z]*${ref.endVerse + 1}[a-zA-Z]*\\n\\w+`; + } else { + const quoteOrList = '(?:[>-] )*'; + const verseNum = `${ref.endVerse + 1}`; + pattern = quoteOrList + verseNum; + } + + const regex = new RegExp(pattern); return text.split(regex, 1)[0].trim(); } @@ -193,12 +209,20 @@ export class PassageSuggest extends EditorSuggest { chapterNumber: number, multipleChapters: boolean ): string { + if (this.settings.bibleFormat === BibleFormat.BibleLinker) { + text = this.formatBibleLinkerVerses(text); + } + text = this.removeChapterNumbers(text); text = this.removeHeadings(text); text = this.removeFootnoteRefs(text); text = this.removeBOF(text); text = this.removeEOF(text); + if (this.settings.bibleFormat === BibleFormat.BibleLinker) { + text = this.removeVerseSpacing(text); + } + const chapterMd = multipleChapters ? `**${chapterNumber}**` : ""; if (text.startsWith("> ")) { const quoteMd = text.match(/^(?:> )+/)![0]; @@ -213,6 +237,14 @@ export class PassageSuggest extends EditorSuggest { return (text = `${chapterMd} ${text}`); } + /** Formats verses that use Bible Linker formatting. */ + private formatBibleLinkerVerses(text: string): string { + return text.replace( + /#{1,6} [a-zA-Z]*(\d{1,3})[a-zA-Z]*\n(\w+)/g, + "$1 $2", + ); + } + /** Removes chapter numbers from the given text. */ private removeChapterNumbers(text: string): string { return text.replace(/\*\*\d{1,3}\*\* /g, ""); @@ -245,6 +277,11 @@ export class PassageSuggest extends EditorSuggest { return split[0].trim(); } + /** Removes extra spacing between verses in Bible Linker formatting. */ + private removeVerseSpacing(text: string): string { + return text.replace(/\n{2,}/g, " "); + } + /** Generates an excerpt for the suggestion. */ private generateExcerpt(text: string): string { text = text.split(/<\/sup>/, 2)[1]; @@ -302,15 +339,17 @@ export class PassageSuggest extends EditorSuggest { ref: PassageReference, context: EditorSuggestContext ): string { - const { version, book, startChapter } = ref; + const { version, book, startChapter, startVerse } = ref; const path = `${this.settings.biblesPath}/${version}/${book.name}/${book.name} ${startChapter}.md`; const file = this.app.vault.getFileByPath(normalizePath(path)); if (!file) return ref.stringify(); - + return this.app.fileManager.generateMarkdownLink( file, context.file.path, - undefined, + this.settings.bibleFormat === BibleFormat.BibleLinker + ? `#${startVerse}` + : undefined, ref.stringify(), ); } diff --git a/src/settings.ts b/src/settings.ts index 793219d..4783637 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,7 +1,9 @@ +import { BibleFormat } from "./local-bible-ref-setting-tab"; import { PassageFormat } from "./passage-reference"; export interface LocalBibleRefSettings { biblesPath: string; defaultVersionShorthand: string; defaultPassageFormat: PassageFormat; -} \ No newline at end of file + bibleFormat: BibleFormat; +} From 3e4c37bd77a6c8d808aa924ba1fe09ad74c753db Mon Sep 17 00:00:00 2001 From: Caleb Campbell Date: Sat, 20 Dec 2025 09:29:09 +1100 Subject: [PATCH 2/3] 2 - Quick clean up. --- src/passage-suggest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passage-suggest.ts b/src/passage-suggest.ts index 4e4d143..210ce52 100644 --- a/src/passage-suggest.ts +++ b/src/passage-suggest.ts @@ -106,7 +106,7 @@ export class PassageSuggest extends EditorSuggest { }); // suggest - const excerpt = this.generateExcerpt(texts[0]); + const excerpt = this.generateExcerpt(texts[0]); const text = this.formatTexts(texts, passageRef, context); return [{ excerpt, text }]; } From e692cf2d8250f5135f8e10bfd3e5dc1ad7d616b2 Mon Sep 17 00:00:00 2001 From: Caleb Campbell Date: Sat, 20 Dec 2025 12:18:19 +1100 Subject: [PATCH 3/3] 2 + 5 - Added Manuscript option to default passage format dropdown in settings. --- src/local-bible-ref-setting-tab.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/local-bible-ref-setting-tab.ts b/src/local-bible-ref-setting-tab.ts index c5cebd3..0dc4a30 100644 --- a/src/local-bible-ref-setting-tab.ts +++ b/src/local-bible-ref-setting-tab.ts @@ -89,6 +89,7 @@ export default class LocalBibleRefSettingTab extends PluginSettingTab { .setDesc('The markdown format to use for passages by default.') .addDropdown(dropdown => dropdown .addOptions({ + manuscript: 'Manuscript', paragraph: 'Paragraph', quote: 'Quote', callout: 'Callout',