diff --git a/Readme.md b/Readme.md
new file mode 100644
index 0000000..e3e6ffd
--- /dev/null
+++ b/Readme.md
@@ -0,0 +1,48 @@
+
+# anagram
+
+ A simple anagram generation library for use with nodejs. Forked from jeresig/trie-js by John Resig.
+
+## Installation
+
+ $ npm install anagram
+
+## Examples
+
+```js
+var anagram = require('anagram');
+
+anagram.init('../dict/twl06.js', function(err) {
+ if (err) throw err;
+ anagram.findAnagrams('dog', function(err, anagrams) {
+ console.log('`%s`: found %d anagrams', anagrams.input, anagrams.count);
+ console.log(anagrams);
+ });
+});
+```
+
+## Executables
+
+ anagram comes packed with two executables: `anagram` and `anagram-build`
+
+```shell
+$ anagram-build -f dict/twl06.txt > dict/twl06.js
+
+$ anagram -d dict/twl06.js -w anagr?m
+```
+
+## Running tests
+
+ Install development dependencies:
+
+ $ npm install -d
+
+ Run the tests:
+
+ $ npm test
+
+## License
+
+Copyright (c) 2012 Ryan Nauman
+
+MIT Licensed
\ No newline at end of file
diff --git a/bin/anagram b/bin/anagram
index 1b7bfa5..6ca1ee9 100755
--- a/bin/anagram
+++ b/bin/anagram
@@ -28,7 +28,7 @@ anagram.init(argv.d, function(err) {
options = { maxWildcards: argv.mw };
}
- anagram.findAnagramsSafely(argv.w, options, function(err, anagrams) {
+ anagram.findAnagrams(argv.w, options, function(err, anagrams) {
if (err) throw err;
console.log('Found %d anagrams for `%s`.', anagrams.count, anagrams.input);
console.log(anagrams);
diff --git a/examples/find-anagrams-formatting.js b/examples/find-anagrams-formatting.js
new file mode 100644
index 0000000..a18fbd3
--- /dev/null
+++ b/examples/find-anagrams-formatting.js
@@ -0,0 +1,13 @@
+var anagram = require ('../lib/anagram');
+
+// output anagrams with wildcard highlighting
+anagram.init('../dict/twl06.js', function(err) {
+ if (err) throw err;
+ anagram.findAnagrams('aa?', { 'format': 'md' }, function(err, anagrams) {
+ console.log('Found %d anagrams for `%s`.', anagrams.count, anagrams.input);
+ console.log('3 letters:');
+ console.log(' ' + anagrams['3']);
+ console.log('2 letters:');
+ console.log(' ' + anagrams['2']);
+ });
+});
\ No newline at end of file
diff --git a/examples/find-anagrams-with-restrictions.js b/examples/find-anagrams-with-restrictions.js
index 38eaa4c..8376d15 100644
--- a/examples/find-anagrams-with-restrictions.js
+++ b/examples/find-anagrams-with-restrictions.js
@@ -1,12 +1,12 @@
var anagram = require ('../lib/anagram');
-// the default options with findAnagramsSafely are:
+// the default options with findAnagrams are:
// maxWilcards: 3
anagram.init('../dict/twl06.js', function() {
- anagram.findAnagramsSafely('??????', function(err, anagrams) {
+ anagram.findAnagrams('??????', function(err, anagrams) {
console.log('`%s`: found %d anagrams', '??????', anagrams.count);
});
- anagram.findAnagramsSafely('??????', {maxWildcards: 2}, function(err, anagrams) {
+ anagram.findAnagrams('??????', {maxWildcards: 2}, function(err, anagrams) {
console.log('`%s`: found %d anagrams', '??????', anagrams.count);
});
});
\ No newline at end of file
diff --git a/lib/anagram.js b/lib/anagram.js
index efddc82..d8251a7 100644
--- a/lib/anagram.js
+++ b/lib/anagram.js
@@ -1,6 +1,7 @@
var dict,
- config = {
- maxWildcards: 3
+ options = {
+ maxWildcards: 3,
+ format: 'raw'
};
function renderDict(txt) {
@@ -108,40 +109,25 @@ function isTrailAccurate(trail, cur) {
console.log((d === cur) ? 'Trail is accurate' : 'Trail is INACCURATE');
}
-function findAnagramsSafely(rack, userConfig, callback) {
-
- // Restrict to three wildcard characters maximum
- var lFreq = findLetterFreqs(rack),
- options = {rack: rack},
- i = 0,
- extend = require("node.extend");
-
- extend(config, userConfig);
-
- if (lFreq['?'] && lFreq['?'] > config.maxWildcards) {
-
- lFreq['?'] = config.maxWildcards;
- options.letterFreq = lFreq;
-
- options.rack = rack.replace(/\?/g, '');
- for (;i < config.maxWildcards; i++) options.rack += '?';
-
- }
-
- findTrieAnagrams(options, callback);
-
-}
-
-function findTrieAnagrams(options, callback) {
- var uniqueLetters = findUniqueLetters(options.rack),
+function findAnagrams(rack, userOptions, callback) {
+
+ var uniqueLetters = findUniqueLetters(rack),
ul = uniqueLetters.length,
- letterFreq = options.letterFreq || findLetterFreqs(options.rack),
+ letterFreq = findLetterFreqs(rack),
groupedMatches = { 'count': 0 },
debug = false,
debugTrail = false,
recurse = true,
i = 0,
- extend = require("node.extend");
+ extend = require("node.extend"),
+ mergedOptions = extend({}, options, userOptions);
+
+ // reduce wildcards if necessary
+ if (letterFreq['?'] && letterFreq['?'] > mergedOptions.maxWildcards) {
+ letterFreq['?'] = mergedOptions.maxWildcards;
+ rack = rack.replace(/\?/g, '');
+ for (;i < mergedOptions.maxWildcards; i++) rack += '?';
+ }
try {
@@ -163,7 +149,7 @@ function findTrieAnagrams(options, callback) {
if (isWildcard) {
// format
- switch (options.format) {
+ switch (mergedOptions.format) {
case 'html':
localTrail = trail + '' + node + '';
break;
@@ -199,9 +185,9 @@ function findTrieAnagrams(options, callback) {
}
}
- groupedMatches.input = options.rack;
+ groupedMatches.input = rack;
- letterFreq.total = options.rack.length;
+ letterFreq.total = rack.length;
searchTrie( letterFreq, dict, '');
@@ -226,21 +212,17 @@ exports.init = init;
exports.createDictionary = createDictionary;
-exports.findAnagrams = function findAnagrams(rack, callback) {
- findTrieAnagrams({ 'rack': rack }, callback);
-};
-
exports.cliWildcardHelper = function cliWildcardHelper(rack) {
return rack.replace(/\^/g, '?');
};
-exports.findAnagramsSafely = function flexibleFindAnagramsSafely(rack, argh, callback) {
+exports.findAnagrams = function flexibleFindAnagrams(rack, argh, callback) {
switch (typeof argh) {
case 'function':
- findAnagramsSafely(rack, null, argh);
+ findAnagrams(rack, null, argh);
break;
case 'object':
- findAnagramsSafely(rack, argh, callback);
+ findAnagrams(rack, argh, callback);
break;
default:
callback(new Error('Unexpected parameters'), null);
diff --git a/package.json b/package.json
index b0804de..00b5c8f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "anagram",
- "version": "0.2.2",
+ "version": "0.3.0",
"author": "Ryan Nauman ",
"description": "a simple anagram generator",
"repository": {
diff --git a/test/find-anagrams-test.js b/test/find-anagrams-test.js
index 8ef7823..5407ef8 100644
--- a/test/find-anagrams-test.js
+++ b/test/find-anagrams-test.js
@@ -88,7 +88,7 @@ vows.describe('Find anagrams using twl06 dictionary').addBatch({
'find anagrams _safely_ for `??????????`': {
topic: function() {
- anagram.findAnagramsSafely('??????????', this.callback);
+ anagram.findAnagrams('??????????', this.callback);
},
'we know max wildcards was cut to 3 because there \
@@ -99,7 +99,7 @@ vows.describe('Find anagrams using twl06 dictionary').addBatch({
'find anagrams _safely_ with custom max wildcard setting': {
topic: function() {
- anagram.findAnagramsSafely('??????????', { maxWildcards: 2 },
+ anagram.findAnagrams('??????????', { maxWildcards: 2 },
this.callback);
},
@@ -111,7 +111,7 @@ vows.describe('Find anagrams using twl06 dictionary').addBatch({
'find anagrams _safely_ with max wildcard setting set to 1': {
topic: function() {
- anagram.findAnagramsSafely('t???', { maxWildcards: 1 },
+ anagram.findAnagrams('t???', { maxWildcards: 1 },
this.callback);
},
@@ -123,7 +123,7 @@ vows.describe('Find anagrams using twl06 dictionary').addBatch({
'find anagrams safely without wildcards (`dog`)': {
topic: function() {
- anagram.findAnagramsSafely('dog', this.callback);
+ anagram.findAnagrams('dog', this.callback);
},
'we get these anagrams': function (err, anagrams) {