Index: src/orca/chnames.py
===================================================================
--- src/orca/chnames.py	(revision 2302)
+++ src/orca/chnames.py	(working copy)
@@ -28,164 +28,428 @@
 
 from orca_i18n import _ # for gettext support
 
-# __chnames is a dictionary where the keys represent a UTF-8
-# character (possibly multibyte) and the values represent the common
-# term used for the character.
+# chnames is a dictionary where the keys represent a unicode character
+# and the values represent the common term used for the character.
 #
-__chnames = {}
+chnames = {}
 
 # Translators: this is the spoken word for the space character
 #
-__chnames[" "] = _("space")
+chnames[" "] = _("space")
 
 # Translators: this is the spoken word for the newline character
 #
-__chnames["\n"] = _("newline")
+chnames["\n"] = _("newline")
 
 # Translators: this is the spoken word for the tab character
 #
-__chnames["\t"] = _("tab")
+chnames["\t"] = _("tab")
 
 # Translators: this is the spoken word for the exclamation point: !
 #
-__chnames["!"] = _("exclaim")
+chnames["!"] = _("exclaim")
 
 # Translators: this is the spoken word for the apostrophe: '
 #
-__chnames["'"] = _("apostrophe")
+chnames["'"] = _("apostrophe")
 
+# Translators: this is the spoken word for the left single quote: ‘
+# (U+2018)
+#
+chnames[u'\u2018'] = _("left single quote")
+
+# Translators: this is the spoken word for the right single quote: ’
+# (U+2019)
+#
+chnames[u'\u2019'] = _("right single quote")
+
 # Translators: this is the spoken word for the comma: ,
 #
-__chnames[","] = _("comma")
+chnames[","] = _("comma")
 
 # Translators: this is the spoken word for the period: .
 #
-__chnames["."] = _("dot")
+chnames["."] = _("dot")
 
 # Translators: this is the spoken word for the question mark: ?
 #
-__chnames["?"] = _("question")
+chnames["?"] = _("question")
 
 # Translators: this is the spoken word for the double quote: "
 #
-__chnames["\""] = _("quote")
+chnames["\""] = _("quote")
 
+# Translators: this is the spoken word for the left double quote: “
+# (U+201C)
+#
+chnames[u'\u201C']  = _("left double quote")
+
+# Translators: this is the spoken word for the right double quote: ”
+# (U+201D)
+#
+chnames[u'\u201D']  = _("right double quote")
+
 # Translators: this is the spoken word for the left parentheses: (
 #
-__chnames["("] = _("left paren")
+chnames["("] = _("left paren")
 
 # Translators: this is the spoken word for the right parentheses: (
 #
-__chnames[")"] = _("right paren")
+chnames[")"] = _("right paren")
 
 # Translators: this is the spoken word for the hyphen: -
 #
-__chnames["-"] = _("dash")
+chnames["-"] = _("dash")
 
+# Translators: this is the spoken word for the en dash: –
+# (U+2013)
+#
+chnames[u'\u2013'] = _("en dash")
+
 # Translators: this is the spoken word for the underscore: _
 #
-__chnames["_"] = _("underscore")
+chnames["_"] = _("underscore")
 
 # Translators: this is the spoken word for the colon: :
 #
-__chnames[":"] = _("colon")
+chnames[":"] = _("colon")
 
 # Translators: this is the spoken word for the semicolon: ;
 #
-__chnames[";"] = _("semicolon")
+chnames[";"] = _("semicolon")
 
 # Translators: this is the spoken word for the less than sign: <
 #
-__chnames["<"] = _("less than")
+chnames["<"] = _("less than")
 
 # Translators: this is the spoken word for the greater than sign: >
 #
-__chnames[">"] = _("greater than")
+chnames[">"] = _("greater than")
 
 # Translators: this is the spoken word for the left square bracket: [
 #
-__chnames["["] = _("left bracket")
+chnames["["] = _("left bracket")
 
 # Translators: this is the spoken word for the right square bracket: ]
 #
-__chnames["]"] = _("right bracket")
+chnames["]"] = _("right bracket")
 
 # Translators: this is the spoken word for the backslash: \
 #
-__chnames["\\"] = _("backslash")
+chnames["\\"] = _("backslash")
 
 # Translators: this is the spoken word for the vertical line: |
 #
-__chnames["|"] = _("vertical line")
+chnames["|"] = _("vertical line")
 
 # Translators: this is the spoken word for the accent grave: `
 #
-__chnames["`"] = _("grave accent")
+chnames["`"] = _("grave accent")
 
 # Translators: this is the spoken word for the tilde: ~
 #
-__chnames["~"] = _("tilde")
+chnames["~"] = _("tilde")
 
 # Translators: this is the spoken word for the left squiggly brace: {
 #
-__chnames["{"] = _("left brace")
+chnames["{"] = _("left brace")
 
 # Translators: this is the spoken word for the right squiggly brace: {
 #
-__chnames["}"] = _("right brace")
+chnames["}"] = _("right brace")
 
 # Translators: this is the spoken word for the octothorpe: #
 #
-__chnames["#"] = _("pound")
+chnames["#"] = _("number")
 
 # Translators: this is the spoken word for the dollar sign: $
 #
-__chnames["$"] = _("dollar")
+chnames["$"] = _("dollar")
 
+# Translators: this is the spoken word for the cent sign: ¢
+# (U+00A2)
+#
+chnames[u'\u00A2'] = _("cent")
+
+# Translators: this is the spoken word for the pound sign: £
+# (U+00A3)
+#
+chnames[u'\u00A3'] = _("pound")
+
+# Translators: this is the spoken word for the yen sign: ¥
+# (U+00A5)
+#
+chnames[u'\u00A5'] = _("yen")
+
+# Translators: this is the spoken word for the euro sign: €
+# (U+20AC)
+#
+chnames[u'\u20AC'] = _("euro")
+
 # Translators: this is the spoken word for the percent sign: %
 #
-__chnames["%"] = _("percent")
+chnames["%"] = _("percent")
 
 # Translators: this is the spoken word for the ampersand: &
 #
-__chnames["&"] = _("and")
+chnames["&"] = _("and")
 
 # Translators: this is the spoken word for the star: *
 #
-__chnames["*"] = _("star")
+chnames["*"] = _("star")
 
 # Translators: this is the spoken word for the plus: +
 #
-__chnames["+"] = _("plus")
+chnames["+"] = _("plus")
 
 # Translators: this is the spoken word for the forward slash: /
 #
-__chnames["/"] = _("slash")
+chnames["/"] = _("slash")
 
 # Translators: this is the spoken word for the equals sign: =
 #
-__chnames["="] = _("equals")
+chnames["="] = _("equals")
 
 # Translators: this is the spoken word for the at sign: @
 #
-__chnames["@"] = _("at")
+chnames["@"] = _("at")
 
 # Translators: this is the spoken word for the hat sign: ^
 #
-__chnames["^"] = _("caret")
+chnames["^"] = _("caret")
 
-# Translators: this is the spoken word for the plus/minus symbol
+# Translators: this is the spoken word for the not sign: ¬
+# (U+00AC)
 #
-__chnames["\xc2\xb1"] = _("plus minus")
+chnames[u'\u00AC'] = _("not")
 
-# Translators: this is the spoken word for the division sign
+# Translators: this is the spoken word for the copyright sign: ©
+# (U+00A9)
 #
-__chnames["\xc3\xb7"] = _("divide")
+chnames[u'\u00A9'] = _("copyright")
 
-# Translators: this is the spoken word for the multiplication sign
+# Translators: this is the spoken word for the registered sign: ®
+# (U+00AE)
 #
-__chnames["\xc3\x97"] = _("multiply")
+chnames[u'\u00AE'] = _("registered")
 
+# Translators: this is the spoken word for the trademark sign: ™
+# (U+2122)
+#
+chnames[u'\u2122'] = _("trademark")
+
+# Translators: this is the spoken word for the degree symbol: °
+# (U+00B0)
+#
+chnames[u'\u00B0'] =  _("degree") 
+
+# Translators: this is the spoken word for the plus/minus symbol: ±
+# (U+00B1)
+#
+chnames[u'\u00B1'] = _("plus minus")
+
+# Translators: this is the spoken word for a superscripted 2: ²
+# (U+00B2)
+#
+chnames[u'\u00B2'] = _("2 superscript")
+
+# Translators: this is the spoken word for a superscripted 3: ³
+# (U+00B3)
+#
+chnames[u'\u00B3'] = _("3 superscript")
+
+# Translators: this is the spoken word for the 1/4 sign: ¼
+# (U+00BC)
+#
+chnames[u'\u00BC'] = _("one quarter")
+
+# Translators: this is the spoken word for the 1/2 sign: ½
+# (U+00BD)
+#
+chnames[u'\u00BD'] = _("one half")
+
+# Translators: this is the spoken word for the 3/4 sign: ¾
+# (U+00BE)
+#
+chnames[u'\u00BE'] = _("three quarters")
+
+# Translators: this is the spoken word for the multiplication sign: ×
+# (U+00D7)
+#
+chnames[u'\u00D7'] = _("times")
+
+# Translators: this is the spoken word for the division sign: ÷
+# (U+00F7)
+#
+chnames[u'\u00F7'] = _("divided by")
+
+# Translators: this is the spoken word for the n tilde: ñ
+# (U+00F1)
+#
+chnames[u'\u00F1'] = _("n tilde")
+
+# Translators: this is the spoken word for the per mille sign: ‰
+# (U+2030)
+# 
+chnames[u'\u2030'] = _("per mille")
+
+# Translators: this is the spoken word for the prime sign: ′
+# (U+2032)
+# 
+chnames[u'\u2032'] = _("prime")
+
+# Translators: this is the spoken word for the double prime sign: ″
+# (U+2033)
+# 
+chnames[u'\u2033'] = _("double prime")
+
+# Translators: this is the spoken word for the almost-equal-to sign: ≈
+# (U+2248)
+# 
+chnames[u'\u2248'] = _("almost equal to")
+
+# Translators: this is the spoken word for the not-equal-to sign: ≠
+# (U+2260)
+# 
+chnames[u'\u2260'] = _("not equal to")
+
+# Translators: this is the spoken word for the less-than-or-equal-to sign: ≤
+# (U+2264)
+#
+chnames[u'\u2264'] = _("less than or equal to")
+
+# Translators: this is the spoken word for the greater-than-or-equal-to 
+# sign: ≥ (U+2265)
+#
+chnames[u'\u2265'] = _("greater-than or equal to")
+
+# Translators: this is the spoken word for the square-root symbol: √
+# (U+221A)
+#
+chnames[u'\u221A'] = _("square root")
+
+# Translators: this is the spoken word for the cube-root symbol: ∛
+# (U+221B)
+#
+chnames[u'\u221B'] = _("cube root")
+
+# Translators: this is the spoken word for the infinity symbol: ∞
+# (U+221E)
+#
+chnames[u'\u221E'] = _("infinity")
+
+# Translators: this is the spoken word for the section symbol: §
+# (U+00A7)
+#
+chnames[u'\u00A7'] = _("section")
+
+# Translators: this is the spoken word for the dagger symbol: †
+# (U+2020)
+#
+chnames[u'\u2020'] = _("dagger")
+
+# Translators: this is the spoken word for the double-dagger symbol: ‡
+# (U+2021)
+#
+chnames[u'\u2021'] = _("double dagger")
+
+# Translators: this is the spoken word for the middle dot: ·
+# (U+00B7) 
+#
+chnames[u'\u00B7'] = _("middle dot")
+
+# Translators: this is the spoken word for the bullet: •
+# (U+2022)
+#
+chnames[u'\u2022'] = _("bullet")
+
+# Translators: this is the spoken word for the triangular bullet: ‣
+# (U+2023)
+#
+chnames[u'\u2023'] = _("triangular bullet")
+
+# Translators: this is the spoken word for the hyphen bullet: ⁃
+# (U+2043)
+#
+chnames[u'\u2043'] = _("hyphen bullet")
+
+# Translators: this is the spoken word for the black square: ■
+# (U+25A0).  It can be used as a bullet in a list.
+#
+chnames[u'\u25A0'] = _("black square")
+
+# Translators: this is the spoken word for the white square: □
+# (U+25A1). It can be used as a bullet in a list.
+#
+chnames[u'\u25A1'] = _("white square")
+
+# Translators: this is the spoken word for the white bullet: ◦
+# (U+25E6)
+#
+chnames[u'\u25E6'] = _("white bullet")
+
+# Translators: this is the spoken word for the white circle: ○
+# (U+25CB). It can be used as a bullet in a list.
+#
+chnames[u'\u25CB'] = _("white circle")
+
+# Translators: this is the spoken word for the black circle: ●
+# (U+25CF). It can be used as a bullet in a list.
+#
+chnames[u'\u25CF'] = _("black circle")
+
+# Translators: this is the spoken word for the black diamond: ◆
+# (U+25C6). It can be used as a bullet in a list.
+#
+chnames[u'\u25C6'] = _("black diamond")
+
+# Translators: this is the spoken word for the check mark: ✓
+# (U+2713). It can be used as a bullet in a list.
+#
+chnames[u'\u2713'] = _("check mark")
+
+# Translators: this is the spoken word for the heavy check mark: ✔
+# (U+2714). It can be used as a bullet in a list.
+#
+chnames[u'\u2714'] = _("heavy check mark")
+
+# Translators: this is the spoken word for the character which unicode.org
+# names "ballot x": ✗ (U+2717). This symbol is included here because it
+# can be used as a bullet in an OOo list.  The goal is to inform the user
+# of the appearance of the bullet, while making it clear that it is a bullet
+# and not simply the typed letter 'x'.  "Ballot x" might confuse the user.
+# Hence the use of "x-shaped bullet".
+#
+chnames[u'\u2717'] = _("x-shaped bullet")
+
+# Translators: this is the spoken word for the character which unicode.org
+# names "heavy wide-headed rightwards arrow": ➔ (U+2794). This symbol
+# is included here because it can be used as a bullet in an OOo list. The
+# goal is to inform the user of the appearance of the bullet without too
+# much verbiage, hence simply "right-pointing arrow".
+#
+chnames[u'\u2794'] = _("right-pointing arrow")
+
+# Translators: this is the spoken word for the character which unicode.org
+# names "three-d top-lighted rightwards arrowhead": ➢ (U+27A2). This symbol
+# is included here because it can be used as a bullet in an OOo list. The
+# goal is to inform the user of the appearance of the bullet without too
+# much verbiage, hence simply "right-pointing arrowhead".
+#
+chnames[u'\u27A2'] = _("right-pointing arrowhead")
+
+# Translators:  StarOffice/OOo includes private-use unicode character U+E00A
+# as a bullet which looks like the black square: ■ (U+25A0).  Therefore,
+# please use the same translation for this character.
+#
+chnames[u'\uE00A'] = _("black square")
+
+# Translators:  StarOffice/OOo includes private-use unicode character U+E00C
+# as a bullet which looks like the black diamond: ◆ (U+25C6).  Therefore,
+# please use the same translation for this character.
+#
+chnames[u'\uE00C'] = _("black diamond")
+
 def getCharacterName(character):
     """Given a character, return its name as people might refer to it
     in ordinary conversation.
@@ -196,10 +460,10 @@
     Returns a string representing the name for the character
     """
 
-    if isinstance(character, unicode):
-        character = character.encode("UTF-8")
+    if not isinstance(character, unicode):
+        character = character.decode("UTF-8")
 
     try:
-        return __chnames[character]
+        return chnames[character]
     except:
         return character
Index: src/orca/punctuation_settings.py
===================================================================
--- src/orca/punctuation_settings.py	(revision 2302)
+++ src/orca/punctuation_settings.py	(working copy)
@@ -53,48 +53,170 @@
 PUNCTUATION_REPLACE = 0
 PUNCTUATION_INSERT  = 1
 
-# __punctuation is a dictionary where the keys represent a UTF-8
-# character (possibly multibyte) and the values are a list of two
-# elements where the first represents the punctuation style and
-# the second represents the action to take.
+# The lowest level at which the spoken name should be spoken. Thus a symbol
+# with a level of LEVEL_MOST will be spoken at LEVEL_MOST and LEVEL_ALL.
 #
-__punctuation = {}
+LEVEL_ALL  = settings.PUNCTUATION_STYLE_ALL
+LEVEL_MOST = settings.PUNCTUATION_STYLE_MOST
+LEVEL_SOME = settings.PUNCTUATION_STYLE_SOME
+LEVEL_NONE = settings.PUNCTUATION_STYLE_NONE
 
-__punctuation["!"] =  [ settings.PUNCTUATION_STYLE_ALL,  PUNCTUATION_INSERT ]
-__punctuation["'"] =  [ settings.PUNCTUATION_STYLE_ALL,  PUNCTUATION_REPLACE ]
-__punctuation[","] =  [ settings.PUNCTUATION_STYLE_ALL,  PUNCTUATION_INSERT ]
-__punctuation["."] =  [ settings.PUNCTUATION_STYLE_ALL,  PUNCTUATION_INSERT ]
-__punctuation["?"] =  [ settings.PUNCTUATION_STYLE_ALL,  PUNCTUATION_INSERT ]
+# Bullets and bullet-like characters
+#
+middle_dot           =  u'\u00b7'
+bullet               =  u'\u2022'
+triangular_bullet    =  u'\u2023'
+hyphen_bullet        =  u'\u2043'
+black_square         =  u'\u25a0'
+white_square         =  u'\u25a1'
+white_bullet         =  u'\u25e6'
+white_circle         =  u'\u25cb'
+black_diamond        =  u'\u25c6'
+black_circle         =  u'\u25cf'
+check_mark           =  u'\u2713'
+heavy_check_mark     =  u'\u2714'
+x_shaped_bullet      =  u'\u2717'
+right_arrow          =  u'\u2794'
+right_arrowhead      =  u'\u27a2'
 
-__punctuation["\""] = [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["("] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation[")"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["-"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["_"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation[":"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_INSERT ]
-__punctuation[";"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_INSERT ]
-__punctuation["<"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation[">"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["["] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["]"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["\\"] = [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["|"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["`"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["~"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["{"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
-__punctuation["}"] =  [ settings.PUNCTUATION_STYLE_MOST, PUNCTUATION_REPLACE ]
+# StarOffice/OOo's special-purpose bullet chararacters
+#
+SO_black_square      =  u'\ue00a'
+SO_black_diamond     =  u'\ue00c'
 
-__punctuation["#"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["$"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["%"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["&"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["*"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["+"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["/"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["="] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["@"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
-__punctuation["^"] =  [ settings.PUNCTUATION_STYLE_SOME, PUNCTUATION_REPLACE ]
+# Miscellaneous other symbols
+#
+cent                 =  u'\u00a2'
+pound                =  u'\u00a3'
+yen                  =  u'\u00a5'
+section              =  u'\u00a7'
+copyright            =  u'\u00a9'
+not_sign             =  u'\u00ac'
+registered           =  u'\u00ae'
+degree               =  u'\u00b0'
+plus_minus           =  u'\u00b1'
+superscript2         =  u'\u00b2'
+superscript3         =  u'\u00b3'
+one_quarter          =  u'\u00bc'
+one_half             =  u'\u00bd'
+three_quarters       =  u'\u00be'
+multiply             =  u'\u00d7'
+divide               =  u'\u00f7'
+en_dash              =  u'\u2013'
+left_single_quote    =  u'\u2018'
+right_single_quote   =  u'\u2019'
+left_double_quote    =  u'\u201c'
+right_double_quote   =  u'\u201d'
+dagger               =  u'\u2020'
+double_dagger        =  u'\u2021'
+per_mille            =  u'\u2030'
+prime                =  u'\u2032'
+double_prime         =  u'\u2033'
+euro                 =  u'\u20ac'
+trademark            =  u'\u2122'
+infinity             =  u'\u221e'
+almost_equal         =  u'\u2248'
+not_equal            =  u'\u2260'
+lt_or_equal          =  u'\u2264'
+gt_or_equal          =  u'\u2265'
+square_root          =  u'\u221a'
+cube_root            =  u'\u221b'
 
+# punctuation is a dictionary where the keys represent a unicode
+# character and the values are a list of two elements where the
+# first represents the punctuation style and the second represents
+# the action to take.
+#
+punctuation = {}
+
+punctuation["!"] =  [ LEVEL_ALL,  PUNCTUATION_INSERT ]
+punctuation["'"] =  [ LEVEL_ALL,  PUNCTUATION_REPLACE ]
+punctuation[","] =  [ LEVEL_ALL,  PUNCTUATION_INSERT ]
+punctuation["."] =  [ LEVEL_ALL,  PUNCTUATION_INSERT ]
+punctuation["?"] =  [ LEVEL_ALL,  PUNCTUATION_INSERT ]
+punctuation[right_single_quote] = [ LEVEL_ALL, PUNCTUATION_REPLACE ]
+
+punctuation["\""] = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["("]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[")"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["-"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["_"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[":"]  = [ LEVEL_MOST, PUNCTUATION_INSERT ]
+punctuation[";"]  = [ LEVEL_MOST, PUNCTUATION_INSERT ]
+punctuation["<"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[">"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["["]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["]"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["\\"] = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["|"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["`"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["~"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["{"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation["}"]  = [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[left_single_quote]  =  [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[left_double_quote]  =  [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[right_double_quote] =  [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+punctuation[en_dash]            =  [ LEVEL_MOST, PUNCTUATION_REPLACE ]
+
+punctuation["#"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["$"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["%"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["&"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["*"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["+"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["/"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["="] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["@"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation["^"] =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[cent]               =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[pound]              =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[yen]                =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[euro]               =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[not_sign]           =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[copyright]          =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[registered]         =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[trademark]          =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[degree]             =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[plus_minus]         =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[multiply]           =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[divide]             =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[infinity]           =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[almost_equal]       =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[not_equal]          =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[lt_or_equal]        =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[gt_or_equal]        =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[square_root]        =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[cube_root]          =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[dagger]             =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[double_dagger]      =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[section]            =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[prime]              =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[double_prime]       =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+punctuation[per_mille]          =  [ LEVEL_SOME, PUNCTUATION_REPLACE ]
+
+punctuation[middle_dot]         =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[bullet]             =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[triangular_bullet]  =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[hyphen_bullet]      =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[black_square]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[white_square]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[white_bullet]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[white_circle]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[black_diamond]      =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[black_circle]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[check_mark]         =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[heavy_check_mark]   =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[x_shaped_bullet]    =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[right_arrow]        =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[right_arrowhead]    =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[SO_black_square]    =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[SO_black_diamond]   =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[one_quarter]        =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[one_half]           =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[three_quarters]     =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[superscript3]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+punctuation[superscript2]       =  [ LEVEL_NONE, PUNCTUATION_REPLACE ]
+
 def getPunctuationInfo(character):
     """Given a punctuation character, return the value
     [punctuation_style, punctuation_action] or None
@@ -106,10 +228,10 @@
     or None
     """
 
-    if isinstance(character, unicode):
-        character = character.encode("UTF-8")
+    if not isinstance(character, unicode):
+        character = character.decode("UTF-8")
 
     try:
-        return __punctuation[character]
+        return punctuation[character]
     except:
         return None
