Fix markdown comments breaking on reload (template whitespace parsed as code)
Lint / PHP (phpcs PSR-12) (push) Failing after 55s
Lint / JS (eslint) (push) Successful in 9s
Lint / PHP requirements (version + extensions) (push) Successful in 21s
Security / PHP Security (semgrep) (push) Successful in 1m2s
Lint / Deploy (push) Has been skipped
Lint / Notify on failure (push) Successful in 2s
Lint / PHP (phpcs PSR-12) (push) Failing after 55s
Lint / JS (eslint) (push) Successful in 9s
Lint / PHP requirements (version + extensions) (push) Successful in 21s
Security / PHP Security (semgrep) (push) Successful in 1m2s
Lint / Deploy (push) Has been skipped
Lint / Notify on failure (push) Successful in 2s
Stored markdown comments rendered fine in the live preview (parses the raw textarea value) but broke after refresh: the server template emitted the comment text on an indented line, so the on-load renderer parsed element.textContent with ~20 spaces of leading indentation. Markdown treats 4+ leading spaces as a code block, so the first line (e.g. a heading or table row) was mis-parsed and blocks got wrapped in <p>, producing invalid HTML that broke the page layout. - markdown.js: trim the text before parseMarkdown in both on-load renderers so template indentation can't be parsed as a leading code block. - TicketView.php: emit the comment text inline (no surrounding whitespace) so the element's textContent is exactly the stored markdown. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -334,7 +334,10 @@ function buildTable(rows) {
|
||||
// Apply markdown rendering to all elements with data-markdown attribute
|
||||
function renderMarkdownElements() {
|
||||
document.querySelectorAll('[data-markdown]:not([data-rendered])').forEach(element => {
|
||||
const markdownText = element.getAttribute('data-markdown') || element.textContent;
|
||||
// Trim so template indentation/whitespace in the element's text content
|
||||
// doesn't get parsed as a leading code block (which breaks headings,
|
||||
// tables, etc. and diverges from the live preview).
|
||||
const markdownText = (element.getAttribute('data-markdown') || element.textContent).trim();
|
||||
element.innerHTML = parseMarkdown(markdownText);
|
||||
element.dataset.rendered = '1';
|
||||
});
|
||||
@@ -587,7 +590,9 @@ function processPlainTextComments() {
|
||||
function renderMarkdownComments() {
|
||||
document.querySelectorAll('.comment-text[data-markdown]:not([data-rendered])').forEach(el => {
|
||||
el.classList.add('lt-markdown');
|
||||
el.innerHTML = parseMarkdown(el.textContent);
|
||||
// Trim template whitespace so the first line isn't parsed as an
|
||||
// indented code block (matches the live-preview rendering).
|
||||
el.innerHTML = parseMarkdown(el.textContent.trim());
|
||||
el.dataset.rendered = '1';
|
||||
});
|
||||
}
|
||||
|
||||
@@ -621,11 +621,14 @@ include __DIR__ . '/layout_header.php';
|
||||
</div>
|
||||
</div>
|
||||
<div class="comment-text<?= $markdownEnabled ? ' lt-markdown' : '' ?>" id="comment-text-<?= $commentId ?>"
|
||||
<?= $markdownEnabled ? 'data-markdown' : '' ?>>
|
||||
<?= $markdownEnabled
|
||||
<?= $markdownEnabled ? 'data-markdown' : '' ?>><?=
|
||||
// Emit inline (no surrounding whitespace) so a markdown
|
||||
// comment's text content isn't prefixed with template
|
||||
// indentation, which would be parsed as a code block.
|
||||
$markdownEnabled
|
||||
? htmlspecialchars($comment['comment_text'])
|
||||
: nl2br(htmlspecialchars($comment['comment_text'])) ?>
|
||||
</div>
|
||||
: nl2br(htmlspecialchars($comment['comment_text']))
|
||||
?></div>
|
||||
<textarea class="lt-input lt-textarea comment-edit-raw is-hidden"
|
||||
id="comment-raw-<?= $commentId ?>"
|
||||
aria-hidden="true"><?= htmlspecialchars($comment['comment_text']) ?></textarea>
|
||||
|
||||
Reference in New Issue
Block a user