Spaces:
Running
Running
Commit ·
cfd4523
1
Parent(s): 68e09f8
fix: end markers only show for nearby sections (page proximity filter)
Browse files
webapp/tipitaka-api/app/services/page_service.py
CHANGED
|
@@ -70,7 +70,7 @@ class PageService:
|
|
| 70 |
return None
|
| 71 |
|
| 72 |
cursor.execute("""
|
| 73 |
-
SELECT c.title, c.level
|
| 74 |
FROM contents c
|
| 75 |
WHERE c.volume_id = ?
|
| 76 |
AND c.page_number <= ?
|
|
@@ -88,9 +88,10 @@ class PageService:
|
|
| 88 |
# Clean section range suffix: ๓.-๑๐. → ๓.
|
| 89 |
title = re.sub(r'^([\u0E50-\u0E59]+)\.-[\u0E50-\u0E59]+\.\s*', r'\1. ', title)
|
| 90 |
level = r["level"]
|
|
|
|
| 91 |
if level not in seen_levels and title:
|
| 92 |
seen_levels.add(level)
|
| 93 |
-
sections.append({"title": title, "level": level})
|
| 94 |
sections.sort(key=lambda s: s["level"])
|
| 95 |
cleaned = self.search_service.clean_text(row["content_text"])
|
| 96 |
is_blank = self._is_blank_page(cleaned)
|
|
|
|
| 70 |
return None
|
| 71 |
|
| 72 |
cursor.execute("""
|
| 73 |
+
SELECT c.title, c.level, c.page_number
|
| 74 |
FROM contents c
|
| 75 |
WHERE c.volume_id = ?
|
| 76 |
AND c.page_number <= ?
|
|
|
|
| 88 |
# Clean section range suffix: ๓.-๑๐. → ๓.
|
| 89 |
title = re.sub(r'^([\u0E50-\u0E59]+)\.-[\u0E50-\u0E59]+\.\s*', r'\1. ', title)
|
| 90 |
level = r["level"]
|
| 91 |
+
sec_page = r["page_number"]
|
| 92 |
if level not in seen_levels and title:
|
| 93 |
seen_levels.add(level)
|
| 94 |
+
sections.append({"title": title, "level": level, "page_number": sec_page})
|
| 95 |
sections.sort(key=lambda s: s["level"])
|
| 96 |
cleaned = self.search_service.clean_text(row["content_text"])
|
| 97 |
is_blank = self._is_blank_page(cleaned)
|
webapp/tipitaka-web/src/components/layout/ReaderPanel.tsx
CHANGED
|
@@ -17,12 +17,17 @@ const SHELL_STYLES: Record<string, string> = {
|
|
| 17 |
classic: 'bg-[#f5edd8]',
|
| 18 |
};
|
| 19 |
|
| 20 |
-
const renderContent = (html: string, fontSize: number, sections: {title: string; level: number}[]) => {
|
| 21 |
// Sections with "จบ" → end marker below content
|
| 22 |
-
//
|
| 23 |
const endMarkers = sections.filter(s => {
|
| 24 |
const title = s.title.trim();
|
| 25 |
if (!(title.endsWith('จบ') || title.includes('จบ'))) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
if (html && html.includes(title)) return false;
|
| 27 |
return true;
|
| 28 |
});
|
|
@@ -193,7 +198,7 @@ const ReaderPanel: React.FC = () => {
|
|
| 193 |
))}
|
| 194 |
</header>
|
| 195 |
<div className="border-b border-[#c8860a]/15 mb-5" />
|
| 196 |
-
{renderContent(content.content_html_formatted || content.content_html || '', fontSize, content.sections || [])}
|
| 197 |
</>
|
| 198 |
)}
|
| 199 |
|
|
|
|
| 17 |
classic: 'bg-[#f5edd8]',
|
| 18 |
};
|
| 19 |
|
| 20 |
+
const renderContent = (html: string, fontSize: number, sections: {title: string; level: number; page_number?: number}[], currentPage?: number) => {
|
| 21 |
// Sections with "จบ" → end marker below content
|
| 22 |
+
// Only if section's page_number is close to current page (within 5 pages)
|
| 23 |
const endMarkers = sections.filter(s => {
|
| 24 |
const title = s.title.trim();
|
| 25 |
if (!(title.endsWith('จบ') || title.includes('จบ'))) return false;
|
| 26 |
+
// Skip if this end marker belongs to a faraway page
|
| 27 |
+
if (s.page_number !== undefined && currentPage !== undefined) {
|
| 28 |
+
if (currentPage - s.page_number > 5) return false;
|
| 29 |
+
}
|
| 30 |
+
// Skip if already rendered as <h4> inside content body (from <B> tag)
|
| 31 |
if (html && html.includes(title)) return false;
|
| 32 |
return true;
|
| 33 |
});
|
|
|
|
| 198 |
))}
|
| 199 |
</header>
|
| 200 |
<div className="border-b border-[#c8860a]/15 mb-5" />
|
| 201 |
+
{renderContent(content.content_html_formatted || content.content_html || '', fontSize, content.sections || [], content.page_number)}
|
| 202 |
</>
|
| 203 |
)}
|
| 204 |
|