annotate curlyq @ 10:397c178c5b98

Make it array-based.
author David Barts <n5jrn@me.com>
date Fri, 27 Dec 2019 11:26:00 -0800
parents 05363e803272
children a771878f6cf4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
1 #!/usr/bin/env python3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
4 import os, sys
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
5 import argparse
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
6 import codecs
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
7
4
7a83e82e65a6 Remove some deadwood.
David Barts <n5jrn@me.com>
parents: 3
diff changeset
8 from curlers import TextCurler, HtmlCurler, uncurl
10
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
9 from runes import Workspace
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
10 from writer import CODECS_TO_NAME
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
11
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
12 # V a r i a b l e s
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
13
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
14 # Name invoked by
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
15 MYNAME = os.path.basename(sys.argv[0])
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
16
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
17 # Streams
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
18 input_fp = None
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
19 output_fp = None
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
20
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
21 # F u n c t i o n s
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
22
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
23 def normal():
4
7a83e82e65a6 Remove some deadwood.
David Barts <n5jrn@me.com>
parents: 3
diff changeset
24 global input_fp, output_fp, args
10
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
25 ws = Workspace()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
26 curler = TextCurler(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
27 while True:
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
28 line = input_fp.readline()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
29 ws.append(line)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
30 if line == "" or line == "\n":
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
31 if args.force: uncurl(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
32 curler.feed()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
33 output_fp.write(str(ws))
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
34 ws.clear()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
35 if line == "":
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
36 break
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
37
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
38 def flowed():
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
39 global input_fp, output_fp, args
10
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
40 ws = Workspace()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
41 curler = TextCurler(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
42 while True:
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
43 line = input_fp.readline()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
44 if line == "":
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
45 break
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
46 ws.append(line)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
47 if args.force: uncurl(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
48 curler.feed()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
49 output_fp.write(str(ws))
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
50 ws.clear()
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
51
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
52 def html():
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
53 global input_fp, output_fp
10
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
54 ws = Workspace(input_fp.read())
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
55 curler = HtmlCurler(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
56 if args.force: uncurl(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
57 curler.feed()
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
58 output_fp.write(str(ws))
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
59
5
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
60 def do_uncurl():
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
61 global input_fp, output_fp
10
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
62 ws = Workspace(input_fp.read())
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
63 uncurl(ws)
397c178c5b98 Make it array-based.
David Barts <n5jrn@me.com>
parents: 8
diff changeset
64 output_fp.write(str(ws))
5
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
65
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
66 # M a i n P r o g r a m
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
67
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
68 # Parse arguments
8
05363e803272 Improve help text.
David Barts <n5jrn@me.com>
parents: 5
diff changeset
69 parser = argparse.ArgumentParser(
05363e803272 Improve help text.
David Barts <n5jrn@me.com>
parents: 5
diff changeset
70 description='Make straight quotes curly.', prog=MYNAME)
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
71 group = parser.add_mutually_exclusive_group()
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
72 group.add_argument("--flowed", action="store_true", help="Input is flowed text.")
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
73 group.add_argument("--html", action="store_true", help="Input is HTML.")
5
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
74 group.add_argument("--uncurl", action="store_true", help="Uncurl quotes instead of curling them.")
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
75 parser.add_argument("--force", action="store_true", help="Force all quotes to straight ones first.")
8
05363e803272 Improve help text.
David Barts <n5jrn@me.com>
parents: 5
diff changeset
76 parser.add_argument("--icoding", default="UTF-8", help="Input encoding (default UTF-8).")
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
77 parser.add_argument("--inplace", action="store_true", help="Edit file in-place.")
8
05363e803272 Improve help text.
David Barts <n5jrn@me.com>
parents: 5
diff changeset
78 parser.add_argument("--ocoding", default="UTF-8", help="Output encoding (default UTF-8).")
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
79 parser.add_argument("input", nargs="?", help="Input file.")
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
80 parser.add_argument("output", nargs="?", help="Output file.")
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
81 try:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
82 args = parser.parse_args()
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
83 except SystemExit:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
84 sys.exit(2)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
85
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
86 # Sanity-check codings
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
87 try:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
88 codec = codecs.lookup(args.icoding)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
89 codec = codecs.lookup(args.ocoding)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
90 except LookupError as e:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
91 sys.stderr.write("{0}: {1!s}\n".format(MYNAME, e))
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
92 sys.exit(2)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
93 if not CODECS_TO_NAME.get(codec, "").startswith("UTF-"):
8
05363e803272 Improve help text.
David Barts <n5jrn@me.com>
parents: 5
diff changeset
94 sys.stderr.write("{0}: {1!r} output coding does not support Unicode\n".format(MYNAME, args.ocoding))
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
95 sys.exit(1)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
96 del codec
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
97
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
98 # Get streams
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
99 try:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
100 if args.input and (not args.output) and args.inplace:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
101 args.output = args.input
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
102 args.input += "~"
5
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
103 os.rename(args.output, args.input)
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
104 if args.input:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
105 input_fp = open(args.input, "r", encoding=args.icoding)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
106 else:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
107 input_fp = open(0, "r", encoding=args.icoding)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
108 if args.output:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
109 output_fp = open(args.output, "w", encoding=args.ocoding)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
110 else:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
111 output_fp = open(1, "w", encoding=args.ocoding)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
112 except (OSError, LookupError) as e:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
113 sys.stderr.write("{0}: {1!s}\n".format(MYNAME, e))
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
114 sys.exit(1)
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
115
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
116 # Choose our mode
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
117 if args.flowed:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
118 flowed()
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
119 elif args.html:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
120 html()
5
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
121 elif args.uncurl:
d5198c7ec54d Add --uncurl option.
David Barts <n5jrn@me.com>
parents: 4
diff changeset
122 do_uncurl()
3
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
123 else:
091c03f1b2e8 Getting it working...
David Barts <n5jrn@me.com>
parents:
diff changeset
124 normal()