mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
added strequal, strnotequal, strcontains, strnotcontains functions to compare strings in conditions
This commit is contained in:
parent
5bbd592636
commit
abbdea4b76
3
HISTORY
3
HISTORY
@ -296,3 +296,6 @@ Version 0.4.2
|
|||||||
|
|
||||||
Version 0.4.3
|
Version 0.4.3
|
||||||
|
|
||||||
|
- added strequal, strnotequal, strcontains, strnotcontains functions
|
||||||
|
to compare strings in conditions
|
||||||
|
|
||||||
|
@ -282,6 +282,50 @@ void cConditionalParameter::Evaluate(map < string, int > *intTokens, map < strin
|
|||||||
} else {
|
} else {
|
||||||
tokenTrue = true;
|
tokenTrue = true;
|
||||||
}
|
}
|
||||||
|
} else if (cond->type == ctStringEquals) {
|
||||||
|
if (stringTokens) {
|
||||||
|
map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
|
||||||
|
if (hit != stringTokens->end()) {
|
||||||
|
string value = hit->second;
|
||||||
|
if (!value.compare(cond->strCompareValue))
|
||||||
|
tokenTrue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (cond->type == ctStringNotEquals) {
|
||||||
|
if (stringTokens) {
|
||||||
|
map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
|
||||||
|
if (hit != stringTokens->end()) {
|
||||||
|
string value = hit->second;
|
||||||
|
if (value.compare(cond->strCompareValue))
|
||||||
|
tokenTrue = true;
|
||||||
|
} else {
|
||||||
|
tokenTrue = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tokenTrue = true;
|
||||||
|
}
|
||||||
|
} else if (cond->type == ctStringContains) {
|
||||||
|
if (stringTokens) {
|
||||||
|
map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
|
||||||
|
if (hit != stringTokens->end()) {
|
||||||
|
string value = hit->second;
|
||||||
|
if (value.find(cond->strCompareValue) != string::npos)
|
||||||
|
tokenTrue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (cond->type == ctStringNotContains) {
|
||||||
|
if (stringTokens) {
|
||||||
|
map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
|
||||||
|
if (hit != stringTokens->end()) {
|
||||||
|
string value = hit->second;
|
||||||
|
if (value.find(cond->strCompareValue) == string::npos)
|
||||||
|
tokenTrue = true;
|
||||||
|
} else {
|
||||||
|
tokenTrue = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tokenTrue = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int tokenValue = EvaluateParameter(cond->tokenName, intTokens, stringTokens);
|
int tokenValue = EvaluateParameter(cond->tokenName, intTokens, stringTokens);
|
||||||
if (cond->type == ctBool) {
|
if (cond->type == ctBool) {
|
||||||
@ -352,8 +396,7 @@ void cConditionalParameter::TokenizeValue(string sep) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cConditionalParameter::InsertCondition(string cond) {
|
void cConditionalParameter::InsertCondition(string cond) {
|
||||||
cond.erase( std::remove_if( cond.begin(), cond.end(), ::isspace ), cond.end() );
|
cond = StripWhitespaces(cond);
|
||||||
|
|
||||||
if (cond.size() < 1)
|
if (cond.size() < 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -370,6 +413,7 @@ void cConditionalParameter::InsertCondition(string cond) {
|
|||||||
sCond.tokenName = tokenName;
|
sCond.tokenName = tokenName;
|
||||||
sCond.type = ctBool;
|
sCond.type = ctBool;
|
||||||
sCond.compareValue = 0;
|
sCond.compareValue = 0;
|
||||||
|
sCond.strCompareValue = "";
|
||||||
sCond.isNegated = false;
|
sCond.isNegated = false;
|
||||||
if (!rest.compare("not")) {
|
if (!rest.compare("not")) {
|
||||||
sCond.isNegated = true;
|
sCond.isNegated = true;
|
||||||
@ -377,6 +421,18 @@ void cConditionalParameter::InsertCondition(string cond) {
|
|||||||
sCond.type = ctStringSet;
|
sCond.type = ctStringSet;
|
||||||
} else if (!rest.compare("empty")) {
|
} else if (!rest.compare("empty")) {
|
||||||
sCond.type = ctStringEmpty;
|
sCond.type = ctStringEmpty;
|
||||||
|
} else if (startswith(rest.c_str(), "strequal(")) {
|
||||||
|
sCond.strCompareValue = rest.substr(10, rest.size() - 11);
|
||||||
|
sCond.type = ctStringEquals;
|
||||||
|
} else if (startswith(rest.c_str(), "strnotequal(")) {
|
||||||
|
sCond.strCompareValue = rest.substr(13, rest.size() - 14);
|
||||||
|
sCond.type = ctStringNotEquals;
|
||||||
|
} else if (startswith(rest.c_str(), "strcontains(")) {
|
||||||
|
sCond.strCompareValue = rest.substr(13, rest.size() - 14);
|
||||||
|
sCond.type = ctStringContains;
|
||||||
|
} else if (startswith(rest.c_str(), "strnotcontains(")) {
|
||||||
|
sCond.strCompareValue = rest.substr(16, rest.size() - 17);
|
||||||
|
sCond.type = ctStringNotContains;
|
||||||
} else if (startswith(rest.c_str(), "gt(")) {
|
} else if (startswith(rest.c_str(), "gt(")) {
|
||||||
string compVal = rest.substr(4, rest.size() - 5);
|
string compVal = rest.substr(4, rest.size() - 5);
|
||||||
sCond.compareValue = atoi(compVal.c_str());
|
sCond.compareValue = atoi(compVal.c_str());
|
||||||
@ -394,6 +450,25 @@ void cConditionalParameter::InsertCondition(string cond) {
|
|||||||
conditions.push_back(sCond);
|
conditions.push_back(sCond);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string cConditionalParameter::StripWhitespaces(string value) {
|
||||||
|
size_t startEqual = value.find("strequal(");
|
||||||
|
size_t startNotEqual = value.find("strnotequal(");
|
||||||
|
size_t startContains = value.find("strcontains(");
|
||||||
|
size_t startNotContains = value.find("strnotcontains(");
|
||||||
|
if (startEqual != string::npos || startContains != string::npos || startNotEqual != string::npos || startNotContains != string::npos) {
|
||||||
|
size_t startString = value.find_first_of('\'');
|
||||||
|
size_t stopString = value.find_last_of('\'');
|
||||||
|
string text = value.substr(startString + 1, stopString - startString - 1);
|
||||||
|
value.replace(startString, stopString - startString + 1, "xxxxxx");
|
||||||
|
value.erase( std::remove_if( value.begin(), value.end(), ::isspace ), value.end() );
|
||||||
|
size_t startPlaceholder = value.find("xxxxxx");
|
||||||
|
value.replace(startPlaceholder, 6, text);
|
||||||
|
} else {
|
||||||
|
value.erase( std::remove_if( value.begin(), value.end(), ::isspace ), value.end() );
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
void cConditionalParameter::Debug(void) {
|
void cConditionalParameter::Debug(void) {
|
||||||
dsyslog("skindesigner: Condition %s, Type: %s, cond is %s", value.c_str(), (type == cpAnd)?"and combination":((type == cpOr)?"or combination":"single param") , isTrue?"true":"false");
|
dsyslog("skindesigner: Condition %s, Type: %s, cond is %s", value.c_str(), (type == cpAnd)?"and combination":((type == cpOr)?"or combination":"single param") , isTrue?"true":"false");
|
||||||
for (vector<sCondition>::iterator it = conditions.begin(); it != conditions.end(); it++) {
|
for (vector<sCondition>::iterator it = conditions.begin(); it != conditions.end(); it++) {
|
||||||
|
@ -110,6 +110,10 @@ enum eCondType {
|
|||||||
ctBool,
|
ctBool,
|
||||||
ctStringSet,
|
ctStringSet,
|
||||||
ctStringEmpty,
|
ctStringEmpty,
|
||||||
|
ctStringEquals,
|
||||||
|
ctStringNotEquals,
|
||||||
|
ctStringContains,
|
||||||
|
ctStringNotContains,
|
||||||
ctNone
|
ctNone
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -118,6 +122,7 @@ struct sCondition {
|
|||||||
bool isNegated;
|
bool isNegated;
|
||||||
eCondType type;
|
eCondType type;
|
||||||
int compareValue;
|
int compareValue;
|
||||||
|
string strCompareValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
class cConditionalParameter {
|
class cConditionalParameter {
|
||||||
@ -129,6 +134,7 @@ private:
|
|||||||
vector<sCondition> conditions;
|
vector<sCondition> conditions;
|
||||||
void TokenizeValue(string sep);
|
void TokenizeValue(string sep);
|
||||||
void InsertCondition(string cond);
|
void InsertCondition(string cond);
|
||||||
|
string StripWhitespaces(string value);
|
||||||
int EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens);
|
int EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens);
|
||||||
public:
|
public:
|
||||||
cConditionalParameter(cGlobals *globals, string value);
|
cConditionalParameter(cGlobals *globals, string value);
|
||||||
|
Loading…
Reference in New Issue
Block a user