You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/tdemarkdown/markdown_part.cpp

144 lines
4.2 KiB

/***************************************************************************
* Markdown Viewer part *
* Copyright (c) 2022 Mavridis Philippe <mavridisf@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include <tqbuffer.h>
#include <tqfile.h>
#include <tdeparts/genericfactory.h>
#include <kstandarddirs.h>
#include <tdehtmlview.h>
/* MD4C-HTML */
#include <md4c-html.h>
#include "markdown_part.h"
typedef KParts::GenericFactory<MarkdownPart> Factory;
K_EXPORT_COMPONENT_FACTORY(libtdemarkdown, Factory)
MarkdownPart::MarkdownPart(TQWidget* parentWidget, const char* widgetName,
TQObject* parent, const char* name, const TQStringList& args)
: TDEHTMLPart(parentWidget, name = "TDEMarkdown")
{
setInstance(Factory::instance());
/* Features */
setJScriptEnabled(false);
setJavaEnabled(false);
setMetaRefreshEnabled(false);
setPluginsEnabled(false);
setAutoloadImages(true);
setXMLFile( locate("data", "tdemarkdown/markdown_part.rc") );
}
MarkdownPart::~MarkdownPart()
{
}
TDEAboutData* MarkdownPart::createAboutData()
{
TDEAboutData* aboutData = new TDEAboutData(
"tdemarkdown", I18N_NOOP("TDE Markdown Viewer"), "1.0",
I18N_NOOP("TDEMarkdown is an embeddable viewer for Markdown documents."),
TDEAboutData::License_GPL_V2, "© 2022 Mavridis Philippe"
);
aboutData->addAuthor("Mavridis Philippe (blu.256)", I18N_NOOP("Developer"), "mavridisf@gmail.com");
return aboutData;
}
bool MarkdownPart::openURL(const KURL& u)
{
if(u.isLocalFile())
{
TQFile local(u.path());
if(!local.open(IO_ReadOnly))
{
return false;
}
TQByteArray data = local.readAll();
local.close();
if(!data.isNull())
{
if (data[data.size()-1] != '\0')
{
data.resize(data.size()+1);
data[data.size()-1] = '\0';
}
begin(u);
TQString parsed(parse((MD_CHAR*) data.data(), u.fileName().utf8().data()));
write(parsed);
end();
}
}
emit started(0L);
return true;
}
TQString& MarkdownPart::parse(MD_CHAR* document, MD_CHAR* title)
{
m_buffer = "<!DOCTYPE html>\n";
m_buffer += "<html>\n";
m_buffer += " <head>\n";
m_buffer += " <meta charset='utf-8'>\n";
m_buffer += " <title>" + (title ? title : i18n("Markdown document")) + "</title>\n";
m_buffer += " </head>\n";
m_buffer += " <body>\n";
TQByteArray data;
int success = md_html(document,
MD_SIZE(strlen(document)),
&MarkdownPart::processHTML,
&data,
MD_DIALECT_GITHUB | MD_FLAG_PERMISSIVEURLAUTOLINKS | MD_FLAG_PERMISSIVEEMAILAUTOLINKS | MD_FLAG_PERMISSIVEWWWAUTOLINKS
| MD_FLAG_LATEXMATHSPANS | MD_FLAG_PERMISSIVEATXHEADERS | MD_FLAG_UNDERLINE | MD_FLAG_TASKLISTS,
0);
if (success == -1)
{
m_buffer += TQString("<b>%1</b>").arg(i18n("Error: malformed document."));
}
else
{
if (data[data.size()-1] != '\0')
{
data.resize(data.size()+1);
data[data.size()-1] = '\0';
}
m_buffer += TQString::fromLocal8Bit(data);
}
m_buffer += " </body>\n";
m_buffer += "</html>\n";
return m_buffer;
}
void MarkdownPart::processHTML(const MD_CHAR* data, MD_SIZE data_size, void* user_data)
{
TQByteArray *ud = static_cast<TQByteArray*>(user_data);
TQBuffer buff(*ud);
if (data_size > 0)
{
buff.open(IO_WriteOnly | IO_Append);
buff.writeBlock(data, (int)data_size);
buff.close();
}
}
#include "markdown_part.moc"