diff --git a/pdftocgen/app.py b/pdftocgen/app.py index 2859d7b..459a540 100644 --- a/pdftocgen/app.py +++ b/pdftocgen/app.py @@ -90,7 +90,7 @@ def main(): print(usage_s, file=sys.stderr) sys.exit(2) - recipe_file: TextIO = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore') + recipe_file: TextIO = None readable: bool = False vpos: bool = False out: TextIO = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='ignore') @@ -129,6 +129,8 @@ def main(): print(usage_s, file=sys.stderr) sys.exit(1) + if not recipe_file: + recipe_file = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore') path_in: str = args[0] # done parsing arguments diff --git a/pdftocio/app.py b/pdftocio/app.py index 484b44f..6fcc22f 100644 --- a/pdftocio/app.py +++ b/pdftocio/app.py @@ -94,7 +94,7 @@ def main(): print(usage_s, file=sys.stderr) sys.exit(2) - toc_file: TextIO = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore') + toc_file: TextIO = None print_toc: bool = False readable: bool = False out: Optional[str] = None @@ -131,6 +131,8 @@ def main(): print(usage_s, file=sys.stderr) sys.exit(1) + if not toc_file: + toc_file = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore') path_in: str = args[0] # done parsing arguments diff --git a/pdftocio/tocparser.py b/pdftocio/tocparser.py index 3dfaec6..93693f6 100644 --- a/pdftocio/tocparser.py +++ b/pdftocio/tocparser.py @@ -5,10 +5,10 @@ from typing import IO, List from fitzutils import ToCEntry -from itertools import takewhile +from itertools import count, takewhile -def parse_entry(entry: List) -> ToCEntry: +def parse_entry(entry: List, nLine: int) -> ToCEntry: """parse a row in csv to a toc entry""" # a somewhat weird hack, csv reader would read spaces as an empty '', so we @@ -23,8 +23,13 @@ def parse_entry(entry: List) -> ToCEntry: *entry[indent + 2:] # vpos ) return toc_entry + except ValueError as e: + print(f"Unable to parse toc entry {entry} from line {nLine};", + f"Couldn't convert '{entry[indent + 1]}' to a page number.", + file=sys.stderr) + raise e except IndexError as e: - print(f"Unable to parse toc entry {entry};", + print(f"Unable to parse toc entry {entry} from line {nLine};", f"Need at least {indent + 2} parts but only have {len(entry)}.", "Make sure the page number is present.", file=sys.stderr) @@ -35,4 +40,4 @@ def parse_toc(file: IO) -> List[ToCEntry]: """Parse a toc file to a list of toc entries""" reader = csv.reader(file, lineterminator='\n', delimiter=' ', quoting=csv.QUOTE_NONNUMERIC) - return list(map(parse_entry, reader)) + return list(map(parse_entry, reader, count(1)))