File indexing completed on 2025-02-16 04:49:25
0001 /* 0002 SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "markdownpreviewwidget.h" 0008 #include "markdownconverter.h" 0009 #include "markdownenginepage.h" 0010 #include <KLocalizedString> 0011 #include <KMessageBox> 0012 #include <QLabel> 0013 #include <QVBoxLayout> 0014 #include <QWebChannel> 0015 #include <QWebEngineSettings> 0016 #include <QWebEngineView> 0017 0018 MarkdownPreviewWidget::MarkdownPreviewWidget(QWidget *parent) 0019 : QWidget(parent) 0020 , mWebView(new QWebEngineView(this)) 0021 , mConverter(new MarkdownConverter(this)) 0022 , mHoverUrlLabel(new QLabel(this)) 0023 { 0024 mConverter->setObjectName(QLatin1StringView("converter")); 0025 connect(mConverter, &MarkdownConverter::failed, this, &MarkdownPreviewWidget::converterFailed); 0026 0027 auto mainLayout = new QVBoxLayout(this); 0028 mainLayout->setObjectName(QLatin1StringView("mainLayout")); 0029 mainLayout->setContentsMargins({}); 0030 0031 auto page = new MarkdownEnginePage(this); 0032 mWebView->setPage(page); 0033 mWebView->resize(600, 800); 0034 0035 mWebView->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, false); 0036 mWebView->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, false); 0037 mWebView->settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false); 0038 mWebView->settings()->setAttribute(QWebEngineSettings::JavascriptCanAccessClipboard, false); 0039 mWebView->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, false); 0040 mWebView->settings()->setAttribute(QWebEngineSettings::XSSAuditingEnabled, false); 0041 mWebView->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, false); 0042 mWebView->settings()->setAttribute(QWebEngineSettings::ErrorPageEnabled, false); 0043 mWebView->settings()->setAttribute(QWebEngineSettings::HyperlinkAuditingEnabled, false); 0044 mWebView->settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, false); 0045 mWebView->settings()->setAttribute(QWebEngineSettings::WebGLEnabled, false); 0046 mWebView->settings()->setAttribute(QWebEngineSettings::AutoLoadIconsForPage, false); 0047 mWebView->settings()->setAttribute(QWebEngineSettings::Accelerated2dCanvasEnabled, false); 0048 mWebView->settings()->setAttribute(QWebEngineSettings::WebGLEnabled, false); 0049 0050 mWebView->setObjectName(QLatin1StringView("webengine")); 0051 mainLayout->addWidget(mWebView); 0052 0053 mHoverUrlLabel->setObjectName(QLatin1StringView("mHoverUrlLabel")); 0054 mainLayout->addWidget(mHoverUrlLabel); 0055 0056 mWebView->setContextMenuPolicy(Qt::NoContextMenu); 0057 connect(page, &MarkdownEnginePage::linkHovered, this, &MarkdownPreviewWidget::slotLinkHovered); 0058 } 0059 0060 MarkdownPreviewWidget::~MarkdownPreviewWidget() = default; 0061 0062 void MarkdownPreviewWidget::slotLinkHovered(const QString &url) 0063 { 0064 QString truncateUrl = url; 0065 if (truncateUrl.length() > 80) { 0066 truncateUrl.truncate(80); 0067 truncateUrl += QStringLiteral("..."); 0068 } 0069 mHoverUrlLabel->setText(truncateUrl); 0070 mHoverUrlLabel->setToolTip(url); 0071 } 0072 0073 void MarkdownPreviewWidget::converterFailed(const QString &msg) 0074 { 0075 KMessageBox::error(this, i18n("Converter Error"), msg); 0076 } 0077 0078 void MarkdownPreviewWidget::setConverterSettings(bool enableEmbeddedLabel, bool enableExtraDefinitionLists) 0079 { 0080 mConverter->setEnableEmbeddedLabel(enableEmbeddedLabel); 0081 mConverter->setEnableExtraDefinitionLists(enableExtraDefinitionLists); 0082 } 0083 0084 void MarkdownPreviewWidget::slotUpdatePreview(const QString &text) 0085 { 0086 mWebView->setHtml(mConverter->convertTextToMarkdown(text), QUrl(QStringLiteral("file://"))); 0087 } 0088 0089 #include "moc_markdownpreviewwidget.cpp"