-
-
Save rc5hack/a871f0e4cc1e4d67d7f2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
import subprocess | |
__all__ = ["transform"] | |
__version__ = '0.3' | |
__author__ = 'Christoph Burgmer <[email protected]>' | |
__url__ = 'http://github.com/cburgmer/upsidedown' | |
__license__ = 'MIT' | |
import unicodedata | |
import string | |
# Define dual character. Make sure that mapping is bijective. | |
FLIP_RANGES = [ | |
(string.ascii_lowercase, u"ɐqɔpǝɟƃɥᴉɾʞꞁɯuodbɹsʇnʌʍxʎz"), | |
# alternatives: l:ʅ | |
(string.ascii_uppercase, u"ⱯᗺƆᗡƎᖵ⅁HIᒋ⋊ꞀWNOԀꝹᴚS⊥∩ɅMX⅄Z"), | |
# alternatives: L:ᒣ⅂, J:ſ, F:߃Ⅎ, A:∀ᗄ, U:Ⴖ, W:Ϻ, C:ϽↃ, Q:Ό, M:Ɯꟽ | |
(string.digits, u"0ІᘔƐᔭ59Ɫ86"), | |
(string.punctuation, u"¡„#$%⅋,)(*+'-˙/:؛>=<¿@]\\[ᵥ‾`}|{~"), | |
] | |
# See also http://www.fileformat.info/convert/text/upside-down-map.htm | |
# See: | |
# http://de.wikipedia.org/wiki/Unicode-Block_Kombinierende_diakritische_Zeichen | |
UNICODE_COMBINING_DIACRITICS = {u'̈': u'̤', u'̊': u'̥', u'́': u'̗', u'̀': u'̖', | |
u'̇': u'̣', u'̃': u'̰', u'̄': u'̱', u'̂': u'̬', u'̆': u'̯', u'̌': u'̭', | |
u'̑': u'̮', u'̍': u'̩'} | |
TRANSLITERATIONS = {u'ß': 'ss'} | |
# character lookup | |
_CHARLOOKUP = {} | |
for chars, flipped in FLIP_RANGES: | |
_CHARLOOKUP.update(zip(chars, flipped)) | |
# get reverse direction | |
for char in _CHARLOOKUP.copy(): | |
# make 1:1 back transformation possible | |
assert (_CHARLOOKUP[char] not in _CHARLOOKUP | |
or _CHARLOOKUP[_CHARLOOKUP[char]] == char), \ | |
("%s has ambiguous mapping" % _CHARLOOKUP[char]) | |
_CHARLOOKUP[_CHARLOOKUP[char]] = char | |
# lookup for diacritical marks, reverse first | |
_DIACRITICSLOOKUP = dict([(UNICODE_COMBINING_DIACRITICS[char], char) \ | |
for char in UNICODE_COMBINING_DIACRITICS]) | |
_DIACRITICSLOOKUP.update(UNICODE_COMBINING_DIACRITICS) | |
def transform(string, transliterations=None): | |
u""" | |
Transform the string to "upside-down" writing. | |
Example: | |
>>> import upsidedown | |
>>> print upsidedown.transform('Hello World!') | |
¡pꞁɹoM oꞁꞁǝH | |
For languages with diacritics you might want to supply a transliteration to | |
work around missing (rendering of) upside-down forms: | |
>>> import upsidedown | |
>>> print upsidedown.transform(u'köln', transliterations={u'ö': 'oe'}) | |
ulǝoʞ | |
""" | |
transliterations = transliterations or TRANSLITERATIONS | |
for character in transliterations: | |
string = string.replace(character, transliterations[character]) | |
inputChars = list(string) | |
inputChars.reverse() | |
output = [] | |
for character in inputChars: | |
if character in _CHARLOOKUP: | |
output.append(_CHARLOOKUP[character]) | |
else: | |
charNormalised = unicodedata.normalize("NFD", character) | |
for c in charNormalised[:]: | |
if c in _CHARLOOKUP: | |
charNormalised = charNormalised.replace(c, _CHARLOOKUP[c]) | |
elif c in _DIACRITICSLOOKUP: | |
charNormalised = charNormalised.replace(c, | |
_DIACRITICSLOOKUP[c]) | |
output.append(unicodedata.normalize("NFC", charNormalised)) | |
return ''.join(output) | |
import sys | |
sys.argv[0] = '/bin/ls' | |
p = subprocess.Popen(sys.argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
o, e = p.communicate() | |
res = o + e | |
maxlen = max(len(x) for x in res.splitlines()) | |
res = ''.join(x.ljust(maxlen) + '\n' for x in res.splitlines()) | |
print transform(res.decode('utf8')).encode('utf8') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1. Save to /root/evills | |
2. ln -s /root/evills /usr/local/bin/ls | |
3. Restart your shell |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment