def nova_grupa( az, kyso, dylgo, dop): kyso = zaglavie( kyso) if dop: assert kyso assert not dylgo dylgo = kyso + ' ' + dop elif not dylgo: dylgo = kyso elif not kyso: kyso = dylgo dylgo = zaglavie( dylgo) igrupa = DictAttr( ime= dylgo, kyso= kyso, dop= dop, elementi= [] ) az.grupi.append( igrupa) return igrupa
def _nov_prevod( klas, *, fname, ime, original =None, grupa =None, roditel =None, **etiketi): p = klas.Prevod( fname= fname, grupa= grupa, roditel= roditel, _prevodach = klas.stoinosti) p.etiketi = klas.DictAttrTrans() for k in (etiketi.pop( 'simvoli', '') or '').strip().split(): klas._slaga_etiket( k, True, p.etiketi) p.update_pre( ime= zaglavie( ime), original= original, **etiketi) for k in list( p.keys()): klas.ime2imena( k, p) if grupa is not None: grupa.elementi.append( p) q = klas.vse_prevodi.get( fname) if not q: klas.vse_prevodi[ fname] = p elif q.ime != ime: err( 'повтаря се/все:', fname, '\n', roditel, ':', ime, '\n', q.roditel, ':', q.ime) return p
def razglobi_imena( imena, rubrika, data, dirname): imena = (imena.replace( '\u2013','-') #- = x2013 .replace( '\xA0','_') .replace( ' ','_') ) dok = False ime = avtor = '' ostatyk = '' opisanie = avtor_ot_opisanie = None bez_ime = False for q in rquo: rubrika = rubrika.replace( q, '') rubrika_ = rubrika.replace(' ','_') if rezlf.search( rubrika_ ): opisanie = imena m = reime.search( imena) if m: avtor_ot_opisanie = m.group(0) ime = zlf bez_ime = True elif regodishnina.search( imena): m = regodishnina.search( imena) ime = m.group('ime') avtor = m.group('avtor') elif rerubrika.search( rubrika ): opisanie = imena ime = rubrika_ bez_ime = True else: imena = rezlf.sub( zlf, imena) imena = reakm.sub( akomika, imena) imena = rehs.sub( hs, imena) imena = reteatyr_ime.sub( r'\1\2', imena) #imena > ime + (tip) + avtor.opis #imena = imena.lstrip( rquo+rend) imena = imena.strip( rend) tipove= 'документална_радиопиеса драматизация документално_студио'.replace(' ','|') razdelitel = rlatcyr( '_(от|по|на)_') ss = re.split( requo, imena) if len(ss)>1: avtor = ss.pop(-1).strip( rend) if len(ss)>1: opisanie = ss.pop(0).strip( rend) ime = '_'.join( ss) razdelitel = razdelitel.lstrip('_') if opisanie: #... в романа на ... ; панорама на ... #Механизмът на едиквоси, разтълкуван от ... в if 10: m = rextract( rlatcyr( '_(на|от)_') + '('+rImeIme+')', opisanie) if m: m,_ostavi = m avtor_ot_opisanie = m.group( 2) else: m = rextract( '^('+rImeIme+')', opisanie) if m: m,_ostavi = m avtor_ot_opisanie = m.group( 1) elif '-' in imena: ime,avtor = imena.split('-',1) else: ime = '' avtor = imena m = re.match( '(?P<ime>.*?)'+razdelitel+'(?P<avtor>'+rImeIme+ ')(?P<ost>.*)', avtor) if m: avtor = m.group( 'avtor').strip( rend) ostatyk = m.group( 'ost').strip( rend) if not ime: ime = m.group('ime') m = rextract( rlatcyr( tipove), ime, flags= re.IGNORECASE) if m: m,ime = m if 'док' in (m.group('tip') or '').lower(): dok = True else: ostatyk = avtor avtor = '' ime = ime.strip( rquo+rend) ime = (spc( ime) .replace( ' ',' ') ) if not ime: ime = rubrika bez_ime = True ostatyk = ostatyk.strip( rend) ostatyk = rim.rim2fix( ostatyk, doX= False) #print( 222222222, ostatyk) #avtor.opis > avtor + nomer.chast (+opis) nomer = '' rchast = rlatcyr( '((част|епизод)и?|ч\.?)') #|глава rnomer = rim.re_nomer_extrafix rnomer = rnomer.replace( ')', ''.join( '|'+slovom[:-1]+'[аи]' for slovom in slovom10 #първ[аи] част/епизод ) +')') m = rextract( '(?P<nomer>_*('+rnomer+'_(и_)?)*' +rnomer+')_?'+rchast, ostatyk, flags= re.IGNORECASE) if m: m,ostatyk = m nomer = m.group( 'nomer') else: m = rextract( '[-_]'+rchast+'_?(?P<nomer>'+rnomer+')', ostatyk, flags= re.IGNORECASE) if m: m,ostatyk = m nomer = m.group( 'nomer') n = slovom10.get( nomer) if n: nomer = n else: nomer = rim.rim2fix( nomer) nomer = rim.rim2int( nomer,nomer) #print( 333333333, ostatyk, nomer) ostatyk = ostatyk.strip( rend) m = rextract( ( rlatcyr( r'_? o? ((?P<g1>\d{4})_?г\.? | (?P<g3>премиера)) c?' .replace( 'o', r'[\[\(]') .replace( 'c', r'[\)\]]') )), ostatyk, flags= re.VERBOSE+re.IGNORECASE) if m: m,ostatyk = m godina = m.group( 'g1') or m.group( 'g3') and datetime.date.today().year else: godina = None ostatyk = ostatyk.strip( rend) #print( 444444444, ostatyk, godina) if not avtor: avtor = ostatyk if not avtor and avtor_ot_opisanie: avtor = avtor_ot_opisanie #avtori m = rextract( rImeIme, avtor) if m: m,_ostavi = m avtor = m.group( 0) else: if len(avtor)>40: avtor = '' avtor = spc( avtor) avtori = re.split( ' и ', avtor) avtori = [ re.sub( '(по )?(.+?)((народна|приказка|радиоадаптация|премиера)[ \.]?)+', r'\2', a.strip().strip('()'), re.IGNORECASE ) .replace( '[]','') .strip() .rstrip( rend) for a in avtori] avtori = [ a for a in avtori if a] avtori_kysi = [] for a in avtori: avtor_imena = a.split() if avtor_imena: kys = len( avtor_imena)>1 and avtor_imena[0][0]+'.'+avtor_imena[-1] or avtor_imena[0] avtori_kysi.append( kys) avtor_kys = '-'.join( avtori_kysi) avtor_dylyg = '-'.join( avtori) dirname_cyr = filt_er( '--'.join( a for a in [ ime, avtor_dylyg, 'радио'] if a )) dirname = c2l( dirname_cyr) # [0].upper()+a[1:] avtori_plus = ' '.join( ''.join( zaglavie(e) for e in a.split()) for a in avtori) zagolemi = (dok or not sum( x.lower() in rubrika.lower() for x in 'деца приказк ВзаП'.split()) ) and 'възрастни' or '' dok = dok and 'док' or '' return locals()
def dai_ime( opis): return zaglavie( dai( opis, cyr.ime)) for k in s_ime: v = opis.get(k) if v: break return v
def zaredi_danni( klas, args): ''' - прочита всички описи - при преводи, обикаля всички директории и запомня кои имат преводи - тези от тях които нямат описи, им се правят нови - за всички описи - ако нямат име, се слага от преводи ако има - самопопълва звук/година от името-на-директорията - добавя поисканите етикети ''' options = klas.options ################# #зареждане на данни, заявки, и пр. - четене/оправяне на ОПИСИте if options.prevodi: if options.podrobno: prn( 'prevodi:', options.prevodi) for k,(v,o) in prevodi_file2ime( eutf.readlines( options.prevodi)): klas._nov_prevod( fname= k, ime= zaglavie(v), original= zaglavie(o), roditel= options.prevodi) if options.podrobno: prn( '%-40s = %s' % (k,v) ) if options.prevodi_meta: info.meta_prevodi.update( meta_prevodi( options.prevodi_meta, dict= dict_lower, prn= options.podrobno and prn, zaglavie= 'мета-преводи', razdelitel_v_nachaloto=True )) info.fenc = options.filename_enc or (eutf.e_utf_stdout() and 'utf-8' or locale.getpreferredencoding()) if options.podrobno: prn( 'filename_enc:', info.fenc) prn( 'stdout.enc:', sys.stdout.encoding, sys.stdout) prn( 'stderr.enc:', sys.stderr.encoding, sys.stderr) etiketi = {} for e in options.etiket or (): klas.procheti_etiket( e, etiketi) options.dirs = [] za_pravene = {} for path,dirs,files in klas.obikoli( args, klas.e_za_propuskane ): if options.prevodi: for dname in dirs: pname = join( path, dname) if not options.simvolni and os.path.islink( pname): continue p = klas.vse_prevodi.get( dname) if p: rpname = realpath( pname) za_pravene[ rpname] = p.ime, pname pname = realpath( path) for fname in files: if not e_opis( fname): continue i = klas( pname, redove= join( path, fname), origfname= path) if options.podrobno: prn( i.fname) if options.podrobno>1: prn( i.dump() ) for path,dirs,files in klas.obikoli( options.papka_s_opisi or () ): pname = realpath( path) for fname in files: if klas.e_za_propuskane( fname): continue i = klas( join( pname, fname), redove= join( path, fname), origfname= join( path, fname), isdir=False) if options.podrobno: prn( i.fname) for pname,(ime,fpath) in za_pravene.items(): if pname not in info.vse: i = klas( pname) i.slaga_ime( ime) for k,i in sorted( info.vse.items()): try: i.samopopylva_ot_fname() fname = basename( i.fname) p = klas.vse_prevodi.get( fname) if p: if not i.imeto or options.popravi_opisi: i.slaga_ime( p.ime) if p.original and not i.etiketi.original: i.slaga_etiket( i.stoinosti.original, p.original ) i.etiketi.update_pre( **etiketi) i.samopopylva_etiketi() razlika, t = i.zapis( naistina= options.zapis_opisi ) #if razlika: print '-----------' except: print( '????', fname) raise