aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmpui/mediaplayer.cpp3
-rw-r--r--src/qmmpui/metadataformatter2.cpp113
-rw-r--r--src/qmmpui/metadataformatter2.h6
3 files changed, 105 insertions, 17 deletions
diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp
index 40cd40c26..acd89ef86 100644
--- a/src/qmmpui/mediaplayer.cpp
+++ b/src/qmmpui/mediaplayer.cpp
@@ -22,6 +22,7 @@
#include <QString>
#include <QTranslator>
#include <QLocale>
+#include "metadataformatter2.h"
#include "playlistitem.h"
#include "qmmpuisettings.h"
#include "mediaplayer.h"
@@ -48,6 +49,8 @@ MediaPlayer::MediaPlayer(QObject *parent)
connect(m_core, SIGNAL(finished()), SLOT(playNext()));
connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(processState(Qmmp::State)));
connect(m_core, SIGNAL(metaDataChanged()),SLOT(updateMetaData()));
+
+ MetaDataFormatter2 formatter;
}
MediaPlayer::~MediaPlayer()
diff --git a/src/qmmpui/metadataformatter2.cpp b/src/qmmpui/metadataformatter2.cpp
index 7b8c1a02d..f54168005 100644
--- a/src/qmmpui/metadataformatter2.cpp
+++ b/src/qmmpui/metadataformatter2.cpp
@@ -45,7 +45,10 @@ Syntax:
MetaDataFormatter2::MetaDataFormatter2(const QString &format)
{
m_format = format;
- //compile("%p - %a");
+ qDebug("start!!");
+ QList<Node> nodes = compile("%if(%if(%p,%a,%t),%a,%t) + ");
+ qDebug("=%d=",nodes.count());
+ qDebug("end!!");
}
QString MetaDataFormatter2::parse(const PlayListTrack *item)
@@ -97,7 +100,7 @@ QString MetaDataFormatter2::formatLength(qint64 length) const
return str;
}
-bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator i, QString::const_iterator end)
+bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n)
{
QHash<QString, Qmmp::MetaData> key_map;
key_map.insert("p", Qmmp::ARTIST);
@@ -134,12 +137,13 @@ bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator
param.key = key;
node.params.append(param);
nodes->append(node);
+ *n = i;
return true;
}
return false;
}
-bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator i, QString::const_iterator end)
+bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n)
{
if((*i) != QChar('i'))
return false;
@@ -154,23 +158,91 @@ bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QStri
node.command = Node::IF_KEYWORD;
int c = 0;
- QString str;
+ QString var1, var2, var3;
+
+ enum {
+ STARTING = 0,
+ READING_VAR1,
+ READING_VAR2,
+ READING_VAR3,
+ FINISHED,
+
+ } state = STARTING;
+
while(i != end)
{
if((*i) == QChar('('))
+ {
c++;
+ if(state == STARTING)
+ {
+ state = READING_VAR1;
+ i++;
+ continue;
+ }
+ }
else if((*i) == QChar(')'))
c--;
- str.append((*i));
- i++;
- if(c == 0)
+ switch (state)
+ {
+ case STARTING:
+ {
+ break;
+ }
+ case READING_VAR1:
+ {
+ if((*i) == QChar(',') && c == 1)
+ {
+ state = READING_VAR2;
+ break;
+ }
+ var1.append((*i));
+ break;
+ }
+ case READING_VAR2:
+ {
+ if((*i) == QChar(',') && c == 1)
+ {
+ state = READING_VAR3;
+ break;
+ }
+ var2.append((*i));
+ break;
+ }
+ case READING_VAR3:
+ {
+ if((*i) == QChar(')') && c == 0)
+ {
+ state = FINISHED;
+ break;
+ }
+ var3.append((*i));
+ break;
+ }
+ default:
+ break;
+ }
+ if(state == FINISHED)
break;
+ i++;
}
- return false;
+
+ qDebug("%s|%s|%s", qPrintable(var1), qPrintable(var2), qPrintable(var3));
+
+ //i--;
+ *n = i;
+ Param param1, param2, param3;
+ param1.type = Param::NODES, param2.type = Param::NODES, param3.type = Param::NODES;
+ param1.children = compile(var1);
+ param2.children = compile(var2);
+ param3.children = compile(var3);
+ node.params << param1 << param2 << param3;
+ nodes->append(node);
+ return true;
}
-void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator i, QString::const_iterator end)
+void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n)
{
Node node;
node.command = Node::PRINT_TEXT;
@@ -186,34 +258,47 @@ void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QSt
{
i--;
nodes->append(node);
+ *n = i;
return;
}
}
- nodes->append(node);
+ *n = i;
+ if(!node.params[0].text.isEmpty())
+ nodes->append(node);
}
QList<MetaDataFormatter2::Node> MetaDataFormatter2::compile(const QString &format)
{
+ qDebug("=%s=", qPrintable(format));
QList <Node> nodes;
QString::const_iterator i = format.constBegin();
while (i != format.constEnd())
{
- i++;
if((*i) == QChar('%'))
{
i++;
- if(processKey(&nodes, i, format.constEnd()))
+ if(processKey(&nodes, i, format.constEnd(), &i))
+ {
continue;
+ }
- if(processIf(&nodes, i, format.constEnd()))
+ if(processIf(&nodes, i, format.constEnd(), &i))
+ {
continue;
+ }
+
+
+ processText(&nodes, i, format.constEnd(), &i);
+ continue;
}
else
{
- processText(&nodes, i, format.constEnd());
+ i++;
+ processText(&nodes, i, format.constEnd(), &i);
continue;
}
+ i++;
}
return nodes;
}
diff --git a/src/qmmpui/metadataformatter2.h b/src/qmmpui/metadataformatter2.h
index 6158c0944..c7784dbb5 100644
--- a/src/qmmpui/metadataformatter2.h
+++ b/src/qmmpui/metadataformatter2.h
@@ -93,9 +93,9 @@ private:
QList<Param> params;
};
- 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);
+ bool processKey(QList<Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n);
+ bool processIf(QList<Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n);
+ void processText(QList<Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n);
QList<MetaDataFormatter2::Node> compile(const QString &format);
QString m_format;