class Glaemscribe::API::ResolveVirtualsPostProcessorOperator

Public Instance Methods

apply(tokens,charset) click to toggle source
# File lib/api/post_processor/resolve_virtuals.rb, line 78
def apply(tokens,charset)
  # Apply sequence chars
  tokens = apply_sequences(charset,tokens)

  # Clone the tokens so that we can perform ligatures AND diacritics without interferences
  new_tokens = tokens.clone
  
  # Handle l to r virtuals (diacritics ?)
  reset_trigger_states(charset)       
  tokens.each_with_index{ |token,idx|
    apply_loop(charset,tokens,new_tokens,false,token,idx)
  }
  # Handle r to l virtuals (ligatures ?)
  reset_trigger_states(charset)       
  tokens.reverse_each.with_index{ |token,idx|
    apply_loop(charset,tokens,new_tokens,true,token,tokens.count - 1 - idx)
  }
  new_tokens
end
apply_loop(charset, tokens, new_tokens, reversed, token, idx) click to toggle source
# File lib/api/post_processor/resolve_virtuals.rb, line 40
def apply_loop(charset, tokens, new_tokens, reversed, token, idx)
  if token == '*SPACE' || token =='*LF'
    reset_trigger_states(charset)
    return
  end
  
  # Check if token is a virtual char
  c = charset[token]
  return if c.nil? # May happen for empty tokens
  if c.virtual? && (reversed == c.reversed)
    # Try to replace
    last_trigger = @last_triggers[c]
    if last_trigger != nil
      new_tokens[idx] = last_trigger.names.first  # Take the first name of the non-virtual replacement.
      token           = new_tokens[idx]           # Consider the token replaced, being itself a potential trigger for further virtuals (cascading virtuals)
    end
  end
  
  # Update states of virtual classes
  charset.virtual_chars.each{|vc|
    rc                  = vc[token]
    @last_triggers[vc]  = rc if rc != nil 
  }
end
apply_sequences(charset,tokens) click to toggle source
# File lib/api/post_processor/resolve_virtuals.rb, line 65
def apply_sequences(charset,tokens)
  ret = []
  tokens.each { |token|
    c = charset[token]
    if c && c.sequence?
      ret += c.sequence
    else
      ret << token
    end
  }
  ret
end
finalize(trans_options) click to toggle source
Calls superclass method
# File lib/api/post_processor/resolve_virtuals.rb, line 28
def finalize(trans_options)
  super(trans_options)
  @last_triggers = {} # Allocate the lookup here to optimize
end
reset_trigger_states(charset) click to toggle source
# File lib/api/post_processor/resolve_virtuals.rb, line 33
def reset_trigger_states(charset)
  # For each virtual char in charset, maintain a state.
  charset.virtual_chars.each{ |vc|
    @last_triggers[vc] = nil # Clear the state
  }
end