21#include "scriptabletags.h"
23#include <QtCore/QFile>
26#include <QtQml/QJSEngine>
27#include <QtQml/QJSValueIterator>
29#include "nodebuiltins_p.h"
34#include "scriptablefilter.h"
35#include "scriptablefilterexpression.h"
36#include "scriptablenode.h"
37#include "scriptablesafestring.h"
38#include "scriptabletemplate.h"
39#include "scriptablevariable.h"
44Q_DECLARE_METATYPE(
Token)
56 ssObj->setSafety(
true);
57 return m_scriptEngine->newQObject(ssObj);
61 auto ssObj =
new ScriptableSafeString(m_scriptEngine);
63 return m_scriptEngine->newQObject(ssObj);
68QJSValue ScriptableHelperFunctions::ScriptableFilterExpressionConstructor(
69 QString name, QObject *parserObj)
71 auto object =
new ScriptableFilterExpression(m_scriptEngine);
75 object->init(name, p);
77 return m_scriptEngine->newQObject(
object);
81ScriptableHelperFunctions::ScriptableNodeConstructor(QJSValue callContext)
83 QJSValueIterator it(callContext);
85 auto scriptableNodeName = it.value().toString();
87 = m_scriptEngine->globalObject().property(scriptableNodeName);
93 concreteNode = concreteNode.callAsConstructor(args);
95 auto renderMethod = concreteNode.property(QStringLiteral(
"render"));
97 auto object =
new ScriptableNode(m_scriptEngine);
98 object->setObjectName(scriptableNodeName);
99 object->setScriptEngine(m_scriptEngine);
100 object->init(concreteNode, renderMethod);
101 return m_scriptEngine->newQObject(
object);
104QJSValue ScriptableHelperFunctions::ScriptableTemplateConstructor(
105 QString content, QString name, QObject *parent)
108 = m_scriptEngine->property(
"templateEngine").value<Engine *>();
113 auto t = templateEngine->newTemplate(content, name);
115 auto object =
new ScriptableTemplate(t,
parent);
116 return m_scriptEngine->newQObject(
object);
119QJSValue ScriptableHelperFunctions::ScriptableVariableConstructor(QString name)
126 auto object =
new ScriptableVariable(m_scriptEngine,
parent);
127 object->setContent(name);
129 return m_scriptEngine->newQObject(
object);
132ScriptableTagLibrary::ScriptableTagLibrary(QObject *parent)
133 : QObject(parent), m_scriptEngine(new QJSEngine(this)),
134 m_functions(m_scriptEngine->newQObject(
137 m_scriptEngine->globalObject().setProperty(
138 QStringLiteral(
"internalCuteleeFunctions"), m_functions);
141 m_scriptEngine->globalObject().setProperty(
142 QStringLiteral(
"Node"),
143 m_scriptEngine->evaluate(QStringLiteral(R
"javascript(
145 return internalCuteleeFunctions.ScriptableNodeConstructor(
146 Array.prototype.slice.call(arguments));
151 m_scriptEngine->globalObject().setProperty(
152 QStringLiteral(
"Variable"),
153 m_functions.property(QStringLiteral(
"ScriptableVariableConstructor")));
156 m_scriptEngine->globalObject().setProperty(
157 QStringLiteral(
"FilterExpression"),
158 m_functions.property(
159 QStringLiteral(
"ScriptableFilterExpressionConstructor")));
162 m_scriptEngine->globalObject().setProperty(
163 QStringLiteral(
"Template"),
164 m_functions.property(QStringLiteral(
"ScriptableTemplateConstructor")));
167 auto libraryObject = m_scriptEngine->newQObject(
this);
168 m_scriptEngine->globalObject().setProperty(QStringLiteral(
"Library"),
173 auto nodeFactoryObject = m_scriptEngine->newQObject(nodeFactory);
174 m_scriptEngine->globalObject().setProperty(
175 QStringLiteral(
"AbstractNodeFactory"), nodeFactoryObject);
178 m_scriptEngine->globalObject().setProperty(
179 QStringLiteral(
"mark_safe"),
180 m_functions.property(QStringLiteral(
"markSafeFunction")));
183bool ScriptableTagLibrary::evaluateScript(
const QString &name)
185 QFile scriptFile(name);
187 if (!scriptFile.exists()
192 QTextStream fstream(&scriptFile);
193 fstream.setCodec(
"UTF-8");
194 const auto fileContent = fstream.readAll();
198 QJSValue result = m_scriptEngine->evaluate(fileContent);
200 throw Cutelee::Exception(TagSyntaxError, result.
toString());
208 m_factoryNames.
clear();
209 m_nodeFactories.clear();
212 if (!evaluateScript(name)) {
216 return getFactories();
221 m_filterNames.
clear();
225 if (!evaluateScript(name)) {
232QHash<QString, AbstractNodeFactory *> ScriptableTagLibrary::getFactories()
234 QHash<QString, AbstractNodeFactory *> factories;
235 for (
auto it = m_factoryNames.begin(), end = m_factoryNames.end(); it != end;
237 auto factoryName = it.value();
238 auto tagName = it.key();
240 auto factoryObject = m_scriptEngine->globalObject().property(factoryName);
242 auto snf =
new ScriptableNodeFactory();
243 snf->setScriptEngine(m_scriptEngine);
244 snf->setFactory(factoryObject);
246 factories.
insert(tagName, snf);
252QHash<QString, Filter *> ScriptableTagLibrary::getFilters()
254 QHash<QString, Filter *>
filters;
256 for (
auto &filterNameString : m_filterNames) {
258 = m_scriptEngine->globalObject().property(filterNameString);
260 = filterObject.property(QStringLiteral(
"filterName")).toString();
261 auto filter =
new ScriptableFilter(filterObject, m_scriptEngine);
262 filters.insert(filterName, filter);
268void ScriptableTagLibrary::addFactory(
const QString &factoryName,
269 const QString &tagName)
271 m_factoryNames.insert(tagName, factoryName);
274void ScriptableTagLibrary::addFilter(
const QString &filterName)
276 m_filterNames << filterName;
QHash< QString, AbstractNodeFactory * > nodeFactories(const QString &name={}) override
QHash< QString, Filter * > filters(const QString &name={}) override
The Cutelee namespace holds all public Cutelee API.
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
iterator insert(const Key &key, const T &value)
bool isError() const const
bool isQObject() const const
bool isString() const const
QObject * toQObject() const const
QString toString() const const
QObject * parent() const const
T qobject_cast(QObject *object)
Utility functions used throughout Cutelee.