    # HobeBila, euskarazko bilaketen hobetzailea
    #Code & Syntax-ek egindako softwarea - http://www.codesyntax.com
    #Asmatzaileak: Garikoitz Araolaza, Patxi Diaz, Luistxo Fernandez
    #Programa hau Gipuzkoako Foru Aldundiak lagunduta egin ahal izan dugu, 
    #2002. urteko Euskara eta Teknologia Berriak deialdiaren laguntzarekin.
    #Software xume hau librea eta doakoa da (GPL). Funtsean nahi duzuna egin 
    #dezakezu honekin, bere izaera librea bortxatu eta 
    #zeure asmakuntza propietario itxi eta propioa bihurtzea salbu.

import sys
import string
import array
import re



#########################PROGRAMA###################
def prozesua(lerro):
    #Hau da programa nagusia
    lerro = lerro.lower()
    #letra larriak xehe bihurtu lehenbizi
    lerro=garbitu(lerro)
    #lerroak garbitu, termino garbiak lortzeko
    lerro=banatu_tratatu_elkartu(lerro)
    #terminoak banatu, eta operadore booleanoekin elkartu
    return lerro

def garbitu(lerro):
    #eskatutako terminoa garbitzen du
    lerro=hasierako_bukaerako_espazioak(lerro)
    lerro=espazioak(lerro)
    lerro=ikur_arraroak(lerro)
    lerro=puntuen_tratamendua(lerro)
    return lerro

def hasierako_bukaerako_espazioak(lerro):
    #hasierako eta bukaerako espazioak kentzen ditu
    #jendea "    nafarroa oinez  " bezalakoak sartzen ditu bilaketan!
    if lerro[0:1]==' ':
        luzeera=0
        for luzeera in range(0,len(lerro)-1): #hasierako espazioak kentzeko buklea
            if lerro[luzeera]==' ':
                lerro=lerro[luzeera+1:]
            else:
                break
    if lerro[len(lerro)-1:len(lerro)]==' ':
        luzeera=len(lerro)
        luzeera=luzeera-1
        while luzeera>=0: #bukaerako espazioak kentzeko buklea
            if lerro[luzeera]==' ':
                lerro=lerro[:luzeera]
            else:
                break
            luzeera=luzeera-1
    return lerro

def espazioak(lerro):
    #tartean espazio bat baino gehiago bada, bakarra utzi
    #jendeak "nafarroa   oinez" idatz dezake!
    BidaliBehar=''
    hitzak = string.split(lerro,' ')
    for hitza in hitzak:
        if hitza != '':
            BidaliBehar=BidaliBehar+'+'+hitza
    BidaliBehar=BidaliBehar[1:]
    lerro=BidaliBehar
    return BidaliBehar

def ikur_arraroak(lerro):
#ikur arraroak kendu, puntuak izan ezik
    letrak ='ABCDEFGHIJKLMÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyzáéíóú+.ü'
    lerro_berria = ''
    for letra in lerro:
        if letra in letrak:#honekin lerroko letra letrak string-ean dagoen konprobatzen da
            lerro_berria= lerro_berria+letra
    lerro = lerro_berria
    return lerro

def puntuen_tratamendua(lerro):
#puntuen tratamentudua
    letrak ='ABCDEFGHIJKLMÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyzáéíóúü'
    luzeera=len(lerro)
    luzeera=luzeera-1
    kenduta=0
    while luzeera>=0:
        try:
            if lerro[luzeera]=='.':
                if not lerro[luzeera+1] in letrak or not lerro[luzeera-1] in lerro:
                    lerro=lerro[:luzeera]+lerro[luzeera+1:]
                    luzeera=luzeera+1
                    kenduta=1
                else:
                    if kenduta==1:
                        lerro=lerro[:luzeera]+lerro[luzeera+1:]
                        luzeera=luzeera+1
                        kenduta=0
                    luzeera=luzeera-1
            else:
                luzeera=luzeera-1
        except:
            lerro=lerro[:luzeera]
            luzeera=luzeera-1
    return lerro



def banatu_tratatu_elkartu(lerro):
    #lerroak garbitu ondoren, terminoak zatitzen ditu, eta
    #termino artean operadore booleanoa jartzen du.
    plus=' AND '
    #  plus='+'
    # plus hau da operadore booleanoa.
    # Terminoak nola bilatu behar dira, denak ala edozein?
    # Interneteko bilaketan eta testu libre handi samarren gaineko
    # bilaketan, onena da AND operadorea gehitzea.
    # edozein modutan, aztertu behar da ze sintaxi duen AND operadoreak
    # sistema bakoitzean. Googlen '+' zeinua da soilik,
    # Zope-n AND da, eta ezker-eskuin espazioak jarrita bidali behar
    # da katea sistemaren kontra
      
    BidaliBehar=''
    hitzak = string.split(lerro,'+')
    for hitza in hitzak:
        if hitza==hitzak[len(hitzak)-1]:
            BidaliBehar=BidaliBehar+plus+lema1(hitza)
            #termino kateko azken hitza
        else:
            BidaliBehar=BidaliBehar+plus+lema2(hitza)
    BidaliBehar=BidaliBehar[len(plus):]
    lerro=BidaliBehar
    return lerro

def lema1(t):
    #termino-kateko azken terminoari aplikatu beharreko pseudolematizazioa
    t = string.lower(t)
    t=re.sub(' ','+',t)
    if len(t)<4:
        return t
    #hiru letrakoak edo laburragoak, tratatu gabe eman
    hiztegia=hiztegi_funtzioa()
    #Hiztegiari deitzen dio, salbuespenak kontuan hartzeko
    if hiztegia.has_key(t):
        return hiztegia[t]
    if t[-1:] == 'a':
        return t[:-1]+'*'
    elif t[-1:] == '*':
        return t
    elif t[-2:] == 'ak':
        return t[:-2]+'*'
    #funtsean, -a edo -ak amaierak detektatzen ditu.
    else:
        return internet(t)
    #domeinuak tratatzeko funtziora bidaltzen du      

def lema2(t):
    #termino-katean azkenaz besteko terminoei aplikatu beharreko pseudolematizazioa
    t = string.lower(t)
    t=re.sub(' ','+',t)
    if len(t)<4:
        return t
    #hiru letrakoak edo laburragoak, tratatu gabe eman
    hiztegia={}
    hiztegia =hiztegi_funtzioa()
    if hiztegia.has_key(t):
        return hiztegia[t]
    if t[-1:] == 'a':
        return t[:-1]+'*'
    elif t[-1:] == '*':
        return t
    elif t[-2:] == 'ak':
        return t[:-2]+'*'
    elif t[-4:] == 'aren':
        return t[:-4]+'*'
    elif t[-2:] == 'ko':
        return t[:-2]+'*'
    elif t[-3:] == 'een':
        return t[:-3]+'e*'
    # -a eta -ak amaierak, eta KO eta NOREN kasuen amaiera batzuk detektatzen dira
    else:
        return internet(t)

def hiztegi_funtzioa():
    p = open('/usr/nireZope/Extensions/hiztegia.txt','r')
    #salbuespenen hiztegiaren kokapena fitxategien sisteman...
    #Hemengo /usr/nireZope/Extensions/ hori kokapen faltsua da noski,
    #zeuk zeure kokapenaren helbidea eman behar diozu programari
    #
    #Programak hiztegi horrekin erkatzen du termino bakoitza
    a=''
    hiztegian={}
    for line in p.readlines():
        banatu=string.split(line,'\t')
        if banatu[1][-1:]=='\n':
            hiztegian[banatu[0]]=banatu[1][:-1]
        else:
            hiztegian[banatu[0]]=banatu[1]
        a=a+ line
    return hiztegian

def internet(t):
    #jendeak domeinuak bilatzen ditu sarri, horretarako da metodo hau.
    if t[-3:] == '.fr':
        return internet2(t)
    elif t[-3:] == '.es':
        return internet2(t)
    elif t[-4:] == '.com':
        return internet2(t)
    elif t[-4:] == '.net':
        return internet2(t)
    elif t[-4:] == '.org':
        return internet2(t)
    else:
        return t+'*'

def internet2(t):
  #domeinu bilaketan, hasierako www hori kentzen du
  #horrela www.cnn.com bilatu duena "cnn.com" aipamena
  #ere aurkituko du. Jendeak domeinuak bilatzen ditu
  #sarri Interneten, horretarako da metodo hau.
  if t[:3]=='www':
    return t[4:]
  else:
    return t





