Module szyfrow.support.text_prettify
+Various functions for prettifying text, useful when cipher routines generate +strings of letters without spaces.
++Expand source code +
+"""Various functions for prettifying text, useful when cipher routines generate
+strings of letters without spaces.
+"""
+
+import string
+from szyfrow.support.segment import segment
+from szyfrow.support.utilities import cat, lcat, sanitise
+
+
+def prettify(text, width=100):
+ """Segment a text into words, then pack into lines, and combine the lines
+ into a single string for printing."""
+ return lcat(tpack(segment(text), width=width))
+
+
+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)
+Functions
+-
+
+def cat(iterable, /) +
+-
++
Concatenate any number of strings.
+The string whose method is called is inserted in between each given string. +The result is returned as a new string.
+Example: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'
+ +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)
+++Expand source code +
+
+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 depunctuate_character(c) +
+-
++
Record the punctuation of a character
+++Expand source code +
+
+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 lcat(iterable, /) +
+-
++
Concatenate any number of strings.
+The string whose method is called is inserted in between each given string. +The result is returned as a new string.
+Example: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'
+ +def prettify(text, width=100) +
+-
++
Segment a text into words, then pack into lines, and combine the lines +into a single string for printing.
+++Expand source code +
+
+def prettify(text, width=100): + """Segment a text into words, then pack into lines, and combine the lines + into a single string for printing.""" + return lcat(tpack(segment(text), width=width))
+ +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)
+++Expand source code +
+
+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)
+ +def repunctuate_character(letters, punctuation) +
+-
++
Apply the recorded punctuation to a character. The letters must be +an iterator of base characters.
+++Expand source code +
+
+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 tpack(text, width=100) +
+-
++
Pack a list of words into lines, so long as each line (including +intervening spaces) is no longer than width
+++Expand source code +
+
+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
+