Rearranged files, added import paths
[cipher-tools.git] / support / text_prettify.py
diff --git a/support/text_prettify.py b/support/text_prettify.py
new file mode 100644 (file)
index 0000000..d3a6ffa
--- /dev/null
@@ -0,0 +1,60 @@
+from segment import segment
+from utilities import cat, sanitise
+import string
+
+
+def tpack(text, width=100):
+    """Pack a list of words into lines, so long as each line (including
+    intervening spaces) is no longer than _width_"""
+    lines = [text[0]]
+    for word in text[1:]:
+        if len(lines[-1]) + 1 + len(word) <= width:
+            lines[-1] += (' ' + word)
+        else:
+            lines += [word]
+    return lines
+
+
+def depunctuate_character(c):
+    """Record the punctuation of a character"""
+    if c in string.ascii_uppercase:
+        return 'UPPER'
+    elif c in string.ascii_lowercase:
+        return 'LOWER'
+    else:
+        return c
+
+
+def depunctuate(text):
+    """Record the punctuation of a string, so it can be applied to a converted
+    version of the string.
+
+    For example, 
+    punct = depunctuate(ciphertext)
+    plaintext = decipher(sanitise(ciphertext))
+    readable_plaintext = repunctuate(plaintext, punct)
+    """
+    return [depunctuate_character(c) for c in text]
+
+
+def repunctuate_character(letters, punctuation):
+    """Apply the recorded punctuation to a character. The letters must be
+    an iterator of base characters."""
+    if punctuation == 'UPPER':
+        return next(letters).upper()
+    elif punctuation == 'LOWER':
+        return next(letters).lower()
+    else:
+        return punctuation
+
+
+def repunctuate(text, punctuation):
+    """Apply the recored punctuation to a sanitised string.
+
+    For example, 
+    punct = depunctuate(ciphertext)
+    plaintext = decipher(sanitise(ciphertext))
+    readable_plaintext = repunctuate(plaintext, punct)
+    """
+    letters = iter(sanitise(text))
+    return cat(repunctuate_character(letters, p) for p in punctuation)