Skip to content

Commit

Permalink
Use intervals in citation
Browse files Browse the repository at this point in the history
  • Loading branch information
anwolosz committed Dec 1, 2024
1 parent d648a83 commit fd33e36
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 104 deletions.
10 changes: 8 additions & 2 deletions src/interfaces/dailyGospelInterface.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
export interface DailyGospelScheme {
passage: string;
export interface GospelScheme {
gospel: QuoteScheme;
}

interface VerseScheme {
chapter: string;
verse: string;
}

interface QuoteIntervalScheme {
start: VerseScheme
end: VerseScheme
}

export interface QuoteScheme {
evangelist: string,
intervals: QuoteIntervalScheme[]
start: VerseScheme
end: VerseScheme
}
160 changes: 85 additions & 75 deletions src/stores/SynopsisStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type { DictionaryScheme } from '@/interfaces/dictionaryInterface'
import router from '../router';
import type { RouteLocationRaw } from 'vue-router';

import { fetchGospel, isValidDate, parseCitation } from '@/utils/calendarGospel';
import { fetchGospel, isValidDate} from '@/utils/calendarGospel';


import synopsisKG from '@/assets/translations/kg.json'
Expand Down Expand Up @@ -213,66 +213,71 @@ export const useSynopsisStore = defineStore('synopsis', {

const dailyGospel = await fetchGospel(new Date(date));
this.isLoading = false
const gospel = parseCitation(dailyGospel.passage)
gospel.start.verse = this.formatVerse(gospel.evangelist, gospel.start.chapter, gospel.start.verse)
gospel.end.verse = this.formatVerse(gospel.evangelist, gospel.end.chapter, gospel.end.verse)
const gospel = dailyGospel.gospel
for (let i = 0; i<gospel.intervals.length; i++)
{
gospel.intervals[i].start.verse = this.formatVerse(gospel.evangelist, gospel.intervals[i].start.chapter, gospel.intervals[i].start.verse)
gospel.intervals[i].end.verse = this.formatVerse(gospel.evangelist, gospel.intervals[i].end.chapter, gospel.intervals[i].end.verse)
}
if (isDaily)
{
this.dailyGospel = gospel
}
else {
this.dateGospel = gospel
}
// TODO: duplicated functions in isInQuote
const parseChapterVerse = (chapter: string, verse: string) => {
const chapterNumber = parseInt(chapter, 10);
const match = verse.match(/^(\d+)([a-z]?)$/);

// Parse function for chapter and verse with two parameters
const parseChapterVerse = (chapter: string, verse: string) => {
const chapterNumber = parseInt(chapter, 10);
const match = verse.match(/^(\d+)([a-z]?)$/);
if (isNaN(chapterNumber) || !match) {
return { chapter: Infinity, verse: Infinity, letter: "" }; // Invalid input fallback
}

if (isNaN(chapterNumber) || !match) {
return { chapter: Infinity, verse: Infinity, letter: "" }; // Invalid input fallback
}
return {
chapter: chapterNumber,
verse: parseInt(match[1], 10),
letter: match[2] || ""
};
};

return {
chapter: chapterNumber, // Parsed chapter number
verse: parseInt(match[1], 10), // Parsed verse number
letter: match[2] || "" // Parsed optional letter
//TODO: similar function used in isQuoteInGospel
const compareChapterVerses = (
cv1: { chapter: number; verse: number; letter: string },
cv2: { chapter: number; verse: number; letter: string }
) => {
if (cv1.chapter !== cv2.chapter) return cv1.chapter - cv2.chapter; // Compare chapters
if (cv1.verse !== cv2.verse) return cv1.verse - cv2.verse; // Compare verses
return cv1.letter.localeCompare(cv2.letter); // Compare optional letters
};
};

//TODO: similar function used in isQuoteInGospel
const compareChapterVerses = (
cv1: { chapter: number; verse: number; letter: string },
cv2: { chapter: number; verse: number; letter: string }
) => {
if (cv1.chapter !== cv2.chapter) return cv1.chapter - cv2.chapter; // Compare chapters
if (cv1.verse !== cv2.verse) return cv1.verse - cv2.verse; // Compare verses
return cv1.letter.localeCompare(cv2.letter); // Compare optional letters
};

for (let i = 0; i < this.currentSynopsis.parts.length; i++) {
const part: PartScheme = this.currentSynopsis.parts[i]
for (let j = 0; j < part.sections.length; j++) {
const section: SectionScheme = part.sections[j]
for (let l = 0; l < section[gospel.evangelist as keyof SectionScheme].length; l++) {
const citation = section[gospel.evangelist as keyof SectionScheme][l] as CitationScheme
if (citation?.leading) {
for (let m = 0; m < citation.content.length; m++) {
const content = citation.content[m]

const contentQuote = parseChapterVerse(content.chapter, content.verse);
const gospelStartQuote = parseChapterVerse(gospel.start.chapter, gospel.start.verse);
const gospelEndQuote = parseChapterVerse(gospel.end.chapter, gospel.end.verse);

for ( let n = 0 ; n < gospel.intervals.length; n ++)
{
for (let i = 0; i < this.currentSynopsis.parts.length; i++) {
const part: PartScheme = this.currentSynopsis.parts[i]
for (let j = 0; j < part.sections.length; j++) {
const section: SectionScheme = part.sections[j]
for (let l = 0; l < section[gospel.evangelist as keyof SectionScheme].length; l++) {
const citation = section[gospel.evangelist as keyof SectionScheme][l] as CitationScheme
if (citation?.leading) {
for (let m = 0; m < citation.content.length; m++) {
const content = citation.content[m]

const contentQuote = parseChapterVerse(content.chapter, content.verse);
const gospelStartQuote = parseChapterVerse(gospel.intervals[n].start.chapter, gospel.intervals[n].start.verse);
const gospelEndQuote = parseChapterVerse(gospel.intervals[n].end.chapter, gospel.intervals[n].end.verse);

if (
compareChapterVerses(gospelStartQuote, contentQuote) <= 0
&&
compareChapterVerses(contentQuote, gospelEndQuote) <= 0
&&
!gospelSections.includes(section.id)
){
gospelSections.push(section.id)
}
if (
compareChapterVerses(gospelStartQuote, contentQuote) <= 0
&&
compareChapterVerses(contentQuote, gospelEndQuote) <= 0
&&
!gospelSections.includes(section.id)
){
gospelSections.push(section.id)
}
}
}
}
}
Expand All @@ -292,38 +297,43 @@ export const useSynopsisStore = defineStore('synopsis', {
}
if (gospel && gospel.evangelist === evangelist)
{
const parseVerse = (verse: string) => {
const parseChapterVerse = (chapter: string, verse: string) => {
const chapterNumber = parseInt(chapter, 10);
const match = verse.match(/^(\d+)([a-z]?)$/);
if (!match) return { number: Infinity, letter: "" }; // Invalid verse fallback
return { number: parseInt(match[1], 10), letter: match[2] || "" };
};

if (isNaN(chapterNumber) || !match) {
return { chapter: Infinity, verse: Infinity, letter: "" }; // Invalid input fallback
}

return {
chapter: chapterNumber, // Parsed chapter number
verse: parseInt(match[1], 10), // Parsed verse number
letter: match[2] || "" // Parsed optional letter
};
};

const compareVerses = (verse1: { number: number; letter: string }, verse2: { number: number; letter: string }) => {
if (verse1.number !== verse2.number) return verse1.number - verse2.number;
return verse1.letter.localeCompare(verse2.letter);
const compareChapterVerses = (
cv1: { chapter: number; verse: number; letter: string },
cv2: { chapter: number; verse: number; letter: string }
) => {
if (cv1.chapter !== cv2.chapter) return cv1.chapter - cv2.chapter; // Compare chapters
if (cv1.verse !== cv2.verse) return cv1.verse - cv2.verse; // Compare verses
return cv1.letter.localeCompare(cv2.letter); // Compare optional letters
};

const quoteChapter = parseInt(chapter, 10);
const quoteVerse = parseVerse(verse);
const startChapter = parseInt(gospel.start.chapter, 10);
const startVerse = parseVerse(gospel.start.verse);
const endChapter = parseInt(gospel.end.chapter, 10);
const endVerse = parseVerse(gospel.end.verse);


if (quoteChapter < startChapter || quoteChapter > endChapter) {
return false;
}

if (quoteChapter === startChapter && compareVerses(quoteVerse, startVerse) < 0) {
return false;
}

if (quoteChapter === endChapter && compareVerses(quoteVerse, endVerse) > 0) {
return false;
const parsedQuote = parseChapterVerse(chapter, verse);
for (let i = 0; i < gospel.intervals.length; i++)
{
const parsedStart = parseChapterVerse(gospel.intervals[i].start.chapter, gospel.intervals[i].start.verse);
const parsedEnd = parseChapterVerse(gospel.intervals[i].end.chapter, gospel.intervals[i].end.verse);

if (compareChapterVerses(parsedQuote, parsedEnd) <= 0 && compareChapterVerses(parsedQuote, parsedStart) >= 0) {
return true;
}
}
return true;

return false;
}
}
}
Expand Down
33 changes: 6 additions & 27 deletions src/utils/calendarGospel.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import type { DailyGospelScheme, QuoteScheme } from "@/interfaces/dailyGospelInterface";
import type { GospelScheme, QuoteScheme } from "@/interfaces/dailyGospelInterface";

export async function fetchGospel(date: Date): Promise<DailyGospelScheme> {
export async function fetchGospel(date: Date): Promise<GospelScheme> {
try {
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const response = await fetch(`https://igenaptar-api-production.up.railway.app/fetch-webpage/${date.getFullYear()}/${month}/${day}`);

// const response = await fetch(`http://localhost:3000/${date.getFullYear()}/${month}/${day}`);
const response = await fetch(`https://igenaptar-api-production.up.railway.app/${date.getFullYear()}/${month}/${day}`);
if (!response.ok) {
throw new Error(`Error: ${response.status} - ${response.statusText}`);
throw new Error(`Error: ${response.status} - ${response.statusText}`);
}

const data = await response.json();
return data;

Expand All @@ -19,27 +19,6 @@ export async function fetchGospel(date: Date): Promise<DailyGospelScheme> {
}
}

export function parseCitation(citation: string) : QuoteScheme {
const regex = /^([A-Za-z]{2})\s(\d+),(\d+[ab]?)(?:-(\d+[ab]?)(?:,(\d+[ab]?))?)?/;
const match = citation.match(regex);

if (match) {
return {
evangelist: match[1].toLowerCase(),
start: {
chapter: match[2],
verse: match[3],
},
end: {
chapter: match[5] ? match[4] : match[2],
verse: match[5] || (match[4] || match[3]),
}
};
} else {
throw new Error('Invalid reference format');
}
}

export function isValidDate(value : string) : boolean {
const regex = /^\d{4}-\d{2}-\d{2}$/;

Expand Down

0 comments on commit fd33e36

Please sign in to comment.