diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-01-26 20:16:25 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-01-26 20:16:25 +0000 |
| commit | aca67a84c088aa19851ddeec1e917b233be08964 (patch) | |
| tree | c6408cfc521fdc3cd0a2d844725b93cd324766f8 | |
| parent | ebef658ac971ae9f4924fd6b0e059613c7eaee33 (diff) | |
| download | qmmp-aca67a84c088aa19851ddeec1e917b233be08964.tar.gz qmmp-aca67a84c088aa19851ddeec1e917b233be08964.tar.bz2 qmmp-aca67a84c088aa19851ddeec1e917b233be08964.zip | |
added parser implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4703 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/qmmpui/mediaplayer.cpp | 3 | ||||
| -rw-r--r-- | src/qmmpui/metadataformatter2.cpp | 113 | ||||
| -rw-r--r-- | src/qmmpui/metadataformatter2.h | 6 |
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; |
