Class OSC::Pattern
In: lib/osc/pattern.rb
Parent: String

Methods

intersect?   new   regexp  

Public Class methods

Do these two patterns intersect?

[Source]

     # File lib/osc/pattern.rb, line 48
 48:     def self.intersect?(s1,s2)
 49:       r = /\*|\?|\[[^\]]*\]|\{[^\}]*\}|./
 50:       a = s1.to_s.scan r
 51:       b = s2.to_s.scan r
 52:       q = [[a,b]]
 53:       until q.empty?
 54:         q.uniq!
 55:         a,b = q.pop
 56:         a = a.dup
 57:         b = b.dup
 58: 
 59:         return true if a.empty? and b.empty?
 60:         next if a.empty? or b.empty?
 61: 
 62:         x,y = a.shift, b.shift
 63: 
 64:         # branch {}
 65:         if x =~ /^\{/
 66:           x.scan /[^\{\},]+/ do |x|
 67:             q.push [x.scan(/./)+a,[y]+b]
 68:           end
 69:           next
 70:         end
 71:         if y =~ /^\{/
 72:           y.scan /[^\{\},]+/ do |y|
 73:             q.push [[x]+a,y.scan(/./)+b]
 74:           end
 75:           next
 76:         end
 77: 
 78:         # sort
 79:         if y =~ /^\[/
 80:           x,y = y,x
 81:           a,b = b,a
 82:         end
 83:         if y =~ /^(\*|\?)/
 84:           x,y = y,x
 85:           a,b = b,a
 86:         end
 87: 
 88:         # match
 89:         case x
 90:         when '*'
 91:           unless y == '/'
 92:             q.push [a,b]
 93:             q.push [[x]+a,b]
 94:           end
 95:           if y == '*'
 96:             q.push [a,[y]+b]
 97:             q.push [[x]+a,b]
 98:           end
 99:         when '?'
100:           q.push [a,b] unless y == '/'
101:           q.push [a,[y]+b] if y == '*'
102:         when /^\[/
103:           xinv = (x[1] == ?!)
104:           yinv = (y =~ /^\[!/)
105:           x = x[(xinv ? 2 : 1)..-2].scan(/./).to_set
106:           if y =~ /^\[/
107:             y = y[(yinv ? 2 : 1)..-2].scan(/./).to_set
108:           else
109:             y = [y].to_set
110:           end
111: 
112:           # simplifying assumption: nobody in their right mind is going to do
113:           # [^everyprintablecharacter]
114:           if xinv and yinv
115:             q.push [a,b]
116:           elsif xinv and not yinv
117:             q.push [a,b] unless (y-x).empty?
118:           elsif not xinv and yinv
119:             q.push [a,b] unless (x-y).empty?
120:           else
121:             q.push [a,b] unless (x&y).empty?
122:           end
123:         else
124:           q.push [a,b] if x == y
125:         end
126:       end
127: 
128:       false # no intersection
129:     end

Create an OSC pattern from a string or (experimental) from a Regex.

[Source]

    # File lib/osc/pattern.rb, line 5
 5:     def initialize(s)
 6:       case s
 7:       when Regexp # This is experimental
 8:         s = Regexp.source s
 9:         s.gsub! /(\\\\)*\[^\/\]\*/, "\1*"
10:         s.gsub! /(\\\\)*\[^\/\]/, "\1?"
11:         s.gsub! /(\\\\)*\[^/, "\1[!"
12:         s.gsub! /(\\\\)*\(/, "\1{"
13:         s.gsub! /(\\\\)*\|/, "\1,"
14:         s.gsub! /(\\\\)*\)/, "\1}"
15:         s.gsub! /\\\\/, "\\"
16:       end
17:       super s
18:     end

Public Instance methods

Return a Regex representing this pattern

[Source]

    # File lib/osc/pattern.rb, line 21
21:     def regexp
22:       s = Regexp.escape self
23:       s.gsub! /\\\?/, '[^/]'
24:       s.gsub! /\\\*/, '[^/]*'
25:       s.gsub! /\\\[!/, '[^'
26:       s.gsub! /\\\]/, ']'
27:       s.gsub! /\\\{/, '('
28:       s.gsub! /,/, '|'
29:       s.gsub! /\\\}/, ')'
30:       Regexp.new s
31:     end

[Validate]