コード例 #1
0
ファイル: io_moi.py プロジェクト: svilendobrev/svd_bin
    def procheti_prevod( klas, az, red, nomer, igrupa):
        gg = red.split( az.stoinosti.grupa+':', 1)
        if len(gg)>1 and not gg[0].strip():
            g = gg[1].strip()
            dop = kyso = ime = ''
            if '+=' in g:
                kyso,dop = (s.strip() for s in g.split('+='))
            elif '==' in g:
                ime,kyso = (s.strip() for s in g.split('=='))
            else: ime = g
            igrupa = az.nova_grupa( dylgo= ime, kyso= kyso, dop= dop)
            return igrupa

        try:
            k,v,o = prevodi_parse( red, nomer)
        except AssertionError as e:
            err( 'PARSING ', az.fname, e.message, stderr=1)
            raise
        v = zaglavie( v)
        k = az.bez_ext( k)
        q = az.prevodi.get( k)
        if q and q.ime != v: err( 'повтаря се:', k, az.fname, v, '\n;;', q.ime)
        az.nov_prevod( fname= k, ime= v, grupa= igrupa, original= o, roditel= az.fname)
        return igrupa
コード例 #2
0
ファイル: io_moi.py プロジェクト: svilendobrev/svd_bin
    def procheti( klas, az, redove):
        dbg=0
        nomer = 0
        ime = ''
        systoyanie = 'ime'
        prevodi = []
        stoinost = []   #key, values
        sydyrzhanie = []
        def popylni_stoinost():
            k = stoinost[0]
            vv = stoinost[1:]
            if k == az.stoinosti.sydyrzhanie:
                vv = [ r for r,n in vv ]  #не маха празните, за разделител - освен отпред и отзад
                if vv[0][:1]==':':   #много-редове; ключ:: ... ; всеки нов ред е нов ред
                    vv[0] = vv[0][1:]
                while vv and not vv[0]: del vv[0]
                while vv and not vv[-1]: del vv[-1]
                sydyrzhanie.extend( vv)
            elif k == az.stoinosti.prevodi:
                prevodi.extend( (r,n) for r,n in vv if r )  #също?
            else:
                vv = [ r for r,n in vv ]
                if vv[0][:1]==':':   #много-редове; ключ:: ... ; всеки нов ред е нов ред
                    vv[0] = vv[0][1:]
                    v = '\n'.join( vv ).strip()
                else:   #много-абзаци; ключ: ... ; 2 нови реда са нов ред, иначе се слепват
                    v = ' '.join( (r or '\n') for r in vv ).strip().replace( ' \n ', '\n')
                az.slaga_etiket( k,v, zamesti= False )
            stoinost[:] = []

        for red in redove:
            nomer += 1
            red = red.expandtabs(4)
            red = red.rstrip()
            red0 = red.lstrip()
            if red0.startswith( '#'):
                az.komentari.append( red0)
                continue

            az.redove.append( red)
            if systoyanie == 'ime':
                red = red0
                #if dbg: print( '?ime', red)
                if red:
                    mezik = az.re_ezik_ime and az.re_ezik_ime.match( red)
                    if mezik:
                        e = mezik.group(1)
                        r = mezik.group(2)
                        az.imena[e] = zaglavie( az.imena.get( e, '') + ' ' + r)
                        continue

                    ime += ' ' + red
                    if dbg: print( '+ime', red)
                else:
                    systoyanie = 'etiketi'
                continue

            if stoinost:
                if not red:
                    stoinost.append( (red, nomer) )
                    continue

                krai = red[0].strip()    #non-space
                #prazno = len( red) - len( red1)
                sydyrzhanie_izvynredno = stoinost[0] in [az.stoinosti.sydyrzhanie, az.stoinosti.prevodi] and ':' not in red
                if not krai or sydyrzhanie_izvynredno:
                    #if not stoinost_prefix: stoinost_prefix = prazno
                    stoinost.append( (red0, nomer) )
                    if dbg: print( 221, '+stoinost', red)
                    continue
                if dbg: print( 22, '-stoinost')
                popylni_stoinost()

            elif not red: continue

            stst = red.find( ':')
            prev = red.find( '=')
            e_stst = stst >0
            e_prev = prev >0
            if e_prev and e_stst:
                if prev<stst: e_stst = 0
                else: e_prev = 0

            if e_prev:
                if dbg: print( 11, 'prev', red)
                prevodi.append( (red, nomer) )
            elif e_stst:
                if dbg: print( 11, 'stoinost', red)
                kv = [a.strip() for a in red.split(':',1)]
                k = kv[0]
                v = len(kv)>=1 and kv[-1] or ''
                if k == az.stoinosti.grupa:
                    stoinost = [az.stoinosti.prevodi, (red,nomer) ]
                else:
                    stoinost = [k, (v,nomer) ]
            else:   #etiketi
                if dbg: print( 11, 'etiketi', red)
                for k in red.split():
                    az.slaga_etiket( k, True)


        if stoinost:
            popylni_stoinost()

        grupa = None
        for red,nomer in prevodi:
            grupa = klas.procheti_prevod( az, red, nomer, grupa)

        if ime and ime.strip(): az.slaga_ime( ime.strip())
        if sydyrzhanie: az.etiketi.sydyrzhanie = sydyrzhanie