From f3aa797d96c8e2cef2124dbb2f49d1fadaee3fa2 Mon Sep 17 00:00:00 2001 From: Kelly Brazil Date: Tue, 22 Mar 2022 17:47:19 -0700 Subject: [PATCH] add more pretty table separators --- jc/parsers/asciitable.py | 43 +++++++++++++++++++++++++++++++------- jc/parsers/asciitable_m.py | 35 ++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 9 deletions(-) diff --git a/jc/parsers/asciitable.py b/jc/parsers/asciitable.py index ce648057..3c21fa60 100644 --- a/jc/parsers/asciitable.py +++ b/jc/parsers/asciitable.py @@ -171,12 +171,34 @@ def _is_separator(line: str) -> bool: strip_line.startswith('╒═') and strip_line.endswith('═╕'), strip_line.startswith('╞═') and strip_line.endswith('═╡'), strip_line.startswith('╘═') and strip_line.endswith('═╛'), + strip_line.startswith('┏━') and strip_line.endswith('━┓'), + strip_line.startswith('┣━') and strip_line.endswith('━┫'), + strip_line.startswith('┗━') and strip_line.endswith('━┛'), + strip_line.startswith('┡━') and strip_line.endswith('━┩'), + strip_line.startswith('┢━') and strip_line.endswith('━┪'), + strip_line.startswith('┟─') and strip_line.endswith('─┧'), + strip_line.startswith('┞─') and strip_line.endswith('─┦'), + strip_line.startswith('┠─') and strip_line.endswith('─┨'), + strip_line.startswith('┝━') and strip_line.endswith('━┥'), + strip_line.startswith('┍━') and strip_line.endswith('━┑'), + strip_line.startswith('┕━') and strip_line.endswith('━┙'), + strip_line.startswith('┎─') and strip_line.endswith('─┒'), + strip_line.startswith('┖─') and strip_line.endswith('─┚'), + strip_line.startswith('╓─') and strip_line.endswith('─╖'), + strip_line.startswith('╟─') and strip_line.endswith('─╢'), + strip_line.startswith('╙─') and strip_line.endswith('─╜'), + strip_line.startswith('╔═') and strip_line.endswith('═╗'), + strip_line.startswith('╠═') and strip_line.endswith('═╣'), + strip_line.startswith('╚═') and strip_line.endswith('═╝'), strip_line.startswith('┌─') and strip_line.endswith('─┐'), strip_line.startswith('├─') and strip_line.endswith('─┤'), strip_line.startswith('└─') and strip_line.endswith('─┘'), - strip_line.startswith('┏━') and strip_line.endswith('━┓'), - strip_line.startswith('┡━') and strip_line.endswith('━┩'), + strip_line.startswith('━━') and strip_line.endswith('━━'), strip_line.startswith('──') and strip_line.endswith('──'), + strip_line.startswith('┄┄') and strip_line.endswith('┄┄'), + strip_line.startswith('┅┅') and strip_line.endswith('┅┅'), + strip_line.startswith('┈┈') and strip_line.endswith('┈┈'), + strip_line.startswith('┉┉') and strip_line.endswith('┉┉'), strip_line.startswith('══') and strip_line.endswith('══'), strip_line.startswith('+=') and strip_line.endswith('=+'), strip_line.startswith('+-') and strip_line.endswith('-+'), @@ -208,17 +230,22 @@ def _normalize_rows(table: str) -> List[str]: continue # data row - remove column separators - line = line.replace('│', ' ').replace('|', ' ').replace('┃', ' ') + line = line.replace('|', ' ')\ + .replace('│', ' ')\ + .replace('┃', ' ')\ + .replace('┆', ' ')\ + .replace('┇', ' ')\ + .replace('┊', ' ')\ + .replace('┋', ' ')\ + .replace('╎', ' ')\ + .replace('╏', ' ')\ + .replace('║', ' ') result.append(line) result[0] = _snake_case(result[0]) return result -def _parse_pretty(table: List[str]) -> List[Dict[str, str]]: - return sparse_table_parse(table) - - def parse( data: str, raw: bool = False, @@ -246,6 +273,6 @@ def parse( data = _remove_ansi(data) data = _strip(data) data_list = _normalize_rows(data) - raw_output = _parse_pretty(data_list) + raw_output = sparse_table_parse(data_list) return raw_output if raw else _process(raw_output) diff --git a/jc/parsers/asciitable_m.py b/jc/parsers/asciitable_m.py index edb95845..d11f2e5c 100644 --- a/jc/parsers/asciitable_m.py +++ b/jc/parsers/asciitable_m.py @@ -163,6 +163,14 @@ def _table_sniff(string: str) -> str: line.startswith('╞═') and line.endswith('═╡'), line.startswith('├─') and line.endswith('─┤'), line.startswith('┡━') and line.endswith('━┩'), + line.startswith('┣━') and line.endswith('━┫'), + line.startswith('┢━') and line.endswith('━┪'), + line.startswith('┟─') and line.endswith('─┧'), + line.startswith('┞─') and line.endswith('─┦'), + line.startswith('┠─') and line.endswith('─┨'), + line.startswith('┝━') and line.endswith('━┥'), + line.startswith('╟─') and line.endswith('─╢'), + line.startswith('╠═') and line.endswith('═╣'), line.startswith('+=') and line.endswith('=+'), line.startswith('+-') and line.endswith('-+') )): @@ -185,7 +193,24 @@ def _is_separator(line: str) -> bool: strip_line.startswith('╞═') and strip_line.endswith('═╡'), strip_line.startswith('╘═') and strip_line.endswith('═╛'), strip_line.startswith('┏━') and strip_line.endswith('━┓'), + strip_line.startswith('┣━') and strip_line.endswith('━┫'), + strip_line.startswith('┗━') and strip_line.endswith('━┛'), strip_line.startswith('┡━') and strip_line.endswith('━┩'), + strip_line.startswith('┢━') and strip_line.endswith('━┪'), + strip_line.startswith('┟─') and strip_line.endswith('─┧'), + strip_line.startswith('┞─') and strip_line.endswith('─┦'), + strip_line.startswith('┠─') and strip_line.endswith('─┨'), + strip_line.startswith('┝━') and strip_line.endswith('━┥'), + strip_line.startswith('┍━') and strip_line.endswith('━┑'), + strip_line.startswith('┕━') and strip_line.endswith('━┙'), + strip_line.startswith('┎─') and strip_line.endswith('─┒'), + strip_line.startswith('┖─') and strip_line.endswith('─┚'), + strip_line.startswith('╓─') and strip_line.endswith('─╖'), + strip_line.startswith('╟─') and strip_line.endswith('─╢'), + strip_line.startswith('╙─') and strip_line.endswith('─╜'), + strip_line.startswith('╔═') and strip_line.endswith('═╗'), + strip_line.startswith('╠═') and strip_line.endswith('═╣'), + strip_line.startswith('╚═') and strip_line.endswith('═╝'), strip_line.startswith('┌─') and strip_line.endswith('─┐'), strip_line.startswith('├─') and strip_line.endswith('─┤'), strip_line.startswith('└─') and strip_line.endswith('─┘'), @@ -204,7 +229,15 @@ def _snake_case(line: str) -> str: def _fixup_separators(line: str) -> str: """Normalize separators, and remove first and last separators""" # normalize separator - line = line.replace('│', '|').replace('┃', '|') + line = line.replace('│', '|')\ + .replace('┃', '|')\ + .replace('┆', '|')\ + .replace('┇', '|')\ + .replace('┊', '|')\ + .replace('┋', '|')\ + .replace('╎', '|')\ + .replace('╏', '|')\ + .replace('║', '|') # remove first separator if it is the first char in the line if line[0] == '|':