Ejemplo n.º 1
0
def oes_odl_lusg(cyntaf, ail, olynydd=None):
    '''
	ffwythiant: oes_odl_lusg
	'''

    # rhaid i'r ail air fod yn lluosill
    if ail.nifer_sillau() < 2:
        return False

    # clymau
    clymau1 = cyntaf.nodau.rhestr_clymau(trwsio=True)
    clymau2 = ail.nodau.rhestr_clymau(trwsio=True)

    # tocio cynffon yr ail air (y ddau gwlwm olaf)
    clymau2.pop()
    clymau2.pop()

    # nodau'r gair cyntaf
    nodau1 = cyntaf.nodau

    # nodau pen blaen yr ail air
    nodau2 = RhestrNodau([nod for cwlwm in clymau2 for nod in cwlwm])

    # gwirio am odl rhwng y cyntaf a phen blaen yr ail
    return oes_odl(nodau1, nodau2, olynydd, trwm_ac_ysgafn=False)
Ejemplo n.º 2
0
def oes_odl_ddwbl(nodau1, nodau2):
    '''
	ffwythiant: oes_odl_ddwbl
	'''
    if any([nod.isspace()
            for nod in nodau1]) or any([nod.isspace() for nod in nodau2]):
        return None

    odl_un = oes_odl_sengl(nodau1, nodau2)
    if odl_un:
        clymau1 = nodau1.rhestr_clymau(trwsio=True)
        clymau2 = nodau2.rhestr_clymau(trwsio=True)
        if len(clymau1) > 2 and len(clymau2) > 2:
            nodau3 = RhestrNodau(
                [nod for cwlwm in clymau1[:-2] for nod in cwlwm])
            nodau4 = RhestrNodau(
                [nod for cwlwm in clymau2[:-2] for nod in cwlwm])
            odl_dau = oes_odl_sengl(nodau3, nodau4)
            if odl_dau:
                return (odl_dau[0] + odl_un[0], odl_dau[1] + odl_un[1])
    return odl_un
Ejemplo n.º 3
0
 def __init__(self, s):
     s = s.strip()
     if re.search(r'\s', s):
         raise ValueError("Wedi methu creu Gair o'r llinyn '%s'" % s)
     self.nodau = RhestrNodau(s)
     self.clymau = self.nodau.rhestr_clymau(trwsio=True)
Ejemplo n.º 4
0
class Gair(object):
    '''
	class: Gair
		 mewnbwn: llinyn (utf8)
	 '''
    def __init__(self, s):
        s = s.strip()
        if re.search(r'\s', s):
            raise ValueError("Wedi methu creu Gair o'r llinyn '%s'" % s)
        self.nodau = RhestrNodau(s)
        self.clymau = self.nodau.rhestr_clymau(trwsio=True)

    def __unicode__(self):
        return self.nodau.__unicode__()

    def __str__(self):
        return self.__unicode__().encode('utf-8')

    def nodau_acennog(self):
        '''
		ffwythiant:	darganfod y nodau sy'n cario'r acenion
		allbwn:		rhestr y nodau (llafariaid) sy'n cario'r acenion
		'''
        ace = list()
        for cwlwm in self.clymau[::2]:  # clymau llafariaid yn unig
            if cwlwm and cwlwm[0].isllafariad():
                # llafariad sengl
                if len(cwlwm) == 1:
                    ace.append(cwlwm[0])
                # llafariaid dwbl (deusain)
                elif len(cwlwm) == 2:
                    # -------------------------
                    # dydy hyn ddim yn gweithio ers newid nodau.rhestr_clymau(wgytsain=True)
                    # i nodau.rhestr_clymau(trwsio=True). Mi fydd yn rhaid mynd nol i gael
                    # dau restr clymau, un ar gyfer cytseinedd (y method "wgystain" gwreiddiol)
                    # ac un ar gyfer odli (y method "trwsio")
                    # -------------------------
                    """
					ds = ''.join(nod.hir2byr() for nod in cwlwm).lower()
					if cy.dosbarth_deusain(ds):
						dd = cy.dosbarth_deusain[ds]
						# deusain talgron (acen ar yr ail lafariad)
						if ds in cy.deuseiniaid['talgron']:				
							ace.append( cwlwm[1] )
						# gair deusill (acen ar y ddwy lafariad)
						elif ds in cy.deuseiniaid['deusill']:				
							ace.append( cwlwm[0] )
							ace.append( cwlwm[1] ) 
					# deusain lleddf (acen ar y llafariad cyntaf)
					else:
						ace.append( cwlwm[0] )
					"""
                    ace.append(cwlwm[0])

                # tri neu fwy o lafariaid: defnyddio'r ail lafariad yn y cwlwm
                # nid yw hyn yn berthnasol ers defnyddio'r method "trwsio"
                else:
                    ace.append(cwlwm[1])
        return tuple(ace)

    def nifer_sillau(self):
        return len(self.acenion())

    def shownodau(self):
        print[nod.llinyn for nod in self.nodau]

    def showclymau(self):
        print[cwl.llinyn() for cwl in self.clymau]

    def pwyslais(self):
        '''
		ffwythiant:	darganfod pwyslais gair
		mewnbwn:	rhestr nodau
		allbwn:		mynegrif: (-1 = sill olaf, -2 = sill olaf ond un)
		sylwadau:	
			Mae angen helaethu ar ffyrdd i ddarganfod geiriau acennog lluosill
		'''
        # dianc os nad oes o leiaf un llafariad (e.e. y cysylltnod mewn englyn)
        if not any([nod.isllafariad() for nod in self.nodau]):
            return 0

        olaf = self.clymau[-1]
        olaf_ond_un = self.clymau[-2]
        olaf_ond_dau = self.clymau[-3] if len(self.clymau) > 2 else None

        # gwirio am ae o flaen y cwlwm cytseiniaid olaf (e.e. cymraeg)
        # ond dyw hyn ddim yn gweithio gyda 'ymadael'
        # if olaf and olaf_ond_un and olaf_ond_un.llinyn() == u'ae':
        # 	return -1

        # gwirio am h o flaen y cwlwm llafariaid olaf (e.e. dyfalbarhau)
        if olaf_ond_dau and olaf_ond_dau[-1].llinyn in ['h', 'rh']:
            # print 'ding 2'
            return -1
        # gwirio am lafariad hir fel cwlwm olaf (e.e. cangarŵ)
        if olaf_ond_un and unicode(olaf_ond_un[-1]) in cy.llafariaid_hir:
            # print 'ding 3'
            return -1
        # gwiriad syml
        if self.nifer_sillau() == 1:
            return -1  # gair unsill
        else:
            return -2  # goben

    def traeannu(self, cytseiniaid=False):
        '''
		ffwythiant: hollti gair yn dri (pen, canol, cwt)
		allbwn:		tri rhestr nodau
		'''
        pwy = self.pwyslais()
        # dim cytseiniaid
        # if not filter(None, self.clymau[1::2]):
        # 	return [], [], []
        # gair acennog
        if pwy == -1:
            pen = self.clymau[:-2]
            can = []
            cwt = self.clymau[-2:]
        # gair diacen
        else:
            pen = self.clymau[:-4]
            can = self.clymau[-4:-2]
            cwt = self.clymau[-2:]
        # cytseiniaid yn unig
        if cytseiniaid:
            pen = pen[1::2]
            can = can[1::2]
            cwt = cwt[1::2]
        # datod
        pen = [z for x in pen for z in x]
        can = [z for x in can for z in x]
        cwt = [z for x in cwt for z in x]
        return pen, can, cwt

    # allbwn
    def llinyn(self):
        return ''.join([nod.llinyn for nod in self.nodau])

    def llinyn_llafariaid(self, blanksymbol=' '):
        ss = list()
        for nod in self.nodau:
            if nod.isllafariad(): ss.append(nod.llinyn)
            else: ss.append(blanksymbol * len(nod.llinyn))
        return ''.join(ss)

    def llinyn_cytseiniaid(self, blanksymbol=' '):
        ss = list()
        for nod in self.nodau:
            if nod.iscytsain(): ss.append(nod.llinyn)
            else: ss.append(blanksymbol * len(nod.llinyn))
        return ''.join(ss)

    def llinyn_acenion(self, blanksymbol=' '):
        ace = self.nodau_acennog()

        if self.pwyslais() == 0:
            return ''.join(
                [blanksymbol * len(nod.llinyn) for nod in self.nodau])
        pwy = ace[self.pwyslais()]

        ss = list()
        for nod in self.nodau:
            if any([nod is x for x in ace]):
                if nod is pwy: ss.append('/')
                else: ss.append('v')
            else:
                ss.append(blanksymbol * len(nod.llinyn))
        return ''.join(ss)

    def llinyn_acenion_colon(self, blanksymbol=' '):
        ace = self.nodau_acennog()
        ss = [blanksymbol * len(nod.llinyn) for nod in self.nodau]
        ss[self.nodau.index(ace[-1])] = ':'
        if self.pwyslais() == -2:
            ss[self.nodau.index(ace[-2])] = ':'
        return ''.join(ss)

    # man ffwythiannau
    def nifer_sillau(self):
        return len(self.nodau_acennog())
Ejemplo n.º 5
0
	def __init__(self, s):
		s = s.strip()
		if re.search(r'\s', s):	
			raise ValueError( "Wedi methu creu Gair o'r llinyn '%s'" % s )
		self.nodau = RhestrNodau(s)
		self.clymau = self.nodau.rhestr_clymau(trwsio=True)
Ejemplo n.º 6
0
class Gair(object):
	'''
	class: Gair
		 mewnbwn: llinyn (utf8)
	 ''' 
	def __init__(self, s):
		s = s.strip()
		if re.search(r'\s', s):	
			raise ValueError( "Wedi methu creu Gair o'r llinyn '%s'" % s )
		self.nodau = RhestrNodau(s)
		self.clymau = self.nodau.rhestr_clymau(trwsio=True)

	def __unicode__(self):
		return  self.nodau.__unicode__()
				
	def __str__(self):
		return self.__unicode__().encode('utf-8')		
		
	def nodau_acennog(self):
		'''
		ffwythiant:	darganfod y nodau sy'n cario'r acenion
		allbwn:		rhestr y nodau (llafariaid) sy'n cario'r acenion
		'''
		ace = list()
		for cwlwm in self.clymau[::2]:	# clymau llafariaid yn unig
			if cwlwm and cwlwm[0].isllafariad():
				# llafariad sengl
				if len(cwlwm) == 1:			
					ace.append( cwlwm[0] )
				# llafariaid dwbl (deusain)
				elif len(cwlwm) == 2:
					# -------------------------
					# dydy hyn ddim yn gweithio ers newid nodau.rhestr_clymau(wgytsain=True)
					# i nodau.rhestr_clymau(trwsio=True). Mi fydd yn rhaid mynd nol i gael
					# dau restr clymau, un ar gyfer cytseinedd (y method "wgystain" gwreiddiol)
					# ac un ar gyfer odli (y method "trwsio")
					# -------------------------
					"""
					ds = ''.join(nod.hir2byr() for nod in cwlwm).lower()
					if cy.dosbarth_deusain(ds):
						dd = cy.dosbarth_deusain[ds]
						# deusain talgron (acen ar yr ail lafariad)
						if ds in cy.deuseiniaid['talgron']:				
							ace.append( cwlwm[1] )
						# gair deusill (acen ar y ddwy lafariad)
						elif ds in cy.deuseiniaid['deusill']:				
							ace.append( cwlwm[0] )
							ace.append( cwlwm[1] ) 
					# deusain lleddf (acen ar y llafariad cyntaf)
					else:
						ace.append( cwlwm[0] )
					"""
					ace.append( cwlwm[0] )
		
				# tri neu fwy o lafariaid: defnyddio'r ail lafariad yn y cwlwm
				# nid yw hyn yn berthnasol ers defnyddio'r method "trwsio"
				else:
					ace.append( cwlwm[1] )			
		return tuple(ace)
	
		
	def nifer_sillau(self):
		return len( self.acenion() )
	
	def shownodau(self):
		print [nod.llinyn for nod in self.nodau]
	
	def showclymau(self):
		print [cwl.llinyn() for cwl in self.clymau]

	def pwyslais(self):
		'''
		ffwythiant:	darganfod pwyslais gair
		mewnbwn:	rhestr nodau
		allbwn:		mynegrif: (-1 = sill olaf, -2 = sill olaf ond un)
		sylwadau:	
			Mae angen helaethu ar ffyrdd i ddarganfod geiriau acennog lluosill
		'''
		# dianc os nad oes o leiaf un llafariad (e.e. y cysylltnod mewn englyn)
		if not any([ nod.isllafariad() for nod in self.nodau ]):
			return 0

		olaf = self.clymau[-1]
		olaf_ond_un = self.clymau[-2]
		olaf_ond_dau = self.clymau[-3] if len(self.clymau) > 2 else None

		# gwirio am ae o flaen y cwlwm cytseiniaid olaf (e.e. cymraeg)
		# ond dyw hyn ddim yn gweithio gyda 'ymadael'
		# if olaf and olaf_ond_un and olaf_ond_un.llinyn() == u'ae':
		# 	return -1	

		# gwirio am h o flaen y cwlwm llafariaid olaf (e.e. dyfalbarhau)
		if olaf_ond_dau and olaf_ond_dau[-1].llinyn in ['h','rh']:
			# print 'ding 2'
			return -1
		# gwirio am lafariad hir fel cwlwm olaf (e.e. cangarŵ)
		if olaf_ond_un and unicode(olaf_ond_un[-1]) in cy.llafariaid_hir:
			# print 'ding 3'
			return -1
		# gwiriad syml
		if self.nifer_sillau() == 1: 
			return -1 # gair unsill
		else:
			return -2 # goben
	
	def traeannu(self, cytseiniaid=False):
		'''
		ffwythiant: hollti gair yn dri (pen, canol, cwt)
		allbwn:		tri rhestr nodau
		'''	
		pwy = self.pwyslais()
		# dim cytseiniaid
		# if not filter(None, self.clymau[1::2]):	
		# 	return [], [], []
		# gair acennog
		if pwy == -1:
			pen = self.clymau[:-2]
			can = []
			cwt = self.clymau[-2:]
		# gair diacen
		else:
			pen = self.clymau[:-4]
			can = self.clymau[-4:-2]
			cwt = self.clymau[-2:]
		# cytseiniaid yn unig
		if cytseiniaid:
			pen = pen[1::2]
			can = can[1::2]
			cwt = cwt[1::2]
		# datod
		pen = [z for x in pen for z in x]
		can = [z for x in can for z in x]
		cwt = [z for x in cwt for z in x]
		return pen, can, cwt
	
		
	# allbwn
	def llinyn(self):
		return ''.join( [nod.llinyn for nod in self.nodau] )
				
	def llinyn_llafariaid(self, blanksymbol=' '):
		ss = list()
		for nod in self.nodau:
			if nod.isllafariad():	ss.append(nod.llinyn)
			else:					ss.append(blanksymbol*len(nod.llinyn))
		return ''.join(ss)

	def llinyn_cytseiniaid(self, blanksymbol=' '):
		ss = list()
		for nod in self.nodau:
			if nod.iscytsain():		ss.append(nod.llinyn)
			else:					ss.append(blanksymbol*len(nod.llinyn))
		return ''.join(ss)

	def llinyn_acenion(self, blanksymbol=' '):
		ace = self.nodau_acennog()

		if self.pwyslais() == 0:
			return ''.join([ blanksymbol*len(nod.llinyn) for nod in self.nodau ])
		pwy = ace[ self.pwyslais() ]

		ss = list()
		for nod in self.nodau:
			if any([nod is x for x in ace]):
				if nod is pwy:	ss.append('/')
				else:			ss.append('v')
			else:
				ss.append( blanksymbol*len( nod.llinyn ) )				
		return ''.join(ss)

	def llinyn_acenion_colon(self, blanksymbol=' '):
		ace = self.nodau_acennog()
		ss = [blanksymbol*len(nod.llinyn) for nod in self.nodau ]
		ss[ self.nodau.index(ace[-1]) ] = ':'
		if self.pwyslais() == -2:
			ss[ self.nodau.index(ace[-2]) ] = ':'
		return ''.join(ss)

	# man ffwythiannau
	def nifer_sillau(self):
		return len( self.nodau_acennog() )
Ejemplo n.º 7
0
def oes_cytseinedd(x_geiriau, y_geiriau):
    '''
	ffwythiant: darganfod cytseinedd rhwng dau restr geiriau
	mewnbwn:	dau restr geiriau
	allbwn:		dosbarth cytseinedd (neu dosbarth bai)
	sylwadau:
		mae'r ffwythiant yn traeannu'r ddau restr geiriau: 
			x_blaen, x_canol, x_cwt
			y_blaen, y_canol, y_cwt
		ac yn ceisio darganfod cytseinedd rhwng
			x_blaen a y_blaen
			x_canol a y_canol
		data:
			parau			parau cytseiniaid rhwng x_blaen a y_blaen
			parau_canol		parau cytseiniaid rhwng x_canol a y_canol
			x_pen:			n-wreiddgoll, cytseiniaid pengoll
			y_pen:			n-ganolgoll, cytseiniaid traws
			x_cwt:
			y_cwt:
			
	cynghanedd drychben:

	anghytbwys ddisgynedig: rhaid cyfateb x_cwt a y_canol
		methiant os

		if aceniad == ADI and x_cwt.llinyn in cyfuniadau_trychben:
			nod = x_cwt.pop()
			y_blaen.reverse()
			y_blaen.append( nod )
			y_blaen.reverse()
			
	'''
    if not x_geiriau or not y_geiriau:
        return (None, None, None)

    # type check (rhoi gair unigol mewn rhestr)
    if type(x_geiriau) == Gair:
        x_geiriau = [x_geiriau]
    if type(y_geiriau) == Gair:
        y_geiriau = [y_geiriau]

    # info
    sx = ' '.join([g.llinyn() for g in x_geiriau])
    sy = ' '.join([g.llinyn() for g in y_geiriau])
    log.info('oes_cytseinedd: ' + sx + '/' + sy)
    if debug:
        print 'oes_cytseinedd: ' + sx + '/' + sy

    # rhestri nodau
    x_blaen, x_canol, x_cwt = x_geiriau[-1].traeannu()
    y_blaen, y_canol, y_cwt = y_geiriau[-1].traeannu()

    # estyn blaen y ddwy hanner (dim bylchau)
    xb = [nod for g in x_geiriau[:-1] for nod in g.nodau]
    x_blaen = xb + list(x_blaen)
    yb = [nod for g in y_geiriau[:-1] for nod in g.nodau]
    y_blaen = yb + list(y_blaen)

    # info
    # log.debug([nod.llinyn for nod in x_blaen], [nod.llinyn for nod in x_canol], [nod.llinyn for nod in x_cwt])
    # log.debug([nod.llinyn for nod in y_blaen], [nod.llinyn for nod in y_canol], [nod.llinyn for nod in y_cwt])
    log.debug(''.join([nod.llinyn for nod in x_blaen]) + ':' +
              ''.join([nod.llinyn for nod in x_canol]) + ':' +
              ''.join([nod.llinyn for nod in x_cwt]))
    log.debug(''.join([nod.llinyn for nod in y_blaen]) + ':' +
              ''.join([nod.llinyn for nod in y_canol]) + ':' +
              ''.join([nod.llinyn for nod in y_cwt]))
    # log.debug([nod.llinyn for nod in y_blaen], [nod.llinyn for nod in y_canol], [nod.llinyn for nod in y_cwt])

    # data ar gyfer y view functions
    data = {
        'sylwadau': [],
    }

    #--------------------
    # paratoi
    #--------------------

    #--------------------
    # parau canol
    #--------------------
    trychben = []
    cysylltben = []
    parau_canol = []

    # cytbwys ddiacen: cyfateb x_canol a y_canol
    if x_canol and y_canol:
        pa, xp, yp, sy = paru_cytseiniaid(x_canol, y_canol)

        # cyfatebiaeth lawn (dim cytseiniaid yn weddill)
        if not xp and not yp:
            parau_canol = pa
        else:
            log.debug(
                'oes_cytseinedd: cytbwys ddiacen: x_canol a y_canol heb gyfateb'
            )
            return (None, 'XXX', None)

    # anghytbwys ddisgynedig: cyfateb x_cwt a y_canol
    elif not x_canol and y_canol:
        cc = RhestrNodau(x_cwt).rhestr_clymau()
        x_cwt_llinyn = ''.join([nod.llinyn for nod in cc[-1]])
        pa, xp, yp, sy = paru_cytseiniaid(x_cwt, y_canol)

        # cyfatebiaeth lawn (dim cytseiniaid yn weddill)
        if not xp and not yp:
            parau_canol = pa
            x_cwt = []
        # profi am gynghanedd drychben
        elif x_cwt_llinyn in cy.cyfuniadau_trychben:
            log.debug('Profi am gynghanedd drychben')
            nod_trychben = x_cwt.pop()
            pa2, xp2, yp2, sy2 = paru_cytseiniaid(x_cwt, y_canol)
            if not xp2 and not yp2:
                parau_canol = pa2
                trychben.append(nod_trychben)
        # profi am gynghanedd gysylltben:
        elif y_blaen:
            log.debug('Profi am gynghanedd gysylltben')
            nod_cysylltben = y_blaen[0]
            x_cwt_newydd = list(x_cwt)
            x_cwt_newydd.append(nod_cysylltben)
            pa3, xp3, yp3, sy3 = paru_cytseiniaid(x_cwt_newydd, y_canol)
            if not xp3 and not yp3:
                parau_canol = pa3
                cysylltben.append(nod_cysylltben)
            else:
                log.debug(
                    'oes_cytseinedd: anghytbwys ddisgynedig: x_cwt a y_canol ddim yn cyfateb'
                )
                return (None, 'XXX', None)
        else:
            pass

    # anghytbwys ddyrchafedig:
    elif x_canol and not y_canol:
        pass
    # cytbwys acennog
    else:
        pass

    log.debug('parau_canol: ' +
              ' '.join([a.llinyn + '/' + b.llinyn for a, b in parau_canol]))

    #--------------------
    # parau blaen
    #--------------------
    parau, x_pen, y_pen, syl = paru_cytseiniaid(x_blaen, y_blaen)
    if syl:
        data['sylwadau'].extend(syl)

    #--------------------
    # paratoi a recordio'r rhestri
    parau.reverse()
    parau_canol.reverse()
    x_cwt = [nod for nod in x_cwt if nod.iscytsain()]
    y_cwt = [nod for nod in y_cwt if nod.iscytsain()]

    data['pengoll_chwith'] = x_pen
    data['pengoll_dde'] = y_pen
    data['parau'] = parau + parau_canol
    data['cwt_chwith'] = x_cwt
    data['cwt_dde'] = y_cwt
    data['trychben'] = trychben
    data['cysylltben'] = cysylltben

    log.debug('pen_ch: ' +
              ' '.join([nod.llinyn for nod in data['pengoll_chwith']]))
    log.debug('pen_dd: ' +
              ' '.join([nod.llinyn for nod in data['pengoll_dde']]))
    log.debug('parau  : ' +
              ' '.join([a.llinyn + '/' + b.llinyn for a, b in data['parau']]))
    log.debug('cwt_ch: ' + ' '.join([nod.llinyn
                                     for nod in data['cwt_chwith']]))
    log.debug('cwt_dd: ' + ' '.join([nod.llinyn for nod in data['cwt_dde']]))
    log.debug('trychben: ' + ' '.join([nod.llinyn
                                       for nod in data['trychben']]))
    log.debug('cysylltben: ' +
              ' '.join([nod.llinyn for nod in data['cysylltben']]))

    #--------------------
    # dosbarthu

    # proest i'r odl
    # if x_cwt and y_cwt and cyfateb(x_cwt[-1].llinyn, y_cwt[-1].llinyn):
    #	return (None, 'PRO', data)

    # cyfatebiaeth lawn (croes)
    if parau and not x_pen and not y_pen:
        if trychben:
            return ('CRD', None, data)
        elif cysylltben:
            return ('CRG', None, data)
        else:
            return ('CRO', None, data)

    # cytseiniaid chwith yn weddill (n-wreiddgoll, croes-o-gyswllt)
    elif parau and x_pen and not y_pen:

        # n-wreiddgoll
        if len(x_pen) == 1 and x_pen[0].llinyn.lower() == 'n':
            data['sylwadau'].append('n-wreiddgoll')
            if trychben:
                return ('CRD', None, data)
            elif cysylltben:
                return ('CRG', None, data)
            else:
                return ('CRO', None, data)

        # croes-o-gyswllt
        x_nodau = [nod for g in x_geiriau for nod in g.nodau]
        pa, xp, yp, sy = paru_cytseiniaid(x_pen, x_nodau)
        if pa and not xp:
            if len(pa) > 1:
                return ('CGG', None, data)
            else:
                return ('COG', None, data)

        # sain (os oes o leiaf un par yn cyfateb, mae hynny'n ddigon am gynghanedd sain)
        if trychben:
            return ('SAD', None, data)
        elif cysylltben:
            return ('SAG', None, data)
        else:
            return ('SAI', None, data)

    # cytseiniaid dde yn weddill (n-ganolgoll, traws)
    elif parau and not x_pen and y_pen:

        # n-ganolgoll
        if len(y_pen) == 1 and y_pen[0].llinyn == 'n':
            data['sylwadau'].append('n-ganolgoll')
            return ('CRO', None, data)
        # traws
        else:
            if len(x_geiriau) == 1 or len(x_geiriau) == 2 and not any(
                    nod.iscytsain() for nod in x_geiriau[0].nodau):  # hac
                if trychben:
                    return ('TFD', None, data)
                elif cysylltben:
                    return ('TFG', None, data)
                else:
                    return ('TRF', None, data)
            else:
                if trychben:
                    return ('TRD', None, data)
                elif cysylltben:
                    return ('TRG', None, data)
                else:
                    return ('TRA', None, data)

    # os nad oes parau, o leiaf mae popeth yn sain-lafarog!
    else:
        # if trychben:
        # 	return ('SLD', None, data)
        # elif cysylltben:
        # 	return ('SLG', None, data)
        # else:
        # 	return ('SAL', None, data)
        return ('LLA', None, data)
Ejemplo n.º 8
0
def oes_odl(cyntaf, ail, olynydd=None, trwm_ac_ysgafn=True):
    # rhaid i cyntaf, ail ac olynydd fod yn rhestri nodau
    if type(cyntaf) == Gair:
        cyntaf = cyntaf.nodau
    if type(ail) == Gair:
        ail = ail.nodau
    # if olynydd and type(olynydd)==Gair:
    # 	olynydd = olynydd.nodau
    nodau1 = RhestrNodau([nod for nod in cyntaf])
    nodau2 = RhestrNodau([nod for nod in ail])
    if not nodau1 or not nodau2:
        return None, None

    log.info('oes_odl: ' + str(nodau1) + '/' + str(nodau2))

    syl = []

    # profi am odl sengl
    od = oes_odl_sengl(nodau1, nodau2, trwm_ac_ysgafn=trwm_ac_ysgafn)
    if od:
        return od, syl

    # --------------------------------
    # profi am odl gudd neu odl ewinog
    # TODO: rhaid atal y dadansoddwr rhag odli nod gyda'i hun.
    # hac: edrych ond ar eiriau olynol sy'n dechrau â chytsain
    if type(olynydd) == Gair and len(
            olynydd.nodau) > 0 and olynydd.nodau[0].iscytsain():

        # profi am odl gudd
        nodau3 = list(nodau1)
        meddalu = False

        if nodau1[-1].llinyn in cy.cytseiniaid_meddalu and olynydd.nodau[
                0].llinyn.lower() == 'd':
            meddalu = True
            nodau3.append(Nod('t'))
        else:
            nodau3.append(olynydd.nodau[0])

        nodau3 = RhestrNodau(nodau3)

        cudd = oes_odl_sengl(nodau3, nodau2, trwm_ac_ysgafn=trwm_ac_ysgafn)
        dau_gytsain = False
        if len(olynydd.nodau) > 1 and olynydd.nodau[1].iscytsain():  # hac
            nodau4 = list(nodau3)
            nodau4.append(olynydd.nodau[1])
            nodau4 = RhestrNodau(nodau4)
            cudd2 = oes_odl_sengl(nodau4,
                                  nodau2,
                                  trwm_ac_ysgafn=trwm_ac_ysgafn)
            if cudd2:
                dau_gytsain = True
                cudd = cudd2
        if cudd:
            if meddalu:
                cudd[0].pop()
                cudd[0].append(olynydd.nodau[0])
                if dau_gytsain:
                    cudd[0].append(olynydd.nodau[1])
            s0 = ''.join([nod.llinyn for nod in cudd[0]])
            s1 = ''.join([nod.llinyn for nod in cudd[1]])
            # syl.append('odl gudd: ' + s0 + '/' + s1)
            syl.append('odl gudd')
            return (cudd, syl)

        # profi am odl ewinog (dim ond cytsain gyntaf yr olynydd)
        # method: amnewid e.e. (b,h) gan wrthrych newydd Nod('p')
        # yna os oes odl, amnewid y nodau gwreidiol am y nod newydd
        c1 = nodau1[-1].llinyn
        c2 = olynydd.nodau[0].llinyn
        if cy.dosbarth_ceseiliad.has_key((c1, c2)):
            llinyn_cyfwerth = cy.dosbarth_ceseiliad[(c1, c2)]
            log.debug('oes_odl: paru_cytseiniaid: ' + c1 + '+' + c2 + '=' +
                      llinyn_cyfwerth)
            nod_newydd = Nod(llinyn_cyfwerth)
            nodau3 = RhestrNodau(list(nodau1[:-1]) + [nod_newydd])
            ewi = oes_odl_sengl(nodau3, nodau2, trwm_ac_ysgafn=trwm_ac_ysgafn)
            if ewi:
                # syl.append('odl ewinog')
                ewi[0].pop()
                ewi[0].append(nodau1[-1])
                ewi[0].append(olynydd.nodau[0])
                s0 = ''.join([nod.llinyn for nod in ewi[0]])
                s1 = ''.join([nod.llinyn for nod in ewi[1]])
                # syl.append('odl ewinog: ' + s0 + '/' + s1)
                syl.append('odl ewinog')
                return ewi, syl

    return None, None