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"