Nantes Université

Skip to content
Extraits de code Groupes Projets
mml.py 2,63 ko
Newer Older
import os
import sys
import csv
import re
import os.path as osp
from lg import Lg
import lg2txt
from settings import LABELS_TRANS_CSV, MATHML_MAP_DIR, CROHMELIB_SRC_DIR, \
                    CROHMELIB_GRAMMAR_DIR, MATHML_TXL_FILE


def readMapFile(mapFile):
    """Read in symbol and structure mappings from a file."""
    try:
        fileReader = csv.reader(open(mapFile))
    except:
        sys.stderr.write('  !! IO Error (cannot open): ' + mapFile + '\n')
        return

    symbolsMap = {}
    relationsMap = {}
    readingSymbols = True
    for row in fileReader:
        # Skip blank lines and comments.
        if len(row) == 0:
            continue
        elif row[0].strip()[0] == '#':
            continue
        elif row[0].strip() == 'SYMBOLS':
            readingSymbols = True
        elif row[0].strip() == 'RELATIONSHIPS':
            readingSymbols = False
        else:
            if readingSymbols:
                symbolsMap[row[0]] = row[1]
            else:
                relationsMap[row[0]] = row[1]
    return symbolsMap, relationsMap


def get_mml(filename, translate=True):
    temp_lg = osp.join(osp.split(filename)[0], "temp_" + osp.split(filename)[1] )
    temp_mml = temp_lg[:-3] + ".mml"
    inputFile = Lg(filename)
    lg_NE_string = inputFile.csv()
    if translate:
        symbolsMap, relationsMap = readMapFile(LABELS_TRANS_CSV)
        edge_pattern = re.compile(r'^E,')
        node_pattern = re.compile(r'(^N,)|#')
        symbol_temp = relabel(lg_NE_string, symbolsMap, node_pattern)
        edge_temp = relabel(lg_NE_string, dict(**symbolsMap, **relationsMap), 
                            edge_pattern)
        lg_NE_string = symbol_temp + "\n" + edge_temp
    print("\n" + temp_lg)
    with open(temp_lg, 'w') as f:
        f.writelines(lg_NE_string)
    
    try:
        mml_out_temp = lg2txt.main(temp_lg, MATHML_MAP_DIR)
    except:
        mml_out_temp = ""
        mml_out = ""
    if mml_out_temp:
        with open(temp_mml, 'w') as f:
            f.writelines(mml_out_temp)
        mml_out = os.popen("txl -I " + CROHMELIB_SRC_DIR + " -I " + 
                           CROHMELIB_GRAMMAR_DIR + " " + temp_mml + " " + 
                           MATHML_TXL_FILE).read()
    if not mml_out:
        mml_out = mml_out_temp
    return mml_out
        
def relabel(lg_NE_string, Map, pattern):
    temp = '\n'.join([line for line in lg_NE_string.split('\n') 
                       if re.match(pattern, line)])
    for source_label, mapped_label in Map.items():
        temp = temp.replace("," + source_label + ",", "," + mapped_label + ",")
    return temp

if __name__ == "__main__":
    filename = sys.argv[1]
    get_mml(filename)