diff options
author | Eike Ziller <eike.ziller@qt.io> | 2024-01-04 10:47:58 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2024-01-04 12:25:07 +0000 |
commit | 6831e11c3e8b58fe0daf9ebc11ad0c491f076b7d (patch) | |
tree | 14d010995d74e41840a0ebd154dda2017991d31c /src/plugins/texteditor/markdowneditor.cpp | |
parent | 298bd125c0109156e85fb2dd42e28f4feca639c8 (diff) |
Markdown: Add anchors for headings
It looks like GitHub creates heading IDs by
- converting spaces to '-'
- removing anything that is not '-', '_', a number, or a letter
- converting to lower case
Task-number: QTBUG-120518
Change-Id: If09a8e2e0d964e751869eaebd3326a6f983ac495
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/texteditor/markdowneditor.cpp')
-rw-r--r-- | src/plugins/texteditor/markdowneditor.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/plugins/texteditor/markdowneditor.cpp b/src/plugins/texteditor/markdowneditor.cpp index c8106692e3a..877b032465a 100644 --- a/src/plugins/texteditor/markdowneditor.cpp +++ b/src/plugins/texteditor/markdowneditor.cpp @@ -22,6 +22,7 @@ #include <QDesktopServices> #include <QHBoxLayout> +#include <QRegularExpression> #include <QScrollBar> #include <QTextBrowser> #include <QTimer> @@ -184,6 +185,26 @@ public: m_previewRestoreScrollPosition.reset(); m_previewWidget->setMarkdown(m_document->plainText()); + // Add anchors to headings. This should actually be done by Qt QTBUG-120518 + for (QTextBlock block = m_previewWidget->document()->begin(); block.isValid(); + block = block.next()) { + QTextBlockFormat fmt = block.blockFormat(); + if (fmt.hasProperty(QTextFormat::HeadingLevel)) { + QTextCharFormat cFormat = block.charFormat(); + QString anchor; + const QString text = block.text(); + for (const QChar &c : text) { + if (c == ' ') + anchor.append('-'); + else if (c == '_' || c == '-' || c.isDigit() || c.isLetter()) + anchor.append(c.toLower()); + } + cFormat.setAnchor(true); + cFormat.setAnchorNames({anchor}); + QTextCursor cursor(block); + cursor.setBlockCharFormat(cFormat); + } + } m_previewWidget->horizontalScrollBar()->setValue(positions.x()); m_previewWidget->verticalScrollBar()->setValue(positions.y()); |