File Coverage

blib/lib/Lingua/EN/Infinitive.pm
Criterion Covered Total %
statement 79 80 98.7
branch 18 18 100.0
condition 5 5 100.0
subroutine 7 7 100.0
pod 2 3 66.6
total 111 113 98.2


line stmt bran cond sub pod time code
1             package Lingua::EN::Infinitive;
2              
3 1     1   485 use strict;
  1         3  
  1         35  
4 1     1   3 use warnings;
  1         1  
  1         18  
5              
6 1     1   445 use Moo;
  1         9776  
  1         4  
7              
8 1     1   1472 use Types::Standard qw/HashRef Str/;
  1         48925  
  1         8  
9              
10             has adjective_to_noun =>
11             (
12             default => sub{return {} },
13             is => 'rw',
14             isa => HashRef,
15             required => 0,
16             );
17              
18             has irregular2infinitive =>
19             (
20             default => sub{return {} },
21             is => 'rw',
22             isa => HashRef,
23             required => 0,
24             );
25              
26             has rule =>
27             (
28             default => sub{return ''},
29             is => 'rw',
30             isa => Str,
31             required => 0,
32             );
33              
34             has suffix =>
35             (
36             default => sub{return ''},
37             is => 'rw',
38             isa => Str,
39             required => 0,
40             );
41              
42             has suffix2rule =>
43             (
44             default => sub{return {} },
45             is => 'rw',
46             isa => HashRef,
47             required => 0,
48             );
49              
50             has word1 =>
51             (
52             default => sub{return ''},
53             is => 'rw',
54             isa => Str,
55             required => 0,
56             );
57              
58             has word2 =>
59             (
60             default => sub{return ''},
61             is => 'rw',
62             isa => Str,
63             required => 0,
64             );
65              
66              
67             our $VERSION = '1.13';
68              
69             # -------------------------------------------------------------------
70              
71             sub BUILD
72             {
73 1     1 0 12 my($self) = @_;
74              
75 1         110 $self -> adjective_to_noun
76             ({
77             British => 'Britian',
78             Danish => 'Denmark',
79             English => 'England',
80             Finnish => 'Finland',
81             Irish => 'Ireland',
82             Jewish => 'Jew',
83             Kurdish => 'Kurd',
84             Moorish => 'Moor',
85             Polish => 'Poland',
86             Scottish => 'Scotland',
87             Spanish => 'Spain',
88             Swedish => 'Sweden',
89             Turkish => 'Turkey',
90             amateurish => 'amateur',
91             babyish => 'baby',
92             bearish => 'bear',
93             blackish => 'black',
94             bluish => 'blue',
95             bookish => 'book',
96             boorish => 'boor',
97             boyish => 'boy',
98             brownish => 'brown',
99             brutish => 'brute',
100             bullish => 'bull',
101             childish => 'child',
102             clannish => 'clan',
103             cliquish => 'clique',
104             clownish => 'clown',
105             coltish => 'colt',
106             coquettish => 'coquette',
107             devilish => 'devil',
108             doltish => 'dolt',
109             dwarfish => 'dwarf',
110             elfish => 'elf',
111             faddish => 'fad',
112             feverish => 'fever',
113             fiendish => 'fiend',
114             flourish => 'flour',
115             foolish => 'fool',
116             foppish => 'fop',
117             freakish => 'freak',
118             ghoulish => 'ghoul',
119             girlish => 'girl',
120             gnomish => 'gnome',
121             grayish => 'gray',
122             greenish => 'green',
123             greyish => 'grey',
124             hawkish => 'hawk',
125             heathenish => 'heathen',
126             hellish => 'hell',
127             hoggish => 'hog',
128             impish => 'imp',
129             kittenish => 'kitten',
130             knavish => 'knave',
131             longish => 'long',
132             loutish => 'lout',
133             lowish => 'low',
134             lumpish => 'lump',
135             mannish => 'man',
136             modish => 'mod',
137             mulish => 'mult',
138             nightmarish => 'nightmare',
139             oafish => 'oaf',
140             owlish => 'owl',
141             peevish => 'peeve',
142             piggish => 'pig',
143             pinkish => 'pink',
144             priggish => 'prig',
145             prudish => 'prude',
146             puckish => 'puck',
147             purplish => 'purple',
148             rakish => 'rake',
149             reddish => 'red',
150             roguish => 'rogue',
151             roundish => 'round',
152             sheepish => 'sheep',
153             shortish => 'short',
154             slavish => 'slave',
155             sluggish => 'slug',
156             sluttish => 'slut',
157             smallish => 'small',
158             snappish => 'snappy',
159             snobbish => 'snob',
160             sottish => 'sot',
161             standoffish => 'standoff',
162             stylish => 'style',
163             sweetish => 'sweet',
164             swinish => 'swine',
165             thievish => 'thieve',
166             ticklish => 'tickle',
167             vixenish => 'vixen',
168             voguish => 'vugoue',
169             waggish => 'wag',
170             waspish => 'wasp',
171             whitish => 'white',
172             wolfish => 'wolf',
173             womanish => 'woman',
174             yellowish => 'yellow',
175             youngish => 'young',
176             });
177 1         355 $self -> irregular2infinitive
178             ({
179             abided => 'abide',
180             abode => 'abide',
181             am => 'be',
182             are => 'be',
183             arisen => 'arise',
184             arose => 'arise',
185             ate => 'eat',
186             awaked => 'awake',
187             awoke => 'awake',
188             bade => 'bid',
189             beaten => 'beat',
190             became => 'become',
191             been => 'be',
192             befallen => 'befall',
193             befell => 'befall',
194             began => 'begin',
195             begat => 'beget',
196             begot => 'beget',
197             begotten => 'beget',
198             begun => 'begin',
199             beheld => 'behold',
200             bent => 'bend',
201             bereaved => 'bereave',
202             bereft => 'bereave',
203             beseeched => 'beseech',
204             besought => 'beseech',
205             bespoke => 'bespeak',
206             bespoken => 'bespeak',
207             bestrewed => 'bestrew',
208             bestrewn => 'bestrew',
209             bestrid => 'bestride',
210             bestridden => 'bestride',
211             bestrode => 'bestride',
212             betaken => 'betake',
213             bethought => 'bethink',
214             betook => 'betake',
215             betted => 'bet',
216             bidden => 'bid',
217             bided => 'bide',
218             bit => 'bite',
219             bitten => 'bite',
220             bled => 'bleed',
221             blended => 'blend',
222             blent => 'blend',
223             blessed => 'bless',
224             blest => 'bless',
225             blew => 'blow',
226             blown => 'blow',
227             bode => 'bide',
228             bore => 'bear',
229             born => 'bear',
230             borne => 'bear',
231             bought => 'buy',
232             bound => 'bind',
233             bred => 'breed',
234             broadcasted => 'broadcast',
235             broke => 'break',
236             broken => 'break',
237             brought => 'bring',
238             browbeaten => 'browbeat',
239             built => 'build',
240             burned => 'burn',
241             burnt => 'burn',
242             came => 'come',
243             caught => 'catch',
244             chid => 'chide',
245             chidden => 'chide',
246             chided => 'chide',
247             chose => 'choose',
248             chosen => 'choose',
249             clad => 'clothe',
250             clave => 'cleave',
251             cleaved => 'cleave',
252             cleft => 'cleave',
253             clothed => 'clothe',
254             clove => 'cleave',
255             cloven => 'cleave',
256             clung => 'cling',
257             costed => 'cost',
258             could => 'can',
259             crept => 'creep',
260             crew => 'crow',
261             crowed => 'crow',
262             dealt => 'deal',
263             did => 'do',
264             done => 'do',
265             dove => 'dive',
266             drank => 'drink',
267             drawn => 'draw',
268             dreamed => 'dream',
269             dreamt => 'dream',
270             drew => 'draw',
271             driven => 'drive',
272             drove => 'drive',
273             drunk => 'drink',
274             dug => 'dig',
275             dwelled => 'dwell',
276             dwelt => 'dwell',
277             eaten => 'eat',
278             fallen => 'fall',
279             fed => 'feed',
280             fell => 'fall',
281             felt => 'feel',
282             fled => 'flee',
283             flew => 'fly',
284             flown => 'fly',
285             flung => 'fling',
286             forbad => 'forbid',
287             forbade => 'forbid',
288             forbidden => 'forbid',
289             forbore => 'forbear',
290             forborne => 'forbear',
291             fordid => 'fordo',
292             fordone => 'fordo',
293             forecasted => 'forecast',
294             foregone => 'forego',
295             foreknew => 'foreknow',
296             foreknown => 'foreknow',
297             foreran => 'forerun',
298             foresaw => 'foresee',
299             foreshowed => 'foreshow',
300             foreshown => 'foreshow',
301             foretold => 'foretell',
302             forewent => 'forego',
303             forgave => 'forgive',
304             forgiven => 'forgive',
305             forgot => 'forget',
306             forgotten => 'forget',
307             forsaken => 'forsake',
308             forseen => 'foresee',
309             forsook => 'forsake',
310             forswore => 'forswear',
311             forsworn => 'forswear',
312             fought => 'fight',
313             found => 'find',
314             froze => 'freeze',
315             frozen => 'freeze',
316             gainsaid => 'gainsay',
317             gave => 'give',
318             gilded => 'gild',
319             gilt => 'gild',
320             girded => 'gird',
321             girt => 'gird',
322             given => 'give',
323             gone => 'go',
324             got => 'get',
325             gotten => 'get',
326             graved => 'grave',
327             graven => 'grave',
328             grew => 'grow',
329             ground => 'grind',
330             grown => 'grow',
331             had => 'have',
332             hamstringed => 'hamstring',
333             hamstrung => 'hamstring',
334             hanged => 'hang',
335             heard => 'hear',
336             heaved => 'heave',
337             held => 'hold',
338             hewed => 'hew',
339             hewn => 'hew',
340             hid => 'hide',
341             hidden => 'hide',
342             hove => 'heave',
343             hung => 'hang',
344             inlaid => 'inlay',
345             is => 'be',
346             kept => 'keep',
347             kneeled => 'kneel',
348             knelt => 'kneel',
349             knew => 'know',
350             knitted => 'knit',
351             known => 'know',
352             laded => 'lade',
353             laden => 'lade',
354             laid => 'lay',
355             lain => 'lie',
356             lay => 'lie',
357             leaned => 'lean',
358             leant => 'lean',
359             leaped => 'leap',
360             leapt => 'leap',
361             learned => 'learn',
362             learnt => 'learn',
363             led => 'lead',
364             left => 'leave',
365             lent => 'lend',
366             lighted => 'light',
367             lit => 'light',
368             lost => 'lose',
369             made => 'make',
370             meant => 'mean',
371             melted => 'melt',
372             met => 'meet',
373             might => 'may',
374             misdealt => 'misdeal',
375             misgave => 'misgive',
376             misgiven => 'misgive',
377             mislaid => 'mislay',
378             misled => 'mislead',
379             mistaken => 'mistake',
380             mistook => 'mistake',
381             misunderstood => 'misunderstand',
382             molten => 'melt',
383             mowed => 'mow',
384             mown => 'mow',
385             outate => 'outeat',
386             outbade => 'outbid',
387             outbidden => 'outbid',
388             outbred => 'outbreed',
389             outdid => 'outdo',
390             outdone => 'outdo',
391             outeaten => 'outeat',
392             outfought => 'outfight',
393             outgone => 'outgo',
394             outgrew => 'outgrow',
395             outgrown => 'outgrow',
396             outlaid => 'outlay',
397             outran => 'outrun',
398             outridden => 'outride',
399             outrode => 'outride',
400             outsat => 'outsit',
401             outshone => 'outshine',
402             outshot => 'outshoot',
403             outsold => 'outsell',
404             outspent => 'outspend',
405             outthrew => 'outthrow',
406             outthrown => 'outthrow',
407             outwent => 'outgo',
408             outwore => 'outwear',
409             outworn => 'outwear',
410             overate => 'overeat',
411             overbade => 'overbid',
412             overbidden => 'overbid',
413             overblew => 'overblow',
414             overblown => 'overblow',
415             overbore => 'overbear',
416             overborn => 'overbear',
417             overborne => 'overbear',
418             overbought => 'overbuy',
419             overbuilt => 'overbuild',
420             overcame => 'overcome',
421             overdid => 'overdo',
422             overdone => 'overdo',
423             overdrawn => 'overdraw',
424             overdrew => 'overdraw',
425             overdriven => 'overdrive',
426             overdrove => 'overdrive',
427             overeaten => 'overeat',
428             overfed => 'overfeed',
429             overflew => 'overfly',
430             overflown => 'overfly',
431             overgrew => 'overgrow',
432             overgrown => 'overgrow',
433             overhanged => 'overhang',
434             overheard => 'overhear',
435             overhung => 'overhang',
436             overladed => 'overlade',
437             overladen => 'overlade',
438             overlaid => 'overlay',
439             overlain => 'overlie',
440             overlay => 'overlie',
441             overleaped => 'overleap',
442             overleapt => 'overleap',
443             overpaid => 'overpay',
444             overran => 'overrun',
445             overridden => 'override',
446             overrode => 'override',
447             oversaw => 'oversee',
448             overseen => 'oversee',
449             oversewed => 'oversew',
450             oversewn => 'oversew',
451             overshot => 'overshoot',
452             overslept => 'oversleep',
453             overspent => 'overspend',
454             overtaken => 'overtake',
455             overthrew => 'overthrow',
456             overthrown => 'overthrow',
457             overtook => 'overtake',
458             overwinded => 'overwind',
459             overwound => 'overwind',
460             overwritten => 'overwrite',
461             overwrote => 'overwrite',
462             paid => 'pay',
463             partaken => 'partake',
464             partook => 'partake',
465             prechose => 'prechoose',
466             prechosen => 'prechoose',
467             proved => 'prove',
468             proven => 'prove',
469             quitted => 'quit',
470             ran => 'run',
471             rang => 'ring',
472             reaved => 'reave',
473             rebuilt => 'rebuild',
474             reeved => 'reeve',
475             reft => 'reave',
476             relaid => 'relay',
477             rent => 'rend',
478             repaid => 'repay',
479             retold => 'retell',
480             ridded => 'rid',
481             ridden => 'ride',
482             risen => 'rise',
483             rived => 'rive',
484             riven => 'rive',
485             rode => 'ride',
486             rose => 'rise',
487             rove => 'reeve',
488             rung => 'ring',
489             said => 'say',
490             sang => 'sing',
491             sank => 'sink',
492             sat => 'sit',
493             saw => 'see',
494             sawed => 'saw',
495             sawn => 'saw',
496             seen => 'see',
497             sent => 'send',
498             sewed => 'sew',
499             sewn => 'sew',
500             shaken => 'shake',
501             shaved => 'shave',
502             shaven => 'shave',
503             sheared => 'shear',
504             shined => 'shine',
505             shod => 'shoe',
506             shoed => 'shoe',
507             shone => 'shine',
508             shook => 'shake',
509             shorn => 'shear',
510             shot => 'shoot',
511             showed => 'show',
512             shown => 'show',
513             shrank => 'shrink',
514             shredded => 'shred',
515             shrived => 'shrive',
516             shriven => 'shrive',
517             shrove => 'shrive',
518             shrunk => 'shrink',
519             shrunken => 'shrink',
520             slain => 'slay',
521             slept => 'sleep',
522             slew => 'slay',
523             slid => 'slide',
524             slidden => 'slide',
525             slung => 'sling',
526             slunk => 'slink',
527             smelled => 'smell',
528             smelt => 'smell',
529             smitten => 'smite',
530             smote => 'smite',
531             snuck => 'sneak',
532             sold => 'sell',
533             sought => 'seek',
534             sowed => 'sow',
535             sown => 'sow',
536             span => 'spin',
537             spat => 'spit',
538             sped => 'speed',
539             speeded => 'speed',
540             spelled => 'spell',
541             spelt => 'spell',
542             spent => 'spend',
543             spilled => 'spill',
544             spilt => 'spill',
545             spoiled => 'spoil',
546             spoilt => 'spoil',
547             spoke => 'speak',
548             spoken => 'speak',
549             sprang => 'spring',
550             sprung => 'spring',
551             spun => 'spin',
552             stank => 'stink',
553             staved => 'stave',
554             stole => 'steal',
555             stolen => 'steal',
556             stood => 'stand',
557             stove => 'stave',
558             strewed => 'strew',
559             strewn => 'strew',
560             stricken => 'strike',
561             strid => 'stride',
562             stridden => 'stride',
563             strived => 'strive',
564             striven => 'strive',
565             strode => 'stride',
566             strove => 'strive',
567             struck => 'strike',
568             strung => 'string',
569             stuck => 'stick',
570             stung => 'sting',
571             stunk => 'stink',
572             sung => 'sing',
573             sunk => 'sink',
574             sunken => 'sink',
575             swam => 'swim',
576             sweated => 'sweat',
577             swelled => 'swell',
578             swept => 'sweep',
579             swollen => 'swell',
580             swore => 'swear',
581             sworn => 'swear',
582             swum => 'swim',
583             swung => 'swing',
584             taken => 'take',
585             taught => 'teach',
586             thought => 'think',
587             threw => 'throw',
588             thrived => 'thrive',
589             thriven => 'thrive',
590             throve => 'thrive',
591             thrown => 'throw',
592             told => 'tell',
593             took => 'take',
594             tore => 'tear',
595             torn => 'tear',
596             trod => 'tread',
597             trodden => 'tread',
598             unbent => 'unbend',
599             unbound => 'unbind',
600             unbuilt => 'unbuild',
601             underbought => 'underbuy',
602             underfed => 'underfeed',
603             undergone => 'undergo',
604             underlaid => 'underlay',
605             underlain => 'underlie',
606             underlay => 'underlie',
607             underpaid => 'underpay',
608             underran => 'underrun',
609             undershot => 'undershoot',
610             undersold => 'undersell',
611             understood => 'understand',
612             undertaken => 'undertake',
613             undertook => 'undertake',
614             underwent => 'undergo',
615             underwritten => 'underwrite',
616             underwrote => 'underwrite',
617             undid => 'undo',
618             undone => 'undo',
619             undrawn => 'undraw',
620             undrew => 'undraw',
621             unfroze => 'unfreeze',
622             unfrozen => 'unfreeze',
623             ungirded => 'ungird',
624             ungirt => 'ungird',
625             unhanged => 'unhang',
626             unhung => 'unhang',
627             unknitted => 'unknit',
628             unladed => 'unlade',
629             unladen => 'unlade',
630             unlaid => 'unlay',
631             unlearned => 'unlearn',
632             unlearnt => 'unlearn',
633             unmade => 'unmake',
634             unreeved => 'unreeve',
635             unrove => 'unreeve',
636             unsaid => 'unsay',
637             unslung => 'unsling',
638             unspoke => 'unspeak',
639             unspoken => 'unspeak',
640             unstrung => 'unstring',
641             unstuck => 'unstick',
642             unswore => 'unswear',
643             unsworn => 'unswear',
644             untaught => 'unteach',
645             unthought => 'unthink',
646             untrod => 'untread',
647             untrodden => 'untread',
648             unwinded => 'unwind',
649             unwound => 'unwind',
650             unwove => 'unweave',
651             unwoven => 'unweave',
652             upbuilt => 'upbuild',
653             upheld => 'uphold',
654             uprisen => 'uprise',
655             uprose => 'uprise',
656             upswept => 'upsweep',
657             upswung => 'upswing',
658             waked => 'wake',
659             was => 'be',
660             waylaid => 'waylay',
661             wedded => 'wed',
662             went => 'go',
663             wept => 'weep',
664             were => 'be',
665             wetted => 'wet',
666             winded => 'wind',
667             wist => 'wit',
668             wot => 'wit',
669             withdrawn => 'withdraw',
670             withdrew => 'withdraw',
671             withheld => 'withhold',
672             withstood => 'withstand',
673             woke => 'wake',
674             woken => 'wake',
675             won => 'win',
676             wore => 'wear',
677             worked => 'work',
678             worn => 'wear',
679             wound => 'wind',
680             wove => 'weave',
681             woven => 'weave',
682             written => 'write',
683             wrote => 'write',
684             wrought => 'work',
685             wrung => 'wring',
686             });
687 1         146 $self -> suffix2rule
688             ({
689             'hes' =>
690             { # 'hes' is the suffix.
691             # 'order' is the sort order.
692             # 'rule' is the rule number.
693              
694             # 'word1' == 0 => Use 0, the index of the longest prefix
695             # within @{$prefix{$self->{'suffix'} } }, below.
696              
697             # 'word1' == 1 => Use 1, the index of the 2nd longest prefix
698             # within @{$prefix{$self->{'suffix'} } }, below.
699              
700             # 'word1' == -1 => Use the index of the shortest prefix
701             # within @{$prefix{$self->{'suffix'} } }, below + a letter.
702              
703             # 'word1' == -2 => Use the index of the shortest prefix
704             # within @{$prefix{$self->{'suffix'} } }, below + a letter,
705             # and use the shortest prefix as well.
706              
707             # 'word1' == -3 => Use the index of the shortest prefix
708             # within @{$prefix{$self->{'suffix'} } }, below + meter,
709             # and use the shortest prefix + metre as well.
710              
711             # 'word1' == -4 => Use the original string.
712              
713             order => 1011,
714             rule => '1',
715             word1 => 0, # Longest prefix.
716             suffix1 => '',
717             suffix2 => '',
718             },
719             'ses' =>
720             {
721             order => 1021,
722             rule => '2',
723             word1 => 0, # Longest prefix.
724             suffix1 => '',
725             suffix2 => '',
726             },
727             'xes' =>
728             {
729             order => 1031,
730             rule => '3',
731             word1 => 0, # Longest prefix.
732             suffix1 => '',
733             suffix2 => '',
734             },
735             'zes' =>
736             {
737             order => 1041,
738             rule => '4',
739             word1 => 0, # Longest prefix.
740             suffix1 => '',
741             suffix2 => '',
742             },
743             'iless' =>
744             {
745             order => 1051,
746             rule => '43a',
747             word1 => -1, # Shortest prefix.
748             suffix1 => 'y',
749             suffix2 => '',
750             },
751             'less' =>
752             {
753             order => 1052,
754             rule => '43b',
755             word1 => -1, # Shortest prefix.
756             suffix1 => '',
757             suffix2 => '',
758             },
759             'iness' =>
760             {
761             order => 1053,
762             rule => '44a',
763             word1 => -1, # Shortest prefix.
764             suffix1 => 'y',
765             suffix2 => '',
766             },
767             'ness' =>
768             {
769             order => 1054,
770             rule => '44b',
771             word1 => -1, # Shortest prefix.
772             suffix1 => '',
773             suffix2 => '',
774             },
775             "'s" =>
776             {
777             order => 1055,
778             rule => '7',
779             word1 => -1, # Shortest prefix.
780             suffix1 => '',
781             suffix2 => '',
782             },
783             'ies' =>
784             {
785             order => 1056,
786             rule => '13a',
787             word1 => -1, # Shortest prefix.
788             suffix1 => 'y',
789             suffix2 => '',
790             },
791             'es' =>
792             {
793             order => 1057,
794             rule => '13b',
795             word1 => 0, # Longest prefix.
796             suffix1 => '',
797             suffix2 => '',
798             },
799             'ss' =>
800             {
801             order => 1061,
802             rule => '6a',
803             word1 => -4, # Original string.
804             suffix1 => '',
805             suffix2 => '',
806             },
807             's' =>
808             {
809             order => 1062,
810             rule => '6b',
811             word1 => -1, # Shortest prefix.
812             suffix1 => '',
813             suffix2 => '',
814             },
815             'ater' =>
816             {
817             order => 1081,
818             rule => '8',
819             word1 => -4, # Original string.
820             suffix1 => '',
821             suffix2 => '',
822             },
823             'cter' =>
824             {
825             order => 1091,
826             rule => '9',
827             word1 => -4, # Original string.
828             suffix1 => '',
829             suffix2 => '',
830             },
831             'ier' =>
832             {
833             order => 1101,
834             rule => '10',
835             word1 => -1, # Shortest prefix.
836             suffix1 => 'y',
837             suffix2 => '',
838             },
839             'er' =>
840             {
841             order => 1111,
842             rule => '11',
843             word1 => 0, # Longest prefix.
844             suffix1 => '',
845             suffix2 => '',
846             },
847             'ied' =>
848             {
849             order => 1121,
850             rule => '12a',
851             word1 => -1, # Shortest prefix.
852             suffix1 => 'y',
853             suffix2 => '',
854             },
855             'ed' =>
856             {
857             order => 1122,
858             rule => '12b', # There is extra code for 12b below.
859             word1 => 0, # Longest prefix.
860             suffix1 => '',
861             suffix2 => '',
862             },
863             'iest' =>
864             {
865             order => 1141,
866             rule => '14a',
867             word1 => -1, # Shortest prefix.
868             suffix1 => 'y',
869             suffix2 => '',
870             },
871             'est' =>
872             {
873             order => 1142,
874             rule => '14b',
875             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
876             suffix1 => 'e',
877             suffix2 => '',
878             },
879             'blity' =>
880             {
881             order => 1143,
882             rule => '21',
883             word1 => -4, # Original string.
884             suffix1 => '',
885             suffix2 => '',
886             },
887             'bility' =>
888             {
889             order => 1144,
890             rule => '22',
891             word1 => -1, # Shortest prefix.
892             suffix1 => 'ble',
893             suffix2 => '',
894             },
895             'fiable' =>
896             {
897             order => 1145,
898             rule => '23',
899             word1 => -1, # Shortest prefix.
900             suffix1 => 'fy',
901             suffix2 => '',
902             },
903             'logist' =>
904             {
905             order => 1146,
906             rule => '24',
907             word1 => -1, # Shortest prefix.
908             suffix1 => 'logy',
909             suffix2 => '',
910             },
911             'ing' =>
912             {
913             order => 1151,
914             rule => '15', # There is extra code for 15 below.
915             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
916             suffix1 => 'e',
917             suffix2 => '',
918             },
919             'ist' =>
920             {
921             order => 1161,
922             rule => '16',
923             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
924             suffix1 => 'e',
925             suffix2 => '',
926             },
927             'ism' =>
928             {
929             order => 1171,
930             rule => '17',
931             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
932             suffix1 => 'e',
933             suffix2 => '',
934             },
935             'ity' =>
936             {
937             order => 1181,
938             rule => '18',
939             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
940             suffix1 => 'e',
941             suffix2 => '',
942             },
943             'ize' =>
944             {
945             order => 1191,
946             rule => '19',
947             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
948             suffix1 => 'e',
949             suffix2 => '',
950             },
951             'cable' =>
952             {
953             order => 1201,
954             rule => '20a',
955             word1 => -4, # Original string.
956             suffix1 => '',
957             suffix2 => '',
958             },
959             'gable' =>
960             {
961             order => 1202,
962             rule => '20b',
963             word1 => -4, # Original string.
964             suffix1 => '',
965             suffix2 => '',
966             },
967             'able' =>
968             {
969             order => 1203,
970             rule => '20c',
971             word1 => -2, # Shortest prefix + a letter, and shortest prefix.
972             suffix1 => 'e',
973             suffix2 => '',
974             },
975             'graphic' =>
976             {
977             order => 1251,
978             rule => '25',
979             word1 => -1, # Shortest prefix.
980             suffix1 => 'graphy',
981             suffix2 => '',
982             },
983             'istic' =>
984             {
985             order => 1261,
986             rule => '26',
987             word1 => -1, # Shortest prefix.
988             suffix1 => 'ist',
989             suffix2 => '',
990             },
991             'itic' =>
992             {
993             order => 1271,
994             rule => '27',
995             word1 => -1, # Shortest prefix.
996             suffix1 => 'ite',
997             suffix2 => '',
998             },
999             'like' =>
1000             {
1001             order => 1281,
1002             rule => '28',
1003             word1 => -1, # Shortest prefix.
1004             suffix1 => '',
1005             suffix2 => '',
1006             },
1007             'logic' =>
1008             {
1009             order => 1291,
1010             rule => '29',
1011             word1 => -1, # Shortest prefix.
1012             suffix1 => 'logy',
1013             suffix2 => '',
1014             },
1015             'ment' =>
1016             {
1017             order => 1301,
1018             rule => '30',
1019             word1 => -1, # Shortest prefix.
1020             suffix1 => '',
1021             suffix2 => '',
1022             },
1023             'mental' =>
1024             {
1025             order => 1311,
1026             rule => '31',
1027             word1 => -1, # Shortest prefix.
1028             suffix1 => 'ment',
1029             suffix2 => '',
1030             },
1031             'metry' =>
1032             {
1033             order => 1321,
1034             rule => '32',
1035             word1 => -3, # Shortest prefix + meter, and shortest perfix + metre.
1036             suffix1 => 'meter',
1037             suffix2 => 'metre',
1038             },
1039             'nce' =>
1040             {
1041             order => 1331,
1042             rule => '33',
1043             word1 => -1, # Shortest prefix.
1044             suffix1 => 'nt',
1045             suffix2 => '',
1046             },
1047             'ncy' =>
1048             {
1049             order => 1341,
1050             rule => '34',
1051             word1 => -1, # Shortest prefix.
1052             suffix1 => 'nt',
1053             suffix2 => '',
1054             },
1055             'ship' =>
1056             {
1057             order => 1351,
1058             rule => '35',
1059             word1 => -1, # Shortest prefix.
1060             suffix1 => '',
1061             suffix2 => '',
1062             },
1063             'ical' =>
1064             {
1065             order => 1361,
1066             rule => '36',
1067             word1 => -1, # Shortest prefix.
1068             suffix1 => 'ic',
1069             suffix2 => '',
1070             },
1071             'ional' =>
1072             {
1073             order => 1371,
1074             rule => '37',
1075             word1 => -1, # Shortest prefix.
1076             suffix1 => 'ion',
1077             suffix2 => '',
1078             },
1079             'bly' =>
1080             {
1081             order => 1381,
1082             rule => '38',
1083             word1 => -1, # Shortest prefix.
1084             suffix1 => 'ble',
1085             suffix2 => '',
1086             },
1087             'ily' =>
1088             {
1089             order => 1391,
1090             rule => '39',
1091             word1 => -1, # Shortest prefix.
1092             suffix1 => 'y',
1093             suffix2 => '',
1094             },
1095             'ly' =>
1096             {
1097             order => 1401,
1098             rule => '40',
1099             word1 => -1, # Shortest prefix.
1100             suffix1 => '',
1101             suffix2 => '',
1102             },
1103             'iful' =>
1104             {
1105             order => 1411,
1106             rule => '41a',
1107             word1 => -1, # Shortest prefix.
1108             suffix1 => 'y',
1109             suffix2 => '',
1110             },
1111             'ful' =>
1112             {
1113             order => 1412,
1114             rule => '41b',
1115             word1 => -1, # Shortest prefix.
1116             suffix1 => '',
1117             suffix2 => '',
1118             },
1119             'ihood' =>
1120             {
1121             order => 1421,
1122             rule => '42a',
1123             word1 => -1, # Shortest prefix.
1124             suffix1 => 'y',
1125             suffix2 => '',
1126             },
1127             'hood' =>
1128             {
1129             order => 1422,
1130             rule => '42b',
1131             word1 => -1, # Shortest prefix.
1132             suffix1 => '',
1133             suffix2 => '',
1134             },
1135             'ification' =>
1136             {
1137             order => 1451,
1138             rule => '45',
1139             word1 => -1, # Shortest prefix.
1140             suffix1 => 'ify',
1141             suffix2 => '',
1142             },
1143             'ization' =>
1144             {
1145             order => 1461,
1146             rule => '46',
1147             word1 => -1, # Shortest prefix.
1148             suffix1 => 'ize',
1149             suffix2 => '',
1150             },
1151             'ction' =>
1152             {
1153             order => 1471,
1154             rule => '47',
1155             word1 => -1, # Shortest prefix.
1156             suffix1 => 'ct',
1157             suffix2 => '',
1158             },
1159             'rtion' =>
1160             {
1161             order => 1481,
1162             rule => '48',
1163             word1 => -1, # Shortest prefix.
1164             suffix1 => 'rt',
1165             suffix2 => '',
1166             },
1167             'ation' =>
1168             {
1169             order => 1491,
1170             rule => '49',
1171             word1 => -1, # Shortest prefix.
1172             suffix1 => 'ate',
1173             suffix2 => '',
1174             },
1175             'ator' =>
1176             {
1177             order => 1501,
1178             rule => '50',
1179             word1 => -1, # Shortest prefix.
1180             suffix1 => 'ate',
1181             suffix2 => '',
1182             },
1183             'ctor' =>
1184             {
1185             order => 1511,
1186             rule => '51',
1187             word1 => -1, # Shortest prefix.
1188             suffix1 => 'ct',
1189             suffix2 => '',
1190             },
1191             'ive' =>
1192             {
1193             order => 1521,
1194             rule => '52',
1195             word1 => -1, # Shortest prefix.
1196             suffix1 => 'ion',
1197             suffix2 => '',
1198             },
1199             'onian' =>
1200             {
1201             order => 1530,
1202             rule => '54',
1203             word1 => -1, # Shortest prefix.
1204             suffix1 => 'on',
1205             suffix2 => '',
1206             },
1207             'an' =>
1208             {
1209             order => 1531,
1210             rule => '53',
1211             word1 => -1, # Shortest prefix.
1212             suffix1 => 'a',
1213             suffix2 => '',
1214             },
1215             });
1216              
1217             } # End of BUILD.
1218              
1219             # -------------------------------------------------------------------
1220              
1221             sub adjective2noun
1222             {
1223 8     8 1 2237 my($self, $adjective) = @_;
1224              
1225 8   100     9 return ${$self -> adjective_to_noun}{$adjective} || '';
1226              
1227             } # End of adjective2noun.
1228              
1229             # -------------------------------------------------------------------
1230              
1231             sub stem
1232             {
1233 98     98 1 34586 my($self, $string) = @_;
1234              
1235 98         1858 $self -> word1('');
1236 98         2760 $self -> word2('');
1237 98         2336 $self -> suffix('');
1238 98         2354 $self -> rule('');
1239              
1240 98 100       1058 if (defined ${$self -> irregular2infinitive}{$string})
  98         1302  
1241             {
1242 4         22 $self -> word1(${$self -> irregular2infinitive}{$string});
  4         50  
1243 4         141 $self -> rule('irregular');
1244              
1245 4         84 return ($self -> word1, '', '', $self -> rule);
1246             }
1247              
1248 94         553 my($prefix) = '';
1249 94         95 my($suffix) = '';
1250              
1251 94         79 my($i, $j, $word, %prefix);
1252              
1253             # Build up $prefix{$suffix} as an array of prefixes, from longest to shortest.
1254              
1255 94         185 for ($i = 1; $i < length($string); $i++)
1256             {
1257 653         531 $prefix = substr($string, 0, $i);
1258 653         489 $suffix = substr($string, $i);
1259 653         779 $prefix{$suffix} = [];
1260              
1261 653         851 for ($j = (length($suffix) - 1); $j >= 0; $j--)
1262             {
1263 2824         2294 $word = $prefix . substr($suffix, 0, $j);
1264              
1265 2824         1554 push(@{$prefix{$suffix} }, $word);
  2824         5157  
1266             }
1267             }
1268              
1269 94         74 for $suffix
1270             (
1271             sort
1272 28482         77206 { ${$self -> suffix2rule}{$a}{'order'} <=> ${$self -> suffix2rule}{$b}{'order'} }
  28482         332873  
  28482         388933  
1273 94         1394 keys(%{$self -> suffix2rule})
1274             )
1275             {
1276 2759 100       3621 if (defined($prefix{$suffix}) )
1277             {
1278 94         1297 $self -> suffix($suffix);
1279 94         2985 $self -> rule($self -> {'suffix2rule'}{$suffix}{'rule'});
1280              
1281 94         1184 $i = ${$self -> suffix2rule}{$suffix}{'word1'};
  94         1233  
1282              
1283 94 100       478 if ($i == 0)
    100          
1284             {
1285 19         250 $self -> word1($prefix{$suffix}[0]);
1286 19         471 $self -> word2($prefix{$suffix}[1]);
1287             }
1288             elsif ($i == -1)
1289             {
1290 47         80 $i = $#{$prefix{$suffix} };
  47         90  
1291              
1292 47         70 $self -> word1($prefix{$suffix}[$i] . ${$self -> suffix2rule}{$suffix}{'suffix1'});
  47         620  
1293 47         1953 $self -> word2('');
1294             }
1295              
1296 94 100       946 if ($i == -2)
1297             {
1298 24         19 $i = $#{$prefix{$suffix} };
  24         33  
1299              
1300 24         32 $self -> word1($prefix{$suffix}[$i] . ${$self -> suffix2rule}{$suffix}{'suffix1'});
  24         292  
1301 24         886 $self -> word2($prefix{$suffix}[$i]);
1302             }
1303              
1304 94 100       439 if ($i == -3)
1305             {
1306 1         1 $i = $#{$prefix{$suffix} };
  1         2  
1307              
1308 1         2 $self -> word1($prefix{$suffix}[$i] . ${$self -> suffix2rule}{$suffix}{'suffix1'});
  1         14  
1309 1         27 $self -> word2($prefix{$suffix}[$i] . ${$self -> suffix2rule}{$suffix}{'suffix2'});
  1         14  
1310             }
1311              
1312 94 100       144 if ($i == -4)
1313             {
1314 3         66 $self -> word1($string);
1315 3         127 $self -> word2('');
1316             }
1317              
1318             # Rules 12b and 15: Strip off 'ed' or 'ing'.
1319              
1320 94 100 100     1268 if ( ($self -> rule eq '12b') || ($self -> rule eq '15') )
1321             {
1322             # Do we have a monosyllable of this form:
1323             # o 0+ Consonants
1324             # o 1+ Vowel
1325             # o 2 Non-wx
1326             # Eg: tipped => tipp?
1327             # Then return tip and tipp.
1328             # Eg: swimming => swimm?
1329             # Then return swim and swimm.
1330              
1331 20 100       481 if ($self -> word2 =~ /^([^aeiou]*[aeiou]+)([^wx])\2$/)
1332             {
1333 6         116 $self -> word1("$1$2");
1334 6         145 $self -> word2("$1$2$2");
1335             }
1336             }
1337              
1338 94         2804 return ($self -> word1, $self -> word2, $suffix, $self -> rule);
1339             }
1340             }
1341              
1342 0           return ('', '', '', '');
1343              
1344             } # End of stem.
1345              
1346             #-------------------------------------------------------------------
1347              
1348             1;
1349              
1350             __END__