Shawn O. Pearce | c4638f6 | 2007-07-19 01:13:29 -0400 | [diff] [blame] | 1 | # git-gui encoding support |
| 2 | # Copyright (C) 2005 Paul Mackerras <paulus@samba.org> |
| 3 | # (Copied from gitk, commit fd8ccbec4f0161) |
| 4 | |
| 5 | # This list of encoding names and aliases is distilled from |
| 6 | # http://www.iana.org/assignments/character-sets. |
| 7 | # Not all of them are supported by Tcl. |
| 8 | set encoding_aliases { |
| 9 | { ANSI_X3.4-1968 iso-ir-6 ANSI_X3.4-1986 ISO_646.irv:1991 ASCII |
| 10 | ISO646-US US-ASCII us IBM367 cp367 csASCII } |
| 11 | { ISO-10646-UTF-1 csISO10646UTF1 } |
| 12 | { ISO_646.basic:1983 ref csISO646basic1983 } |
| 13 | { INVARIANT csINVARIANT } |
| 14 | { ISO_646.irv:1983 iso-ir-2 irv csISO2IntlRefVersion } |
| 15 | { BS_4730 iso-ir-4 ISO646-GB gb uk csISO4UnitedKingdom } |
| 16 | { NATS-SEFI iso-ir-8-1 csNATSSEFI } |
| 17 | { NATS-SEFI-ADD iso-ir-8-2 csNATSSEFIADD } |
| 18 | { NATS-DANO iso-ir-9-1 csNATSDANO } |
| 19 | { NATS-DANO-ADD iso-ir-9-2 csNATSDANOADD } |
| 20 | { SEN_850200_B iso-ir-10 FI ISO646-FI ISO646-SE se csISO10Swedish } |
| 21 | { SEN_850200_C iso-ir-11 ISO646-SE2 se2 csISO11SwedishForNames } |
| 22 | { KS_C_5601-1987 iso-ir-149 KS_C_5601-1989 KSC_5601 korean csKSC56011987 } |
| 23 | { ISO-2022-KR csISO2022KR } |
| 24 | { EUC-KR csEUCKR } |
| 25 | { ISO-2022-JP csISO2022JP } |
| 26 | { ISO-2022-JP-2 csISO2022JP2 } |
| 27 | { JIS_C6220-1969-jp JIS_C6220-1969 iso-ir-13 katakana x0201-7 |
| 28 | csISO13JISC6220jp } |
| 29 | { JIS_C6220-1969-ro iso-ir-14 jp ISO646-JP csISO14JISC6220ro } |
| 30 | { IT iso-ir-15 ISO646-IT csISO15Italian } |
| 31 | { PT iso-ir-16 ISO646-PT csISO16Portuguese } |
| 32 | { ES iso-ir-17 ISO646-ES csISO17Spanish } |
| 33 | { greek7-old iso-ir-18 csISO18Greek7Old } |
| 34 | { latin-greek iso-ir-19 csISO19LatinGreek } |
| 35 | { DIN_66003 iso-ir-21 de ISO646-DE csISO21German } |
| 36 | { NF_Z_62-010_(1973) iso-ir-25 ISO646-FR1 csISO25French } |
| 37 | { Latin-greek-1 iso-ir-27 csISO27LatinGreek1 } |
| 38 | { ISO_5427 iso-ir-37 csISO5427Cyrillic } |
| 39 | { JIS_C6226-1978 iso-ir-42 csISO42JISC62261978 } |
| 40 | { BS_viewdata iso-ir-47 csISO47BSViewdata } |
| 41 | { INIS iso-ir-49 csISO49INIS } |
| 42 | { INIS-8 iso-ir-50 csISO50INIS8 } |
| 43 | { INIS-cyrillic iso-ir-51 csISO51INISCyrillic } |
| 44 | { ISO_5427:1981 iso-ir-54 ISO5427Cyrillic1981 } |
| 45 | { ISO_5428:1980 iso-ir-55 csISO5428Greek } |
| 46 | { GB_1988-80 iso-ir-57 cn ISO646-CN csISO57GB1988 } |
| 47 | { GB_2312-80 iso-ir-58 chinese csISO58GB231280 } |
| 48 | { NS_4551-1 iso-ir-60 ISO646-NO no csISO60DanishNorwegian |
| 49 | csISO60Norwegian1 } |
| 50 | { NS_4551-2 ISO646-NO2 iso-ir-61 no2 csISO61Norwegian2 } |
| 51 | { NF_Z_62-010 iso-ir-69 ISO646-FR fr csISO69French } |
| 52 | { videotex-suppl iso-ir-70 csISO70VideotexSupp1 } |
| 53 | { PT2 iso-ir-84 ISO646-PT2 csISO84Portuguese2 } |
| 54 | { ES2 iso-ir-85 ISO646-ES2 csISO85Spanish2 } |
| 55 | { MSZ_7795.3 iso-ir-86 ISO646-HU hu csISO86Hungarian } |
| 56 | { JIS_C6226-1983 iso-ir-87 x0208 JIS_X0208-1983 csISO87JISX0208 } |
| 57 | { greek7 iso-ir-88 csISO88Greek7 } |
| 58 | { ASMO_449 ISO_9036 arabic7 iso-ir-89 csISO89ASMO449 } |
| 59 | { iso-ir-90 csISO90 } |
| 60 | { JIS_C6229-1984-a iso-ir-91 jp-ocr-a csISO91JISC62291984a } |
| 61 | { JIS_C6229-1984-b iso-ir-92 ISO646-JP-OCR-B jp-ocr-b |
| 62 | csISO92JISC62991984b } |
| 63 | { JIS_C6229-1984-b-add iso-ir-93 jp-ocr-b-add csISO93JIS62291984badd } |
| 64 | { JIS_C6229-1984-hand iso-ir-94 jp-ocr-hand csISO94JIS62291984hand } |
| 65 | { JIS_C6229-1984-hand-add iso-ir-95 jp-ocr-hand-add |
| 66 | csISO95JIS62291984handadd } |
| 67 | { JIS_C6229-1984-kana iso-ir-96 csISO96JISC62291984kana } |
| 68 | { ISO_2033-1983 iso-ir-98 e13b csISO2033 } |
| 69 | { ANSI_X3.110-1983 iso-ir-99 CSA_T500-1983 NAPLPS csISO99NAPLPS } |
| 70 | { ISO_8859-1:1987 iso-ir-100 ISO_8859-1 ISO-8859-1 latin1 l1 IBM819 |
| 71 | CP819 csISOLatin1 } |
| 72 | { ISO_8859-2:1987 iso-ir-101 ISO_8859-2 ISO-8859-2 latin2 l2 csISOLatin2 } |
| 73 | { T.61-7bit iso-ir-102 csISO102T617bit } |
| 74 | { T.61-8bit T.61 iso-ir-103 csISO103T618bit } |
| 75 | { ISO_8859-3:1988 iso-ir-109 ISO_8859-3 ISO-8859-3 latin3 l3 csISOLatin3 } |
| 76 | { ISO_8859-4:1988 iso-ir-110 ISO_8859-4 ISO-8859-4 latin4 l4 csISOLatin4 } |
| 77 | { ECMA-cyrillic iso-ir-111 KOI8-E csISO111ECMACyrillic } |
| 78 | { CSA_Z243.4-1985-1 iso-ir-121 ISO646-CA csa7-1 ca csISO121Canadian1 } |
| 79 | { CSA_Z243.4-1985-2 iso-ir-122 ISO646-CA2 csa7-2 csISO122Canadian2 } |
| 80 | { CSA_Z243.4-1985-gr iso-ir-123 csISO123CSAZ24341985gr } |
| 81 | { ISO_8859-6:1987 iso-ir-127 ISO_8859-6 ISO-8859-6 ECMA-114 ASMO-708 |
| 82 | arabic csISOLatinArabic } |
| 83 | { ISO_8859-6-E csISO88596E ISO-8859-6-E } |
| 84 | { ISO_8859-6-I csISO88596I ISO-8859-6-I } |
| 85 | { ISO_8859-7:1987 iso-ir-126 ISO_8859-7 ISO-8859-7 ELOT_928 ECMA-118 |
| 86 | greek greek8 csISOLatinGreek } |
| 87 | { T.101-G2 iso-ir-128 csISO128T101G2 } |
| 88 | { ISO_8859-8:1988 iso-ir-138 ISO_8859-8 ISO-8859-8 hebrew |
| 89 | csISOLatinHebrew } |
| 90 | { ISO_8859-8-E csISO88598E ISO-8859-8-E } |
| 91 | { ISO_8859-8-I csISO88598I ISO-8859-8-I } |
| 92 | { CSN_369103 iso-ir-139 csISO139CSN369103 } |
| 93 | { JUS_I.B1.002 iso-ir-141 ISO646-YU js yu csISO141JUSIB1002 } |
| 94 | { ISO_6937-2-add iso-ir-142 csISOTextComm } |
| 95 | { IEC_P27-1 iso-ir-143 csISO143IECP271 } |
| 96 | { ISO_8859-5:1988 iso-ir-144 ISO_8859-5 ISO-8859-5 cyrillic |
| 97 | csISOLatinCyrillic } |
| 98 | { JUS_I.B1.003-serb iso-ir-146 serbian csISO146Serbian } |
| 99 | { JUS_I.B1.003-mac macedonian iso-ir-147 csISO147Macedonian } |
| 100 | { ISO_8859-9:1989 iso-ir-148 ISO_8859-9 ISO-8859-9 latin5 l5 csISOLatin5 } |
| 101 | { greek-ccitt iso-ir-150 csISO150 csISO150GreekCCITT } |
| 102 | { NC_NC00-10:81 cuba iso-ir-151 ISO646-CU csISO151Cuba } |
| 103 | { ISO_6937-2-25 iso-ir-152 csISO6937Add } |
| 104 | { GOST_19768-74 ST_SEV_358-88 iso-ir-153 csISO153GOST1976874 } |
| 105 | { ISO_8859-supp iso-ir-154 latin1-2-5 csISO8859Supp } |
| 106 | { ISO_10367-box iso-ir-155 csISO10367Box } |
| 107 | { ISO-8859-10 iso-ir-157 l6 ISO_8859-10:1992 csISOLatin6 latin6 } |
| 108 | { latin-lap lap iso-ir-158 csISO158Lap } |
| 109 | { JIS_X0212-1990 x0212 iso-ir-159 csISO159JISX02121990 } |
| 110 | { DS_2089 DS2089 ISO646-DK dk csISO646Danish } |
| 111 | { us-dk csUSDK } |
| 112 | { dk-us csDKUS } |
| 113 | { JIS_X0201 X0201 csHalfWidthKatakana } |
| 114 | { KSC5636 ISO646-KR csKSC5636 } |
| 115 | { ISO-10646-UCS-2 csUnicode } |
| 116 | { ISO-10646-UCS-4 csUCS4 } |
| 117 | { DEC-MCS dec csDECMCS } |
| 118 | { hp-roman8 roman8 r8 csHPRoman8 } |
| 119 | { macintosh mac csMacintosh } |
| 120 | { IBM037 cp037 ebcdic-cp-us ebcdic-cp-ca ebcdic-cp-wt ebcdic-cp-nl |
| 121 | csIBM037 } |
| 122 | { IBM038 EBCDIC-INT cp038 csIBM038 } |
| 123 | { IBM273 CP273 csIBM273 } |
| 124 | { IBM274 EBCDIC-BE CP274 csIBM274 } |
| 125 | { IBM275 EBCDIC-BR cp275 csIBM275 } |
| 126 | { IBM277 EBCDIC-CP-DK EBCDIC-CP-NO csIBM277 } |
| 127 | { IBM278 CP278 ebcdic-cp-fi ebcdic-cp-se csIBM278 } |
| 128 | { IBM280 CP280 ebcdic-cp-it csIBM280 } |
| 129 | { IBM281 EBCDIC-JP-E cp281 csIBM281 } |
| 130 | { IBM284 CP284 ebcdic-cp-es csIBM284 } |
| 131 | { IBM285 CP285 ebcdic-cp-gb csIBM285 } |
| 132 | { IBM290 cp290 EBCDIC-JP-kana csIBM290 } |
| 133 | { IBM297 cp297 ebcdic-cp-fr csIBM297 } |
| 134 | { IBM420 cp420 ebcdic-cp-ar1 csIBM420 } |
| 135 | { IBM423 cp423 ebcdic-cp-gr csIBM423 } |
| 136 | { IBM424 cp424 ebcdic-cp-he csIBM424 } |
| 137 | { IBM437 cp437 437 csPC8CodePage437 } |
| 138 | { IBM500 CP500 ebcdic-cp-be ebcdic-cp-ch csIBM500 } |
| 139 | { IBM775 cp775 csPC775Baltic } |
| 140 | { IBM850 cp850 850 csPC850Multilingual } |
| 141 | { IBM851 cp851 851 csIBM851 } |
| 142 | { IBM852 cp852 852 csPCp852 } |
| 143 | { IBM855 cp855 855 csIBM855 } |
| 144 | { IBM857 cp857 857 csIBM857 } |
| 145 | { IBM860 cp860 860 csIBM860 } |
| 146 | { IBM861 cp861 861 cp-is csIBM861 } |
| 147 | { IBM862 cp862 862 csPC862LatinHebrew } |
| 148 | { IBM863 cp863 863 csIBM863 } |
| 149 | { IBM864 cp864 csIBM864 } |
| 150 | { IBM865 cp865 865 csIBM865 } |
| 151 | { IBM866 cp866 866 csIBM866 } |
| 152 | { IBM868 CP868 cp-ar csIBM868 } |
| 153 | { IBM869 cp869 869 cp-gr csIBM869 } |
| 154 | { IBM870 CP870 ebcdic-cp-roece ebcdic-cp-yu csIBM870 } |
| 155 | { IBM871 CP871 ebcdic-cp-is csIBM871 } |
| 156 | { IBM880 cp880 EBCDIC-Cyrillic csIBM880 } |
| 157 | { IBM891 cp891 csIBM891 } |
| 158 | { IBM903 cp903 csIBM903 } |
| 159 | { IBM904 cp904 904 csIBBM904 } |
| 160 | { IBM905 CP905 ebcdic-cp-tr csIBM905 } |
| 161 | { IBM918 CP918 ebcdic-cp-ar2 csIBM918 } |
| 162 | { IBM1026 CP1026 csIBM1026 } |
| 163 | { EBCDIC-AT-DE csIBMEBCDICATDE } |
| 164 | { EBCDIC-AT-DE-A csEBCDICATDEA } |
| 165 | { EBCDIC-CA-FR csEBCDICCAFR } |
| 166 | { EBCDIC-DK-NO csEBCDICDKNO } |
| 167 | { EBCDIC-DK-NO-A csEBCDICDKNOA } |
| 168 | { EBCDIC-FI-SE csEBCDICFISE } |
| 169 | { EBCDIC-FI-SE-A csEBCDICFISEA } |
| 170 | { EBCDIC-FR csEBCDICFR } |
| 171 | { EBCDIC-IT csEBCDICIT } |
| 172 | { EBCDIC-PT csEBCDICPT } |
| 173 | { EBCDIC-ES csEBCDICES } |
| 174 | { EBCDIC-ES-A csEBCDICESA } |
| 175 | { EBCDIC-ES-S csEBCDICESS } |
| 176 | { EBCDIC-UK csEBCDICUK } |
| 177 | { EBCDIC-US csEBCDICUS } |
| 178 | { UNKNOWN-8BIT csUnknown8BiT } |
| 179 | { MNEMONIC csMnemonic } |
| 180 | { MNEM csMnem } |
| 181 | { VISCII csVISCII } |
| 182 | { VIQR csVIQR } |
| 183 | { KOI8-R csKOI8R } |
| 184 | { IBM00858 CCSID00858 CP00858 PC-Multilingual-850+euro } |
| 185 | { IBM00924 CCSID00924 CP00924 ebcdic-Latin9--euro } |
| 186 | { IBM01140 CCSID01140 CP01140 ebcdic-us-37+euro } |
| 187 | { IBM01141 CCSID01141 CP01141 ebcdic-de-273+euro } |
| 188 | { IBM01142 CCSID01142 CP01142 ebcdic-dk-277+euro ebcdic-no-277+euro } |
| 189 | { IBM01143 CCSID01143 CP01143 ebcdic-fi-278+euro ebcdic-se-278+euro } |
| 190 | { IBM01144 CCSID01144 CP01144 ebcdic-it-280+euro } |
| 191 | { IBM01145 CCSID01145 CP01145 ebcdic-es-284+euro } |
| 192 | { IBM01146 CCSID01146 CP01146 ebcdic-gb-285+euro } |
| 193 | { IBM01147 CCSID01147 CP01147 ebcdic-fr-297+euro } |
| 194 | { IBM01148 CCSID01148 CP01148 ebcdic-international-500+euro } |
| 195 | { IBM01149 CCSID01149 CP01149 ebcdic-is-871+euro } |
| 196 | { IBM1047 IBM-1047 } |
| 197 | { PTCP154 csPTCP154 PT154 CP154 Cyrillic-Asian } |
| 198 | { Amiga-1251 Ami1251 Amiga1251 Ami-1251 } |
| 199 | { UNICODE-1-1 csUnicode11 } |
| 200 | { CESU-8 csCESU-8 } |
| 201 | { BOCU-1 csBOCU-1 } |
| 202 | { UNICODE-1-1-UTF-7 csUnicode11UTF7 } |
| 203 | { ISO-8859-14 iso-ir-199 ISO_8859-14:1998 ISO_8859-14 latin8 iso-celtic |
| 204 | l8 } |
| 205 | { ISO-8859-15 ISO_8859-15 Latin-9 } |
| 206 | { ISO-8859-16 iso-ir-226 ISO_8859-16:2001 ISO_8859-16 latin10 l10 } |
| 207 | { GBK CP936 MS936 windows-936 } |
| 208 | { JIS_Encoding csJISEncoding } |
Alexander Gavrilov | 50102c5 | 2008-09-18 01:07:33 +0400 | [diff] [blame] | 209 | { Shift_JIS MS_Kanji csShiftJIS ShiftJIS Shift-JIS } |
Shawn O. Pearce | c4638f6 | 2007-07-19 01:13:29 -0400 | [diff] [blame] | 210 | { Extended_UNIX_Code_Packed_Format_for_Japanese csEUCPkdFmtJapanese |
| 211 | EUC-JP } |
| 212 | { Extended_UNIX_Code_Fixed_Width_for_Japanese csEUCFixWidJapanese } |
| 213 | { ISO-10646-UCS-Basic csUnicodeASCII } |
| 214 | { ISO-10646-Unicode-Latin1 csUnicodeLatin1 ISO-10646 } |
| 215 | { ISO-Unicode-IBM-1261 csUnicodeIBM1261 } |
| 216 | { ISO-Unicode-IBM-1268 csUnicodeIBM1268 } |
| 217 | { ISO-Unicode-IBM-1276 csUnicodeIBM1276 } |
| 218 | { ISO-Unicode-IBM-1264 csUnicodeIBM1264 } |
| 219 | { ISO-Unicode-IBM-1265 csUnicodeIBM1265 } |
| 220 | { ISO-8859-1-Windows-3.0-Latin-1 csWindows30Latin1 } |
| 221 | { ISO-8859-1-Windows-3.1-Latin-1 csWindows31Latin1 } |
| 222 | { ISO-8859-2-Windows-Latin-2 csWindows31Latin2 } |
| 223 | { ISO-8859-9-Windows-Latin-5 csWindows31Latin5 } |
| 224 | { Adobe-Standard-Encoding csAdobeStandardEncoding } |
| 225 | { Ventura-US csVenturaUS } |
| 226 | { Ventura-International csVenturaInternational } |
| 227 | { PC8-Danish-Norwegian csPC8DanishNorwegian } |
| 228 | { PC8-Turkish csPC8Turkish } |
| 229 | { IBM-Symbols csIBMSymbols } |
| 230 | { IBM-Thai csIBMThai } |
| 231 | { HP-Legal csHPLegal } |
| 232 | { HP-Pi-font csHPPiFont } |
| 233 | { HP-Math8 csHPMath8 } |
| 234 | { Adobe-Symbol-Encoding csHPPSMath } |
| 235 | { HP-DeskTop csHPDesktop } |
| 236 | { Ventura-Math csVenturaMath } |
| 237 | { Microsoft-Publishing csMicrosoftPublishing } |
| 238 | { Windows-31J csWindows31J } |
| 239 | { GB2312 csGB2312 } |
| 240 | { Big5 csBig5 } |
| 241 | } |
| 242 | |
Alexander Gavrilov | 50102c5 | 2008-09-18 01:07:33 +0400 | [diff] [blame] | 243 | set encoding_groups { |
| 244 | {"" "" |
| 245 | {"Unicode" UTF-8} |
| 246 | {"Western" ISO-8859-1}} |
| 247 | {we "West European" |
| 248 | {"Western" ISO-8859-15 CP-437 CP-850 MacRoman CP-1252 Windows-1252} |
| 249 | {"Celtic" ISO-8859-14} |
| 250 | {"Greek" ISO-8859-14 ISO-8859-7 CP-737 CP-869 MacGreek CP-1253 Windows-1253} |
| 251 | {"Icelandic" MacIceland MacIcelandic CP-861} |
| 252 | {"Nordic" ISO-8859-10 CP-865} |
| 253 | {"Portuguese" CP-860} |
| 254 | {"South European" ISO-8859-3}} |
| 255 | {ee "East European" |
| 256 | {"Baltic" CP-775 ISO-8859-4 ISO-8859-13 CP-1257 Windows-1257} |
| 257 | {"Central European" CP-852 ISO-8859-2 MacCE CP-1250 Windows-1250} |
| 258 | {"Croatian" MacCroatian} |
| 259 | {"Cyrillic" CP-855 ISO-8859-5 ISO-IR-111 KOI8-R MacCyrillic CP-1251 Windows-1251} |
| 260 | {"Russian" CP-866} |
| 261 | {"Ukrainian" KOI8-U MacUkraine MacUkrainian} |
| 262 | {"Romanian" ISO-8859-16 MacRomania MacRomanian}} |
| 263 | {ea "East Asian" |
| 264 | {"Generic" ISO-2022} |
| 265 | {"Chinese Simplified" GB2312 GB1988 GB12345 GB2312-RAW GBK EUC-CN GB18030 HZ ISO-2022-CN} |
| 266 | {"Chinese Traditional" Big5 Big5-HKSCS EUC-TW CP-950} |
| 267 | {"Japanese" EUC-JP ISO-2022-JP Shift-JIS JIS-0212 JIS-0208 JIS-0201 CP-932 MacJapan} |
| 268 | {"Korean" EUC-KR UHC JOHAB ISO-2022-KR CP-949 KSC5601}} |
| 269 | {sa "SE & SW Asian" |
| 270 | {"Armenian" ARMSCII-8} |
| 271 | {"Georgian" GEOSTD8} |
| 272 | {"Thai" TIS-620 ISO-8859-11 CP-874 Windows-874 MacThai} |
| 273 | {"Turkish" CP-857 CP857 ISO-8859-9 MacTurkish CP-1254 Windows-1254} |
| 274 | {"Vietnamese" TCVN VISCII VPS CP-1258 Windows-1258} |
| 275 | {"Hindi" MacDevanagari} |
| 276 | {"Gujarati" MacGujarati} |
| 277 | {"Gurmukhi" MacGurmukhi}} |
| 278 | {me "Middle Eastern" |
| 279 | {"Arabic" ISO-8859-6 Windows-1256 CP-1256 CP-864 MacArabic} |
| 280 | {"Farsi" MacFarsi} |
| 281 | {"Hebrew" ISO-8859-8-I Windows-1255 CP-1255 ISO-8859-8 CP-862 MacHebrew}} |
| 282 | {mi "Misc" |
| 283 | {"7-bit" ASCII} |
| 284 | {"16-bit" Unicode} |
| 285 | {"Legacy" CP-863 EBCDIC} |
| 286 | {"Symbol" Symbol Dingbats MacDingbats MacCentEuro}} |
| 287 | } |
| 288 | |
Alexander Gavrilov | a1c3feb | 2008-09-18 01:07:35 +0400 | [diff] [blame] | 289 | proc build_encoding_table {} { |
| 290 | global encoding_aliases encoding_lookup_table |
| 291 | |
| 292 | # Prepare the lookup list; cannot use lsort -nocase because |
| 293 | # of compatibility issues with older Tcl (e.g. in msysgit) |
| 294 | set names [list] |
| 295 | foreach item [encoding names] { |
| 296 | lappend names [list [string tolower $item] $item] |
Shawn O. Pearce | c4638f6 | 2007-07-19 01:13:29 -0400 | [diff] [blame] | 297 | } |
Alexander Gavrilov | a1c3feb | 2008-09-18 01:07:35 +0400 | [diff] [blame] | 298 | set names [lsort -ascii -index 0 $names] |
| 299 | # neither can we use lsearch -index |
| 300 | set lnames [list] |
| 301 | foreach item $names { |
| 302 | lappend lnames [lindex $item 0] |
| 303 | } |
| 304 | |
| 305 | foreach grp $encoding_aliases { |
| 306 | set target {} |
| 307 | foreach item $grp { |
| 308 | set i [lsearch -sorted -ascii $lnames \ |
| 309 | [string tolower $item]] |
| 310 | if {$i >= 0} { |
| 311 | set target [lindex $names $i 1] |
| 312 | break |
| 313 | } |
Shawn O. Pearce | c4638f6 | 2007-07-19 01:13:29 -0400 | [diff] [blame] | 314 | } |
Alexander Gavrilov | a1c3feb | 2008-09-18 01:07:35 +0400 | [diff] [blame] | 315 | if {$target eq {}} continue |
| 316 | foreach item $grp { |
| 317 | set encoding_lookup_table([string tolower $item]) $target |
| 318 | } |
Shawn O. Pearce | c4638f6 | 2007-07-19 01:13:29 -0400 | [diff] [blame] | 319 | } |
Alexander Gavrilov | a1c3feb | 2008-09-18 01:07:35 +0400 | [diff] [blame] | 320 | |
| 321 | foreach item $names { |
| 322 | set encoding_lookup_table([lindex $item 0]) [lindex $item 1] |
| 323 | } |
| 324 | } |
| 325 | |
| 326 | proc tcl_encoding {enc} { |
| 327 | global encoding_lookup_table |
| 328 | if {$enc eq {}} { |
| 329 | return {} |
| 330 | } |
| 331 | if {![info exists encoding_lookup_table]} { |
| 332 | build_encoding_table |
| 333 | } |
| 334 | set enc [string tolower $enc] |
| 335 | if {![info exists encoding_lookup_table($enc)]} { |
| 336 | # look for "isonnn" instead of "iso-nnn" or "iso_nnn" |
| 337 | if {[regsub {^(iso|cp|ibm|jis)[-_]} $enc {\1} encx]} { |
| 338 | set enc $encx |
| 339 | } |
| 340 | } |
| 341 | if {[info exists encoding_lookup_table($enc)]} { |
| 342 | return $encoding_lookup_table($enc) |
| 343 | } else { |
| 344 | return {} |
| 345 | } |
Shawn O. Pearce | c4638f6 | 2007-07-19 01:13:29 -0400 | [diff] [blame] | 346 | } |
Alexander Gavrilov | 72e6b00 | 2008-09-18 01:07:32 +0400 | [diff] [blame] | 347 | |
Alexander Gavrilov | 3fe0162 | 2008-09-18 01:07:34 +0400 | [diff] [blame] | 348 | proc force_path_encoding {path enc} { |
| 349 | global path_encoding_overrides last_encoding_override |
| 350 | |
| 351 | set enc [tcl_encoding $enc] |
| 352 | if {$enc eq {}} { |
| 353 | catch { unset last_encoding_override } |
| 354 | catch { unset path_encoding_overrides($path) } |
| 355 | } else { |
| 356 | set last_encoding_override $enc |
| 357 | if {$path ne {}} { |
| 358 | set path_encoding_overrides($path) $enc |
| 359 | } |
| 360 | } |
| 361 | } |
| 362 | |
Alexander Gavrilov | 72e6b00 | 2008-09-18 01:07:32 +0400 | [diff] [blame] | 363 | proc get_path_encoding {path} { |
Alexander Gavrilov | 3fe0162 | 2008-09-18 01:07:34 +0400 | [diff] [blame] | 364 | global path_encoding_overrides last_encoding_override |
| 365 | |
| 366 | if {[info exists last_encoding_override]} { |
| 367 | set tcl_enc $last_encoding_override |
| 368 | } else { |
| 369 | set tcl_enc [tcl_encoding [get_config gui.encoding]] |
| 370 | } |
Alexander Gavrilov | 72e6b00 | 2008-09-18 01:07:32 +0400 | [diff] [blame] | 371 | if {$tcl_enc eq {}} { |
| 372 | set tcl_enc [encoding system] |
| 373 | } |
| 374 | if {$path ne {}} { |
Alexander Gavrilov | 3fe0162 | 2008-09-18 01:07:34 +0400 | [diff] [blame] | 375 | if {[info exists path_encoding_overrides($path)]} { |
| 376 | set enc2 $path_encoding_overrides($path) |
| 377 | } else { |
| 378 | set enc2 [tcl_encoding [gitattr $path encoding $tcl_enc]] |
| 379 | } |
Alexander Gavrilov | 72e6b00 | 2008-09-18 01:07:32 +0400 | [diff] [blame] | 380 | if {$enc2 ne {}} { |
| 381 | set tcl_enc $enc2 |
| 382 | } |
| 383 | } |
| 384 | return $tcl_enc |
| 385 | } |
Alexander Gavrilov | 50102c5 | 2008-09-18 01:07:33 +0400 | [diff] [blame] | 386 | |
| 387 | proc build_encoding_submenu {parent grp cmd} { |
| 388 | global used_encodings |
| 389 | |
| 390 | set mid [lindex $grp 0] |
| 391 | set gname [mc [lindex $grp 1]] |
| 392 | |
| 393 | set smenu {} |
| 394 | foreach subset [lrange $grp 2 end] { |
| 395 | set name [mc [lindex $subset 0]] |
| 396 | |
| 397 | foreach enc [lrange $subset 1 end] { |
| 398 | set tcl_enc [tcl_encoding $enc] |
| 399 | if {$tcl_enc eq {}} continue |
| 400 | |
| 401 | if {$smenu eq {}} { |
| 402 | if {$mid eq {}} { |
| 403 | set smenu $parent |
| 404 | } else { |
| 405 | set smenu "$parent.$mid" |
| 406 | menu $smenu |
| 407 | $parent add cascade \ |
| 408 | -label $gname \ |
| 409 | -menu $smenu |
| 410 | } |
| 411 | } |
| 412 | |
| 413 | if {$name ne {}} { |
| 414 | set lbl "$name ($enc)" |
| 415 | } else { |
| 416 | set lbl $enc |
| 417 | } |
| 418 | $smenu add command \ |
| 419 | -label $lbl \ |
| 420 | -command [concat $cmd [list $tcl_enc]] |
| 421 | |
| 422 | lappend used_encodings $tcl_enc |
| 423 | } |
| 424 | } |
| 425 | } |
| 426 | |
| 427 | proc popup_btn_menu {m b} { |
| 428 | tk_popup $m [winfo pointerx $b] [winfo pointery $b] |
| 429 | } |
| 430 | |
| 431 | proc build_encoding_menu {emenu cmd {nodef 0}} { |
| 432 | $emenu configure -postcommand \ |
| 433 | [list do_build_encoding_menu $emenu $cmd $nodef] |
| 434 | } |
| 435 | |
| 436 | proc do_build_encoding_menu {emenu cmd {nodef 0}} { |
| 437 | global used_encodings encoding_groups |
| 438 | |
| 439 | $emenu configure -postcommand {} |
| 440 | |
| 441 | if {!$nodef} { |
| 442 | $emenu add command \ |
| 443 | -label [mc "Default"] \ |
| 444 | -command [concat $cmd [list {}]] |
| 445 | } |
| 446 | set sysenc [encoding system] |
| 447 | $emenu add command \ |
| 448 | -label [mc "System (%s)" $sysenc] \ |
| 449 | -command [concat $cmd [list $sysenc]] |
| 450 | |
| 451 | # Main encoding tree |
| 452 | set used_encodings [list identity] |
| 453 | $emenu add separator |
| 454 | foreach grp $encoding_groups { |
| 455 | build_encoding_submenu $emenu $grp $cmd |
| 456 | } |
| 457 | |
| 458 | # Add unclassified encodings |
| 459 | set unused_grp [list [mc Other]] |
| 460 | foreach enc [encoding names] { |
| 461 | if {[lsearch -exact $used_encodings $enc] < 0} { |
| 462 | lappend unused_grp $enc |
| 463 | } |
| 464 | } |
| 465 | build_encoding_submenu $emenu [list other [mc Other] $unused_grp] $cmd |
| 466 | } |