diff options
author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-04-29 06:59:10 +0300 |
---|---|---|
committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-04-29 07:06:48 +0300 |
commit | af4ea94efc1999f3b19fd8d643d0331f0b77e265 (patch) | |
tree | f4665a5027f852cd798ef1c48a0951ed5e633bf6 /scripts/code_tools/fix_whitespace.py | |
parent | a6c89d9185d61027dd761af0c05fdbb05e3692fe (diff) |
#824 Add a script to convert tabs to spaces in the code files
Diffstat (limited to 'scripts/code_tools/fix_whitespace.py')
-rw-r--r-- | scripts/code_tools/fix_whitespace.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/scripts/code_tools/fix_whitespace.py b/scripts/code_tools/fix_whitespace.py new file mode 100644 index 0000000000..1c2ba00bb3 --- /dev/null +++ b/scripts/code_tools/fix_whitespace.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python +"""\ + +This script replaces tab characters with spaces in source code files. + +$LicenseInfo:firstyear=2024&license=viewerlgpl$ +Second Life Viewer Source Code +Copyright (C) 2024, Linden Research, Inc. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +version 2.1 of the License only. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +$/LicenseInfo$ +""" + +import argparse +import os + +def convert_tabs_to_spaces(file_path, tab_stop): + """Convert tabs in a file to spaces, considering tab stops.""" + with open(file_path, 'r') as file: + lines = file.readlines() + + new_lines = [] + for line in lines: + # Remove trailing spaces + line = line.rstrip() + new_line = '' + column = 0 # Track the column index for calculating tab stops + for char in line: + if char == '\t': + # Calculate spaces needed to reach the next tab stop + spaces_needed = tab_stop - (column % tab_stop) + new_line += ' ' * spaces_needed + column += spaces_needed + else: + new_line += char + column += 1 + + new_lines.append(new_line + '\n') + + with open(file_path, 'w') as file: + file.writelines(new_lines) + +def process_directory(directory, extensions, tab_stop): + """Recursively process files in directory, considering tab stops.""" + extensions = tuple(extensions) + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(extensions): + file_path = os.path.join(root, file) + print(f"Processing {file_path}") + convert_tabs_to_spaces(file_path, tab_stop) + +def main(): + parser = argparse.ArgumentParser(description='Convert tabs to spaces in files, considering tab stops.') + parser.add_argument('-e', '--extensions', type=str, default='cpp,h,hpp,inl,cmake', help='Comma-separated list of file extensions to process (default: "cpp,h,hpp,inl,cmake")') + parser.add_argument('-t', '--tabstop', type=int, default=4, help='Tab stop size (default: 4)') + parser.add_argument('-d', '--directory', type=str, required=True, help='Directory to process') + + args = parser.parse_args() + + extensions = args.extensions.split(',') + # Add a dot prefix to each extension if not present + extensions = [ext if ext.startswith('.') else f".{ext}" for ext in extensions] + + process_directory(args.directory, extensions, args.tabstop) + print("Processing completed.") + +if __name__ == "__main__": + main() |