class Lingo::Database::Source::WordClass

Constants

DEFAULT_SEPARATOR
GENDER_SEPARATOR
SCAN_RE
VALUE_SEPARATOR
WC_SEPARATOR

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/lingo/database/source/word_class.rb, line 52
def initialize(*)
  super

  gen = Regexp.escape(GENDER_SEPARATOR)
  val = Regexp.escape(VALUE_SEPARATOR)
  sep = Regexp.escape(@sep)

  w, a = "\\w%1$s(?:#{val}\\w%1$s)*", '[+]?'
  wc   = "#{WC_SEPARATOR}#{w % a}(?:#{gen}#{w % ''})?"

  @pat = /^(#{@wrd})#{sep}((?:#{@wrd}#{wc})+)$/
end

Public Instance Methods

dump_line(key, val, key_sep = nil, val_sep = nil, compact = true, *) click to toggle source
# File lib/lingo/database/source/word_class.rb, line 80
def dump_line(key, val, key_sep = nil, val_sep = nil, compact = true, *)
  "#{key}#{key_sep || @sep}#{dump_values(val, compact).join(val_sep || ' ')}"
end
dump_values(val, compact = true) click to toggle source
# File lib/lingo/database/source/word_class.rb, line 84
def dump_values(val, compact = true)
  join = lambda { |v|
    v.compact!; v.uniq!; v.sort!; v.join(VALUE_SEPARATOR) }

  if compact
    values = Hash.new { |h, k| h[k] = [[], []] }; val.each { |lex|
      a, g = values[lex.form]; a << lex.attr; g << lex.gender }
  else
    values = val.map { |lex| [lex.form, [[lex.attr], [lex.gender]]] }
  end

  values.sort.map { |form, (attrs, genders)|
    res = "#{form} #{WC_SEPARATOR}#{join[attrs]}"
    genders.any? ? "#{res}#{GENDER_SEPARATOR}#{join[genders]}" : res
  }
end
parse_line(line, key, val) click to toggle source
# File lib/lingo/database/source/word_class.rb, line 65
def parse_line(line, key, val)
  values = []

  val.strip.scan(SCAN_RE) { |k, v|
    v, f = v.split(GENDER_SEPARATOR)
    f = f ? f.split(VALUE_SEPARATOR) : [nil]

    combinations(v.split(VALUE_SEPARATOR), f) { |w, g|
      values << lexical(k, w, g)
    }
  }

  [key.strip, values]
end