English  English::Infinitive

[Validate]
Generated with RDazzle Newfish 1.3.0

Infinitive

Functions for deriving the infinitive forms of conjugated English words.

Constants

IRREGULAR

Irregular word => infinitive form

RULES

Suffix Rules

RULE_ORDER

List of rule suffixes in processing order.

IRREGULAR_RULE

Public Class Methods

ditto_rule(suffix, suffix1, suffix2, order, number) click to toggle source

Use the original string. (-4)

     # File lib/english/infinitive.rb, line 631
631:     def self.ditto_rule(suffix, suffix1, suffix2, order, number)
632:       RULES[suffix] = Rule.new(:ditto, suffix, suffix1, suffix2, order, number)
633:     end
infinitives(word) click to toggle source

Returns the infinative and any acceptable alternatives.

     # File lib/english/infinitive.rb, line 712
712:     def self.infinitives(word)
713:       information(word)[1..1]
714:     end
information(word) click to toggle source

Return the rule applies and all viable infinitive forms of the given word.

     # File lib/english/infinitive.rb, line 719
719:     def self.information(word)
720:       word  = word.to_s
721:       word1 = word2 = suffix = rule = newword = ''
722: 
723:       if IRREGULAR.key?(word)
724:         word1 = IRREGULAR[word]
725:         word2 = nil
726:         rule  = IRREGULAR_RULE
727:       else
728:         prefixes = prefixes(word)
729:         rule = rule(word, prefixes)
730: 
731:         $stderr.puts "prefixes: %p" % prefixes if $DEBUG
732: 
733:         if rule
734:           suffix = rule.suffix
735: 
736:           $stderr.puts "Using rule %p (%p) for suffix %p" % 
737:               [rule.number, rule.type, rule.suffix] if $DEBUG
738: 
739:           case rule.type #shortest_prefix
740:           when :long
741:             word1 = prefixes[suffix][0]
742:             word2 = prefixes[suffix][1]
743:           when :short
744:             word1 = prefixes[suffix].last + rule.suffix1
745:             word2 = ''
746:           when :letter
747:             word1 = prefixes[suffix].last + rule.suffix1
748:             word2 = prefixes[suffix].last
749:           when :special
750:             word1 = prefixes[suffix].last + rule.suffix1
751:             word2 = prefixes[suffix].last + rule.suffix2
752:           when :ditto
753:             word1 = word
754:             word2 = ''
755:           else
756:             raise IndexError, "Couldn't find rule for shortest prefix %p" %  rule.type #shortest_prefix
757:           end
758: 
759:           $stderr.puts "For %p: word1: %p, word2: %p" % [rule.type, word1, word2] if $DEBUG
760: 
761:           # Rules 12b and 15: Strip off 'ed' or 'ing'.
762:           if rule.number == '12b' or rule.number == '15'
763:             # Do we have a monosyllable of this form:
764:             # o 0+ Consonants
765:             # o 1+ Vowel
766:             # o    2 Non-wx
767:             # Eg: tipped => tipp?
768:             # Then return tip and tipp.
769:             # Eg: swimming => swimm?
770:             # Then return tipswim and swimm.
771:             if /^([^aeiou]*[aeiou]+)([^wx])\22$$/ =~ word2
772:               word1 = $1 + $2
773:               word2 = $1 + $2 + $2
774:             end
775:           end
776:         else
777:           word1 = word
778:           word2 = nil
779:           rule  = IRREGULAR_RULE
780:         end
781:       end
782: 
783:       return rule, word1, word2
784:     end
inifinitive(word) click to toggle source

Returns the affinative and any acceptable alternatives.

     # File lib/english/infinitive.rb, line 707
707:     def self.inifinitive(word)
708:       information(word)[1]
709:     end
letter_rule(suffix, suffix1, suffix2, order, number) click to toggle source

Letter rule. (-2)

     # File lib/english/infinitive.rb, line 621
621:     def self.letter_rule(suffix, suffix1, suffix2, order, number)
622:       RULES[suffix] = Rule.new(:letter, suffix, suffix1, suffix2, order, number)
623:     end
long_rule(suffix, suffix1, suffix2, order, number) click to toggle source

Long rule (longest prefix). (0)

     # File lib/english/infinitive.rb, line 606
606:     def self.long_rule(suffix, suffix1, suffix2, order, number)
607:       RULES[suffix] = Rule.new(:long, suffix, suffix1, suffix2, order, number)
608:     end
prefixes(word) click to toggle source

Calculate the prefixes for a given word.

     # File lib/english/infinitive.rb, line 817
817:     def self.prefixes(word)
818:       # Build up prefix[suffix] as an array of prefixes, from longest to shortest.
819:       prefix, suffix = nil, nil
820:       prefixes = Hash.new{ |h,k| h[k] = [] }
821:       # Build the hash of prefixes for the word
822:       1.upto(word.length) do |i|
823:         prefix = word[0, i]
824:         suffix = word[i..1]
825:         (suffix.length - 1).downto(0) do |j|
826:           newword = prefix + suffix[0,j]
827:           prefixes[suffix].push(newword)
828:         end
829:       end
830:       return prefixes
831:     end
rule(word, prefixes=nil) click to toggle source

Lookup the rule that applies to a given word.

     # File lib/english/infinitive.rb, line 787
787:     def self.rule(word, prefixes=nil)
788:       prefixes = prefixes(word) unless prefixes
789: 
790:       if IRREGULAR.key?(word)
791:         IRREGULAR_RULE
792:       else
793:         # Build up prefix[suffix] as an array of prefixes, from longest to shortest.
794:         prefix, suffix = nil, nil
795:         prefixes = Hash.new{ |h,k| h[k] = [] }
796:         # Build the hash of prefixes for the word
797:         1.upto(word.length) do |i|
798:           prefix = word[0, i]
799:           suffix = word[i..1]
800:           (suffix.length - 1).downto(0) do |j|
801:             newword = prefix + suffix[0,j]
802:             prefixes[suffix].push(newword)
803:           end
804:         end
805:         # Now check for rules covering the prefixes for this word, picking
806:         # the first one if one was found.
807:         suffix = (RULE_ORDER & prefixes.keys).first
808:         if suffix
809:           RULES[suffix]
810:         else
811:           IRREGULAR_RULE
812:         end
813:       end
814:     end
second_rule(suffix, suffix1, suffix2, order, number) click to toggle source

Longer Rule (2nd longest prefix). (1)

     # File lib/english/infinitive.rb, line 611
611:     def self.second_rule(suffix, suffix1, suffix2, order, number)
612:       RULES[suffix] = Rule.new(:second, suffix, suffix1, suffix2, order, number)
613:     end
short_rule(suffix, suffix1, suffix2, order, number) click to toggle source

Short Rule. (-1)

     # File lib/english/infinitive.rb, line 616
616:     def self.short_rule(suffix, suffix1, suffix2, order, number)
617:       RULES[suffix] = Rule.new(:short, suffix, suffix1, suffix2, order, number)
618:     end
special_rule(suffix, suffix1, suffix2, order, number) click to toggle source

Special rule. (-3)

     # File lib/english/infinitive.rb, line 626
626:     def self.special_rule(suffix, suffix1, suffix2, order, number)
627:       RULES[suffix] = Rule.new(:special, suffix, suffix1, suffix2, order, number)
628:     end

Disabled; run with --debug to generate this.