diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-07-27 12:14:50 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-07-27 12:14:50 +0300 |
commit | dfa708a764d689a1e33ec96ccee2a510a82237c8 (patch) | |
tree | 840edaf96607863b99c6a1fcf0b36bc360a40f62 /src | |
parent | 69ea8a21a832be11f3ce8344431d2cdd0d6e74e7 (diff) | |
download | mplint-dfa708a764d689a1e33ec96ccee2a510a82237c8.tar.gz mplint-dfa708a764d689a1e33ec96ccee2a510a82237c8.tar.bz2 mplint-dfa708a764d689a1e33ec96ccee2a510a82237c8.tar.xz mplint-dfa708a764d689a1e33ec96ccee2a510a82237c8.zip |
Add basic checking for po files.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/rulebase.h | 2 | ||||
-rw-r--r-- | src/rules/po.cpp | 136 |
3 files changed, 138 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 14455db..1d16154 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,6 +23,7 @@ mplint_SOURCES = \ rules/final.cpp \ rules/include.cpp \ rules/license.cpp \ + rules/po.cpp \ rules/xml.cpp # set the include path found by configure diff --git a/src/rulebase.h b/src/rulebase.h index 4421291..9a1fbc2 100644 --- a/src/rulebase.h +++ b/src/rulebase.h @@ -71,11 +71,11 @@ class RuleBase void terminateRule(); - protected: void print(const std::string &text) const; void printRaw(const std::string &text) const; + protected: void addMask(const std::string &mask); void deleteSelf(); diff --git a/src/rules/po.cpp b/src/rules/po.cpp new file mode 100644 index 0000000..bb99e1e --- /dev/null +++ b/src/rules/po.cpp @@ -0,0 +1,136 @@ +/* + * The ManaPlus Client + * Copyright (C) 2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "template.hpp" + +registerRuleExt(po, "010", "(.+)[.](po)") + +bool readId(false); +bool readStr(false); +std::string msgId; +std::string msgStr; + +static void processMessage(RuleBase *const rule) +{ +// rule->print(std::string("pair: ").append(msgId).append( +// "=").append(msgStr)); + readId = false; + readStr = false; + + // skip not translated lines + if (msgStr.empty()) + return; + + const size_t szId = msgId.size(); + const size_t szStr = msgStr.size(); + for (size_t f = 0; f < szId && f < szStr; f ++) + { + if (msgId[f] == ' ') + { + if (msgStr[f] != ' ') + { + rule->print("Wrong number of spaces at translation " + "line start."); + break; + } + } + break; + } + if (szId > 1 && szStr > 1) + { + const char cStr = msgStr[szStr - 1]; + const char cId = msgId[szId - 1]; + if (cStr == ' ' && cId != ' ') + rule->print("Useless space at end of translation line."); + if (cId == '.' || cId == ',' ||cId == '!' || cId == '?' || cId == '-') + { + if (cId != cStr) + rule->print("Wrong character at end of translation line."); + } + } +} + +startRule(po) +{ + readId = false; + readStr = false; + msgId = std::string(); + msgStr = std::string(); +} + +endRule(po) +{ + if (readStr) + processMessage(this); +} + +parseLineRule(po) +{ + if (findCutFirst(data, "msgid \"")) + { // msgId start + if (readStr) + { + processMessage(this); + readStr = false; + } + readId = true; + if (findCutLast(data, "\"")) + msgId = data; + else + print("Wrong msgId line. Missing last \"."); + } + else if (findCutFirst(data, "msgstr \"")) + { // msgStr start + if (readId) + readId = false; + readStr = true; + if (findCutLast(data, "\"")) + msgStr = data; + else + print("Wrong msgStr line. Missing last \"."); + } + else if (findCutFirst(data, "\"")) + { // line start with " + if (readId) + { + if (findCutLast(data, "\"")) + msgId += data; + else + print("Wrong msgId line. Missing last \"."); + } + if (readStr) + { + if (findCutLast(data, "\"")) + msgStr += data; + else + print("Wrong msgStr line. Missing last \"."); + } + } + else + { // other lines + if (readStr) + processMessage(this); + readId = false; + readStr = false; + msgId = std::string(); + msgStr = std::string(); + } +} + |