diff --git a/core/textdocumentgenerator.h b/core/textdocumentgenerator.h --- a/core/textdocumentgenerator.h +++ b/core/textdocumentgenerator.h @@ -213,6 +213,12 @@ bool doCloseDocument() override; Okular::TextPage* textPage( Okular::TextRequest *request ) override; + /* @since 1.8 */ + TextDocumentConverter* converter(); + + /* @since 1.8 */ + void setTextDocument( QTextDocument *textDocument ); + private: Q_DECLARE_PRIVATE( TextDocumentGenerator ) Q_DISABLE_COPY( TextDocumentGenerator ) diff --git a/core/textdocumentgenerator.cpp b/core/textdocumentgenerator.cpp --- a/core/textdocumentgenerator.cpp +++ b/core/textdocumentgenerator.cpp @@ -23,6 +23,7 @@ #include "action.h" #include "annotations.h" +#include "document_p.h" #include "page.h" #include "textpage.h" @@ -563,5 +564,24 @@ return d->mGeneralSettings; } +TextDocumentConverter* TextDocumentGenerator::converter() +{ + Q_D( TextDocumentGenerator ); + + return d->mConverter; +} + +void TextDocumentGenerator::setTextDocument( QTextDocument *textDocument ) +{ + Q_D( TextDocumentGenerator ); + + d->mDocument = textDocument; + + Q_FOREACH (Page *p, d->m_document->m_pagesVector ) + { + p->setTextPage( nullptr ); + } +} + #include "moc_textdocumentgenerator.cpp" diff --git a/generators/markdown/converter.h b/generators/markdown/converter.h --- a/generators/markdown/converter.h +++ b/generators/markdown/converter.h @@ -12,7 +12,8 @@ #include -class QDir; +#include + class QTextBlock; class QTextFrame; @@ -28,11 +29,18 @@ QTextDocument *convert( const QString &fileName ) override; + void convertAgain(); + + QTextDocument *convertOpenFile(); + private: - void convertLinks(QTextFrame *parent); - void convertLinks(const QTextBlock& parent); + void extractLinks(QTextFrame *parent); + void extractLinks(const QTextBlock& parent); void convertImages(QTextFrame *parent, const QDir &dir, QTextDocument *textDocument); void convertImages(const QTextBlock& parent, const QDir &dir, QTextDocument *textDocument); + + FILE *m_markdownFile; + QDir m_fileDir; }; } diff --git a/generators/markdown/converter.cpp b/generators/markdown/converter.cpp --- a/generators/markdown/converter.cpp +++ b/generators/markdown/converter.cpp @@ -9,6 +9,8 @@ #include "converter.h" +#include "generator_md.h" + #include #include @@ -38,37 +40,59 @@ #ifndef MKD_AUTOLINK #define MKD_AUTOLINK 0 #endif - + using namespace Markdown; Converter::Converter() + : m_markdownFile( nullptr ) { } Converter::~Converter() { + if ( m_markdownFile ) + { + fclose( m_markdownFile ); + } } QTextDocument* Converter::convert( const QString &fileName ) { - FILE *markdownFile = fopen( fileName.toLocal8Bit(), "rb" ); - if ( !markdownFile ) { + m_markdownFile = fopen( fileName.toLocal8Bit(), "rb" ); + if ( !m_markdownFile ) { emit error( i18n( "Failed to open the document" ), -1 ); return nullptr; } - const QDir dir = QDir( fileName.left( fileName.lastIndexOf( '/' ) ) ); - - MMIOT *markdownHandle = mkd_in( markdownFile, 0 ); + m_fileDir = QDir( fileName.left( fileName.lastIndexOf( '/' ) ) ); + + QTextDocument *doc = convertOpenFile(); + extractLinks( doc->rootFrame() ); + return doc; +} + +void Converter::convertAgain() +{ + setDocument( convertOpenFile() ); +} + +QTextDocument *Converter::convertOpenFile() +{ + rewind( m_markdownFile ); + + MMIOT *markdownHandle = mkd_in( m_markdownFile, 0 ); - if ( !mkd_compile( markdownHandle, MKD_FENCEDCODE | MKD_GITHUBTAGS | MKD_AUTOLINK ) ) { + int flags = MKD_FENCEDCODE | MKD_GITHUBTAGS | MKD_AUTOLINK; + if (!MarkdownGenerator::isFancyPantsEnabled()) + flags |= MKD_NOPANTS; + if ( !mkd_compile( markdownHandle, flags ) ) { emit error( i18n( "Failed to compile the Markdown document." ), -1 ); return 0; } char *htmlDocument; const int size = mkd_document( markdownHandle, &htmlDocument ); - + const QString html = QString::fromUtf8( htmlDocument, size ); QTextDocument *textDocument = new QTextDocument; @@ -84,27 +108,26 @@ QTextFrame *rootFrame = textDocument->rootFrame(); rootFrame->setFrameFormat( frameFormat ); - convertLinks( rootFrame ); - convertImages( rootFrame, dir, textDocument ); + convertImages( rootFrame, m_fileDir, textDocument ); return textDocument; } -void Converter::convertLinks(QTextFrame * parent) +void Converter::extractLinks(QTextFrame * parent) { for ( QTextFrame::iterator it = parent->begin(); !it.atEnd(); ++it ) { QTextFrame *textFrame = it.currentFrame(); const QTextBlock textBlock = it.currentBlock(); if ( textFrame ) { - convertLinks(textFrame); + extractLinks(textFrame); } else if ( textBlock.isValid() ) { - convertLinks(textBlock); + extractLinks(textBlock); } } } -void Converter::convertLinks(const QTextBlock & parent) +void Converter::extractLinks(const QTextBlock & parent) { for ( QTextBlock::iterator it = parent.begin(); !it.atEnd(); ++it ) { const QTextFragment textFragment = it.fragment(); diff --git a/generators/markdown/generator_md.h b/generators/markdown/generator_md.h --- a/generators/markdown/generator_md.h +++ b/generators/markdown/generator_md.h @@ -21,7 +21,14 @@ MarkdownGenerator( QObject *parent, const QVariantList &args ); // [INHERITED] reparse configuration + bool reparseConfig() override; void addPages( KConfigDialog* dlg ) override; + + static bool isFancyPantsEnabled() { return s_isFancyPantsEnabled; } + + private: + static bool s_isFancyPantsEnabled; + static bool s_wasFancyPantsEnabled; }; #endif diff --git a/generators/markdown/generator_md.cpp b/generators/markdown/generator_md.cpp --- a/generators/markdown/generator_md.cpp +++ b/generators/markdown/generator_md.cpp @@ -11,22 +11,54 @@ #include "converter.h" #include "debug_md.h" +#include "mdsettings.h" #include #include #include +#include + OKULAR_EXPORT_PLUGIN(MarkdownGenerator, "libokularGenerator_md.json") +bool MarkdownGenerator::s_isFancyPantsEnabled = true; +bool MarkdownGenerator::s_wasFancyPantsEnabled = true; + MarkdownGenerator::MarkdownGenerator( QObject *parent, const QVariantList &args ) : Okular::TextDocumentGenerator( new Markdown::Converter, QStringLiteral("okular_markdown_generator_settings"), parent, args ) { + Okular::TextDocumentSettings *mdSettings = generalSettings(); + + mdSettings->addItemBool( "SmartyPants", s_isFancyPantsEnabled, true ); + mdSettings->load(); + s_wasFancyPantsEnabled = s_isFancyPantsEnabled; +} + +bool MarkdownGenerator::reparseConfig() +{ + const bool textDocumentGeneratorChangedConfig = Okular::TextDocumentGenerator::reparseConfig(); + + if (s_wasFancyPantsEnabled != s_isFancyPantsEnabled) { + s_wasFancyPantsEnabled = s_isFancyPantsEnabled; + + Markdown::Converter *c = static_cast( converter() ); + c->convertAgain(); + setTextDocument( c->document() ); + + return true; + } + + return textDocumentGeneratorChangedConfig; } void MarkdownGenerator::addPages( KConfigDialog* dlg ) { Okular::TextDocumentSettingsWidget *widget = new Okular::TextDocumentSettingsWidget(); + QCheckBox *enableSmartyPants = new QCheckBox( dlg ); + enableSmartyPants->setObjectName( QString::fromUtf8( "kcfg_SmartyPants" ) ); + widget->addRow( i18n("Enable SmartyPants formatting"), enableSmartyPants ); + dlg->addPage( widget, generalSettings(), i18n("Markdown"), QStringLiteral("text-markdown"), i18n("Markdown Backend Configuration") ); }