# Copyright 2012 Emilie Gillet.
#
# Author: Emilie Gillet (emilie.o.gillet@gmail.com)
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# 
# See http://creativecommons.org/licenses/MIT/ for more information.
#
# -----------------------------------------------------------------------------
#
# Characters definitions.

characters = []


MASKS = {
  'a': 0x8000,
  'b': 0x4000,
  'c': 0x2000,
  'd': 0x1000,
  'e': 0x0800,
  'f': 0x0400,
  'g': 0x0200,
  'h': 0x0100,
  'j': 0x80,
  'k': 0x40,
  'l': 0x20,
  'm': 0x10,
  'n': 0x08,
  'p': 0x04,
}

characters = {
  'A': 'afepkbc',
  'B': 'adhmbck',
  'C': 'afed',
  'D': 'adhmbc',
  'E': 'afedkp',
  'F': 'afepk',
  'G': 'afedck',
  'H': 'febcpk',
  'I': 'adhm',
  'J': 'bcde',
  'K': 'efpjl',
  'L': 'def',
  'M': 'efgjbc',
  'N': 'efglcb',
  'O': 'abcdef',
  'P': 'abpkef',
  'Q': 'abcdefl',
  'R': 'abpkefl',
  'S': 'afpkcd',
  'T': 'ahm',
  'U': 'bcdef',
  'V': 'fenj',
  'W': 'fenlcb',
  'X': 'gjln',
  'Y': 'gjm',
  'Z': 'ajnd',
  
  'a': 'abpkecd',
  'b': 'fedlp',
  'c': 'pked',
  'd': 'bcdnk',
  'e': 'afped',
  'f': 'afpe',
  'g': 'agkbcd',
  'h': 'fpkec',
  'i': 'mpkd',
  'j': 'kcd',
  'k': 'hmjl',
  'l': 'hm',
  'm': 'epkmc',
  'n': 'mkc',
  'o': 'pkecd',
  'p': 'afpje',
  'q': 'afpkbl',
  'r': 'mk',
  's': 'agkcd',
  't': 'fedp',
  'u': 'edc',
  'v': 'en',
  'w': 'enlc',
  'x': 'gnjl',
  'y': 'gkbcd',
  'z': 'pnd',
  
  '0': 'abcdefnj',
  '1': 'jbc',
  '2': 'abpked',
  '3': 'abcdk',
  '4': 'fpkbc',
  '5': 'afpkcd',
  '6': 'afpkcde',
  '7': 'ajm',
  '8': 'abcdefpk',
  '9': 'abcpkfd',

  '!': 'hm',
  '"': 'fh',
  '#': 'pkdhmbc',
  '$': 'afpkcdhm',
  '%': 'jnfc',
  '&': 'aghpeld',
  '\'': 'h',
  '(': 'afed',
  ')': 'abcd',
  '*': 'ghjmnl',
  '+': 'hmpk',
  ',': 'n',
  '-': 'pk',
  '.': 'm',
  '/': 'jn',
  ':': 'hm',
  ';': 'hn',
  '<': 'jl',
  '>': 'gn',
  '?': 'fajm',
  '=': 'pkd',
  '@': 'kmcbafed',
  '[': 'afed',
  ']': 'abcd',
  '\\': 'gl',
  '^': 'nl',
  '_': 'd',
  '`': 'g',
  '{': 'pgnad',
  '|': 'hm',
  '}': 'ajldk',
  '~': 'pk',
  
  # LRDU
  '\x80': 'jlbc',
  '\x81': 'efgn',
  '\x82': 'agj',
  '\x83': 'dnl',
  
  # LRDU arrow
  '\x84': 'jkl',
  '\x85': 'gpn',
  '\x86': 'ghj',
  '\x87': 'nml',
  
  # Waveforms
  '\x88': 'njbc',  # Saw
  '\x89': 'enjb',  # Centered saw
  '\x8A': 'mn',    # Baby saw
  '\x8B': 'nl',    # Tri
  '\x8C': 'efabc', # Square
  '\x8D': 'epkc',   # Baby square
  '\x8E': 'dhm',   # Pulse
  '\x8F': 'efgl', # AD
  
  # Spinner
  '\x90': 'abcdefn',
  '\x91': 'abcdefp',
  '\x92': 'abcdefg',
  '\x93': 'abcdefh',
  '\x94': 'abcdefj',
  '\x95': 'abcdefk',
  '\x96': 'abcdefl',
  '\x97': 'abcdefm',

  # Spinner 2
  '\x98': 'ab',
  '\x99': 'abc',
  '\x9A': 'bcd',
  '\x9B': 'cde',
  '\x9C': 'de',
  '\x9D': 'def',
  '\x9E': 'efa',
  '\x9F': 'fab',
  '\xA0': 'abcdefghjklmnp',
  '\xFF': 'abcdefghjklmnp',
  
  'null': 'null'
}

character_table = []
for i in xrange(256):
  segments = characters.get(chr(i), '')
  character_table.append(sum(MASKS[segment] for segment in segments))
  
characters = [('characters', character_table)]
