Compare commits
1 Commits
hotfix/FA-
...
v1.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 89a2cf6db1 |
@@ -155,9 +155,10 @@
|
||||
<Card>
|
||||
<CardContent class="px-6 py-8 md:px-12">
|
||||
<article
|
||||
class="prose prose-lg dark:prose-invert mx-auto max-w-none
|
||||
class="prose prose-lg dark:prose-invert mx-auto max-w-none whitespace-pre-line
|
||||
prose-p:text-foreground prose-p:mb-4 prose-p:leading-relaxed
|
||||
prose-headings:text-foreground
|
||||
[&>p]:text-foreground [&>p]:mb-6 [&>p]:leading-relaxed"
|
||||
first:prose-p:mt-0 last:prose-p:mb-0"
|
||||
>
|
||||
{@html sanitizedBody}
|
||||
</article>
|
||||
|
||||
@@ -1,42 +1,12 @@
|
||||
import DOMPurify from 'isomorphic-dompurify';
|
||||
|
||||
/**
|
||||
* Splits plain text into paragraphs based on newlines.
|
||||
* Double newlines create new paragraphs, single newlines become <br>.
|
||||
* If the content already contains HTML block elements, returns as-is.
|
||||
*/
|
||||
function wrapInParagraphs(text: string): string {
|
||||
// Check if content already has block-level HTML elements
|
||||
const hasBlockElements = /<(p|div|h[1-6]|ul|ol|blockquote|pre|table|hr)[>\s]/i.test(text);
|
||||
if (hasBlockElements) {
|
||||
return text;
|
||||
}
|
||||
|
||||
// Split on double newlines (paragraph breaks)
|
||||
const paragraphs = text.split(/\n\s*\n/);
|
||||
|
||||
return paragraphs
|
||||
.map((para) => {
|
||||
const trimmed = para.trim();
|
||||
if (!trimmed) return '';
|
||||
// Convert single newlines to <br> within paragraphs
|
||||
const withBreaks = trimmed.replace(/\n/g, '<br>');
|
||||
return `<p>${withBreaks}</p>`;
|
||||
})
|
||||
.filter(Boolean)
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitizes chapter HTML content with extended allowed tags.
|
||||
* More permissive than the description sanitizer to support
|
||||
* formatted novel content including headings, lists, and images.
|
||||
* Also wraps plain text in paragraph tags for better browser translate support.
|
||||
*/
|
||||
export function sanitizeChapterHtml(html: string): string {
|
||||
// First wrap in paragraphs if needed, then sanitize
|
||||
const wrapped = wrapInParagraphs(html);
|
||||
return DOMPurify.sanitize(wrapped, {
|
||||
return DOMPurify.sanitize(html, {
|
||||
ALLOWED_TAGS: [
|
||||
// Basic formatting
|
||||
'b',
|
||||
|
||||
Reference in New Issue
Block a user