]> git.phdru.name Git - dotfiles.git/blob - bin/latin1_to_ascii.py
Feat(recode-filenames-recursive): Allow to omit parameters
[dotfiles.git] / bin / latin1_to_ascii.py
1 #! /usr/bin/env python
2
3 # See http://code.activestate.com/recipes/251871/
4
5 import sys, os
6
7 xlate = {
8     u'\N{ACUTE ACCENT}': "'",
9     u'\N{BROKEN BAR}': '|',
10     u'\N{CEDILLA}': '{cedilla}',
11     u'\N{CENT SIGN}': '{cent}',
12     u'\N{COPYRIGHT SIGN}': '{C}',
13     u'\N{CURRENCY SIGN}': '{currency}',
14     u'\N{DEGREE SIGN}': '{degrees}',
15     u'\N{DIAERESIS}': '{umlaut}',
16     u'\N{DIVISION SIGN}': '/',
17     u'\N{FEMININE ORDINAL INDICATOR}': '{^a}',
18     u'\N{INVERTED EXCLAMATION MARK}': '!',
19     u'\N{INVERTED QUESTION MARK}': '?',
20     u'\N{LATIN CAPITAL LETTER A WITH ACUTE}': 'A',
21     u'\N{LATIN CAPITAL LETTER A WITH CIRCUMFLEX}': 'A',
22     u'\N{LATIN CAPITAL LETTER A WITH DIAERESIS}': 'A',
23     u'\N{LATIN CAPITAL LETTER A WITH GRAVE}': 'A',
24     u'\N{LATIN CAPITAL LETTER A WITH RING ABOVE}': 'A',
25     u'\N{LATIN CAPITAL LETTER A WITH TILDE}': 'A',
26     u'\N{LATIN CAPITAL LETTER AE}': 'Ae',
27     u'\N{LATIN CAPITAL LETTER C WITH CEDILLA}': 'C',
28     u'\N{LATIN CAPITAL LETTER E WITH ACUTE}': 'E',
29     u'\N{LATIN CAPITAL LETTER E WITH CIRCUMFLEX}': 'E',
30     u'\N{LATIN CAPITAL LETTER E WITH DIAERESIS}': 'E',
31     u'\N{LATIN CAPITAL LETTER E WITH GRAVE}': 'E',
32     u'\N{LATIN CAPITAL LETTER ETH}': 'Th',
33     u'\N{LATIN CAPITAL LETTER I WITH ACUTE}': 'I',
34     u'\N{LATIN CAPITAL LETTER I WITH CIRCUMFLEX}': 'I',
35     u'\N{LATIN CAPITAL LETTER I WITH DIAERESIS}': 'I',
36     u'\N{LATIN CAPITAL LETTER I WITH GRAVE}': 'I',
37     u'\N{LATIN CAPITAL LETTER N WITH TILDE}': 'N',
38     u'\N{LATIN CAPITAL LETTER O WITH ACUTE}': 'O',
39     u'\N{LATIN CAPITAL LETTER O WITH CIRCUMFLEX}': 'O',
40     u'\N{LATIN CAPITAL LETTER O WITH DIAERESIS}': 'O',
41     u'\N{LATIN CAPITAL LETTER O WITH GRAVE}': 'O',
42     u'\N{LATIN CAPITAL LETTER O WITH STROKE}': 'O',
43     u'\N{LATIN CAPITAL LETTER O WITH TILDE}': 'O',
44     u'\N{LATIN CAPITAL LETTER THORN}': 'th',
45     u'\N{LATIN CAPITAL LETTER U WITH ACUTE}': 'U',
46     u'\N{LATIN CAPITAL LETTER U WITH CIRCUMFLEX}': 'U',
47     u'\N{LATIN CAPITAL LETTER U WITH DIAERESIS}': 'U',
48     u'\N{LATIN CAPITAL LETTER U WITH GRAVE}': 'U',
49     u'\N{LATIN CAPITAL LETTER Y WITH ACUTE}': 'Y',
50     u'\N{LATIN SMALL LETTER A WITH ACUTE}': 'a',
51     u'\N{LATIN SMALL LETTER A WITH CIRCUMFLEX}': 'a',
52     u'\N{LATIN SMALL LETTER A WITH DIAERESIS}': 'a',
53     u'\N{LATIN SMALL LETTER A WITH GRAVE}': 'a',
54     u'\N{LATIN SMALL LETTER A WITH RING ABOVE}': 'a',
55     u'\N{LATIN SMALL LETTER A WITH TILDE}': 'a',
56     u'\N{LATIN SMALL LETTER AE}': 'ae',
57     u'\N{LATIN SMALL LETTER C WITH CEDILLA}': 'c',
58     u'\N{LATIN SMALL LETTER E WITH ACUTE}': 'e',
59     u'\N{LATIN SMALL LETTER E WITH CIRCUMFLEX}': 'e',
60     u'\N{LATIN SMALL LETTER E WITH DIAERESIS}': 'e',
61     u'\N{LATIN SMALL LETTER E WITH GRAVE}': 'e',
62     u'\N{LATIN SMALL LETTER ETH}': 'th',
63     u'\N{LATIN SMALL LETTER I WITH ACUTE}': 'i',
64     u'\N{LATIN SMALL LETTER I WITH CIRCUMFLEX}': 'i',
65     u'\N{LATIN SMALL LETTER I WITH DIAERESIS}': 'i',
66     u'\N{LATIN SMALL LETTER I WITH GRAVE}': 'i',
67     u'\N{LATIN SMALL LETTER N WITH TILDE}': 'n',
68     u'\N{LATIN SMALL LETTER O WITH ACUTE}': 'o',
69     u'\N{LATIN SMALL LETTER O WITH CIRCUMFLEX}': 'o',
70     u'\N{LATIN SMALL LETTER O WITH DIAERESIS}': 'o',
71     u'\N{LATIN SMALL LETTER O WITH GRAVE}': 'o',
72     u'\N{LATIN SMALL LETTER O WITH STROKE}': 'o',
73     u'\N{LATIN SMALL LETTER O WITH TILDE}': 'o',
74     u'\N{LATIN SMALL LETTER SHARP S}': 'ss',
75     u'\N{LATIN SMALL LETTER THORN}': 'th',
76     u'\N{LATIN SMALL LETTER U WITH ACUTE}': 'u',
77     u'\N{LATIN SMALL LETTER U WITH CIRCUMFLEX}': 'u',
78     u'\N{LATIN SMALL LETTER U WITH DIAERESIS}': 'u',
79     u'\N{LATIN SMALL LETTER U WITH GRAVE}': 'u',
80     u'\N{LATIN SMALL LETTER Y WITH ACUTE}': 'y',
81     u'\N{LATIN SMALL LETTER Y WITH DIAERESIS}': 'y',
82     u'\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}': '<<',
83     u'\N{MACRON}': '_',
84     u'\N{MASCULINE ORDINAL INDICATOR}': '{^o}',
85     u'\N{MICRO SIGN}': '{micro}',
86     u'\N{MIDDLE DOT}': '*',
87     u'\N{MULTIPLICATION SIGN}': '*',
88     u'\N{NOT SIGN}': '{not}',
89     u'\N{PILCROW SIGN}': '{paragraph}',
90     u'\N{PLUS-MINUS SIGN}': '{+/-}',
91     u'\N{POUND SIGN}': '{pound}',
92     u'\N{REGISTERED SIGN}': '{R}',
93     u'\N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}': '>>',
94     u'\N{SECTION SIGN}': '{section}',
95     u'\N{SOFT HYPHEN}': '-',
96     u'\N{SUPERSCRIPT ONE}': '{^1}',
97     u'\N{SUPERSCRIPT THREE}': '{^3}',
98     u'\N{SUPERSCRIPT TWO}': '{^2}',
99     u'\N{VULGAR FRACTION ONE HALF}': '{1/2}',
100     u'\N{VULGAR FRACTION ONE QUARTER}': '{1/4}',
101     u'\N{VULGAR FRACTION THREE QUARTERS}': '{3/4}',
102     u'\N{YEN SIGN}': '{yen}'
103 }
104
105 def latin1_to_ascii(uinput):
106     if isinstance(uinput, bytes):
107         uinput = uinput.decode(sys.getfilesystemencoding())
108     out = []
109     for c in uinput:
110         i = ord(c)
111         if i in xlate:
112             out.append(xlate[i])
113         elif i >= 0x80:
114             pass
115         else:
116             out.append(str(c))
117     return ''.join(out)
118
119 if __name__ == '__main__':
120     if len(sys.argv) == 1:
121         sys.exit('Usage: %s filename\n' % sys.argv[0])
122     for name in sys.argv[1:]:
123         plain_ascii = latin1_to_ascii(name)
124         if plain_ascii != name:
125             os.rename(name, plain_ascii)