Class: J2119::Oxford

Inherits:
Object
  • Object
show all
Defined in:
lib/j2119/oxford.rb

Overview

We have to recognize lots of lists like so:

X
X or X
X, X, or X

Examples: one of “Foo”, “Bar”, or “Baz” a Token1, a Token2, or a Token3

Constant Summary collapse

BASIC =
"(?<CAPTURE>X((((,\\s+X)+,)?)?\\s+or\\s+X)?)"

Class Method Summary collapse

Class Method Details

.break_role_list(matcher, list) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/j2119/oxford.rb', line 52

def self.break_role_list(matcher, list)
  pieces = []
  re = Regexp.compile "^an?\\s+(#{matcher.role_matcher})(,\\s+)?"
  while list =~ re
    pieces << $1
    list = $'
  end
  if list =~ /^\s*(and|or)\s+an?\s+(#{matcher.role_matcher})/
    pieces << $2
  end
  pieces
end

.break_string_list(list) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/j2119/oxford.rb', line 42

def self.break_string_list list
  pieces = []
  re = Regexp.compile "^[^\"]*\"([^\"]*)\""
  while list =~ re
    pieces << $1
    list = $'
  end
  pieces
end

.re(particle, opts = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/j2119/oxford.rb', line 26

def self.re(particle, opts = {})
  has_capture, inter, has_connector, last = BASIC.split 'X'
  has_connector.gsub!('or', opts[:connector]) if opts[:connector]
  if opts[:use_article]
    particle = "an?\\s+(#{particle})"
  else
    particle = "(#{particle})"
  end
  if opts[:capture_name]
    has_capture.gsub!('CAPTURE', opts[:capture_name])
  else
    has_capture.gsub!('?<CAPTURE>', '')
  end
  [ has_capture, inter, has_connector, last].join(particle)
end