changeset 23:196c3c4a15aa

Added the --group and --width options.
author Brian Neal <bgneal@gmail.com>
date Sun, 16 Feb 2014 16:54:40 -0600
parents 9c90ca37c023
children adddc0d7038a
files purple/main.py purple/tests/test_machine.py
diffstat 2 files changed, 34 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/purple/main.py	Sun Feb 16 14:31:24 2014 -0600
+++ b/purple/main.py	Sun Feb 16 16:54:40 2014 -0600
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 by Brian Neal.
+# Copyright (C) 2013 - 2014 by Brian Neal.
 # This file is part of purple, the PURPLE (Cipher Machine 97) simulation.
 # purple is released under the MIT License (see LICENSE.txt).
 
@@ -8,6 +8,7 @@
 import os
 import string
 import sys
+import textwrap
 
 from purple.machine import Purple97, Purple97Error
 from purple.switch import SteppingSwitchError
@@ -77,24 +78,37 @@
                 yield c
 
 
+def group_text(text, n=5):
+    """Groups the given text into n-letter groups separated by spaces."""
+
+    return ' '.join(text[i:i+n] for i in range(0, len(text), n))
+
+
 def main(argv=None):
     """Entry point for the command-line purple97 simulation."""
 
     parser = argparse.ArgumentParser(description=DESC, epilog=EPILOG)
     parser.add_argument('-e', '--encrypt', action='store_true',
-        help='encrypt text from files or the command-line')
+        help='perform an encrypt operation')
     parser.add_argument('-d', '--decrypt', action='store_true',
-        help='decrypt text from files or the command-line')
+        help='perform a decrypt operation')
     parser.add_argument('-f', '--filter', action='store_true',
         help='filter plaintext and provide useful substitutions')
     parser.add_argument('-s', '--switches',
         help='switch settings, e.g. 9-1,24,6-23')
     parser.add_argument('-a', '--alphabet',
-        help='plugboard wiring string, 26-letters')
+        help='plugboard wiring string, 26-letters; e.g. AEIOUYBCDFGHJKLMNPQRSTVWXZ')
     parser.add_argument('-t', '--text',
         help='input text to encrypt/decrypt')
     parser.add_argument('-i', '--input', metavar='FILE',
         help='file to read input text from, - for stdin')
+    parser.add_argument('-g', '--group', type=int, default=5, metavar='N',
+        help=('if non-zero, group output in %(metavar)s-letter groups '
+              '[default: %(default)s]'))
+    parser.add_argument('-w', '--width', type=int, default=70, metavar='N',
+        help=("wrap output text to %(metavar)s letters; "
+              "a value of 0 means do not wrap "
+              "[default: %(default)s]"))
 
     args = parser.parse_args(args=argv)
 
@@ -119,6 +133,11 @@
     else:
         alphabet = os.environ.get('PURPLE97_ALPHABET', DEFAULT_ALPHABET)
 
+    if args.group < 0:
+        parser.error("The --group option must be 0 or greater")
+    if args.width < 0:
+        parser.error("The --width option must be 0 or greater")
+
     # Create purple cipher machine object
     try:
         purple = Purple97.from_key_sheet(switches, alphabet)
@@ -148,6 +167,16 @@
     except (Purple97Error, SteppingSwitchError) as ex:
         parser.error(str(ex))
 
+    if args.group != 0:
+        result = group_text(result, args.group)
+
+    if args.width != 0:
+        # Never break groups when grouping
+        break_long_words = args.group == 0
+        result = textwrap.fill(result, width=args.width, expand_tabs=False,
+                replace_whitespace=False, drop_whitespace=False,
+                break_long_words=break_long_words)
+
     print(result)
 
 
--- a/purple/tests/test_machine.py	Sun Feb 16 14:31:24 2014 -0600
+++ b/purple/tests/test_machine.py	Sun Feb 16 16:54:40 2014 -0600
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 by Brian Neal.
+# Copyright (C) 2013 - 2014 by Brian Neal.
 # This file is part of purple, the PURPLE (Cipher Machine 97) simulation.
 # purple is released under the MIT License (see LICENSE.txt).