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 "markdownconverter.h" 0008 #include "config-markdownplugin.h" 0009 #ifdef DISCOUNT_HAS_HIGHLIGHTING_SUPPORT 0010 #include "markdownhighlighter.h" 0011 0012 #include <KSyntaxHighlighting/Definition> 0013 #include <KSyntaxHighlighting/Repository> 0014 #include <KSyntaxHighlighting/Theme> 0015 #include <QGuiApplication> 0016 #include <QPalette> 0017 #include <QTextStream> 0018 #endif 0019 0020 #include <KLocalizedString> 0021 extern "C" { 0022 #include <mkdio.h> 0023 } 0024 0025 #ifdef DISCOUNT_HAS_HIGHLIGHTING_SUPPORT 0026 char *external_codefmt(const char *src, int, void *) 0027 { 0028 KSyntaxHighlighting::Repository repo; 0029 QString result; 0030 QTextStream stream(&result); 0031 MarkdownHighlighter highLighter(&stream); 0032 highLighter.setDefinition(repo.definitionForName(QStringLiteral("SystemC"))); 0033 highLighter.setTheme(QGuiApplication::palette().color(QPalette::Base).lightness() < 128 ? repo.defaultTheme(KSyntaxHighlighting::Repository::DarkTheme) 0034 : repo.defaultTheme(KSyntaxHighlighting::Repository::LightTheme)); 0035 highLighter.highlight(QString::fromLatin1(src)); 0036 QByteArray ba = result.toLatin1(); 0037 return qstrdup(ba.data()); 0038 } 0039 0040 #endif 0041 0042 MarkdownConverter::MarkdownConverter(QObject *parent) 0043 : QObject(parent) 0044 { 0045 } 0046 0047 MarkdownConverter::~MarkdownConverter() = default; 0048 0049 QString MarkdownConverter::convertTextToMarkdown(const QString &str) 0050 { 0051 if (str.isEmpty()) { 0052 return {}; 0053 } 0054 const QByteArray textArray = str.toUtf8(); 0055 #if defined(MKD_NOLINKS) 0056 // on discount 2 MKD_NOLINKS is a define 0057 MMIOT *markdownHandle = mkd_string(textArray.constData(), textArray.size(), 0); 0058 mkd_flag_t flags = MKD_FENCEDCODE | MKD_GITHUBTAGS | MKD_AUTOLINK; 0059 if (mEnableEmbeddedLabel) { 0060 flags |= MKD_LATEX; 0061 } 0062 if (mEnableExtraDefinitionLists) { 0063 flags |= MKD_DLEXTRA; 0064 } 0065 #if DISCOUNT_HAS_HIGHLIGHTING_SUPPORT 0066 mkd_e_code_format(markdownHandle, external_codefmt); 0067 #endif 0068 if (!mkd_compile(markdownHandle, flags)) { 0069 Q_EMIT failed(i18n("Failed to compile the Markdown document.")); 0070 mkd_cleanup(markdownHandle); 0071 return {}; 0072 } 0073 #else 0074 // on discount 2 MKD_NOLINKS is a define 0075 0076 MMIOT *markdownHandle = mkd_string(textArray.constData(), textArray.size(), nullptr); 0077 mkd_flag_t *flags = mkd_flags(); 0078 mkd_set_flag_bitmap(flags, MKD_FENCEDCODE | MKD_GITHUBTAGS | MKD_AUTOLINK); 0079 if (mEnableEmbeddedLabel) { 0080 mkd_set_flag_num(flags, MKD_LATEX); 0081 } 0082 if (mEnableExtraDefinitionLists) { 0083 mkd_set_flag_num(flags, MKD_DLEXTRA); 0084 } 0085 #if DISCOUNT_HAS_HIGHLIGHTING_SUPPORT 0086 mkd_e_code_format(markdownHandle, external_codefmt); 0087 #endif 0088 if (!mkd_compile(markdownHandle, flags)) { 0089 Q_EMIT failed(i18n("Failed to compile the Markdown document.")); 0090 mkd_cleanup(markdownHandle); 0091 mkd_free_flags(flags); 0092 return {}; 0093 } 0094 mkd_free_flags(flags); 0095 #endif 0096 char *htmlDocument; 0097 const int size = mkd_document(markdownHandle, &htmlDocument); 0098 0099 const QString html = QString::fromUtf8(htmlDocument, size); 0100 #if 0 // CSS ? 0101 char *cssDocument; 0102 const int cssSize = mkd_css(markdownHandle, &cssDocument); 0103 0104 const QString css = QString::fromUtf8(cssDocument, cssSize); 0105 #endif 0106 0107 mkd_cleanup(markdownHandle); 0108 return html; 0109 } 0110 0111 bool MarkdownConverter::enableEmbeddedLabel() const 0112 { 0113 return mEnableEmbeddedLabel; 0114 } 0115 0116 void MarkdownConverter::setEnableEmbeddedLabel(bool enableEmbeddedLabel) 0117 { 0118 mEnableEmbeddedLabel = enableEmbeddedLabel; 0119 } 0120 0121 bool MarkdownConverter::enableExtraDefinitionLists() const 0122 { 0123 return mEnableExtraDefinitionLists; 0124 } 0125 0126 void MarkdownConverter::setEnableExtraDefinitionLists(bool enableExtraDefinitionLists) 0127 { 0128 mEnableExtraDefinitionLists = enableExtraDefinitionLists; 0129 } 0130 0131 #include "moc_markdownconverter.cpp"