#!/usr/bin/env python

# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#                                                                        %
#      This file is part of the 'lilyglyphs' LaTeX package.              %
#                                ==========                              %
#                                                                        %
#              https://github.com/openlilylib/lilyglyphs                 %
#               http://www.openlilylib.org/lilyglyphs                    %
#                                                                        %
#  Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org          %
#                                                                        %
#  'lilyglyphs' is free software: you can redistribute it and/or modify  %
#  it under the terms of the LaTeX Project Public License, either        %
#  version 1.3 of this license or (at your option) any later version.    %
#  You may find the latest version of this license at                    %
#               http://www.latex-project.org/lppl.txt                    %
#  more information on                                                   %
#               http://latex-project.org/lppl/                           %
#  and version 1.3 or later is part of all distributions of LaTeX        %
#  version 2005/12/01 or later.                                          %
#                                                                        %
#  This work has the LPPL maintenance status 'maintained'.               %
#  The Current Maintainer of this work is Urs Liska (see above).         %
#                                                                        %
#  This work consists of the files listed in the file 'manifest.txt'     %
#  which can be found in the 'license' directory.                        %
#                                                                        %
#  This program 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.                  %
#                                                                        %
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

# ########################################################################
#                                                                        #
# genGlyphCommands.py                                                    #
#                                                                        #
# generate commands based on Emmentaler glyphs                           #
#                                                                        #
# ########################################################################

import os, sys, argparse, lilyglyphs_common as lg

def main(input_file):
    """Do the main work of the script"""
    
    in_dir, in_file = os.path.split(input_file)
    os.chdir(in_dir)
    
    # load and parse input file
    lg.read_input_file(in_file)
    read_entries()
    
    # generate LaTeX commands and save them to output file
    # (will be a .tex sibling of the input file)
    lg.generate_latex_commands()
    out_file, out_ext = os.path.splitext(input_file)
    lg.write_latex_file(os.path.join(os.getcwd(), out_file + '.tex'))
    
def read_entries():
    """Parse the input file and fill a dictionary"""
    entry = {}
    def reset_entry():
        """Set all members of the dict empty,
           because not all are present in each entry."""
        entry['cmd'] = ''
        entry['element'] = ''
        entry['type'] = 'glyphname'
        entry['comment'] = []
        entry['raise'] = ''
        entry['scale'] = ''
    
    reset_entry()
    scale = ''
    rais = ''
    for line in lg.definitions_file:
        line = line.strip()
        # empty line = end of entry
        if not len(line):
            # skip if cmd and glyph haven't been filled both
            if not (entry['cmd'] and entry['element']):
                print('Skip malformed entry \'' + entry['cmd'] + '\'. Please check input file')
                reset_entry()
            else:
                print('Read entry \'' + entry['cmd'] + '\'')
                lg.in_cmds[entry['cmd']] = {}
                lg.in_cmds[entry['cmd']]['element'] = entry['element']
                lg.in_cmds[entry['cmd']]['type'] = entry['type']
                lg.in_cmds[entry['cmd']]['comment'] = entry['comment']
                if scale:
                    lg.in_cmds[entry['cmd']]['scale'] = scale
                if rais:
                    lg.in_cmds[entry['cmd']]['raise'] = rais
                reset_entry()
        # ignore Python or LaTeX style comments
        elif line[0] in '#%':
            continue
        else:
            # add element to the entry
            keyval = line.split('=')
            if keyval[0] == 'scale':
                scale = keyval[1]
            elif keyval[0] == 'raise':
                rais = keyval[1]
            if keyval[0] == 'comment':
                entry['comment'] = [keyval[1]]
            else:
                entry[keyval[0].strip()] = keyval[1].strip()

    
def usage():
    print('genGlyphCommands.py')
    print('is part of the lilyglyphs package')
    print('')
    print('Usage:')
    print('Pass the name (without path) of an input definitions file')
    print('(this has to be located in the /stash_new_commands directory.')
    print('Please refer to the manual (documentation/lilyglyphs.pdf).')

# ####################################
# Finally launch the program
if __name__ == "__main__":
    # parse command line arguments
    parser = argparse.ArgumentParser(
                      description='Generate LaTeX commands using Emmentaler glyphs', 
                      parents=[lg.common_arguments])
    parser.add_argument('i', 
                        type=lg.is_file, 
                        metavar='INPUT', 
                        help='File with command templates.')
    args = parser.parse_args()
    
    # if we have exactly one existing file
    # join its components and run the program
    main(os.path.join(os.getcwd(), vars(args)['i']))