Chris@909: #!/usr/bin/env ruby Chris@909: # Chris@909: # Utility to generate font definition files Chris@909: # Version: 1.1 Chris@909: # Date: 2006-07-19 Chris@909: # Chris@909: # Changelog: Chris@909: # Version 1.1 - Brian Ollenberger Chris@909: # - Fixed a very small bug in MakeFont for generating FontDef.diff. Chris@909: Chris@909: Charencodings = { Chris@909: # Central Europe Chris@909: 'cp1250' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', '.notdef', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: '.notdef', 'perthousand', 'Scaron', 'guilsinglleft', Chris@909: 'Sacute', 'Tcaron', 'Zcaron', 'Zacute', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: '.notdef', 'trademark', 'scaron', 'guilsinglright', Chris@909: 'sacute', 'tcaron', 'zcaron', 'zacute', Chris@909: 'space', 'caron', 'breve', 'Lslash', Chris@909: 'currency', 'Aogonek', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'Scedilla', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'Zdotaccent', Chris@909: 'degree', 'plusminus', 'ogonek', 'lslash', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'cedilla', 'aogonek', 'scedilla', 'guillemotright', Chris@909: 'Lcaron', 'hungarumlaut', 'lcaron', 'zdotaccent', Chris@909: 'Racute', 'Aacute', 'Acircumflex', 'Abreve', Chris@909: 'Adieresis', 'Lacute', 'Cacute', 'Ccedilla', Chris@909: 'Ccaron', 'Eacute', 'Eogonek', 'Edieresis', Chris@909: 'Ecaron', 'Iacute', 'Icircumflex', 'Dcaron', Chris@909: 'Dcroat', 'Nacute', 'Ncaron', 'Oacute', Chris@909: 'Ocircumflex', 'Ohungarumlaut', 'Odieresis', 'multiply', Chris@909: 'Rcaron', 'Uring', 'Uacute', 'Uhungarumlaut', Chris@909: 'Udieresis', 'Yacute', 'Tcommaaccent', 'germandbls', Chris@909: 'racute', 'aacute', 'acircumflex', 'abreve', Chris@909: 'adieresis', 'lacute', 'cacute', 'ccedilla', Chris@909: 'ccaron', 'eacute', 'eogonek', 'edieresis', Chris@909: 'ecaron', 'iacute', 'icircumflex', 'dcaron', Chris@909: 'dcroat', 'nacute', 'ncaron', 'oacute', Chris@909: 'ocircumflex', 'ohungarumlaut', 'odieresis', 'divide', Chris@909: 'rcaron', 'uring', 'uacute', 'uhungarumlaut', Chris@909: 'udieresis', 'yacute', 'tcommaaccent', 'dotaccent' Chris@909: ], Chris@909: # Cyrillic Chris@909: 'cp1251' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'afii10051', 'afii10052', 'quotesinglbase', 'afii10100', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: 'Euro', 'perthousand', 'afii10058', 'guilsinglleft', Chris@909: 'afii10059', 'afii10061', 'afii10060', 'afii10145', Chris@909: 'afii10099', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: '.notdef', 'trademark', 'afii10106', 'guilsinglright', Chris@909: 'afii10107', 'afii10109', 'afii10108', 'afii10193', Chris@909: 'space', 'afii10062', 'afii10110', 'afii10057', Chris@909: 'currency', 'afii10050', 'brokenbar', 'section', Chris@909: 'afii10023', 'copyright', 'afii10053', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'afii10056', Chris@909: 'degree', 'plusminus', 'afii10055', 'afii10103', Chris@909: 'afii10098', 'mu', 'paragraph', 'periodcentered', Chris@909: 'afii10071', 'afii61352', 'afii10101', 'guillemotright', Chris@909: 'afii10105', 'afii10054', 'afii10102', 'afii10104', Chris@909: 'afii10017', 'afii10018', 'afii10019', 'afii10020', Chris@909: 'afii10021', 'afii10022', 'afii10024', 'afii10025', Chris@909: 'afii10026', 'afii10027', 'afii10028', 'afii10029', Chris@909: 'afii10030', 'afii10031', 'afii10032', 'afii10033', Chris@909: 'afii10034', 'afii10035', 'afii10036', 'afii10037', Chris@909: 'afii10038', 'afii10039', 'afii10040', 'afii10041', Chris@909: 'afii10042', 'afii10043', 'afii10044', 'afii10045', Chris@909: 'afii10046', 'afii10047', 'afii10048', 'afii10049', Chris@909: 'afii10065', 'afii10066', 'afii10067', 'afii10068', Chris@909: 'afii10069', 'afii10070', 'afii10072', 'afii10073', Chris@909: 'afii10074', 'afii10075', 'afii10076', 'afii10077', Chris@909: 'afii10078', 'afii10079', 'afii10080', 'afii10081', Chris@909: 'afii10082', 'afii10083', 'afii10084', 'afii10085', Chris@909: 'afii10086', 'afii10087', 'afii10088', 'afii10089', Chris@909: 'afii10090', 'afii10091', 'afii10092', 'afii10093', Chris@909: 'afii10094', 'afii10095', 'afii10096', 'afii10097' Chris@909: ], Chris@909: # Western Europe Chris@909: 'cp1252' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', 'florin', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', Chris@909: 'OE', '.notdef', 'Zcaron', '.notdef', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: 'tilde', 'trademark', 'scaron', 'guilsinglright', Chris@909: 'oe', '.notdef', 'zcaron', 'Ydieresis', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'currency', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'questiondown', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', Chris@909: 'Adieresis', 'Aring', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Eth', 'Ntilde', 'Ograve', 'Oacute', Chris@909: 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Yacute', 'Thorn', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'atilde', Chris@909: 'adieresis', 'aring', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'igrave', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'eth', 'ntilde', 'ograve', 'oacute', Chris@909: 'ocircumflex', 'otilde', 'odieresis', 'divide', Chris@909: 'oslash', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'yacute', 'thorn', 'ydieresis' Chris@909: ], Chris@909: # Greek Chris@909: 'cp1253' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', 'florin', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: '.notdef', 'perthousand', '.notdef', 'guilsinglleft', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: '.notdef', 'trademark', '.notdef', 'guilsinglright', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'dieresistonos', 'Alphatonos', 'sterling', Chris@909: 'currency', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', '.notdef', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'afii00208', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'tonos', 'mu', 'paragraph', 'periodcentered', Chris@909: 'Epsilontonos', 'Etatonos', 'Iotatonos', 'guillemotright', Chris@909: 'Omicrontonos', 'onehalf', 'Upsilontonos', 'Omegatonos', Chris@909: 'iotadieresistonos','Alpha', 'Beta', 'Gamma', Chris@909: 'Delta', 'Epsilon', 'Zeta', 'Eta', Chris@909: 'Theta', 'Iota', 'Kappa', 'Lambda', Chris@909: 'Mu', 'Nu', 'Xi', 'Omicron', Chris@909: 'Pi', 'Rho', '.notdef', 'Sigma', Chris@909: 'Tau', 'Upsilon', 'Phi', 'Chi', Chris@909: 'Psi', 'Omega', 'Iotadieresis', 'Upsilondieresis', Chris@909: 'alphatonos', 'epsilontonos', 'etatonos', 'iotatonos', Chris@909: 'upsilondieresistonos','alpha', 'beta', 'gamma', Chris@909: 'delta', 'epsilon', 'zeta', 'eta', Chris@909: 'theta', 'iota', 'kappa', 'lambda', Chris@909: 'mu', 'nu', 'xi', 'omicron', Chris@909: 'pi', 'rho', 'sigma1', 'sigma', Chris@909: 'tau', 'upsilon', 'phi', 'chi', Chris@909: 'psi', 'omega', 'iotadieresis', 'upsilondieresis', Chris@909: 'omicrontonos', 'upsilontonos', 'omegatonos', '.notdef' Chris@909: ], Chris@909: # Turkish Chris@909: 'cp1254' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', 'florin', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', Chris@909: 'OE', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: 'tilde', 'trademark', 'scaron', 'guilsinglright', Chris@909: 'oe', '.notdef', '.notdef', 'Ydieresis', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'currency', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'questiondown', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', Chris@909: 'Adieresis', 'Aring', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Gbreve', 'Ntilde', 'Ograve', 'Oacute', Chris@909: 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Idotaccent', 'Scedilla', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'atilde', Chris@909: 'adieresis', 'aring', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'igrave', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'gbreve', 'ntilde', 'ograve', 'oacute', Chris@909: 'ocircumflex', 'otilde', 'odieresis', 'divide', Chris@909: 'oslash', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'dotlessi', 'scedilla', 'ydieresis' Chris@909: ], Chris@909: # Hebrew Chris@909: 'cp1255' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', 'florin', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: 'circumflex', 'perthousand', '.notdef', 'guilsinglleft', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: 'tilde', 'trademark', '.notdef', 'guilsinglright', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'afii57636', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'multiply', 'guillemotleft', Chris@909: 'logicalnot', 'sfthyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'middot', Chris@909: 'cedilla', 'onesuperior', 'divide', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'questiondown', Chris@909: 'afii57799', 'afii57801', 'afii57800', 'afii57802', Chris@909: 'afii57793', 'afii57794', 'afii57795', 'afii57798', Chris@909: 'afii57797', 'afii57806', '.notdef', 'afii57796', Chris@909: 'afii57807', 'afii57839', 'afii57645', 'afii57841', Chris@909: 'afii57842', 'afii57804', 'afii57803', 'afii57658', Chris@909: 'afii57716', 'afii57717', 'afii57718', 'gereshhebrew', Chris@909: 'gershayimhebrew','.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'afii57664', 'afii57665', 'afii57666', 'afii57667', Chris@909: 'afii57668', 'afii57669', 'afii57670', 'afii57671', Chris@909: 'afii57672', 'afii57673', 'afii57674', 'afii57675', Chris@909: 'afii57676', 'afii57677', 'afii57678', 'afii57679', Chris@909: 'afii57680', 'afii57681', 'afii57682', 'afii57683', Chris@909: 'afii57684', 'afii57685', 'afii57686', 'afii57687', Chris@909: 'afii57688', 'afii57689', 'afii57690', '.notdef', Chris@909: '.notdef', 'afii299', 'afii300', '.notdef' Chris@909: ], Chris@909: # Baltic Chris@909: 'cp1257' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', '.notdef', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: '.notdef', 'perthousand', '.notdef', 'guilsinglleft', Chris@909: '.notdef', 'dieresis', 'caron', 'cedilla', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: '.notdef', 'trademark', '.notdef', 'guilsinglright', Chris@909: '.notdef', 'macron', 'ogonek', '.notdef', Chris@909: 'space', '.notdef', 'cent', 'sterling', Chris@909: 'currency', '.notdef', 'brokenbar', 'section', Chris@909: 'Oslash', 'copyright', 'Rcommaaccent', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'AE', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'oslash', 'onesuperior', 'rcommaaccent', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'ae', Chris@909: 'Aogonek', 'Iogonek', 'Amacron', 'Cacute', Chris@909: 'Adieresis', 'Aring', 'Eogonek', 'Emacron', Chris@909: 'Ccaron', 'Eacute', 'Zacute', 'Edotaccent', Chris@909: 'Gcommaaccent', 'Kcommaaccent', 'Imacron', 'Lcommaaccent', Chris@909: 'Scaron', 'Nacute', 'Ncommaaccent', 'Oacute', Chris@909: 'Omacron', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Uogonek', 'Lslash', 'Sacute', 'Umacron', Chris@909: 'Udieresis', 'Zdotaccent', 'Zcaron', 'germandbls', Chris@909: 'aogonek', 'iogonek', 'amacron', 'cacute', Chris@909: 'adieresis', 'aring', 'eogonek', 'emacron', Chris@909: 'ccaron', 'eacute', 'zacute', 'edotaccent', Chris@909: 'gcommaaccent', 'kcommaaccent', 'imacron', 'lcommaaccent', Chris@909: 'scaron', 'nacute', 'ncommaaccent', 'oacute', Chris@909: 'omacron', 'otilde', 'odieresis', 'divide', Chris@909: 'uogonek', 'lslash', 'sacute', 'umacron', Chris@909: 'udieresis', 'zdotaccent', 'zcaron', 'dotaccent' Chris@909: ], Chris@909: # Vietnamese Chris@909: 'cp1258' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', 'quotesinglbase', 'florin', Chris@909: 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', Chris@909: 'circumflex', 'perthousand', '.notdef', 'guilsinglleft', Chris@909: 'OE', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: 'tilde', 'trademark', '.notdef', 'guilsinglright', Chris@909: 'oe', '.notdef', '.notdef', 'Ydieresis', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'currency', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'questiondown', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Abreve', Chris@909: 'Adieresis', 'Aring', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'gravecomb', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Dcroat', 'Ntilde', 'hookabovecomb', 'Oacute', Chris@909: 'Ocircumflex', 'Ohorn', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Uhorn', 'tildecomb', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'abreve', Chris@909: 'adieresis', 'aring', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'acutecomb', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'dcroat', 'ntilde', 'dotbelowcomb', 'oacute', Chris@909: 'ocircumflex', 'ohorn', 'odieresis', 'divide', Chris@909: 'oslash', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'uhorn', 'dong', 'ydieresis' Chris@909: ], Chris@909: # Thai Chris@909: 'cp874' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'Euro', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', 'ellipsis', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', 'quoteleft', 'quoteright', 'quotedblleft', Chris@909: 'quotedblright', 'bullet', 'endash', 'emdash', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'kokaithai', 'khokhaithai', 'khokhuatthai', Chris@909: 'khokhwaithai', 'khokhonthai', 'khorakhangthai', 'ngonguthai', Chris@909: 'chochanthai', 'chochingthai', 'chochangthai', 'sosothai', Chris@909: 'chochoethai', 'yoyingthai', 'dochadathai', 'topatakthai', Chris@909: 'thothanthai', 'thonangmonthothai', 'thophuthaothai', 'nonenthai', Chris@909: 'dodekthai', 'totaothai', 'thothungthai', 'thothahanthai', Chris@909: 'thothongthai', 'nonuthai', 'bobaimaithai', 'poplathai', Chris@909: 'phophungthai', 'fofathai', 'phophanthai', 'fofanthai', Chris@909: 'phosamphaothai', 'momathai', 'yoyakthai', 'roruathai', Chris@909: 'ruthai', 'lolingthai', 'luthai', 'wowaenthai', Chris@909: 'sosalathai', 'sorusithai', 'sosuathai', 'hohipthai', Chris@909: 'lochulathai', 'oangthai', 'honokhukthai', 'paiyannoithai', Chris@909: 'saraathai', 'maihanakatthai', 'saraaathai', 'saraamthai', Chris@909: 'saraithai', 'saraiithai', 'sarauethai', 'saraueethai', Chris@909: 'sarauthai', 'sarauuthai', 'phinthuthai', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', 'bahtthai', Chris@909: 'saraethai', 'saraaethai', 'saraothai', 'saraaimaimuanthai', Chris@909: 'saraaimaimalaithai', 'lakkhangyaothai', 'maiyamokthai', 'maitaikhuthai', Chris@909: 'maiekthai', 'maithothai', 'maitrithai', 'maichattawathai', Chris@909: 'thanthakhatthai', 'nikhahitthai', 'yamakkanthai', 'fongmanthai', Chris@909: 'zerothai', 'onethai', 'twothai', 'threethai', Chris@909: 'fourthai', 'fivethai', 'sixthai', 'seventhai', Chris@909: 'eightthai', 'ninethai', 'angkhankhuthai', 'khomutthai', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef' Chris@909: ], Chris@909: # Western Europe Chris@909: 'ISO-8859-1' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'currency', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'questiondown', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', Chris@909: 'Adieresis', 'Aring', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Eth', 'Ntilde', 'Ograve', 'Oacute', Chris@909: 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Yacute', 'Thorn', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'atilde', Chris@909: 'adieresis', 'aring', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'igrave', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'eth', 'ntilde', 'ograve', 'oacute', Chris@909: 'ocircumflex', 'otilde', 'odieresis', 'divide', Chris@909: 'oslash', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'yacute', 'thorn', 'ydieresis' Chris@909: ], Chris@909: # Central Europe Chris@909: 'ISO-8859-2' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'Aogonek', 'breve', 'Lslash', Chris@909: 'currency', 'Lcaron', 'Sacute', 'section', Chris@909: 'dieresis', 'Scaron', 'Scedilla', 'Tcaron', Chris@909: 'Zacute', 'hyphen', 'Zcaron', 'Zdotaccent', Chris@909: 'degree', 'aogonek', 'ogonek', 'lslash', Chris@909: 'acute', 'lcaron', 'sacute', 'caron', Chris@909: 'cedilla', 'scaron', 'scedilla', 'tcaron', Chris@909: 'zacute', 'hungarumlaut', 'zcaron', 'zdotaccent', Chris@909: 'Racute', 'Aacute', 'Acircumflex', 'Abreve', Chris@909: 'Adieresis', 'Lacute', 'Cacute', 'Ccedilla', Chris@909: 'Ccaron', 'Eacute', 'Eogonek', 'Edieresis', Chris@909: 'Ecaron', 'Iacute', 'Icircumflex', 'Dcaron', Chris@909: 'Dcroat', 'Nacute', 'Ncaron', 'Oacute', Chris@909: 'Ocircumflex', 'Ohungarumlaut', 'Odieresis', 'multiply', Chris@909: 'Rcaron', 'Uring', 'Uacute', 'Uhungarumlaut', Chris@909: 'Udieresis', 'Yacute', 'Tcommaaccent', 'germandbls', Chris@909: 'racute', 'aacute', 'acircumflex', 'abreve', Chris@909: 'adieresis', 'lacute', 'cacute', 'ccedilla', Chris@909: 'ccaron', 'eacute', 'eogonek', 'edieresis', Chris@909: 'ecaron', 'iacute', 'icircumflex', 'dcaron', Chris@909: 'dcroat', 'nacute', 'ncaron', 'oacute', Chris@909: 'ocircumflex', 'ohungarumlaut', 'odieresis', 'divide', Chris@909: 'rcaron', 'uring', 'uacute', 'uhungarumlaut', Chris@909: 'udieresis', 'yacute', 'tcommaaccent', 'dotaccent' Chris@909: ], Chris@909: # Baltic Chris@909: 'ISO-8859-4' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'Aogonek', 'kgreenlandic', 'Rcommaaccent', Chris@909: 'currency', 'Itilde', 'Lcommaaccent', 'section', Chris@909: 'dieresis', 'Scaron', 'Emacron', 'Gcommaaccent', Chris@909: 'Tbar', 'hyphen', 'Zcaron', 'macron', Chris@909: 'degree', 'aogonek', 'ogonek', 'rcommaaccent', Chris@909: 'acute', 'itilde', 'lcommaaccent', 'caron', Chris@909: 'cedilla', 'scaron', 'emacron', 'gcommaaccent', Chris@909: 'tbar', 'Eng', 'zcaron', 'eng', Chris@909: 'Amacron', 'Aacute', 'Acircumflex', 'Atilde', Chris@909: 'Adieresis', 'Aring', 'AE', 'Iogonek', Chris@909: 'Ccaron', 'Eacute', 'Eogonek', 'Edieresis', Chris@909: 'Edotaccent', 'Iacute', 'Icircumflex', 'Imacron', Chris@909: 'Dcroat', 'Ncommaaccent', 'Omacron', 'Kcommaaccent', Chris@909: 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Uogonek', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Utilde', 'Umacron', 'germandbls', Chris@909: 'amacron', 'aacute', 'acircumflex', 'atilde', Chris@909: 'adieresis', 'aring', 'ae', 'iogonek', Chris@909: 'ccaron', 'eacute', 'eogonek', 'edieresis', Chris@909: 'edotaccent', 'iacute', 'icircumflex', 'imacron', Chris@909: 'dcroat', 'ncommaaccent', 'omacron', 'kcommaaccent', Chris@909: 'ocircumflex', 'otilde', 'odieresis', 'divide', Chris@909: 'oslash', 'uogonek', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'utilde', 'umacron', 'dotaccent' Chris@909: ], Chris@909: # Cyrillic Chris@909: 'ISO-8859-5' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'afii10023', 'afii10051', 'afii10052', Chris@909: 'afii10053', 'afii10054', 'afii10055', 'afii10056', Chris@909: 'afii10057', 'afii10058', 'afii10059', 'afii10060', Chris@909: 'afii10061', 'hyphen', 'afii10062', 'afii10145', Chris@909: 'afii10017', 'afii10018', 'afii10019', 'afii10020', Chris@909: 'afii10021', 'afii10022', 'afii10024', 'afii10025', Chris@909: 'afii10026', 'afii10027', 'afii10028', 'afii10029', Chris@909: 'afii10030', 'afii10031', 'afii10032', 'afii10033', Chris@909: 'afii10034', 'afii10035', 'afii10036', 'afii10037', Chris@909: 'afii10038', 'afii10039', 'afii10040', 'afii10041', Chris@909: 'afii10042', 'afii10043', 'afii10044', 'afii10045', Chris@909: 'afii10046', 'afii10047', 'afii10048', 'afii10049', Chris@909: 'afii10065', 'afii10066', 'afii10067', 'afii10068', Chris@909: 'afii10069', 'afii10070', 'afii10072', 'afii10073', Chris@909: 'afii10074', 'afii10075', 'afii10076', 'afii10077', Chris@909: 'afii10078', 'afii10079', 'afii10080', 'afii10081', Chris@909: 'afii10082', 'afii10083', 'afii10084', 'afii10085', Chris@909: 'afii10086', 'afii10087', 'afii10088', 'afii10089', Chris@909: 'afii10090', 'afii10091', 'afii10092', 'afii10093', Chris@909: 'afii10094', 'afii10095', 'afii10096', 'afii10097', Chris@909: 'afii61352', 'afii10071', 'afii10099', 'afii10100', Chris@909: 'afii10101', 'afii10102', 'afii10103', 'afii10104', Chris@909: 'afii10105', 'afii10106', 'afii10107', 'afii10108', Chris@909: 'afii10109', 'section', 'afii10110', 'afii10193' Chris@909: ], Chris@909: # Greek Chris@909: 'ISO-8859-7' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'quoteleft', 'quoteright', 'sterling', Chris@909: '.notdef', '.notdef', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', '.notdef', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', '.notdef', 'afii00208', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'tonos', 'dieresistonos', 'Alphatonos', 'periodcentered', Chris@909: 'Epsilontonos', 'Etatonos', 'Iotatonos', 'guillemotright', Chris@909: 'Omicrontonos', 'onehalf', 'Upsilontonos', 'Omegatonos', Chris@909: 'iotadieresistonos','Alpha', 'Beta', 'Gamma', Chris@909: 'Delta', 'Epsilon', 'Zeta', 'Eta', Chris@909: 'Theta', 'Iota', 'Kappa', 'Lambda', Chris@909: 'Mu', 'Nu', 'Xi', 'Omicron', Chris@909: 'Pi', 'Rho', '.notdef', 'Sigma', Chris@909: 'Tau', 'Upsilon', 'Phi', 'Chi', Chris@909: 'Psi', 'Omega', 'Iotadieresis', 'Upsilondieresis', Chris@909: 'alphatonos', 'epsilontonos', 'etatonos', 'iotatonos', Chris@909: 'upsilondieresistonos','alpha', 'beta', 'gamma', Chris@909: 'delta', 'epsilon', 'zeta', 'eta', Chris@909: 'theta', 'iota', 'kappa', 'lambda', Chris@909: 'mu', 'nu', 'xi', 'omicron', Chris@909: 'pi', 'rho', 'sigma1', 'sigma', Chris@909: 'tau', 'upsilon', 'phi', 'chi', Chris@909: 'psi', 'omega', 'iotadieresis', 'upsilondieresis', Chris@909: 'omicrontonos', 'upsilontonos', 'omegatonos', '.notdef' Chris@909: ], Chris@909: # Turkish Chris@909: 'ISO-8859-9' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'currency', 'yen', 'brokenbar', 'section', Chris@909: 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'acute', 'mu', 'paragraph', 'periodcentered', Chris@909: 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', Chris@909: 'onequarter', 'onehalf', 'threequarters', 'questiondown', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', Chris@909: 'Adieresis', 'Aring', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Gbreve', 'Ntilde', 'Ograve', 'Oacute', Chris@909: 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Idotaccent', 'Scedilla', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'atilde', Chris@909: 'adieresis', 'aring', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'igrave', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'gbreve', 'ntilde', 'ograve', 'oacute', Chris@909: 'ocircumflex', 'otilde', 'odieresis', 'divide', Chris@909: 'oslash', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'dotlessi', 'scedilla', 'ydieresis' Chris@909: ], Chris@909: # Thai Chris@909: 'ISO-8859-11' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'kokaithai', 'khokhaithai', 'khokhuatthai', Chris@909: 'khokhwaithai', 'khokhonthai', 'khorakhangthai', 'ngonguthai', Chris@909: 'chochanthai', 'chochingthai', 'chochangthai', 'sosothai', Chris@909: 'chochoethai', 'yoyingthai', 'dochadathai', 'topatakthai', Chris@909: 'thothanthai', 'thonangmonthothai','thophuthaothai', 'nonenthai', Chris@909: 'dodekthai', 'totaothai', 'thothungthai', 'thothahanthai', Chris@909: 'thothongthai', 'nonuthai', 'bobaimaithai', 'poplathai', Chris@909: 'phophungthai', 'fofathai', 'phophanthai', 'fofanthai', Chris@909: 'phosamphaothai', 'momathai', 'yoyakthai', 'roruathai', Chris@909: 'ruthai', 'lolingthai', 'luthai', 'wowaenthai', Chris@909: 'sosalathai', 'sorusithai', 'sosuathai', 'hohipthai', Chris@909: 'lochulathai', 'oangthai', 'honokhukthai', 'paiyannoithai', Chris@909: 'saraathai', 'maihanakatthai', 'saraaathai', 'saraamthai', Chris@909: 'saraithai', 'saraiithai', 'sarauethai', 'saraueethai', Chris@909: 'sarauthai', 'sarauuthai', 'phinthuthai', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', 'bahtthai', Chris@909: 'saraethai', 'saraaethai', 'saraothai', 'saraaimaimuanthai', Chris@909: 'saraaimaimalaithai','lakkhangyaothai','maiyamokthai', 'maitaikhuthai', Chris@909: 'maiekthai', 'maithothai', 'maitrithai', 'maichattawathai', Chris@909: 'thanthakhatthai','nikhahitthai', 'yamakkanthai', 'fongmanthai', Chris@909: 'zerothai', 'onethai', 'twothai', 'threethai', Chris@909: 'fourthai', 'fivethai', 'sixthai', 'seventhai', Chris@909: 'eightthai', 'ninethai', 'angkhankhuthai', 'khomutthai', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef' Chris@909: ], Chris@909: # Western Europe Chris@909: 'ISO-8859-15' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclamdown', 'cent', 'sterling', Chris@909: 'Euro', 'yen', 'Scaron', 'section', Chris@909: 'scaron', 'copyright', 'ordfeminine', 'guillemotleft', Chris@909: 'logicalnot', 'hyphen', 'registered', 'macron', Chris@909: 'degree', 'plusminus', 'twosuperior', 'threesuperior', Chris@909: 'Zcaron', 'mu', 'paragraph', 'periodcentered', Chris@909: 'zcaron', 'onesuperior', 'ordmasculine', 'guillemotright', Chris@909: 'OE', 'oe', 'Ydieresis', 'questiondown', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', Chris@909: 'Adieresis', 'Aring', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Eth', 'Ntilde', 'Ograve', 'Oacute', Chris@909: 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', Chris@909: 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Yacute', 'Thorn', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'atilde', Chris@909: 'adieresis', 'aring', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'igrave', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'eth', 'ntilde', 'ograve', 'oacute', Chris@909: 'ocircumflex', 'otilde', 'odieresis', 'divide', Chris@909: 'oslash', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'yacute', 'thorn', 'ydieresis' Chris@909: ], Chris@909: # Central Europe Chris@909: 'ISO-8859-16' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'Aogonek', 'aogonek', 'Lslash', Chris@909: 'Euro', 'quotedblbase', 'Scaron', 'section', Chris@909: 'scaron', 'copyright', 'Scommaaccent', 'guillemotleft', Chris@909: 'Zacute', 'hyphen', 'zacute', 'Zdotaccent', Chris@909: 'degree', 'plusminus', 'Ccaron', 'lslash', Chris@909: 'Zcaron', 'quotedblright', 'paragraph', 'periodcentered', Chris@909: 'zcaron', 'ccaron', 'scommaaccent', 'guillemotright', Chris@909: 'OE', 'oe', 'Ydieresis', 'zdotaccent', Chris@909: 'Agrave', 'Aacute', 'Acircumflex', 'Abreve', Chris@909: 'Adieresis', 'Cacute', 'AE', 'Ccedilla', Chris@909: 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', Chris@909: 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', Chris@909: 'Dcroat', 'Nacute', 'Ograve', 'Oacute', Chris@909: 'Ocircumflex', 'Ohungarumlaut', 'Odieresis', 'Sacute', Chris@909: 'Uhungarumlaut', 'Ugrave', 'Uacute', 'Ucircumflex', Chris@909: 'Udieresis', 'Eogonek', 'Tcommaaccent', 'germandbls', Chris@909: 'agrave', 'aacute', 'acircumflex', 'abreve', Chris@909: 'adieresis', 'cacute', 'ae', 'ccedilla', Chris@909: 'egrave', 'eacute', 'ecircumflex', 'edieresis', Chris@909: 'igrave', 'iacute', 'icircumflex', 'idieresis', Chris@909: 'dcroat', 'nacute', 'ograve', 'oacute', Chris@909: 'ocircumflex', 'ohungarumlaut', 'odieresis', 'sacute', Chris@909: 'uhungarumlaut', 'ugrave', 'uacute', 'ucircumflex', Chris@909: 'udieresis', 'eogonek', 'tcommaaccent', 'ydieresis' Chris@909: ], Chris@909: # Russian Chris@909: 'KOI8-R' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'SF100000', 'SF110000', 'SF010000', 'SF030000', Chris@909: 'SF020000', 'SF040000', 'SF080000', 'SF090000', Chris@909: 'SF060000', 'SF070000', 'SF050000', 'upblock', Chris@909: 'dnblock', 'block', 'lfblock', 'rtblock', Chris@909: 'ltshade', 'shade', 'dkshade', 'integraltp', Chris@909: 'filledbox', 'periodcentered', 'radical', 'approxequal', Chris@909: 'lessequal', 'greaterequal', 'space', 'integralbt', Chris@909: 'degree', 'twosuperior', 'periodcentered', 'divide', Chris@909: 'SF430000', 'SF240000', 'SF510000', 'afii10071', Chris@909: 'SF520000', 'SF390000', 'SF220000', 'SF210000', Chris@909: 'SF250000', 'SF500000', 'SF490000', 'SF380000', Chris@909: 'SF280000', 'SF270000', 'SF260000', 'SF360000', Chris@909: 'SF370000', 'SF420000', 'SF190000', 'afii10023', Chris@909: 'SF200000', 'SF230000', 'SF470000', 'SF480000', Chris@909: 'SF410000', 'SF450000', 'SF460000', 'SF400000', Chris@909: 'SF540000', 'SF530000', 'SF440000', 'copyright', Chris@909: 'afii10096', 'afii10065', 'afii10066', 'afii10088', Chris@909: 'afii10069', 'afii10070', 'afii10086', 'afii10068', Chris@909: 'afii10087', 'afii10074', 'afii10075', 'afii10076', Chris@909: 'afii10077', 'afii10078', 'afii10079', 'afii10080', Chris@909: 'afii10081', 'afii10097', 'afii10082', 'afii10083', Chris@909: 'afii10084', 'afii10085', 'afii10072', 'afii10067', Chris@909: 'afii10094', 'afii10093', 'afii10073', 'afii10090', Chris@909: 'afii10095', 'afii10091', 'afii10089', 'afii10092', Chris@909: 'afii10048', 'afii10017', 'afii10018', 'afii10040', Chris@909: 'afii10021', 'afii10022', 'afii10038', 'afii10020', Chris@909: 'afii10039', 'afii10026', 'afii10027', 'afii10028', Chris@909: 'afii10029', 'afii10030', 'afii10031', 'afii10032', Chris@909: 'afii10033', 'afii10049', 'afii10034', 'afii10035', Chris@909: 'afii10036', 'afii10037', 'afii10024', 'afii10019', Chris@909: 'afii10046', 'afii10045', 'afii10025', 'afii10042', Chris@909: 'afii10047', 'afii10043', 'afii10041', 'afii10044' Chris@909: ], Chris@909: # Ukrainian Chris@909: 'KOI8-U' => [ Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: '.notdef', '.notdef', '.notdef', '.notdef', Chris@909: 'space', 'exclam', 'quotedbl', 'numbersign', Chris@909: 'dollar', 'percent', 'ampersand', 'quotesingle', Chris@909: 'parenleft', 'parenright', 'asterisk', 'plus', Chris@909: 'comma', 'hyphen', 'period', 'slash', Chris@909: 'zero', 'one', 'two', 'three', Chris@909: 'four', 'five', 'six', 'seven', Chris@909: 'eight', 'nine', 'colon', 'semicolon', Chris@909: 'less', 'equal', 'greater', 'question', Chris@909: 'at', 'A', 'B', 'C', Chris@909: 'D', 'E', 'F', 'G', Chris@909: 'H', 'I', 'J', 'K', Chris@909: 'L', 'M', 'N', 'O', Chris@909: 'P', 'Q', 'R', 'S', Chris@909: 'T', 'U', 'V', 'W', Chris@909: 'X', 'Y', 'Z', 'bracketleft', Chris@909: 'backslash', 'bracketright', 'asciicircum', 'underscore', Chris@909: 'grave', 'a', 'b', 'c', Chris@909: 'd', 'e', 'f', 'g', Chris@909: 'h', 'i', 'j', 'k', Chris@909: 'l', 'm', 'n', 'o', Chris@909: 'p', 'q', 'r', 's', Chris@909: 't', 'u', 'v', 'w', Chris@909: 'x', 'y', 'z', 'braceleft', Chris@909: 'bar', 'braceright', 'asciitilde', '.notdef', Chris@909: 'SF100000', 'SF110000', 'SF010000', 'SF030000', Chris@909: 'SF020000', 'SF040000', 'SF080000', 'SF090000', Chris@909: 'SF060000', 'SF070000', 'SF050000', 'upblock', Chris@909: 'dnblock', 'block', 'lfblock', 'rtblock', Chris@909: 'ltshade', 'shade', 'dkshade', 'integraltp', Chris@909: 'filledbox', 'bullet', 'radical', 'approxequal', Chris@909: 'lessequal', 'greaterequal', 'space', 'integralbt', Chris@909: 'degree', 'twosuperior', 'periodcentered', 'divide', Chris@909: 'SF430000', 'SF240000', 'SF510000', 'afii10071', Chris@909: 'afii10101', 'SF390000', 'afii10103', 'afii10104', Chris@909: 'SF250000', 'SF500000', 'SF490000', 'SF380000', Chris@909: 'SF280000', 'afii10098', 'SF260000', 'SF360000', Chris@909: 'SF370000', 'SF420000', 'SF190000', 'afii10023', Chris@909: 'afii10053', 'SF230000', 'afii10055', 'afii10056', Chris@909: 'SF410000', 'SF450000', 'SF460000', 'SF400000', Chris@909: 'SF540000', 'afii10050', 'SF440000', 'copyright', Chris@909: 'afii10096', 'afii10065', 'afii10066', 'afii10088', Chris@909: 'afii10069', 'afii10070', 'afii10086', 'afii10068', Chris@909: 'afii10087', 'afii10074', 'afii10075', 'afii10076', Chris@909: 'afii10077', 'afii10078', 'afii10079', 'afii10080', Chris@909: 'afii10081', 'afii10097', 'afii10082', 'afii10083', Chris@909: 'afii10084', 'afii10085', 'afii10072', 'afii10067', Chris@909: 'afii10094', 'afii10093', 'afii10073', 'afii10090', Chris@909: 'afii10095', 'afii10091', 'afii10089', 'afii10092', Chris@909: 'afii10048', 'afii10017', 'afii10018', 'afii10040', Chris@909: 'afii10021', 'afii10022', 'afii10038', 'afii10020', Chris@909: 'afii10039', 'afii10026', 'afii10027', 'afii10028', Chris@909: 'afii10029', 'afii10030', 'afii10031', 'afii10032', Chris@909: 'afii10033', 'afii10049', 'afii10034', 'afii10035', Chris@909: 'afii10036', 'afii10037', 'afii10024', 'afii10019', Chris@909: 'afii10046', 'afii10045', 'afii10025', 'afii10042', Chris@909: 'afii10047', 'afii10043', 'afii10041', 'afii10044' Chris@909: ] Chris@909: } Chris@909: Chris@909: def ReadAFM(file, map) Chris@909: Chris@909: # Read a font metric file Chris@909: a = IO.readlines(file) Chris@909: Chris@909: raise "File no found: #{file}" if a.size == 0 Chris@909: Chris@909: widths = {} Chris@909: fm = {} Chris@909: fix = { 'Edot' => 'Edotaccent', 'edot' => 'edotaccent', Chris@909: 'Idot' => 'Idotaccent', Chris@909: 'Zdot' => 'Zdotaccent', 'zdot' => 'zdotaccent', Chris@909: 'Odblacute' => 'Ohungarumlaut', 'odblacute' => 'ohungarumlaut', Chris@909: 'Udblacute' => 'Uhungarumlaut', 'udblacute' => 'uhungarumlaut', Chris@909: 'Gcedilla' => 'Gcommaaccent', 'gcedilla' => 'gcommaaccent', Chris@909: 'Kcedilla' => 'Kcommaaccent', 'kcedilla' => 'kcommaaccent', Chris@909: 'Lcedilla' => 'Lcommaaccent', 'lcedilla' => 'lcommaaccent', Chris@909: 'Ncedilla' => 'Ncommaaccent', 'ncedilla' => 'ncommaaccent', Chris@909: 'Rcedilla' => 'Rcommaaccent', 'rcedilla' => 'rcommaaccent', Chris@909: 'Scedilla' => 'Scommaaccent',' scedilla' => 'scommaaccent', Chris@909: 'Tcedilla' => 'Tcommaaccent',' tcedilla' => 'tcommaaccent', Chris@909: 'Dslash' => 'Dcroat', 'dslash' => 'dcroat', Chris@909: 'Dmacron' => 'Dcroat', 'dmacron' => 'dcroat', Chris@909: 'combininggraveaccent' => 'gravecomb', Chris@909: 'combininghookabove' => 'hookabovecomb', Chris@909: 'combiningtildeaccent' => 'tildecomb', Chris@909: 'combiningacuteaccent' => 'acutecomb', Chris@909: 'combiningdotbelow' => 'dotbelowcomb', Chris@909: 'dongsign' => 'dong' Chris@909: } Chris@909: Chris@909: a.each do |line| Chris@909: Chris@909: e = line.rstrip.split(' ') Chris@909: next if e.size < 2 Chris@909: Chris@909: code = e[0] Chris@909: param = e[1] Chris@909: Chris@909: if code == 'C' then Chris@909: Chris@909: # Character metrics Chris@909: cc = e[1].to_i Chris@909: w = e[4] Chris@909: gn = e[7] Chris@909: Chris@909: gn = 'Euro' if gn[-4, 4] == '20AC' Chris@909: Chris@909: if fix[gn] then Chris@909: Chris@909: # Fix incorrect glyph name Chris@909: 0.upto(map.size - 1) do |i| Chris@909: if map[i] == fix[gn] then Chris@909: map[i] = gn Chris@909: end Chris@909: end Chris@909: end Chris@909: Chris@909: if map.size == 0 then Chris@909: # Symbolic font: use built-in encoding Chris@909: widths[cc] = w Chris@909: else Chris@909: widths[gn] = w Chris@909: fm['CapXHeight'] = e[13].to_i if gn == 'X' Chris@909: end Chris@909: Chris@909: fm['MissingWidth'] = w if gn == '.notdef' Chris@909: Chris@909: elsif code == 'FontName' then Chris@909: fm['FontName'] = param Chris@909: elsif code == 'Weight' then Chris@909: fm['Weight'] = param Chris@909: elsif code == 'ItalicAngle' then Chris@909: fm['ItalicAngle'] = param.to_f Chris@909: elsif code == 'Ascender' then Chris@909: fm['Ascender'] = param.to_i Chris@909: elsif code == 'Descender' then Chris@909: fm['Descender'] = param.to_i Chris@909: elsif code == 'UnderlineThickness' then Chris@909: fm['UnderlineThickness'] = param.to_i Chris@909: elsif code == 'UnderlinePosition' then Chris@909: fm['UnderlinePosition'] = param.to_i Chris@909: elsif code == 'IsFixedPitch' then Chris@909: fm['IsFixedPitch'] = (param == 'true') Chris@909: elsif code == 'FontBBox' then Chris@909: fm['FontBBox'] = "[#{e[1]},#{e[2]},#{e[3]},#{e[4]}]" Chris@909: elsif code == 'CapHeight' then Chris@909: fm['CapHeight'] = param.to_i Chris@909: elsif code == 'StdVW' then Chris@909: fm['StdVW'] = param.to_i Chris@909: end Chris@909: end Chris@909: Chris@909: raise 'FontName not found' unless fm['FontName'] Chris@909: Chris@909: if map.size > 0 then Chris@909: widths['.notdef'] = 600 unless widths['.notdef'] Chris@909: Chris@909: if (widths['Delta'] == nil) && widths['increment'] then Chris@909: widths['Delta'] = widths['increment'] Chris@909: end Chris@909: Chris@909: # Order widths according to map Chris@909: 0.upto(255) do |i| Chris@909: if widths[map[i]] == nil Chris@909: puts "Warning: character #{map[i]} is missing" Chris@909: widths[i] = widths['.notdef'] Chris@909: else Chris@909: widths[i] = widths[map[i]] Chris@909: end Chris@909: end Chris@909: end Chris@909: Chris@909: fm['Widths'] = widths Chris@909: Chris@909: return fm Chris@909: end Chris@909: Chris@909: def MakeFontDescriptor(fm, symbolic) Chris@909: Chris@909: # Ascent Chris@909: asc = fm['Ascender'] ? fm['Ascender'] : 1000 Chris@909: fd = "{\n 'Ascent' => '#{asc}'" Chris@909: Chris@909: # Descent Chris@909: desc = fm['Descender'] ? fm['Descender'] : -200 Chris@909: fd += ", 'Descent' => '#{desc}'" Chris@909: Chris@909: # CapHeight Chris@909: if fm['CapHeight'] then Chris@909: ch = fm['CapHeight'] Chris@909: elsif fm['CapXHeight'] Chris@909: ch = fm['CapXHeight'] Chris@909: else Chris@909: ch = asc Chris@909: end Chris@909: fd += ", 'CapHeight' => '#{ch}'" Chris@909: Chris@909: # Flags Chris@909: flags = 0 Chris@909: Chris@909: if fm['IsFixedPitch'] then Chris@909: flags += 1 << 0 Chris@909: end Chris@909: Chris@909: if symbolic then Chris@909: flags += 1 << 2 Chris@909: else Chris@909: flags += 1 << 5 Chris@909: end Chris@909: Chris@909: if fm['ItalicAngle'] && (fm['ItalicAngle'] != 0) then Chris@909: flags += 1 << 6 Chris@909: end Chris@909: Chris@909: fd += ",\n 'Flags' => '#{flags}'" Chris@909: Chris@909: # FontBBox Chris@909: if fm['FontBBox'] then Chris@909: fbb = fm['FontBBox'].gsub(/,/, ' ') Chris@909: else Chris@909: fbb = "[0 #{desc - 100} 1000 #{asc + 100}]" Chris@909: end Chris@909: Chris@909: fd += ", 'FontBBox' => '#{fbb}'" Chris@909: Chris@909: # ItalicAngle Chris@909: ia = fm['ItalicAngle'] ? fm['ItalicAngle'] : 0 Chris@909: fd += ",\n 'ItalicAngle' => '#{ia}'" Chris@909: Chris@909: # StemV Chris@909: if fm['StdVW'] then Chris@909: stemv = fm['StdVW'] Chris@909: elsif fm['Weight'] && (/bold|black/i =~ fm['Weight']) Chris@909: stemv = 120 Chris@909: else Chris@909: stemv = 70 Chris@909: end Chris@909: Chris@909: fd += ", 'StemV' => '#{stemv}'" Chris@909: Chris@909: # MissingWidth Chris@909: if fm['MissingWidth'] then Chris@909: fd += ", 'MissingWidth' => '#{fm['MissingWidth']}'" Chris@909: end Chris@909: Chris@909: fd += "\n }" Chris@909: return fd Chris@909: end Chris@909: Chris@909: def MakeWidthArray(fm) Chris@909: Chris@909: # Make character width array Chris@909: s = " [\n " Chris@909: Chris@909: cw = fm['Widths'] Chris@909: Chris@909: 0.upto(255) do |i| Chris@909: s += "%5d" % cw[i] Chris@909: s += "," if i != 255 Chris@909: s += "\n " if (i % 8) == 7 Chris@909: end Chris@909: Chris@909: s += ']' Chris@909: Chris@909: return s Chris@909: end Chris@909: Chris@909: def MakeFontEncoding(map) Chris@909: Chris@909: # Build differences from reference encoding Chris@909: ref = Charencodings['cp1252'] Chris@909: s = '' Chris@909: last = 0 Chris@909: 32.upto(255) do |i| Chris@909: if map[i] != ref[i] then Chris@909: if i != last + 1 then Chris@909: s += i.to_s + ' ' Chris@909: end Chris@909: last = i Chris@909: s += '/' + map[i] + ' ' Chris@909: end Chris@909: end Chris@909: return s.rstrip Chris@909: end Chris@909: Chris@909: def ReadShort(f) Chris@909: a = f.read(2).unpack('n') Chris@909: return a[0] Chris@909: end Chris@909: Chris@909: def ReadLong(f) Chris@909: a = f.read(4).unpack('N') Chris@909: return a[0] Chris@909: end Chris@909: Chris@909: def CheckTTF(file) Chris@909: Chris@909: rl = false Chris@909: pp = false Chris@909: e = false Chris@909: Chris@909: # Check if font license allows embedding Chris@909: File.open(file, 'rb') do |f| Chris@909: Chris@909: # Extract number of tables Chris@909: f.seek(4, IO::SEEK_CUR) Chris@909: nb = ReadShort(f) Chris@909: f.seek(6, IO::SEEK_CUR) Chris@909: Chris@909: # Seek OS/2 table Chris@909: found = false Chris@909: 0.upto(nb - 1) do |i| Chris@909: if f.read(4) == 'OS/2' then Chris@909: found = true Chris@909: break Chris@909: end Chris@909: Chris@909: f.seek(12, IO::SEEK_CUR) Chris@909: end Chris@909: Chris@909: if ! found then Chris@909: return Chris@909: end Chris@909: Chris@909: f.seek(4, IO::SEEK_CUR) Chris@909: offset = ReadLong(f) Chris@909: f.seek(offset, IO::SEEK_SET) Chris@909: Chris@909: # Extract fsType flags Chris@909: f.seek(8, IO::SEEK_CUR) Chris@909: fsType = ReadShort(f) Chris@909: Chris@909: rl = (fsType & 0x02) != 0 Chris@909: pp = (fsType & 0x04) != 0 Chris@909: e = (fsType & 0x08) != 0 Chris@909: end Chris@909: Chris@909: if rl && ( ! pp) && ( ! e) then Chris@909: puts 'Warning: font license does not allow embedding' Chris@909: end Chris@909: end Chris@909: Chris@909: # Chris@909: # fontfile: path to TTF file (or empty string if not to be embedded) Chris@909: # afmfile: path to AFM file Chris@909: # enc: font encoding (or empty string for symbolic fonts) Chris@909: # patch: optional patch for encoding Chris@909: # type : font type if $fontfile is empty Chris@909: # Chris@909: def MakeFont(fontfile, afmfile, enc = 'cp1252', patch = {}, type = 'TrueType') Chris@909: # Generate a font definition file Chris@909: if (enc != nil) && (enc != '') then Chris@909: map = Charencodings[enc] Chris@909: patch.each { |cc, gn| map[cc] = gn } Chris@909: else Chris@909: map = [] Chris@909: end Chris@909: Chris@909: raise "Error: AFM file not found: #{afmfile}" unless File.exists?(afmfile) Chris@909: Chris@909: fm = ReadAFM(afmfile, map) Chris@909: Chris@909: if (enc != nil) && (enc != '') then Chris@909: diff = MakeFontEncoding(map) Chris@909: else Chris@909: diff = '' Chris@909: end Chris@909: Chris@909: fd = MakeFontDescriptor(fm, (map.size == 0)) Chris@909: Chris@909: # Find font type Chris@909: if fontfile then Chris@909: ext = File.extname(fontfile).downcase.sub(/^\./, '') Chris@909: Chris@909: if ext == 'ttf' then Chris@909: type = 'TrueType' Chris@909: elsif ext == 'pfb' Chris@909: type = 'Type1' Chris@909: else Chris@909: raise "Error: unrecognized font file extension: #{ext}" Chris@909: end Chris@909: else Chris@909: raise "Error: incorrect font type: #{type}" if (type != 'TrueType') && (type != 'Type1') Chris@909: end Chris@909: printf "type = #{type}\n" Chris@909: # Start generation Chris@909: s = "# #{fm['FontName']} font definition\n\n" Chris@909: s += "module FontDef\n" Chris@909: s += " def FontDef.type\n '#{type}'\n end\n" Chris@909: s += " def FontDef.name\n '#{fm['FontName']}'\n end\n" Chris@909: s += " def FontDef.desc\n #{fd}\n end\n" Chris@909: Chris@909: if fm['UnderlinePosition'] == nil then Chris@909: fm['UnderlinePosition'] = -100 Chris@909: end Chris@909: Chris@909: if fm['UnderlineThickness'] == nil then Chris@909: fm['UnderlineThickness'] = 50 Chris@909: end Chris@909: Chris@909: s += " def FontDef.up\n #{fm['UnderlinePosition']}\n end\n" Chris@909: s += " def FontDef.ut\n #{fm['UnderlineThickness']}\n end\n" Chris@909: Chris@909: w = MakeWidthArray(fm) Chris@909: s += " def FontDef.cw\n#{w}\n end\n" Chris@909: Chris@909: s += " def FontDef.enc\n '#{enc}'\n end\n" Chris@909: s += " def FontDef.diff\n #{(diff == nil) || (diff == '') ? 'nil' : '\'' + diff '\''}\n end\n" Chris@909: Chris@909: basename = File.basename(afmfile, '.*') Chris@909: Chris@909: if fontfile then Chris@909: # Embedded font Chris@909: if ! File.exist?(fontfile) then Chris@909: raise "Error: font file not found: #{fontfile}" Chris@909: end Chris@909: Chris@909: if type == 'TrueType' then Chris@909: CheckTTF(fontfile) Chris@909: end Chris@909: Chris@909: file = '' Chris@909: File.open(fontfile, 'rb') do |f| Chris@909: file = f.read() Chris@909: end Chris@909: Chris@909: if type == 'Type1' then Chris@909: # Find first two sections and discard third one Chris@909: header = file[0] == 128 Chris@909: file = file[6, file.length - 6] if header Chris@909: Chris@909: pos = file.index('eexec') Chris@909: raise 'Error: font file does not seem to be valid Type1' if pos == nil Chris@909: Chris@909: size1 = pos + 6 Chris@909: Chris@909: file = file[0, size1] + file[size1 + 6, file.length - (size1 + 6)] if header && file[size1] == 128 Chris@909: Chris@909: pos = file.index('00000000') Chris@909: raise 'Error: font file does not seem to be valid Type1' if pos == nil Chris@909: Chris@909: size2 = pos - size1 Chris@909: file = file[0, size1 + size2] Chris@909: end Chris@909: Chris@909: if require 'zlib' then Chris@909: File.open(basename + '.z', 'wb') { |f| f.write(Zlib::Deflate.deflate(file)) } Chris@909: s += " def FontDef.file\n '#{basename}.z'\n end\n" Chris@909: puts "Font file compressed ('#{basename}.z')" Chris@909: else Chris@909: s += " def FontDef.file\n '#{File.basename(fontfile)}'\n end\n" Chris@909: puts 'Notice: font file could not be compressed (zlib not available)' Chris@909: end Chris@909: Chris@909: if type == 'Type1' then Chris@909: s += " def FontDef.size1\n '#{size1}'\n end\n" Chris@909: s += " def FontDef.size2\n '#{size2}'\n end\n" Chris@909: else Chris@909: s += " def FontDef.originalsize\n '#{File.size(fontfile)}'\n end\n" Chris@909: end Chris@909: Chris@909: else Chris@909: # Not embedded font Chris@909: s += " def FontDef.file\n ''\n end\n" Chris@909: end Chris@909: Chris@909: s += "end\n" Chris@909: File.open(basename + '.rb', 'w') { |file| file.write(s)} Chris@909: puts "Font definition file generated (#{basename}.rb)" Chris@909: end Chris@909: Chris@909: Chris@909: if $0 == __FILE__ then Chris@909: if ARGV.length >= 3 then Chris@909: enc = ARGV[2] Chris@909: else Chris@909: enc = 'cp1252' Chris@909: end Chris@909: Chris@909: if ARGV.length >= 4 then Chris@909: patch = ARGV[3] Chris@909: else Chris@909: patch = {} Chris@909: end Chris@909: Chris@909: if ARGV.length >= 5 then Chris@909: type = ARGV[4] Chris@909: else Chris@909: type = 'TrueType' Chris@909: end Chris@909: Chris@909: MakeFont(ARGV[0], ARGV[1], enc, patch, type) Chris@909: end