summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lexiconparameters.cpp8
-rw-r--r--lexiconparameters.h5
-rw-r--r--quacker/lexicondialog.cpp43
-rw-r--r--quacker/lexicondialog.h11
-rw-r--r--quackleio/dawgfactory.cpp31
-rw-r--r--quackleio/dawgfactory.h1
6 files changed, 86 insertions, 13 deletions
diff --git a/lexiconparameters.cpp b/lexiconparameters.cpp
index 6761fc1..9da3b70 100644
--- a/lexiconparameters.cpp
+++ b/lexiconparameters.cpp
@@ -75,6 +75,14 @@ class Quackle::V1LexiconInterpreter : public LexiconInterpreter
file.get(); // skip past version byte
file.read(lexparams.m_hash, sizeof(lexparams.m_hash));
file.read((char*)bytes, 3);
+
+ lexparams.m_utf8Alphabet.resize(file.get());
+ for (size_t i = 0; i < lexparams.m_utf8Alphabet.size(); i++)
+ {
+ file >> lexparams.m_utf8Alphabet[i];
+ file.get(); // separator space
+ }
+ file.get(); // whitespace separator
lexparams.m_wordcount = (bytes[0] << 16) | (bytes[1] << 8) | bytes[2];
while (!file.eof())
{
diff --git a/lexiconparameters.h b/lexiconparameters.h
index 3890d8d..9f34be6 100644
--- a/lexiconparameters.h
+++ b/lexiconparameters.h
@@ -19,11 +19,15 @@
#ifndef QUACKLE_LEXICONPARAMETERS_H
#define QUACKLE_LEXICONPARAMETERS_H
+#include <vector>
+
#include "gaddag.h"
namespace Quackle
{
+class LexiconParameters;
+
class LexiconInterpreter
{
public:
@@ -84,6 +88,7 @@ protected:
LexiconInterpreter *m_interpreter;
char m_hash[16];
int m_wordcount;
+ vector<string> m_utf8Alphabet;
LexiconInterpreter* createInterpreter(char version) const;
};
diff --git a/quacker/lexicondialog.cpp b/quacker/lexicondialog.cpp
index 9d1998c..f9c6399 100644
--- a/quacker/lexicondialog.cpp
+++ b/quacker/lexicondialog.cpp
@@ -25,9 +25,10 @@
#include "customqsettings.h"
#include "settings.h"
#include "geometry.h"
+#include "quackleio/dawgfactory.h"
-
-LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDialog(parent)
+LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDialog(parent),
+ m_wordFactory(NULL)
{
m_originalName = originalName;
@@ -117,7 +118,45 @@ void LexiconDialog::deleteLexicon()
void LexiconDialog::addWordsFromFile()
{
+ QFileDialog browser(this, tr("Choose a file containing words to be added to the lexicon..."));
+}
+
+void LexiconDialog::addWordsFromDawg(const string &dawgfile, const string &alphabetfile)
+{
+ delete m_wordFactory;
+ m_wordFactory = NULL;
+
+ LexiconParameters lexParams;
+ lexParams.loadDawg(dawgfile);
+ if (!lexParams.hasDawg())
+ return;
+ m_wordFactory = new DawgFactory(alphabetfile);
+ Quackle::LetterString word;
+
+ addWordsFromDawgRecursive(lexParams, word, 1);
+}
+
+void LexiconDialog::addWordsFromDawgRecursive(const LexiconParameters &lexParams, Quackle::LetterString &word, int index)
+{
+ unsigned int p;
+ Quackle::Letter letter;
+ bool t;
+ bool lastchild;
+ bool british;
+ int playability;
+
+ do
+ {
+ lexParams.dawgAt(index, p, letter, t, lastchild, british, playability);
+ word.push_back(letter);
+ if (t)
+ m_wordFactory->pushWord(word, !british, playability);
+ if (p)
+ addWordsFromDawgRecursive(lexParams, word, p);
+ index++;
+ word.pop_back();
+ } while (!lastchild);
}
void LexiconDialog::accept()
diff --git a/quacker/lexicondialog.h b/quacker/lexicondialog.h
index cdc0a59..573d48b 100644
--- a/quacker/lexicondialog.h
+++ b/quacker/lexicondialog.h
@@ -20,17 +20,20 @@
#define QUACKER_LEXICONDIALOG_H
#include <string>
-#include <game.h>
+#include "game.h"
+#include "lexiconparameters.h"
#include <QWidget>
#include <QDialog>
using namespace std;
+using namespace Quackle;
class QComboBox;
class QLabel;
class QLineEdit;
class QPushButton;
+class DawgFactory;
class LexiconDialog : public QDialog
{
@@ -47,6 +50,10 @@ protected slots:
void deleteLexicon();
void addWordsFromFile();
+protected:
+ void addWordsFromDawg(const string &dawgfile, const string &alphabetfile);
+ void addWordsFromDawgRecursive(const LexiconParameters &lexParams, Quackle::LetterString &word, int index);
+
private:
QLineEdit *m_lexiconName;
QComboBox *m_alphabetCombo;
@@ -59,6 +66,8 @@ private:
QPushButton *m_deleteLexicon;
QString m_originalName;
+
+ DawgFactory *m_wordFactory;
};
#endif
diff --git a/quackleio/dawgfactory.cpp b/quackleio/dawgfactory.cpp
index 3a971a3..565778a 100644
--- a/quackleio/dawgfactory.cpp
+++ b/quackleio/dawgfactory.cpp
@@ -50,21 +50,24 @@ bool DawgFactory::pushWord(const UVString& word, bool inSmaller, int playability
UVString leftover;
Quackle::LetterString encodedWord = m_alphas->encode(word, &leftover);
if (leftover.empty())
- {
- if (m_root.pushWord(encodedWord, inSmaller, playability))
- {
- ++m_encodableWords;
- hashWord(encodedWord);
- return true;
- }
- ++m_duplicateWords;
- return false;
- }
+ return pushWord(encodedWord, inSmaller, playability);
++m_unencodableWords;
return false;
}
+bool DawgFactory::pushWord(const Quackle::LetterString& word, bool inSmaller, int playability)
+{
+ if (m_root.pushWord(word, inSmaller, playability))
+ {
+ ++m_encodableWords;
+ hashWord(word);
+ return true;
+ }
+ ++m_duplicateWords;
+ return false;
+}
+
void DawgFactory::hashWord(const Quackle::LetterString &word)
{
QCryptographicHash wordhash(QCryptographicHash::Md5);
@@ -139,6 +142,14 @@ void DawgFactory::writeIndex(const UVString& filename)
out.put(1); // DAWG format version 1
out.write(m_hash.charptr, sizeof(m_hash.charptr));
out.write((char*)bytes, 3);
+ out.put((char)m_alphas->length());
+ for (Quackle::Letter i = m_alphas->firstLetter(); i <= m_alphas->lastLetter(); i++)
+ {
+ QString letterText = QuackleIO::Util::uvStringToQString(m_alphas->letterParameter(i).text());
+ QByteArray utf8bytes = letterText.toUtf8();
+ string utf8LetterText(utf8bytes.constData());
+ out << utf8LetterText << ' ';
+ }
for (unsigned int i = 0; i < m_nodelist.size(); i++) {
//cout << m_nodelist[i]->c << " " << m_nodelist[i]->pointer << " " << m_nodelist[i]->t << " " << m_nodelist[i]->lastchild << endl;
diff --git a/quackleio/dawgfactory.h b/quackleio/dawgfactory.h
index 051e632..2a55461 100644
--- a/quackleio/dawgfactory.h
+++ b/quackleio/dawgfactory.h
@@ -36,6 +36,7 @@ public:
int duplicateWords() const { return m_duplicateWords; };
bool pushWord(const UVString& word, bool inSmaller, int playability);
+ bool pushWord(const Quackle::LetterString& word, bool inSmaller, int playability);
void hashWord(const Quackle::LetterString &word);
void generate();
void writeIndex(const UVString& filename);