-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnarrow
More file actions
executable file
·121 lines (97 loc) · 2.69 KB
/
narrow
File metadata and controls
executable file
·121 lines (97 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/env -S uv run --script
# vi: ft=python
# /// script
# requires-python = ">=3.7"
# dependencies = [
# "requests",
# "beautifulsoup4",
# ]
# ///
# ==============================================================================
# Functionality
# ==============================================================================
import pdb
import sys
import re
import argparse
import narrow
# utility funcs, classes, etc go here.
def asserting(cond):
if not cond:
pdb.set_trace()
assert cond
def has_stdin():
return not sys.stdin.isatty()
def reg(pat, flags=0):
return re.compile(pat, re.VERBOSE | flags)
# ==============================================================================
# Cmdline
# ==============================================================================
parser = argparse.ArgumentParser(
formatter_class=argparse.RawTextHelpFormatter,
description="""
TODO
""",
)
parser.add_argument("-v", "--verbose", action="store_true", help="verbose output")
parser.add_argument(
"-i",
"--ignore-case",
dest="case",
action="store_const",
const="off",
help="Match case insensitively",
)
parser.add_argument(
"-s",
"--case-sensitive",
dest="case",
action="store_const",
const="on",
help="Match case sensitively",
)
parser.add_argument(
"-S",
"--smart-case",
dest="case",
action="store_const",
const="smart",
help="Match case insensitively unless PATTERN contains uppercase characters",
)
args = None
# ==============================================================================
# Main
# ==============================================================================
def run():
if args.verbose:
print(args)
if len(args.args) <= 0 and not has_stdin():
# if there were no args and there was no input, prompt user.
print("Enter input (press Ctrl-D when done):")
exitcode = 1
for line in sys.stdin:
if narrow.narrow(line, args.args, case=args.case, verbose=args.verbose):
print(line, end="")
exitcode = 0
sys.exit(exitcode)
def main():
try:
global args
if not args:
args, leftovers = parser.parse_known_args()
args.args = leftovers
if args.case is None:
args.case = "smart"
return run()
except IOError:
# http://stackoverflow.com/questions/15793886/how-to-avoid-a-broken-pipe-error-when-printing-a-large-amount-of-formatted-data
try:
sys.stdout.close()
except IOError:
pass
try:
sys.stderr.close()
except IOError:
pass
if __name__ == "__main__":
main()