diff --git a/src/regex.js b/src/regex.js index fc65e50f..c992a8e0 100644 --- a/src/regex.js +++ b/src/regex.js @@ -16,15 +16,39 @@ const wordsToRegexp = _.flow( _.join('') ) -const matchWords = _.curry((buildRegex, x) => { +/* const matchWords = _.curry((buildRegex, x) => { // Not inlining so that we don't create the regexp every time const regexp = RegExp(buildRegex(x), 'gi') return y => !!(y && y.match(regexp)) }) + */ +/* export const matchAllWords = matchWords(wordsToRegexp) -export const matchAllWords = matchWords(wordsToRegexp) +export const matchAnyWord = matchWords(anyWordToRegexp) */ +/* const matchWords = (body, query) => { + return _.intersection(_.words(body), _.uniq(_.words(query))); +} */ -export const matchAnyWord = matchWords(anyWordToRegexp) +const _contains = _.curry((body, token) => body.indexOf(token) > -1) + +const matchWords = _.curry((fn, body, accumulator, token) => fn(_contains(body), accumulator, token)) + +const matchAny = matchWords((contains, accumulator, token) => !accumulator ? contains(token) : true) + +const matchAll = matchWords((contains, accumulator, token) => (!accumulator ? + (accumulator === undefined) ? + contains(token) : false + : contains(token))) +export const matchAllWords = _.curry((query, body) => { + var match = matchAll(body.toLowerCase()) + var matches = _.words(query.toLowerCase()).reduce(match); + return !!matches; +}) +export const matchAnyWord = _.curry((query, body) => { + var match = matchAny(body.toLowerCase()) + var matches = _.words(query.toLowerCase()).reduce(match); + return !!matches; +}) export const postings = (regex, str) => { var match = regex.exec(str) diff --git a/test/regex.spec.js b/test/regex.spec.js index 48974034..5d8a2d0a 100644 --- a/test/regex.spec.js +++ b/test/regex.spec.js @@ -1,5 +1,6 @@ import chai from 'chai' import * as f from '../src/regex' +import _ from 'lodash/fp' import {insertAtIndex} from '../src/array' chai.expect() const expect = chai.expect @@ -27,19 +28,91 @@ describe('Regexp Functions', () => { }) it('matchAnyWord', () => { + console.time ('matchAnyWord') const reText = 'Some text' const text = 'Here is some text to test' const match = f.matchAnyWord(reText) + expect(match(text)).to.equal(true) + console.timeEnd ('matchAnyWord') + }) + it('matchAnyWord1', () => { + console.time ('matchAnyWord__punctuation'); + const reText = 'Some text' + const text = 'Here... is, some; Text to -- test.' + let match = f.matchAnyWord(reText) expect(match(text)).to.equal(true) + console.timeEnd('matchAnyWord__punctuation') + }) +it('matchAnyWord2', () => { + console.time ('matchAnyWord__long_body') + let reText1 = 'Some text' + let text1 = moby + let match1 = f.matchAnyWord(reText1) + + expect(match1(text1)).to.equal(true) + console.timeEnd('matchAnyWord__long_body') }) +it('matchAnyWord3', () => { + console.time ('matchAnyWord__long_query') + const reText = 'Ishmael some text' + const text = moby + const match = f.matchAnyWord(reText); + expect(match(text)).to.equal(true) + console.timeEnd('matchAnyWord__long_query') + }) it('matchAllWords', () => { + console.time ('matchAllWords') const reText = 'Some text' const text = 'Here is some to test' const match = f.matchAllWords(reText) + expect(match(text)).to.equal(false) + console.timeEnd ('matchAllWords') + }) + it('matchAllWords1', () => { + console.time ('matchAllWords__capitalize_Punctuate') + const reText = 'It has all the... Things..' + const text = 'it has, ALL THE THINGS!!!' + const match = f.matchAllWords(reText) + + expect(match(text)).to.equal(true) + console.timeEnd ('matchAllWords__capitalize_Punctuate') + }) + it('matchAllWords2', () => { + console.time ('matchAllWords__mix_order') + const reText = 'It has all the... Things..' + const text = 'ALL THE THINGS **it** HAS!!!' + const match = f.matchAllWords(reText) + + expect(match(text)).to.equal(true) + console.timeEnd ('matchAllWords__mix_order') + }) + it('matchAllWords3', () => { + console.time ('matchAllWords__long_match') + const reText = moby + const text = moby + const match = f.matchAllWords(reText) + + expect(match(text)).to.equal(true) + console.timeEnd ('matchAllWords__long_match') + }) + it('matchAllWords5', () => { + console.time ('matchAllWords__long_match_backwards_fail') + const reText = moby + const text = _.reverse(moby).join('') + const match = f.matchAllWords(reText) expect(match(text)).to.equal(false) + console.timeEnd ('matchAllWords__long_match_backwards_fail') + }) + it('matchAllWords4', () => { + console.time ('matchAllWords__long_match_backwards') + const reText = moby + const text = _.reverse(_.words(moby)).join(' ') + const match = f.matchAllWords(reText) + expect(match(text)).to.equal(true) + console.timeEnd ('matchAllWords__long_match_backwards') }) }) @@ -81,3 +154,202 @@ describe('Posting Highlight Functions', () => { expect(f.highlight(start, end, pattern, input)).to.deep.equal(expected) }) }) +const moby = `CHAPTER 1. Loomings. + +Call me Ishmael. Some years ago—never mind how long precisely—having +little or no money in my purse, and nothing particular to interest me on +shore, I thought I would sail about a little and see the watery part of +the world. It is a way I have of driving off the spleen and regulating +the circulation. Whenever I find myself growing grim about the mouth; +whenever it is a damp, drizzly November in my soul; whenever I find +myself involuntarily pausing before coffin warehouses, and bringing up +the rear of every funeral I meet; and especially whenever my hypos get +such an upper hand of me, that it requires a strong moral principle to +prevent me from deliberately stepping into the street, and methodically +knocking people’s hats off—then, I account it high time to get to +sea as soon as I can. This is my substitute for pistol and ball. With +a philosophical flourish Cato throws himself upon his sword; I quietly +take to the ship. There is nothing surprising in this. If they but knew +it, almost all men in their degree, some time or other, cherish very +nearly the same feelings towards the ocean with me. + +There now is your insular city of the Manhattoes, belted round by +wharves as Indian isles by coral reefs—commerce surrounds it with +her surf. Right and left, the streets take you waterward. Its extreme +downtown is the battery, where that noble mole is washed by waves, and +cooled by breezes, which a few hours previous were out of sight of land. +Look at the crowds of water-gazers there. + +Circumambulate the city of a dreamy Sabbath afternoon. Go from Corlears +Hook to Coenties Slip, and from thence, by Whitehall, northward. What +do you see?—Posted like silent sentinels all around the town, stand +thousands upon thousands of mortal men fixed in ocean reveries. Some +leaning against the spiles; some seated upon the pier-heads; some +looking over the bulwarks of ships from China; some high aloft in the +rigging, as if striving to get a still better seaward peep. But these +are all landsmen; of week days pent up in lath and plaster—tied to +counters, nailed to benches, clinched to desks. How then is this? Are +the green fields gone? What do they here? + +But look! here come more crowds, pacing straight for the water, and +seemingly bound for a dive. Strange! Nothing will content them but the +extremest limit of the land; loitering under the shady lee of yonder +warehouses will not suffice. No. They must get just as nigh the water +as they possibly can without falling in. And there they stand—miles of +them—leagues. Inlanders all, they come from lanes and alleys, streets +and avenues—north, east, south, and west. Yet here they all unite. +Tell me, does the magnetic virtue of the needles of the compasses of all +those ships attract them thither? + +Once more. Say you are in the country; in some high land of lakes. Take +almost any path you please, and ten to one it carries you down in a +dale, and leaves you there by a pool in the stream. There is magic +in it. Let the most absent-minded of men be plunged in his deepest +reveries—stand that man on his legs, set his feet a-going, and he +will infallibly lead you to water, if water there be in all that region. +Should you ever be athirst in the great American desert, try this +experiment, if your caravan happen to be supplied with a metaphysical +professor. Yes, as every one knows, meditation and water are wedded for +ever. + +But here is an artist. He desires to paint you the dreamiest, shadiest, +quietest, most enchanting bit of romantic landscape in all the valley of +the Saco. What is the chief element he employs? There stand his trees, +each with a hollow trunk, as if a hermit and a crucifix were within; and +here sleeps his meadow, and there sleep his cattle; and up from yonder +cottage goes a sleepy smoke. Deep into distant woodlands winds a +mazy way, reaching to overlapping spurs of mountains bathed in their +hill-side blue. But though the picture lies thus tranced, and though +this pine-tree shakes down its sighs like leaves upon this shepherd’s +head, yet all were vain, unless the shepherd’s eye were fixed upon the +magic stream before him. Go visit the Prairies in June, when for scores +on scores of miles you wade knee-deep among Tiger-lilies—what is the +one charm wanting?—Water—there is not a drop of water there! Were +Niagara but a cataract of sand, would you travel your thousand miles to +see it? Why did the poor poet of Tennessee, upon suddenly receiving two +handfuls of silver, deliberate whether to buy him a coat, which he sadly +needed, or invest his money in a pedestrian trip to Rockaway Beach? Why +is almost every robust healthy boy with a robust healthy soul in him, at +some time or other crazy to go to sea? Why upon your first voyage as a +passenger, did you yourself feel such a mystical vibration, when first +told that you and your ship were now out of sight of land? Why did the +old Persians hold the sea holy? Why did the Greeks give it a separate +deity, and own brother of Jove? Surely all this is not without meaning. +And still deeper the meaning of that story of Narcissus, who because +he could not grasp the tormenting, mild image he saw in the fountain, +plunged into it and was drowned. But that same image, we ourselves see +in all rivers and oceans. It is the image of the ungraspable phantom of +life; and this is the key to it all. + +Now, when I say that I am in the habit of going to sea whenever I begin +to grow hazy about the eyes, and begin to be over conscious of my lungs, +I do not mean to have it inferred that I ever go to sea as a passenger. +For to go as a passenger you must needs have a purse, and a purse is +but a rag unless you have something in it. Besides, passengers get +sea-sick—grow quarrelsome—don’t sleep of nights—do not enjoy +themselves much, as a general thing;—no, I never go as a passenger; +nor, though I am something of a salt, do I ever go to sea as a +Commodore, or a Captain, or a Cook. I abandon the glory and distinction +of such offices to those who like them. For my part, I abominate all +honourable respectable toils, trials, and tribulations of every kind +whatsoever. It is quite as much as I can do to take care of myself, +without taking care of ships, barques, brigs, schooners, and what not. +And as for going as cook,—though I confess there is considerable glory +in that, a cook being a sort of officer on ship-board—yet, somehow, +I never fancied broiling fowls;—though once broiled, judiciously +buttered, and judgmatically salted and peppered, there is no one who +will speak more respectfully, not to say reverentially, of a broiled +fowl than I will. It is out of the idolatrous dotings of the old +Egyptians upon broiled ibis and roasted river horse, that you see the +mummies of those creatures in their huge bake-houses the pyramids. + +No, when I go to sea, I go as a simple sailor, right before the mast, +plumb down into the forecastle, aloft there to the royal mast-head. +True, they rather order me about some, and make me jump from spar to +spar, like a grasshopper in a May meadow. And at first, this sort +of thing is unpleasant enough. It touches one’s sense of honour, +particularly if you come of an old established family in the land, the +Van Rensselaers, or Randolphs, or Hardicanutes. And more than all, +if just previous to putting your hand into the tar-pot, you have been +lording it as a country schoolmaster, making the tallest boys stand +in awe of you. The transition is a keen one, I assure you, from a +schoolmaster to a sailor, and requires a strong decoction of Seneca and +the Stoics to enable you to grin and bear it. But even this wears off in +time. + +What of it, if some old hunks of a sea-captain orders me to get a broom +and sweep down the decks? What does that indignity amount to, weighed, +I mean, in the scales of the New Testament? Do you think the archangel +Gabriel thinks anything the less of me, because I promptly and +respectfully obey that old hunks in that particular instance? Who +ain’t a slave? Tell me that. Well, then, however the old sea-captains +may order me about—however they may thump and punch me about, I have +the satisfaction of knowing that it is all right; that everybody else is +one way or other served in much the same way—either in a physical +or metaphysical point of view, that is; and so the universal thump is +passed round, and all hands should rub each other’s shoulder-blades, +and be content. + +Again, I always go to sea as a sailor, because they make a point of +paying me for my trouble, whereas they never pay passengers a single +penny that I ever heard of. On the contrary, passengers themselves must +pay. And there is all the difference in the world between paying +and being paid. The act of paying is perhaps the most uncomfortable +infliction that the two orchard thieves entailed upon us. But being +paid,—what will compare with it? The urbane activity with which a man +receives money is really marvellous, considering that we so earnestly +believe money to be the root of all earthly ills, and that on no account +can a monied man enter heaven. Ah! how cheerfully we consign ourselves +to perdition! + +Finally, I always go to sea as a sailor, because of the wholesome +exercise and pure air of the fore-castle deck. For as in this world, +head winds are far more prevalent than winds from astern (that is, +if you never violate the Pythagorean maxim), so for the most part the +Commodore on the quarter-deck gets his atmosphere at second hand from +the sailors on the forecastle. He thinks he breathes it first; but not +so. In much the same way do the commonalty lead their leaders in many +other things, at the same time that the leaders little suspect it. +But wherefore it was that after having repeatedly smelt the sea as a +merchant sailor, I should now take it into my head to go on a whaling +voyage; this the invisible police officer of the Fates, who has the +constant surveillance of me, and secretly dogs me, and influences me in +some unaccountable way—he can better answer than any one else. And, +doubtless, my going on this whaling voyage, formed part of the grand +programme of Providence that was drawn up a long time ago. It came in as +a sort of brief interlude and solo between more extensive performances. +I take it that this part of the bill must have run something like this: + +“Grand Contested Election for the Presidency of the United States. +“WHALING VOYAGE BY ONE ISHMAEL. “BLOODY BATTLE IN AFFGHANISTAN.” + +Though I cannot tell why it was exactly that those stage managers, the +Fates, put me down for this shabby part of a whaling voyage, when others +were set down for magnificent parts in high tragedies, and short and +easy parts in genteel comedies, and jolly parts in farces—though +I cannot tell why this was exactly; yet, now that I recall all the +circumstances, I think I can see a little into the springs and motives +which being cunningly presented to me under various disguises, induced +me to set about performing the part I did, besides cajoling me into the +delusion that it was a choice resulting from my own unbiased freewill +and discriminating judgment. + +Chief among these motives was the overwhelming idea of the great +whale himself. Such a portentous and mysterious monster roused all my +curiosity. Then the wild and distant seas where he rolled his island +bulk; the undeliverable, nameless perils of the whale; these, with all +the attending marvels of a thousand Patagonian sights and sounds, helped +to sway me to my wish. With other men, perhaps, such things would not +have been inducements; but as for me, I am tormented with an everlasting +itch for things remote. I love to sail forbidden seas, and land on +barbarous coasts. Not ignoring what is good, I am quick to perceive a +horror, and could still be social with it—would they let me—since +it is but well to be on friendly terms with all the inmates of the place +one lodges in. + +By reason of these things, then, the whaling voyage was welcome; the +great flood-gates of the wonder-world swung open, and in the wild +conceits that swayed me to my purpose, two and two there floated into +my inmost soul, endless processions of the whale, and, mid most of them +all, one grand hooded phantom, like a snow hill in the air. +`