aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/texteditor/markdowneditor.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2024-01-04 10:47:58 +0100
committerEike Ziller <eike.ziller@qt.io>2024-01-04 12:25:07 +0000
commit6831e11c3e8b58fe0daf9ebc11ad0c491f076b7d (patch)
tree14d010995d74e41840a0ebd154dda2017991d31c /src/plugins/texteditor/markdowneditor.cpp
parent298bd125c0109156e85fb2dd42e28f4feca639c8 (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.cpp21
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());