diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-01-28 18:25:11 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-01-28 18:25:11 +0000 |
| commit | 1513cd980e821e951223c05130520d86ae313ec9 (patch) | |
| tree | 5d48ff549ad6ec48836c92d54cae5b7f6e8ca73f /src | |
| parent | aca67a84c088aa19851ddeec1e917b233be08964 (diff) | |
| download | qmmp-1513cd980e821e951223c05130520d86ae313ec9.tar.gz qmmp-1513cd980e821e951223c05130520d86ae313ec9.tar.bz2 qmmp-1513cd980e821e951223c05130520d86ae313ec9.zip | |
improved format parser
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4705 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmpui/metadataformatter2.cpp | 134 | ||||
| -rw-r--r-- | src/qmmpui/metadataformatter2.h | 7 |
2 files changed, 88 insertions, 53 deletions
diff --git a/src/qmmpui/metadataformatter2.cpp b/src/qmmpui/metadataformatter2.cpp index f54168005..c4250f862 100644 --- a/src/qmmpui/metadataformatter2.cpp +++ b/src/qmmpui/metadataformatter2.cpp @@ -45,10 +45,13 @@ Syntax: MetaDataFormatter2::MetaDataFormatter2(const QString &format) { m_format = format; - qDebug("start!!"); + QList<Node> nodes = compile("%if(%if(%p,%a,%t),%a,%t) + "); - qDebug("=%d=",nodes.count()); - qDebug("end!!"); + + foreach (Node n, nodes) + { + qDebug("=>%s", qPrintable(nodeToString(n))); + } } QString MetaDataFormatter2::parse(const PlayListTrack *item) @@ -100,8 +103,10 @@ QString MetaDataFormatter2::formatLength(qint64 length) const return str; } -bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n) +bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator *i, QString::const_iterator end) { + QString token_name; + Qmmp::MetaData key = Qmmp::UNKNOWN; QHash<QString, Qmmp::MetaData> key_map; key_map.insert("p", Qmmp::ARTIST); key_map.insert("aa", Qmmp::ALBUMARTIST); @@ -115,16 +120,17 @@ bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator key_map.insert("F", Qmmp::URL); key_map.insert("y", Qmmp::YEAR); - QString token_name = (*i); //2 symbols - i++; //TODO check end - token_name.append(*i); - - Qmmp::MetaData key = key_map.value(token_name, Qmmp::UNKNOWN); + if((*i) + 1 != end) + { + token_name.append((**i)); + token_name.append(*((*i)+1)); + key = key_map.value(token_name, Qmmp::UNKNOWN); + } if(key == Qmmp::UNKNOWN) { - i--; - token_name = (*i); //1 symbol + token_name.clear(); + token_name.append((**i)); key = key_map.value(token_name, Qmmp::UNKNOWN); } @@ -137,27 +143,26 @@ bool MetaDataFormatter2::processKey(QList<Node> *nodes, QString::const_iterator param.key = key; node.params.append(param); nodes->append(node); - *n = i; + (*i) += token_name.size(); return true; } return false; } -bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n) +bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator *i, QString::const_iterator end) { - if((*i) != QChar('i')) + if((*i) + 1 == end || (*i) + 2 == end) return false; - i++; - if((*i) != QChar('f')) - { - i--; + + if((**i) != QChar('i') || *((*i)+1) != QChar('f')) return false; - } - i++; + + (*i)+=2; + Node node; node.command = Node::IF_KEYWORD; - int c = 0; + int brackets_tracker = 0; QString var1, var2, var3; enum { @@ -169,20 +174,20 @@ bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QStri } state = STARTING; - while(i != end) + while((*i) != end) { - if((*i) == QChar('(')) + if((**i) == QChar('(')) { - c++; + brackets_tracker++; if(state == STARTING) { state = READING_VAR1; - i++; + (*i)++; continue; } } - else if((*i) == QChar(')')) - c--; + else if((**i) == QChar(')')) + brackets_tracker--; switch (state) { @@ -192,46 +197,48 @@ bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QStri } case READING_VAR1: { - if((*i) == QChar(',') && c == 1) + if((**i) == QChar(',') && brackets_tracker == 1) { state = READING_VAR2; break; } - var1.append((*i)); + var1.append((**i)); break; } case READING_VAR2: { - if((*i) == QChar(',') && c == 1) + if((**i) == QChar(',') && brackets_tracker == 1) { state = READING_VAR3; break; } - var2.append((*i)); + var2.append((**i)); break; } case READING_VAR3: { - if((*i) == QChar(')') && c == 0) + if((**i) == QChar(')') && brackets_tracker == 0) { state = FINISHED; break; } - var3.append((*i)); + var3.append((**i)); break; } default: break; } + if(state == FINISHED) break; - i++; + + (*i)++; } - qDebug("%s|%s|%s", qPrintable(var1), qPrintable(var2), qPrintable(var3)); + //qDebug("%s|%s|%s", qPrintable(var1), qPrintable(var2), qPrintable(var3)); //i--; - *n = i; + //*n = i; Param param1, param2, param3; param1.type = Param::NODES, param2.type = Param::NODES, param3.type = Param::NODES; param1.children = compile(var1); @@ -242,7 +249,7 @@ bool MetaDataFormatter2::processIf(QList<MetaDataFormatter2::Node> *nodes, QStri return true; } -void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator i, QString::const_iterator end, QString::const_iterator *n) +void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QString::const_iterator *i, QString::const_iterator end) { Node node; node.command = Node::PRINT_TEXT; @@ -250,23 +257,50 @@ void MetaDataFormatter2::processText(QList<MetaDataFormatter2::Node> *nodes, QSt param.type = Param::TEXT; node.params.append(param); - while (i != end) + while ((*i) != end) { - node.params[0].text.append(*i); - i++; - if((*i) == QChar('%')) + if((**i) == QChar('%')) { - i--; - nodes->append(node); - *n = i; - return; + (*i)--; + break; } + node.params[0].text.append(**i); + (*i)++; } - *n = i; if(!node.params[0].text.isEmpty()) nodes->append(node); } +QString MetaDataFormatter2::nodeToString(MetaDataFormatter2::Node node) +{ + QString str; + QStringList params; + if(node.command == Node::PRINT_TEXT) + str += "PRINT_TEXT"; + else if(node.command == Node::IF_KEYWORD) + str += "IF_KEYWORD"; + str += "("; + foreach (Param p, node.params) + { + if(p.type == Param::KEY) + params.append(QString("KEY:%1").arg(p.key)); + else if(p.type == Param::TEXT) + params.append(QString("TEXT:%1").arg(p.text)); + else if(p.type == Param::NODES) + { + QStringList nodeStrList; + foreach (Node n, p.children) + { + nodeStrList.append(nodeToString(n)); + } + params.append(QString("NODES:%1").arg(nodeStrList.join(","))); + } + } + str.append(params.join(",")); + str.append(")"); + return str; +} + QList<MetaDataFormatter2::Node> MetaDataFormatter2::compile(const QString &format) { qDebug("=%s=", qPrintable(format)); @@ -278,24 +312,24 @@ QList<MetaDataFormatter2::Node> MetaDataFormatter2::compile(const QString &forma if((*i) == QChar('%')) { i++; - if(processKey(&nodes, i, format.constEnd(), &i)) + if(processKey(&nodes, &i, format.constEnd())) { continue; } - if(processIf(&nodes, i, format.constEnd(), &i)) + if(processIf(&nodes, &i, format.constEnd())) { continue; } - processText(&nodes, i, format.constEnd(), &i); + processText(&nodes, &i, format.constEnd()); continue; } else { i++; - processText(&nodes, i, format.constEnd(), &i); + processText(&nodes, &i, format.constEnd()); continue; } i++; diff --git a/src/qmmpui/metadataformatter2.h b/src/qmmpui/metadataformatter2.h index c7784dbb5..d373c4ed1 100644 --- a/src/qmmpui/metadataformatter2.h +++ b/src/qmmpui/metadataformatter2.h @@ -93,9 +93,10 @@ private: QList<Param> params; }; - 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); + 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 nodeToString(Node node); QList<MetaDataFormatter2::Node> compile(const QString &format); QString m_format; |
