From 7b52d4655ea5a5dcf1cf79f92953e90a288d9d6c Mon Sep 17 00:00:00 2001 From: Ryan Nauman Date: Fri, 17 Feb 2012 21:20:57 -0500 Subject: [PATCH] 0.3.0: removed findAnagramsSafely in favor of findAnagrams with and without options. fixed formatting bug. added readme and formatting example --- Readme.md | 48 ++++++++++++++++ bin/anagram | 2 +- examples/find-anagrams-formatting.js | 13 +++++ examples/find-anagrams-with-restrictions.js | 6 +- lib/anagram.js | 62 ++++++++------------- package.json | 2 +- test/find-anagrams-test.js | 8 +-- 7 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 Readme.md create mode 100644 examples/find-anagrams-formatting.js 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) {