|
| 1 | +# -*- coding: UTF-8 -*- |
| 2 | +"""Letters Codec - letter indices-related content encoding. |
| 3 | +
|
| 4 | +This codec: |
| 5 | +- en/decodes strings from str to str |
| 6 | +- en/decodes strings from bytes to bytes |
| 7 | +- decodes file content to str (read) |
| 8 | +- encodes file content from str to bytes (write) |
| 9 | +""" |
| 10 | +import random |
| 11 | + |
| 12 | +from ..__common__ import * |
| 13 | + |
| 14 | + |
| 15 | +__examples__ = { |
| 16 | + 'enc-dec(ipsum|lorem-ipsum)': ["This is a test."], |
| 17 | + 'enc(ipsum)': {'Bad test#': None}, |
| 18 | +} |
| 19 | + |
| 20 | + |
| 21 | +DICT = { |
| 22 | + 'a': ['a', 'ac', 'accumsan', 'ad', 'adipiscing', 'aenean', 'aliquam', 'aliquet', 'amet', 'ante', 'aptent', 'arcu', |
| 23 | + 'at', 'auctor', 'augue'], |
| 24 | + 'b': ['babel', 'bibendum', 'blandit', 'bomba', 'botum', 'buxus'], |
| 25 | + 'c': ['class', 'commodo', 'condimentum', 'congue', 'consectetur', 'consequat', 'conubia', 'convallis', 'cras', |
| 26 | + 'cubilia', 'curabitur', 'curae', 'cursus'], |
| 27 | + 'd': ['dapibus', 'diam', 'dictum', 'dictumst', 'dignissim', 'dis', 'dolor', 'donec', 'dui', 'duis'], |
| 28 | + 'e': ['efficitur', 'egestas', 'eget', 'eleifend', 'elementum', 'elit', 'enim', 'erat', 'eros', 'est', 'et', 'etiam', |
| 29 | + 'eu', 'euismod', 'ex'], |
| 30 | + 'f': ['facilisis', 'fames', 'faucibus', 'felis', 'fermentum', 'feugiat', 'finibus', 'fringilla', 'fusce'], |
| 31 | + 'g': ['gadus', 'galliarus', 'ganeo', 'garba', 'gemma', 'gener', 'genuine', 'gestus', 'gramma', 'gravida', 'grex', |
| 32 | + 'gusto', 'guttur', 'gyro'], |
| 33 | + 'h': ['habitant', 'habitasse', 'hac', 'haicu', 'halo', 'helleborum', 'hendrerit', 'hilarius', 'himenaeos', |
| 34 | + 'horreum', 'hydrus', 'hystericus'], |
| 35 | + 'i': ['iaculis', 'id', 'imperdiet', 'in', 'inceptos', 'integer', 'interdum', 'ipsum'], |
| 36 | + 'j': ['jaccae', 'jacio', 'jecur', 'jocundiatas', 'jovis', 'juctim', 'juger', 'juno', 'jussum', 'justo'], |
| 37 | + 'k': ['kal', 'kalatorium', 'kalium', 'kaput', 'kardo', 'kenia', 'koppa', 'kum'], |
| 38 | + 'l': ['lacinia', 'lacus', 'laoreet', 'lectus', 'leo', 'libero', 'ligula', 'litora', 'lobortis', 'lorem', 'luctus'], |
| 39 | + 'm': ['maecenas', 'magna', 'magnis', 'malesuada', 'massa', 'mattis', 'mauris', 'maximus', 'metus', 'mi', 'molestie', |
| 40 | + 'mollis', 'montes', 'morbi', 'mus'], |
| 41 | + 'n': ['nam', 'nascetur', 'natoque', 'nec', 'neque', 'netus', 'nibh', 'nisi', 'nisl', 'non', 'nostra', 'nulla', |
| 42 | + 'nullam', 'nunc'], |
| 43 | + 'o': ['odio', 'orci', 'ornare'], |
| 44 | + 'p': ['parturient', 'pellentesque', 'penatibus', 'per', 'pharetra', 'phasellus', 'placerat', 'platea', 'porta', |
| 45 | + 'porttitor', 'posuere', 'potenti', 'praesent', 'pretium', 'primis', 'proin', 'pulvinar', 'purus'], |
| 46 | + 'q': ['qua', 'quadrum', 'quam', 'quasi', 'quintum', 'quis', 'quisque', 'quo', 'quom', 'quota', 'qur'], |
| 47 | + 'r': ['radicitus', 'radius', 'ratio', 'recidivus', 'rectio', 'rhoncus', 'ridiculus', 'risus', 'ros', 'rutrum'], |
| 48 | + 's': ['sagittis', 'sapien', 'scelerisque', 'sed', 'sem', 'semper', 'senectus', 'sit', 'sociosqu', 'sodales', |
| 49 | + 'sollicitudin', 'suscipit', 'suspendisse'], |
| 50 | + 't': ['taciti', 'tellus', 'tempor', 'tempus', 'tincidunt', 'torquent', 'tortor', 'tristique', 'turpis'], |
| 51 | + 'u': ['ullamcorper', 'ultrices', 'ultricies', 'urna', 'ut'], |
| 52 | + 'v': ['varius', 'vehicula', 'vel', 'velit', 'venenatis', 'vestibulum', 'vitae', 'vivamus', 'volutpat', 'vulputate'], |
| 53 | + 'w': ['wadiarus', 'warantus', 'warra', 'werumensium', 'wormicia'], |
| 54 | + 'x': ['xandicus', 'xenon', 'xenium', 'xiphias', 'xvir', 'xylon', 'xysticus', 'xystus'], |
| 55 | + 'y': ['yata', 'yatum', 'yatus', 'ypra'], |
| 56 | + 'z': ['zamia', 'zelosus', 'zerum', 'zonatus', 'zymus'], |
| 57 | +} |
| 58 | +SCHARS = ".,:;+=-*/\\ " |
| 59 | + |
| 60 | + |
| 61 | +def ipsum_encode(text, errors="strict"): |
| 62 | + s = "" |
| 63 | + for i, c in enumerate(text): |
| 64 | + try: |
| 65 | + if c in SCHARS: |
| 66 | + s = s.rstrip(" ") + c + " " |
| 67 | + else: |
| 68 | + w = random.choice(DICT[c.lower()]) |
| 69 | + s += (w.capitalize() if c.isupper() else w) + " " |
| 70 | + except KeyError: |
| 71 | + s += handle_error("ipsum", errors, " ")(c, i) |
| 72 | + return s[:-1], len(text) |
| 73 | + |
| 74 | + |
| 75 | +def ipsum_decode(text, errors="strict"): |
| 76 | + s = "" |
| 77 | + words = text.split(" ") |
| 78 | + for i, w in enumerate(words[:-1] if words[-1] == "" else words): |
| 79 | + if w.strip() == "": |
| 80 | + s += " " |
| 81 | + elif w in SCHARS: |
| 82 | + s += w |
| 83 | + else: |
| 84 | + try: |
| 85 | + DICT[w[0].lower()] |
| 86 | + s += w[0] |
| 87 | + except KeyError: |
| 88 | + s += handle_error("ipsum", errors, decode=True, item="word")(w, i) |
| 89 | + if w[-1] in SCHARS: |
| 90 | + s += w[-1] |
| 91 | + return s, len(text) |
| 92 | + |
| 93 | + |
| 94 | +add("ipsum", ipsum_encode, ipsum_decode, pattern=r"^(?:lorem[-_]?)?ipsum$") |
| 95 | + |
0 commit comments