Source code for GLXShell.plugins.builtins.cat

import os
import cmd2
import argparse
import sys

# https://www.maizure.org/projects/decoded-gnu-coreutils/
# https://www.maizure.org/projects/decoded-gnu-coreutils/cat.html

from GLXShell.plugins.builtins import PLUGIN_VERSION
from GLXShell.plugins.builtins import PLUGIN_DESCRIPTION
from GLXShell.plugins.builtins import PLUGIN_WARRANTY

cat_parser = argparse.ArgumentParser()
cat_parser.add_argument(
    "file",
    nargs="*",
    type=argparse.FileType("r"),
    default=sys.stdin,
    help="with no FILE, or when FILE is -, read standard input.",
    completer=cmd2.Cmd.path_complete
)
cat_parser.add_argument(
    "-A",
    "--show-all",
    action="store_true",
    help="equivalent to -vET",
)
cat_parser.add_argument(
    "-b",
    "--number-nonblank",
    action="store_true",
    help="number nonempty output lines, overrides -n",
)
cat_parser.add_argument(
    "-e",
    action="store_true",
    help="equivalent to -vE",
)
cat_parser.add_argument(
    "-E",
    "--show-ends",
    action="store_true",
    help="display $ at end of each line",
)
cat_parser.add_argument(
    "-n",
    "--number",
    action="store_true",
    help="number all output lines",
)
cat_parser.add_argument(
    "-s",
    "--squeeze-blank",
    action="store_true",
    help="suppress repeated empty output lines",
)
#   -t                       equivalent to -vT
cat_parser.add_argument(
    "-t",
    action="store_true",
    help="equivalent to -vT",
)
#   -T, --show-tabs          display TAB characters as ^I
cat_parser.add_argument(
    "-T",
    "--show-tabs",
    action="store_true",
    help="display TAB characters as ^I",
)
#   -u                       (ignored)
cat_parser.add_argument(
    "-u",
    action="store_true",
    help="(ignored)",
)
#   -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
cat_parser.add_argument(
    "-v",
    "--show-nonprinting",
    action="store_true",
    help="use ^ and M- notation, except for LFD and TAB",
)

cat_parser.add_argument(
    "--version", action="store_true", help="output version information and exit"
)


[docs]class GLXCat(cmd2.CommandSet): def __init__(self): super().__init__()
[docs] @staticmethod def cat_print_version(): cmd2.Cmd().poutput( "cat ({name}) v{version}\n{licence}".format( name=PLUGIN_DESCRIPTION, version=PLUGIN_VERSION, licence=PLUGIN_WARRANTY, ) )
[docs] @staticmethod def cat(file, number_nonblank, number, show_tabs, squeeze_blank, show_ends): if number_nonblank: number = False file_data = [] for file_object in file: file_data.append(file_object.read().split("\n")) think_to_display = [] line_number = 1 blank_line_allowed = True for file in file_data: if not blank_line_allowed: blank_line_allowed = True for line in file: if show_tabs: line = line.replace("\t", "^I") if number: if len(line) > 0: think_to_display.append( "{0:>6d} {1}".format(line_number, line) ) line_number += 1 if not blank_line_allowed: blank_line_allowed = True else: if blank_line_allowed: think_to_display.append( "{0:>6d} {1}".format(line_number, "") ) line_number += 1 if squeeze_blank and blank_line_allowed: blank_line_allowed = False elif number_nonblank: if len(line) > 0: think_to_display.append( "{0:>6d} {1}".format(line_number, line) ) line_number += 1 if not blank_line_allowed: blank_line_allowed = True else: if blank_line_allowed: think_to_display.append("") if squeeze_blank and blank_line_allowed: blank_line_allowed = False else: if len(line) > 0: think_to_display.append(line) if not blank_line_allowed: blank_line_allowed = True else: if blank_line_allowed: think_to_display.append(line) if squeeze_blank and blank_line_allowed: blank_line_allowed = False if show_ends: last_result = "$\n".join(think_to_display) else: last_result = "\n".join(think_to_display) cmd2.Cmd().last_result = last_result cmd2.Cmd().poutput(msg=last_result, end="")
[docs] @cmd2.with_argparser(cat_parser) @cmd2.with_category("Builtins") def do_cat2(self, args): """Concatenate FILE(s) to standard output""" if args.version: # pragma: no cover self.cat_print_version() return self.cat( file=args.file, number_nonblank=args.number_nonblank, number=args.number, show_tabs=args.show_tabs, squeeze_blank=args.squeeze_blank, show_ends=args.show_ends, ) # pragma: no cover