summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Fultz <jfultz@wolfram.com>2015-09-26 10:47:07 -0500
committerJohn Fultz <jfultz@wolfram.com>2015-09-26 10:47:07 -0500
commit1214533715a1acfbc35ebe29ff78afee2f850226 (patch)
tree8c4c9a5280cfbb48b48dff2ae1c567364ea97e89
parented46987403dd923d3ba14df6eb676e1e163d1d8d (diff)
Work on DAWG generation.
V1 DAWGs now include an alphabet. Begin creating DAWGs which extend other DAWGs. In general, laying the groundwork for plain text import to DAWG.
-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);