import re

TEMPLATE = '''[ActivePage]
ActivePage=tsSearchByBuleiSingle
[SearchRange]
cbB1=1
cbB2=1
cbB3=1
cbB4=1
cbB5=1
cbB6=1
cbB7=1
cbB8=1
cbB9=1
cbB10=1
cbB11=1
cbB12=1
cbB14=1
cbB15=1
cbB17=1
cbB18=1
cbB19=1
cbB16=1
cbB20=1
cbB13=1
cbB21=1
cbSV1=1
cbSV2=1
cbSV3=1
cbSV4=1
cbSV5=1
cbSV6=1
cbSV7=1
cbSV8=1
cbSV9=1
cbSV10=1
cbSV11=1
cbSV12=1
cbSV13=1
cbSV14=1
cbSV15=1
cbSV16=1
cbSV17=1
cbSV18=1
cbSV19=1
cbSV20=1
cbSV21=1
cbSV22=1
cbSV23=1
cbSV24=1
cbSV25=1
cbSV26=1
cbSV27=1
cbSV28=1
cbSV29=1
cbSV30=1
cbSV31=1
cbSV32=1
cbSV33=1
cbSV34=1
cbSV35=1
cbSV36=1
cbSV37=1
cbSV38=1
cbSV39=1
cbSV40=1
cbSV41=1
cbSV42=1
cbSV43=1
cbSV44=1
cbSV45=1
cbSV46=1
cbSV47=1
cbSV48=1
cbSV49=1
cbSV50=1
cbSV51=1
cbSV52=1
cbSV53=1
cbSV54=1
cbSV55=1
cbSV85=1
cbSV85a=1
cbSV9a=1
cbSV12a=1
cbSV26a=1
cbSV30a=1
cbSV40a=1
cbSV54a=1
cbSX74=1
cbSX79=1
cbSX80=1
cbSX81=1
cbSX82=1
cbSX83=1
cbSX84=1
cbSX86=1
cbSX85=1
cbSX64=1
cbSX65=1
cbSX66=1
cbSX67=1
cbSX68=1
cbSX69=1
cbSX70=1
cbSX71=1
cbSX72=1
cbSX73=1
cbSX87=1
cbSX88=1
cbSX78=1
cbSX77=1
cbSX76=1
cbSX75=1
cbSX58=1
cbSX59=1
cbSX60=1
cbSX61=1
cbSX62=1
cbSX63=1
cbSX54=1
cbSX55=1
cbSX56=1
cbSX57=1
cbSX01=1
cbSX02=1
cbSX03=1
cbSX04=1
cbSX05=1
cbSX07=1
cbSX08=1
cbSX09=1
cbSX10=1
cbSX11=1
cbSX12=1
cbSX13=1
cbSX14=1
cbSX15=1
cbSX16=1
cbSX17=1
cbSX18=1
cbSX19=1
cbSX20=1
cbSX21=1
cbSX22=1
cbSX23=1
cbSX24=1
cbSX25=1
cbSX27=1
cbSX28=1
cbSX29=1
cbSX30=1
cbSX31=1
cbSX32=1
cbSX33=1
cbSX34=1
cbSX35=1
cbSX36=1
cbSX37=1
cbSX38=1
cbSX39=1
cbSX40=1
cbSX41=1
cbSX42=1
cbSX43=1
cbSX44=1
cbSX45=1
cbSX46=1
cbSX47=1
cbSX48=1
cbSX49=1
cbSX50=1
cbSX51=1
cbSX26=1
cbSX53=1
cbSX52=1
cbSX06=1
cbSJ01=1
cbSJ19=1
cbSJ20=1
cbSJ21=1
cbSJ22=1
cbSJ23=1
cbSJ24=1
cbSJ25=1
cbSJ27=1
cbSJ28=1
cbSJ29=1
cbSJ30=1
cbSJ31=1
cbSJ32=1
cbSJ33=1
cbSJ34=1
cbSJ35=1
cbSJ36=1
cbSJ37=1
cbSJ38=1
cbSJ39=1
cbSJ40=1
cbSJ26=1
cbSJ10=1
cbSJ15=1
cbSJ07=1
cbSA091=1
cbSA097=1
cbSA098=1
cbSA110=1
cbSA111=1
cbSA112=1
cbSA114=1
cbSA119=1
cbSA120=1
cbSA121=1
cbSC056=1
cbSC057=1
cbSC059=1
cbSC071=1
cbSC073=1
cbSC077=1
cbSC078=1
cbSC097=1
cbSC106=1
cbSG052=1
cbSG069=1
cbSG083=1
cbSG084=1
cbSF01=1
cbSF02=1
cbSF03=1
cbSF12=1
cbSF24=1
cbSF27=1
cbSF28=1
cbSF29=1
cbSK05=1
cbSK32=1
cbSK34=1
cbSK35=1
cbSK38=1
cbSK41=1
cbSL164=1
cbSL162=1
cbSL158=1
cbSL157=1
cbSL155=1
cbSL154=1
cbSL153=1
cbSL149=1
cbSL143=1
cbSL141=1
cbSL135=1
cbSL133=1
cbSL132=1
cbSL131=1
cbSL130=1
cbSL116=1
cbSL115=1
cbSM059=1
cbSP154=1
cbSP155=1
cbSP167=1
cbSP168=1
cbSP174=1
cbSP178=1
cbSP179=1
cbSP180=1
cbSP181=1
cbSP182=1
cbSP183=1
cbSP184=1
cbSP185=1
cbSP187=1
cbSP189=1
cbSS06=1
cbSU205=1
cbSU222=1
cbSU223=1
cbSZS01=1
cbSZW01=1
cbSZW02=1
cbSZW03=1
cbSI01=1
cbSZW04=1
cbSZW05=1
cbSZW06=1
cbSZW07=1
cbSZW08=1
cbSZW09=1
[BuleiSingle]
{}
[SutraSingle]
0='''

def a_b_adder(cat_set):
    new_numbers = []
    for i in cat_set:	
        if i in ['128', '132', '142', '181', '182', '236', '315', '446', '447', '448', '492', '540', '555', '747', '751', '794', '797', '852', '894', '895', '1027', '1045', '1057', '1103', '1138', '1222', '1252', '1255', '1264', '1369', '1378', '1422', '1467', '1483', '1510']:
            new_numbers.append(i + 'a')
            new_numbers.append(i +	'b')
        elif i in ['175', '893']:
            new_numbers.append(i + 'a')
            new_numbers.append(i +	'b')
            new_numbers.append(i +	'c')
        elif i in ['983', '1072', '1177', '1120']:
            new_numbers.append(i + 'A')
        elif i in ['1113']:
            new_numbers.append(i + 'B')
        elif i in ['150', '864', '954', '944', '1005', '1022', '1028', '1108', '1156', '1159', '1168', '1185', '1134', '1670']:
            new_numbers.append(i + 'A')
            new_numbers.append(i + 'B')
        elif i in ['924']:
            new_numbers.append(i + 'A')
            new_numbers.append(i + 'B')
            new_numbers.append(i + 'C')
        elif i in ['974']:
            new_numbers.append(i + 'A')
            new_numbers.append(i + 'B')
            new_numbers.append(i + 'C')
            new_numbers.append(i + 'D')
            new_numbers.append(i + 'E')
            new_numbers.append(i + 'F')
        else: 
            new_numbers.append(i)	
    return new_numbers

def cat_inverse_compiler(cat):
    cat_rabbit = []
    for i in range(1, 1693):
        if str(i) not in cat:
            cat_rabbit.append(str(i))			
    return cat_rabbit
	
def numerical_only(text_no):
    number_regex = re.compile(r'\d{1,4}')		
    number = number_regex.search(text_no)
    number_only = number.group()
    return int(number_only)
	
def text_no_modifier(text_no):
    text_no_numerical = numerical_only(text_no)
    if 1 <= text_no_numerical <= 9:
        return '000' + str(text_no)
    if 10 <= text_no_numerical <= 99:
        return '00' + str(text_no)
    if 100 <= text_no_numerical <= 999:
        return '0' + str(text_no)
    else:
        return str(text_no)
	
def vol_no_finder(text_no):
    text_no_numerical = numerical_only(text_no)
    if 1 <= text_no_numerical <= 98:
        return '01'
    if 99 <= text_no_numerical <= 151:
        return '02'
    if 152 <= text_no_numerical <= 191:
        return '03'
    if 192 <= text_no_numerical <= 219:
        return '04'
    if text_no_numerical == 220:
        return 'Do it manually!'
    if 221 <= text_no_numerical <= 261:
        return '08'
    if 262 <= text_no_numerical <= 278:
        return '09'
    if 279 <= text_no_numerical <= 309:
        return '10'
    if 310 <= text_no_numerical <= 320:
        return '11'
    if 321 <= text_no_numerical <= 396:
        return '12'
    if 397 <= text_no_numerical <= 424:
        return '13'
    if 425 <= text_no_numerical <= 584:
        return '14'
    if 585 <= text_no_numerical <= 655:
        return '15'
    if 656 <= text_no_numerical <= 720:
        return '16'
    if 721 <= text_no_numerical <= 847:
        return '17'
    if 848 <= text_no_numerical <= 917:
        return '18'
    if 918 <= text_no_numerical <= 1029:
        return '19'
    if 1030 <= text_no_numerical <= 1198:
        return '20'
    if 1199 <= text_no_numerical <= 1420:
        return '21'
    if 1421 <= text_no_numerical <= 1434:
        return '22'
    if 1435 <= text_no_numerical <= 1447:
        return '23'
    if 1448 <= text_no_numerical <= 1504:
        return '24'
    if 1505 <= text_no_numerical <= 1518:
        return '25'
    if 1519 <= text_no_numerical <= 1544:
        return '26'
    if 1545 <= text_no_numerical <= 1546:
        return '27'
    if 1547 <= text_no_numerical <= 1557:
        return '28'
    if 1558 <= text_no_numerical <= 1563:
        return '29'
    if 1564 <= text_no_numerical <= 1584:
        return '30'
    if 1585 <= text_no_numerical <= 1627:
        return '31'
    if 1628 <= text_no_numerical <= 1692:
        return '32'
    if 1693 <= text_no_numerical <= 1717:
        return '33'
    if 1718 <= text_no_numerical <= 1730:
        return '34'
    if 1731 <= text_no_numerical <= 1735:
        return '35'
    if 1736 <= text_no_numerical <= 1743:
        return '36'
    if 1744 <= text_no_numerical <= 1764:
        return '37'
    if 1765 <= text_no_numerical <= 1782:
        return '38'
    if 1783 <= text_no_numerical <= 1803:
        return '39'
    if 1804 <= text_no_numerical <= 1820:
        return '40'
    if 1821 <= text_no_numerical <= 1823:
        return '41'
    if 1824 <= text_no_numerical <= 1828:
        return '42'
    if 1829 <= text_no_numerical <= 1834:
        return '43'
    if 1835 <= text_no_numerical <= 1851:
        return '44'
    if 1852 <= text_no_numerical <= 1910:
        return '45'
    if 1911 <= text_no_numerical <= 1956:
        return '46'
    if 1957 <= text_no_numerical <= 2000:
        return '47'
    if 2001 <= text_no_numerical <= 2025:
        return '48'
    if 2026 <= text_no_numerical <= 2039:
        return '49'
    if 2040 <= text_no_numerical <= 2065:
        return '50'
    if 2066 <= text_no_numerical <= 2101:
        return '51'
    if 2102 <= text_no_numerical <= 2120:
        return '52'
    if 2121 <= text_no_numerical <= 2122:
        return '53'
    if 2123 <= text_no_numerical <= 2144:
        return '54'
    if 2145 <= text_no_numerical <= 2184:
        return '55'
    if 2732 <= text_no_numerical <= 2920:
        return '85'

def slr_writer(cat):
    slr = []
    for i, item in enumerate(cat):
        text_no = item
        slr.append('{index}=T{vol}n{text}'.format(index=str(i), vol=vol_no_finder(text_no), text=text_no_modifier(text_no)))
    slr.append(str(i + 1) + '=')
    return slr

def main():
    userInput = input('Enter a list of Taisho text numbers separated by spaces.\n')
    cat_duck = userInput.split()
    cat_rabbit = cat_inverse_compiler(cat_duck)
    cat_rabbit_with_abcs = a_b_adder(cat_rabbit)
    outputFile = open(('slr holding pen/' + input('Name for slr file?') + '.slr'), 'w')
    outputFile.write((TEMPLATE.format('\n'.join(slr_writer(cat_rabbit_with_abcs)))))
    outputFile.close()

if __name__ == '__main__':
    main()