summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2014-07-27 12:14:50 +0300
committerAndrei Karas <akaras@inbox.ru>2014-07-27 12:14:50 +0300
commitdfa708a764d689a1e33ec96ccee2a510a82237c8 (patch)
tree840edaf96607863b99c6a1fcf0b36bc360a40f62 /src
parent69ea8a21a832be11f3ce8344431d2cdd0d6e74e7 (diff)
downloadmplint-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.am1
-rw-r--r--src/rulebase.h2
-rw-r--r--src/rules/po.cpp136
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();
+ }
+}
+