aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmpui/metadataformatter2.cpp95
-rw-r--r--src/qmmpui/metadataformatter2.h11
2 files changed, 83 insertions, 23 deletions
diff --git a/src/qmmpui/metadataformatter2.cpp b/src/qmmpui/metadataformatter2.cpp
index c4250f862..33ed588a4 100644
--- a/src/qmmpui/metadataformatter2.cpp
+++ b/src/qmmpui/metadataformatter2.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2014 by Ilya Kotov *
+ * Copyright (C) 2015 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -42,25 +42,35 @@ Syntax:
#include <QUrl>
#include "metadataformatter2.h"
-MetaDataFormatter2::MetaDataFormatter2(const QString &format)
+MetaDataFormatter2::MetaDataFormatter2(const QString &format2)
{
- m_format = format;
+ m_format = format2;
+ //m_nodes = compile("%if(%if(%p,%a,%t),%a,%t) + %a");
+ m_nodes = compile("%if(%a,%p,%t) + %a");
- QList<Node> nodes = compile("%if(%if(%p,%a,%t),%a,%t) + ");
-
- foreach (Node n, nodes)
+ foreach (Node n, m_nodes)
{
qDebug("=>%s", qPrintable(nodeToString(n)));
}
+
+ QMap<Qmmp::MetaData, QString> metaData;
+ metaData[Qmmp::ARTIST] = "ARTIST";
+ metaData[Qmmp::ALBUM] = "ALBUM";
+ metaData[Qmmp::TITLE] = "TITLE";
+ QString out = format(metaData);
+ qDebug("=%s=", qPrintable(out));
}
-QString MetaDataFormatter2::parse(const PlayListTrack *item)
+QString MetaDataFormatter2::format(const PlayListTrack *item)
{
- return parse(*item, item->length());
+ return format(*item, item->length());
}
-QString MetaDataFormatter2::parse(const QMap<Qmmp::MetaData, QString> &metaData, qint64 length)
+QString MetaDataFormatter2::format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 length)
{
+ QString title = execute(&m_nodes, &metaData, length);
+
+
/*QString title = m_format;
title.replace("\\(", "%28");
title.replace("\\)", "%29");
@@ -87,7 +97,7 @@ QString MetaDataFormatter2::parse(const QMap<Qmmp::MetaData, QString> &metaData,
title.replace("%28", "(");
title.replace("%29", ")");
return title.trimmed();*/
- return QString();
+ return title;
}
QString MetaDataFormatter2::formatLength(qint64 length) const
@@ -143,7 +153,7 @@ bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator
param.key = key;
node.params.append(param);
nodes->append(node);
- (*i) += token_name.size();
+ (*i) += token_name.size() - 1;
return true;
}
return false;
@@ -257,9 +267,9 @@ void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QSt
param.type = Param::TEXT;
node.params.append(param);
- while ((*i) != end)
+ forever
{
- if((**i) == QChar('%'))
+ if((*i) == end || (**i) == QChar('%'))
{
(*i)--;
break;
@@ -271,6 +281,49 @@ void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QSt
nodes->append(node);
}
+QString MetaDataFormatter2::execute(QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length)
+{
+ QString out;
+ for(int i = 0; i < nodes->count(); ++i)
+ {
+ Node node = nodes->at(i);
+ if(node.command == Node::PRINT_TEXT)
+ {
+ Param p = node.params.first();
+ out.append(printParam(&p, metaData, length));
+
+ }
+ else if(node.command == Node::IF_KEYWORD)
+ {
+ QString var1 = printParam(&node.params[0], metaData, length);
+ if(var1.isEmpty())
+ out.append(printParam(&node.params[2], metaData, length));
+ else
+ out.append(printParam(&node.params[1], metaData, length));
+ }
+ }
+ return out;
+}
+
+QString MetaDataFormatter2::printParam(MetaDataFormatter2::Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length)
+{
+ switch (p->type)
+ {
+ case Param::KEY:
+ return metaData->value(p->key);
+ break;
+ case Param::TEXT:
+ return p->text;
+ break;
+ case Param::NODES:
+ return execute(&p->children, metaData, length);
+ break;
+ default:
+ break;
+ }
+ return QString();
+}
+
QString MetaDataFormatter2::nodeToString(MetaDataFormatter2::Node node)
{
QString str;
@@ -303,7 +356,7 @@ QString MetaDataFormatter2::nodeToString(MetaDataFormatter2::Node node)
QList<MetaDataFormatter2::Node> MetaDataFormatter2::compile(const QString &format)
{
- qDebug("=%s=", qPrintable(format));
+ //qDebug("=%s=", qPrintable(format));
QList <Node> nodes;
QString::const_iterator i = format.constBegin();
@@ -311,28 +364,30 @@ QList<MetaDataFormatter2::Node> MetaDataFormatter2::compile(const QString &forma
{
if((*i) == QChar('%'))
{
+ qDebug("again");
i++;
+ if(i == format.constEnd())
+ continue;
+
if(processKey(&nodes, &i, format.constEnd()))
{
+ i++;
continue;
}
if(processIf(&nodes, &i, format.constEnd()))
{
+ i++;
continue;
}
-
-
- processText(&nodes, &i, format.constEnd());
+ //i++;
continue;
}
else
{
- i++;
processText(&nodes, &i, format.constEnd());
- continue;
+ i++;
}
- i++;
}
return nodes;
}
diff --git a/src/qmmpui/metadataformatter2.h b/src/qmmpui/metadataformatter2.h
index d373c4ed1..b193b9712 100644
--- a/src/qmmpui/metadataformatter2.h
+++ b/src/qmmpui/metadataformatter2.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2014 by Ilya Kotov *
+ * Copyright (C) 2015 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -56,13 +56,13 @@ public:
/*!
* Converts metadata of item \b item to one string using template.
*/
- QString parse(const PlayListTrack *item);
+ QString format(const PlayListTrack *item);
/*!
* Converts metadata to one string using template.
* @param metaData Metadata array.
* @param length Length in seconds.
*/
- QString parse(const QMap<Qmmp::MetaData, QString> &metaData, qint64 length = 0);
+ QString format(const QMap<Qmmp::MetaData, QString> &metaData, qint64 length = 0);
/*!
* Returns formatted length (example: 05:02:03).
* \param length Length in seconds.
@@ -96,6 +96,11 @@ private:
bool processKey(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
bool processIf(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
void processText(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end);
+
+ QString execute(QList<Node> *nodes, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length);
+ QString printParam(Param *p, const QMap<Qmmp::MetaData, QString> *metaData, qint64 length);
+
+
QString nodeToString(Node node);
QList<MetaDataFormatter2::Node> compile(const QString &format);