HarfBuzz text shaping engine
http://harfbuzz.github.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
4.0 KiB
115 lines
4.0 KiB
#!/usr/bin/python |
|
# |
|
# Simple utility script to manipulate |
|
# certain types of strings in a file |
|
|
|
# This can be used in various projects where |
|
# there is the need to replace strings in files, |
|
# and is copied from GLib's $(srcroot)/win32 |
|
|
|
# Author: Fan, Chun-wei |
|
# Date: September 03, 2014 |
|
|
|
import os |
|
import sys |
|
import re |
|
import string |
|
import argparse |
|
|
|
valid_actions = ['remove-prefix', |
|
'replace-var', |
|
'replace-str', |
|
'remove-str'] |
|
|
|
def open_file(filename, mode): |
|
if sys.version_info[0] < 3: |
|
return open(filename, mode=mode) |
|
else: |
|
return open(filename, mode=mode, encoding='utf-8') |
|
|
|
def replace_multi(src, dest, replace_items): |
|
with open_file(src, 'r') as s: |
|
with open_file(dest, 'w') as d: |
|
for line in s: |
|
replace_dict = dict((re.escape(key), value) \ |
|
for key, value in replace_items.items()) |
|
replace_pattern = re.compile("|".join(replace_dict.keys())) |
|
d.write(replace_pattern.sub(lambda m: \ |
|
replace_dict[re.escape(m.group(0))], line)) |
|
|
|
def replace(src, dest, instring, outstring): |
|
replace_item = {instring: outstring} |
|
replace_multi(src, dest, replace_item) |
|
|
|
def check_required_args(args, params): |
|
for param in params: |
|
if getattr(args, param, None) is None: |
|
raise SystemExit('%s: error: --%s argument is required' % (__file__, param)) |
|
|
|
def warn_ignored_args(args, params): |
|
for param in params: |
|
if getattr(args, param, None) is not None: |
|
print('%s: warning: --%s argument is ignored' % (__file__, param)) |
|
|
|
def main(argv): |
|
|
|
parser = argparse.ArgumentParser(description='Process strings in a file.') |
|
parser.add_argument('-a', |
|
'--action', |
|
help='Action to carry out. Can be one of:\n' |
|
'remove-prefix\n' |
|
'replace-var\n' |
|
'replace-str\n' |
|
'remove-str', |
|
choices=valid_actions) |
|
parser.add_argument('-i', '--input', help='Input file') |
|
parser.add_argument('-o', '--output', help='Output file') |
|
parser.add_argument('--instring', help='String to replace or remove') |
|
parser.add_argument('--var', help='Autotools variable name to replace') |
|
parser.add_argument('--outstring', |
|
help='New String to replace specified string or variable') |
|
parser.add_argument('--removeprefix', help='Prefix of string to remove') |
|
|
|
args = parser.parse_args() |
|
|
|
input_string = '' |
|
output_string = '' |
|
|
|
# We must have action, input, output for all operations |
|
check_required_args(args, ['action','input','output']) |
|
|
|
# Build the arguments by the operation that is to be done, |
|
# to be fed into replace() |
|
|
|
# Get rid of prefixes from a string |
|
if args.action == 'remove-prefix': |
|
check_required_args(args, ['instring','removeprefix']) |
|
warn_ignored_args(args, ['outstring','var']) |
|
input_string = args.removeprefix + args.instring |
|
output_string = args.instring |
|
|
|
# Replace an m4-style variable (those surrounded by @...@) |
|
if args.action == 'replace-var': |
|
check_required_args(args, ['var','outstring']) |
|
warn_ignored_args(args, ['instring','removeprefix']) |
|
input_string = '@' + args.var + '@' |
|
output_string = args.outstring |
|
|
|
# Replace a string |
|
if args.action == 'replace-str': |
|
check_required_args(args, ['instring','outstring']) |
|
warn_ignored_args(args, ['var','removeprefix']) |
|
input_string = args.instring |
|
output_string = args.outstring |
|
|
|
# Remove a string |
|
if args.action == 'remove-str': |
|
check_required_args(args, ['instring']) |
|
warn_ignored_args(args, ['var','outstring','removeprefix']) |
|
input_string = args.instring |
|
output_string = '' |
|
|
|
replace(args.input, args.output, input_string, output_string) |
|
|
|
if __name__ == '__main__': |
|
sys.exit(main(sys.argv))
|
|
|