35#include "klfbackend_p.h"
36#include "klfuserscript.h"
116 inline int ref() {
return ++refcount; }
117 inline int deref() {
return --refcount; }
133 scriptInfoError = 999;
138 scriptInfoError = 999;
139 scriptInfoErrorString =
QString(
"Error parsing scriptinfo XML contents: %1: %2")
143 void read_script_info()
146 scriptInfoErrorString =
QString();
150 if ( !
fxml.open(QIODevice::ReadOnly) ) {
151 _set_xml_read_error(
QString(
"Can't open XML file %1: %2").arg(
xmlfname).arg(
fxml.errorString()));
159 _set_xml_read_error(
QString(
"XML parse error: %1 (file %2 line %3 col %4)")
166 if (root.
nodeName() !=
"klfuserscript-info") {
167 _set_xml_parsing_error(
xmlfname,
QString(
"expected <klfuserscript-info> as root document element"));
180 if (
n.nodeType() != QDomNode::ElementNode ) {
192 if (
e.nodeName() ==
"exe-script") {
198 }
else if (
e.nodeName() ==
"name") {
204 }
else if (
e.nodeName() ==
"author") {
206 }
else if (
e.nodeName() ==
"version") {
212 }
else if (
e.nodeName() ==
"license") {
218 }
else if (
e.nodeName() ==
"klf-min-version") {
224 }
else if (
e.nodeName() ==
"klf-max-version") {
230 }
else if (
e.nodeName() ==
"category") {
236 }
else if (
e.nodeName() ==
"settings-form-ui") {
242 }
else if (
e.nodeName() ==
"can-provide-default-settings") {
246 if (
e.nodeName() == category) {
301void KLFUserScriptInfo::clearCacheAll()
304 Private::userScriptInfoCache.
clear();
313 klfDbg(
"cache: " << Private::userScriptInfoCache) ;
314 return Private::userScriptInfoCache.contains(
normalizedfn);
323 if (Private::userScriptInfoCache.contains(
normalizedfn)) {
326 d =
new KLFUserScriptInfo::Private;
330 d()->sname =
fi.fileName();
331 d()->basename =
fi.baseName();
333 d()->read_script_info();
348KLFUserScriptInfo::~KLFUserScriptInfo()
363 return d()->basename;
366int KLFUserScriptInfo::scriptInfoError()
const
368 return d()->scriptInfoError;
370QString KLFUserScriptInfo::scriptInfoErrorString()
const
372 return d()->scriptInfoErrorString;
376void KLFUserScriptInfo::setScriptInfoError(
int code,
const QString &
msg)
378 d()->scriptInfoError =
code;
379 d()->scriptInfoErrorString =
msg;
387QString KLFUserScriptInfo::exeScript()
const {
return scriptInfo(ExeScript).
toString(); }
388QString KLFUserScriptInfo::exeScriptFullPath()
const
390 return relativeFile(exeScript());
393QString KLFUserScriptInfo::category()
const {
return scriptInfo(Category).
toString(); }
394QString KLFUserScriptInfo::name()
const {
return scriptInfo(Name).
toString(); }
397QString KLFUserScriptInfo::version()
const {
return scriptInfo(Version).
toString(); }
398QString KLFUserScriptInfo::license()
const {
return scriptInfo(License).
toString(); }
399QString KLFUserScriptInfo::klfMinVersion()
const {
return scriptInfo(KLFMinVersion).
toString(); }
400QString KLFUserScriptInfo::klfMaxVersion()
const {
return scriptInfo(KLFMaxVersion).
toString(); }
403bool KLFUserScriptInfo::canProvideDefaultSettings()
const {
return scriptInfo(CanProvideDefaultSettings).
toBool(); }
413 proc.setProcessAppEvents(
false);
455 if (root.
nodeName() !=
"klfuserscript-default-settings") {
456 klfWarning(
"expected <klfuserscript-default-settings> as root document element");
474 klfWarning(
"Invalid line in reported userscript default config: " <<
line) ;
491bool KLFUserScriptInfo::hasNotices()
const
493 return d->notices.
size();
495bool KLFUserScriptInfo::hasWarnings()
const
497 return d->warnings.
size();
499bool KLFUserScriptInfo::hasErrors()
const
501 return d->errors.
size();
512QVariant KLFUserScriptInfo::scriptInfo(
int propId)
const
514 return d()->property(propId);
527 int id = d()->propertyIdForName(x);
530 <<field<<
" ("<<x<<
")") ;
533 return scriptInfo(
id);
538 return d()->propertyNameList();
541QString KLFUserScriptInfo::objectKind()
const {
return d()->objectKind(); }
547 d()->setProperty(key,
val);
568 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
569 "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
570 "p, li { white-space: pre-wrap; }\n"
571 "p.msgnotice { color: blue; font-weight: bold; margin: 2px 0px; }\n"
572 "p.msgwarning { color: #a06000; font-weight: bold; margin: 2px 0px; }\n"
573 "p.msgerror { color: #a00000; font-weight: bold; margin: 2px 0px; }\n"
574 ".scriptinfokey { }\n"
575 ".scriptinfovalue { font-weight: bold; }\n"
582 txt += escapeListIntoTags(notices(),
"<p class=\"msgnotice\">",
"</p>\n");
585 txt += escapeListIntoTags(warnings(),
"<p class=\"msgwarning\">",
"</p>\n");
588 txt += escapeListIntoTags(errors(),
"<p class=\"msgerror\">",
"</p>\n");
593 "<p style=\"-qt-block-indent: 0; text-indent: 0px; margin-top: 8px; margin-bottom: 0px\">\n"
594 "<span class=\"scriptinfokey\">" +
QObject::tr(
"Script Name:",
"[[user script info text]]")
595 +
"</span> "
599 txt +=
"<span class=\"scriptinfokey\">" +
QObject::tr(
"Category:",
"[[user script info text]]")
600 +
"</span> "
601 "<span class=\"scriptinfovalue\">" + category().
toHtmlEscaped() +
"</span><br />\n";
603 if (!version().isEmpty()) {
605 txt +=
"<span class=\"scriptinfokey\">" +
QObject::tr(
"Version:",
"[[user script info text]]")
606 +
"</span> "
607 "<span class=\"scriptinfovalue\">" + version().
toHtmlEscaped() +
"</span><br />\n";
609 if (!author().isEmpty()) {
611 txt +=
"<span class=\"scriptinfokey\">" +
QObject::tr(
"Author:",
"[[user script info text]]")
612 +
"</span> "
613 "<span class=\"scriptinfovalue\">" + author().
toHtmlEscaped() +
"</span><br />\n";
616 if (!license().isEmpty()) {
618 txt +=
"<span class=\"scriptinfokey\">" +
QObject::tr(
"License:",
"[[user script info text]]")
619 +
"</span> "
620 "<span class=\"scriptinfovalue\">" + license().
toHtmlEscaped() +
"</span><br />\n";
646 return val.split(
QRegExp(
"\\s+"), QString::SkipEmptyParts);
673 K->setScriptInfoError(1001,
QString(
"Error parsing klf-backend-engine XML config: %1: %2")
682 K->setScriptInfoError(
684 QString(
"XML parse error: %1 (klf-backend-engine in %2, relative line %3 col %4)")
690 if (root.
nodeName() !=
"klf-backend-engine") {
691 _set_xml_parsing_error(
QString(
"expected <klf-backend-engine> element"));
702 if (
n.nodeType() != QDomNode::ElementNode ) {
714 if (
e.nodeName() ==
"spits-out") {
715 if (!
property(KLFBackendEngineUserScriptInfo::SpitsOut).toStringList().isEmpty()) {
716 _set_xml_parsing_error(
QString(
"duplicate <spits-out> element"));
719 setProperty(KLFBackendEngineUserScriptInfo::SpitsOut, space_sep_values(
val));
720 }
else if (
e.nodeName() ==
"skip-formats") {
721 if (!
property(KLFBackendEngineUserScriptInfo::SkipFormats).
toString().isEmpty()) {
722 _set_xml_parsing_error(
QString(
"duplicate <skip-formats> element"));
726 if (
e.hasAttribute(
"selector")) {
728 QString s =
e.attribute(
"selector").toUpper();
731 lst << space_sep_values(
val);
733 }
else if (
e.nodeName() ==
"disable-inputs") {
734 if (!
property(KLFBackendEngineUserScriptInfo::DisableInputs).toStringList().isEmpty()) {
735 _set_xml_parsing_error(
QString(
"duplicate <disable-inputs> element"));
739 if (
e.hasAttribute(
"selector")) {
741 QString s =
e.attribute(
"selector").toUpper();
744 lst << space_sep_values(
val);
746 }
else if (
e.nodeName() ==
"input-form-ui") {
747 if (!
property(KLFBackendEngineUserScriptInfo::InputFormUI).toStringList().isEmpty()) {
748 _set_xml_parsing_error(
QString(
"duplicate <input-form-ui> element"));
753 _set_xml_parsing_error(
QString(
"Found unexpected element: %1").arg(
e.nodeName()));
764KLFBackendEngineUserScriptInfo::KLFBackendEngineUserScriptInfo(
const QString& uspath)
769 if (category() !=
"klf-backend-engine") {
770 klfWarning(
"KLFBackendEngineUserScriptInfo instantiated for user script "
771 << uspath <<
", which is of category " << category()) ;
777KLFBackendEngineUserScriptInfo::~KLFBackendEngineUserScriptInfo()
790 return klfBackendEngineInfo(SkipFormats).
toStringList();
794 return klfBackendEngineInfo(DisableInputs).
toStringList();
798 return klfBackendEngineInfo(InputFormUI).
toString();
802QVariant KLFBackendEngineUserScriptInfo::klfBackendEngineInfo(
int propId)
const
804 return d->property(propId);
807QVariant KLFBackendEngineUserScriptInfo::klfBackendEngineInfo(
const QString& field)
const
813 int id = d->propertyIdForName(x);
815 klfDbg(
"KLFBackendEngineUserScriptInfo for "<<
userScriptName()<<
" does not have any information about "
816 <<field<<
" ("<<x<<
")") ;
819 return scriptInfo(
id);
822QStringList KLFBackendEngineUserScriptInfo::klfBackendEngineInfosList()
const
824 return d->propertyNameList();
838struct KLFUserScriptFilterProcessPrivate
872KLFUserScriptFilterProcess::~KLFUserScriptFilterProcess()
892 +d->usinfo->userScriptBaseName().toHtmlEscaped()
906 "<pre class=\"output\">%2</pre></p>\n") ;
918 if (KLFUserScriptFilterProcessPrivate::log.size() > 255) {
919 KLFUserScriptFilterProcessPrivate::log.
erase(KLFUserScriptFilterProcessPrivate::log.begin());
922 KLFUserScriptFilterProcessPrivate::log <<
thislog;
932 while (
it != KLFUserScriptFilterProcessPrivate::log.cbegin()) {
940 "<meta charset=\"utf-8\">"
941 "<title>User Script Log</title>"
942 "<style type=\"text/css\">"
943 ".userscript-run { font-weight: bold; font-size: 2em; } "
944 ".userscriptname { font: monospace; } "
945 ".output-type { font-weight: bold; } "
QStringList spitsOut() const
List of formats that this script will generate.
QString inputFormUI() const
A UI input form file (Qt designer file) for additional input.
QStringList skipFormats() const
List of formats that klfbackend should not attempt to generate.
QStringList disableInputs() const
List of user input fields that should be disabled.
virtual bool do_run(const QByteArray &indata, const QMap< QString, QByteArray * > outdatalist)
Actually run the process.
QByteArray collectedStdout() const
The collected stdout data of the process that just ran.
QByteArray collectedStderr() const
The collected stderr data of the process that just ran.
virtual QString resultErrorString() const
virtual QVariant property(const QString &propName) const
virtual bool setProperty(const QString &propname, const QVariant &value)
void registerBuiltInProperty(int propId, const QString &propName) const
QList< int > registeredPropertyIdList() const
virtual QString toString(uint toStringFlags=0) const
static QString getUserScriptLogHtml(bool include_head=true)
Return the user script log, formatted in human-readable HTML.
virtual bool do_run(const QByteArray &indata, const QMap< QString, QByteArray * > outdatalist)
KLFUserScriptFilterProcess(const QString &scriptFileName, const KLFBackend::klfSettings *settings=NULL)
Summary of the info returned by a user script.
QString userScriptPath() const
e.g. "/path/to/klffeynmf.klfuserscript"
@ CategorySpecificXmlConfig
XML representation of the category-specific configuration (QByteArray)
QString settingsFormUI() const
A UI widget form file (Qt designer file) to display for setting up the user script.
QString userScriptName() const
e.g. "klffeynmf.klfuserscript"
QStringList scriptInfosList() const
A list of Keys (eg. "Name", "Author", ... including custom infos) found in the scriptinfo.
QString htmlInfo(const QString &extra_css=QString()) const
Formats most (all?) properties in HTML, suitable for human-readable text display.
QString userScriptBaseName() const
e.g. "klffeynmf"
KLFUserScriptInfo(const QString &userScriptPath)
QByteArray categorySpecificXmlConfig() const
The XML for the category-specific config.
Definition of class KLFBackend.
#define KLFERR_NOERROR
No Error.
KLF_EXPORT QVariant klfLoadVariantFromText(const QByteArray &stringdata, const char *dataTypeName, const char *listOrMapDataTypeName)
KLF_EXPORT QByteArray klfSaveVariantToText(const QVariant &value, bool saveListAndMapsAsXML, QByteArray *savedType, QByteArray *savedListOrMapType)
KLF_EXPORT QVariantMap klfLoadVariantMapFromXML(const QDomElement &xmlNode)
#define klfWarning(streamableItems)
#define KLF_DEBUG_BLOCK(msg)
#define klfDbg(streamableItems)
#define KLF_PRIVATE_HEAD(ClassName)
#define KLF_DELETE_PRIVATE
#define KLF_PRIVATE_INHERIT_HEAD(ClassName, BaseInit)
#define KLF_INIT_PRIVATE(ClassName)
QStringList klfMapToEnvironmentList(const QMap< QString, QString > &map)
QDateTime currentDateTime()
QString toString(Qt::DateFormat format) const
QString toNativeSeparators(const QString &pathName)
QDomNode firstChild() const
QString canonicalFilePath() const
const_iterator cend() const
iterator erase(iterator pos)
const Key key(const T &value, const Key &defaultKey) const
const T value(const Key &key, const T &defaultValue) const
QString tr(const char *sourceText, const char *disambiguation, int n)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
QString fromLatin1(const char *str, int size)
QString fromLocal8Bit(const char *str, int size)
QString fromUtf8(const char *str, int size)
QString & replace(int position, int n, QChar after)
QString toHtmlEscaped() const
QString join(const QString &separator) const
QByteArray toByteArray() const
QStringList toStringList() const
General settings for KLFBackend::getLatexFormula()