20 #include <grantlee/exception.h>
21 #include <grantlee/parser.h>
24 #include <Cutelyst/Context>
25 #include <Cutelyst/ParamsMultiMap>
29 UriFor::UriFor(
const QString &path,
const QStringList &args, Grantlee::Parser *parser) : Grantlee::Node(parser)
30 , m_path(path, parser)
32 bool foundQuery =
false;
33 for (
const QString &expression : args) {
41 m_queryExpressions.push_back(Grantlee::FilterExpression(expression, parser));
43 m_argsExpressions.push_back(Grantlee::FilterExpression(expression, parser));
46 std::reverse(m_queryExpressions.begin(), m_queryExpressions.end());
49 std::pair<QString,QString> splitQuery(
const QString &query)
51 std::pair<QString,QString> ret;
59 void UriFor::render(Grantlee::OutputStream *stream, Grantlee::Context *gc)
const
64 const QVariantHash hash = gc->stackHash(0);
65 auto it = hash.constBegin();
66 while (it != hash.constEnd()) {
67 if (it.value().userType() == qMetaTypeId<Cutelyst::Context *>()) {
70 m_cutelystContext = it.key();
86 QVariant pathVar = m_path.resolve(gc);
87 if (pathVar.
userType() == qMetaTypeId<Grantlee::SafeString>()) {
88 path = pathVar.
value<Grantlee::SafeString>().
get();
89 }
else if (pathVar.
type() == QVariant::String) {
92 qWarning() <<
"c_uri_for PATH is not a valid type";
96 for (
const Grantlee::FilterExpression &exp : m_argsExpressions) {
98 if (var.
userType() == qMetaTypeId<Grantlee::SafeString>()) {
99 args << var.
value<Grantlee::SafeString>().
get();
100 }
else if (var.
type() == QVariant::String) {
102 }
else if (var.
type() == QVariant::StringList) {
107 for (
const Grantlee::FilterExpression &exp : m_queryExpressions) {
109 if (var.
userType() == qMetaTypeId<Cutelyst::ParamsMultiMap>()) {
111 queryValues.
unite(map);
112 }
else if (var.
userType() == qMetaTypeId<Grantlee::SafeString>()) {
113 auto query = splitQuery(var.
value<Grantlee::SafeString>().get());
114 queryValues.
insertMulti(query.first, query.second);
115 }
else if (var.
type() == QVariant::String) {
116 auto query = splitQuery(var.
toString());
117 queryValues.
insertMulti(query.first, query.second);
118 }
else if (var.
type() == QVariant::StringList) {
120 for (
const QString &str : queries) {
121 auto query = splitQuery(str);
122 queryValues.
insertMulti(query.first, query.second);
127 *stream << c->uriFor(path, args, queryValues).toString(QUrl::FullyEncoded);
130 Grantlee::Node *UriForTag::getNode(
const QString &tagContent, Grantlee::Parser *p)
const
137 throw Grantlee::Exception(Grantlee::TagSyntaxError, QStringLiteral(
"c_uri_for requires at least the path"));
140 return new UriFor(parts.
first(), parts.
mid(1), p);
143 #include "moc_urifor.cpp"
QMap< Key, T > & unite(const QMap< Key, T > &other)
iterator insertMulti(const Key &key, const T &value)
QStringList toStringList() const
QList< T > mid(int pos, int length) const
QString section(QChar sep, int start, int end, SectionFlags flags) const