summaryrefslogtreecommitdiff
path: root/quackleio/util.cpp
diff options
context:
space:
mode:
authorJason Katz-Brown <jason@airbnb.com>2013-08-25 02:17:13 -0700
committerJason Katz-Brown <jason@airbnb.com>2013-08-25 02:17:13 -0700
commit9306cb60c32082c5403931de0823a9fd5daa196c (patch)
treeca1b6eb695fdf3f0c2294e92416b272164bae642 /quackleio/util.cpp
parent8fb2c681cecc01b46b0f4ba02d5cc177c4747b1c (diff)
Initial git commit.
Diffstat (limited to 'quackleio/util.cpp')
-rw-r--r--quackleio/util.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/quackleio/util.cpp b/quackleio/util.cpp
new file mode 100644
index 0000000..e3f947d
--- /dev/null
+++ b/quackleio/util.cpp
@@ -0,0 +1,212 @@
+/*
+ * Quackle -- Crossword game artificial intelligence and analysis tool
+ * Copyright (C) 2005-2006 Jason Katz-Brown and John O'Laughlin.
+ *
+ * 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 2 of the License, or
+ * (at your option) 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <QtCore>
+
+#include <move.h>
+#include <rack.h>
+
+#include "dict.h"
+#include "dictfactory.h"
+#include "util.h"
+
+using namespace QuackleIO;
+
+UtilSettings *UtilSettings::m_self = 0;
+UtilSettings *UtilSettings::self()
+{
+ return m_self;
+}
+
+UtilSettings::UtilSettings()
+ : octothorpBritish(true), vowelFirst(false)
+{
+ m_self = this;
+}
+
+QString Util::moveToDetailedString(const Quackle::Move &move)
+{
+ QString prettyTiles = letterStringToQString(move.prettyTiles());
+
+ QString ret;
+
+ switch (move.action)
+ {
+ case Quackle::Move::Pass:
+ ret = QObject::tr("Pass");
+ break;
+
+ case Quackle::Move::Exchange:
+ ret = QObject::tr("Exch. %1").arg(prettyTiles);
+ break;
+
+ case Quackle::Move::UnusedTilesBonus:
+ ret = QObject::tr("2*(%1)").arg(letterStringToQString(Util::alphagram(move.usedTiles())));
+ break;
+
+ case Quackle::Move::TimePenalty:
+ ret = QObject::tr("%1 point time penalty").arg(move.effectiveScore());
+ break;
+
+ case Quackle::Move::Nonmove:
+ ret = QObject::tr("None");
+ break;
+
+ case Quackle::Move::Place:
+ ret = uvStringToQString(move.positionString()) + " ";
+ ret += prettyTiles;
+
+ if (UtilSettings::self()->octothorpBritish)
+ ret += symbolsFor(move.wordTiles());
+
+ if (move.isChallengedPhoney())
+ ret = QObject::tr("%1 [Challenged Off]").arg(ret);
+
+ break;
+ }
+
+ if (move.scoreAddition() != 0)
+ ret = QString("%1 [and %2%3]").arg(ret).arg(move.scoreAddition() > 0? QObject::tr("+") : QString()).arg(move.scoreAddition());
+
+ return ret;
+}
+
+QString Util::moveToSensitiveString(const Quackle::Move &move)
+{
+ QString ret;
+
+ if (move.action == Quackle::Move::Exchange)
+ ret = QObject::tr("Exch. %1").arg(move.prettyTiles().length());
+ else
+ ret = moveToDetailedString(move);
+
+ return ret;
+}
+
+UVString Util::qstringToString(const QString &qstring)
+{
+#if QUACKLE_USE_WCHAR_FOR_USER_VISIBLE
+ return qstring.toStdWString();
+#else
+ return string(qstring.toUtf8().data());
+#endif
+}
+
+QString Util::uvStringToQString(const UVString &uvString)
+{
+#if QUACKLE_USE_WCHAR_FOR_USER_VISIBLE
+ return QString::fromStdWString(uvString);
+#else
+ return QString::fromUtf8(uvString.c_str());
+#endif
+}
+
+Quackle::LetterString Util::encode(const QString &qstring)
+{
+ return QUACKLE_ALPHABET_PARAMETERS->encode(qstringToString(qstring));
+}
+
+Quackle::LetterString Util::nonBlankEncode(const QString &qstring)
+{
+ return QUACKLE_ALPHABET_PARAMETERS->clearBlankness(encode(qstring));
+}
+
+QString Util::letterStringToQString(const Quackle::LetterString &letterString)
+{
+ return uvStringToQString(QUACKLE_ALPHABET_PARAMETERS->userVisible(letterString));
+}
+
+QString Util::letterToQString(const Quackle::Letter &letter)
+{
+ return uvStringToQString(QUACKLE_ALPHABET_PARAMETERS->userVisible(letter));
+}
+
+string Util::qstringToStdString(const QString &qstring)
+{
+ return string(qstring.toAscii());
+}
+
+QString Util::stdStringToQString(const string &stdString)
+{
+ return QString::fromAscii(stdString.c_str());
+}
+
+Quackle::LetterString Util::alphagram(const Quackle::LetterString &word)
+{
+ return Quackle::String::alphabetize(word);
+}
+
+QString Util::alphagram(const QString &word)
+{
+ return letterStringToQString(Quackle::String::alphabetize(encode(word)));
+}
+
+Quackle::LetterString Util::arrangeLettersForUser(const Quackle::LetterString &word)
+{
+ Quackle::LetterString alphabetized = Quackle::String::alphabetize(word);
+
+ Quackle::LetterString vowels;
+ Quackle::LetterString nonvowels;
+ Quackle::LetterString blanks;
+ for (Quackle::LetterString::iterator it = alphabetized.begin(); it != alphabetized.end(); ++it)
+ {
+ if ((*it) == QUACKLE_BLANK_MARK)
+ blanks.push_back(*it);
+ else if (UtilSettings::self()->vowelFirst && QUACKLE_ALPHABET_PARAMETERS->isVowel(*it))
+ vowels.push_back(*it);
+ else
+ nonvowels.push_back(*it);
+ }
+
+ return vowels + nonvowels + blanks;
+}
+
+Quackle::LetterString Util::arrangeLettersForUser(const Quackle::Rack &rack)
+{
+ return arrangeLettersForUser(rack.tiles());
+}
+
+Quackle::Rack Util::makeRack(const QString &letters)
+{
+ return Quackle::Rack(QuackleIO::Util::encode(letters.toUpper().replace('.', "?")));
+}
+
+QString Util::arrangeLettersForUser(const QString &word)
+{
+ return letterStringToQString(arrangeLettersForUser(encode(word)));
+}
+
+QString Util::sanitizeUserVisibleLetterString(const QString &pipedString)
+{
+ QString pipedStringCopy = pipedString;
+ pipedStringCopy.replace("|", " ");
+ return pipedStringCopy.simplified();
+}
+
+QString Util::symbolsFor(const Quackle::LetterString &word)
+{
+ if (DictFactory::querier()->isBritish(word))
+ {
+ return "#";
+ }
+
+ return "";
+}
+