Skip to content
Snippets Groups Projects
scan.py 1.75 KiB
Newer Older
Simon Will's avatar
Simon Will committed
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse
import sys
from typing import List

from .meters import ALL_METERS
from .model import Verse
from .scanner import Scanner
def scan(plain_verses: List[str], meters=ALL_METERS, **options) -> List[Verse]:
Simon Will's avatar
Simon Will committed
    """Scan Latin verses."""
    scanner = Scanner()
    scanned_verses = scanner.scan_verses(plain_verses)
Simon Will's avatar
Simon Will committed
    return scanned_verses
Simon Will's avatar
Simon Will committed


def parse_args() -> argparse.Namespace:
    """Parse arguments from the commandline.
Simon Will's avatar
Simon Will committed
    :return: An argparse Namespace holding the arguments.
    """
    d = 'Scan Latin verses.'
    parser = argparse.ArgumentParser(prog='allzweckmesser', description=d)
    parser.add_argument('--infile', help=('A file containing the verses that'
                                          ' are to be scanned.'))
    parser.add_argument('--meters', '-m', nargs='+', help=('The considered'
                                                           ' meters.'))
Simon Will's avatar
Simon Will committed
    args = parser.parse_args()
    return args


def get_plain_verses(infile: str = None) -> List[str]:
Simon Will's avatar
Simon Will committed
    """Read verses that are to be scanned.
Simon Will's avatar
Simon Will committed
    If infile is None the verses are read from the standard input.

    :params infile: A file containing one verse per line.
    :return: A list of the verses.
    """
    if infile:
        with open(infile) as f:
            plain_verses = [line.strip() for line in f.readlines()]
Simon Will's avatar
Simon Will committed
    else:
        plain_verses = [line.strip() for line in sys.stdin.readlines()]
    return plain_verses
Simon Will's avatar
Simon Will committed


def main():
    """Parse CLI arguments then read and scan verses."""
    args = vars(parse_args())
    args['plain_verses'] = get_plain_verses(args['infile'])
Simon Will's avatar
Simon Will committed
    del args['infile']
Simon Will's avatar
Simon Will committed
    scanned_verses = scan(**args)
    for v in scanned_verses:
        print(v)
Simon Will's avatar
Simon Will committed


if __name__ == '__main__':
    main()