Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
0c66972
Add rich-text formatting to image captions (fixes #337)
saa938 Aug 6, 2026
2253f40
Fix caption link validation bypass and highlight toggle in rich-text …
saa938 Aug 6, 2026
610141b
rich text feature
Famousmaster206 Aug 7, 2026
f645ee6
replace image feature
Famousmaster206 Aug 7, 2026
fefbf8a
prevent lint issues
Famousmaster206 Aug 7, 2026
8937282
Merge pull request #361 from saa938/fix/issue-337-caption-rich-text
Famousmaster206 Aug 8, 2026
a53d435
Merge branch 'main' into replace-image
Famousmaster206 Aug 8, 2026
be58edc
Fix undefined centerImage crashing article saves with images
saa938 Aug 10, 2026
a6363a2
Merge pull request #366 from saa938/fix/article-image-save-undefined-…
Famousmaster206 Aug 10, 2026
cecfe97
prevent build issue
Famousmaster206 Aug 10, 2026
36c623c
undo accidental firebase and fix build issue
Famousmaster206 Aug 10, 2026
66ea684
preserve alt text and stuff
Famousmaster206 Aug 10, 2026
42d51d5
fix highlight issue
Famousmaster206 Aug 10, 2026
5645f0a
fix cursor issue
Famousmaster206 Aug 10, 2026
c623add
fix math rendering corruption
Famousmaster206 Aug 10, 2026
fa21b3a
fix keyboard access
Famousmaster206 Aug 10, 2026
9012878
fix issues
Famousmaster206 Aug 11, 2026
e39ceec
fix highlight
Famousmaster206 Aug 11, 2026
6b5d35a
fix latex
Famousmaster206 Aug 11, 2026
527dd77
fix build
Famousmaster206 Aug 11, 2026
d6b744f
fix center image
Famousmaster206 Aug 11, 2026
642ecf9
Merge branch 'main' into replace-image
Famousmaster206 Aug 11, 2026
1dacd1f
Preserve centerImage when an image block is reconstructed
saa938 Aug 12, 2026
e8f6ecd
Merge pull request #363 from Famousmaster206/replace-image
saa938 Aug 12, 2026
f83cef9
Fix Enter key and make highlight removable
saa938 Aug 12, 2026
2553add
Merge pull request #362 from Famousmaster206/rich-text
saa938 Aug 12, 2026
df2de41
fix completion page to show test results
Famousmaster206 Aug 13, 2026
0f17570
Stop the completion page from reappearing over test results
saa938 Aug 14, 2026
6041396
Merge pull request #370 from Famousmaster206/fix-congradulations-page…
saa938 Aug 14, 2026
7ff2abd
Preserve line breaks in question rich text (fixes #372)
saa938 Aug 17, 2026
8b6549f
Merge pull request #373 from saa938/fix/issue-372-explanation-line-br…
Famousmaster206 Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
383 changes: 359 additions & 24 deletions src/components/article-creator/Editor.tsx

Large diffs are not rendered by default.

26 changes: 24 additions & 2 deletions src/components/article-creator/Renderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import type { QuestionFormat } from "@/types/questions";
import "@/styles/katexStyling.css";
import styles from "./Renderer.module.css";
import { sanitizeAlignment } from "./alignment";
import { renderRichCaptionToHtml } from "./caption-rich-text/render";
import { coerceRichCaption } from "./caption-rich-text/convert";

// Tool names the "alignment" BlockTune is registered on (see Editor.tsx).
const ALIGNABLE_TYPES = new Set(["paragraph", "header", "list"]);
Expand Down Expand Up @@ -245,13 +247,33 @@ const customParsers: Record<
);
}

// Prefer richCaption for the figcaption body; fall back to plain caption.
const rich = (data as { richCaption?: unknown }).richCaption;
let captionBody = "";
if (Array.isArray(rich) && rich.length > 0) {
captionBody = renderRichCaptionToHtml(coerceRichCaption(rich));
} else if (typeof data.caption === "string" && data.caption.length > 0) {
captionBody = decodeEntities(data.caption);
}
const rawAltText =
typeof data.altText === "string"
? data.altText
: typeof data.caption === "string"
? data.caption
: "";
const altText = rawAltText
.replaceAll("&", "&amp;")
.replaceAll('"', "&quot;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;");

if (_config.image.use === "img") {
return `<img class="${imageConditions} ${imgClass}" src="${imageSrc}" alt="${data.caption}">`;
return `<img class="${imageConditions} ${imgClass}" src="${imageSrc}" alt="${altText}">`;
} else if (_config.image.use === "figure") {
const figureClass = _config.image.figureClass ?? "";
const figCapClass = _config.image.figCapClass ?? "";

return `<figure class="${figureClass}"><img class="${imgClass} ${imageConditions}" src="${imageSrc}" alt="${data.caption}"><figcaption class="${figCapClass}">${data.caption}</figcaption></figure>`;
return `<figure class="${figureClass}"><img class="${imgClass} ${imageConditions}" src="${imageSrc}" alt="${altText}"><figcaption class="${figCapClass}">${captionBody}</figcaption></figure>`;
}
return "ERROR DISPLAYING IMAGE";
},
Expand Down
Loading
Loading