public function launchCleaner($tipusfrase) { $CI =& get_instance(); $CI->load->library('Mymatching'); $CI->load->library('Myslot'); $matching = new Mymatching(); // TREURE ELS "JO" I "TU" i agafar info dels verbs per després $keymainverb = null; $indexmainverb = -1; $indexsecondaryverb = -1; $indextheme1 = -1; $indextheme2 = -1; $indexdesire = -1; $indexpermission = -1; $mainverbinf = false; $secondaryverbinf = false; $numslots = count($this->ordrefrase); for ($i = 0; $i < $numslots; $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Main Verb") { $indexmainverb = $i; if ($slotaux->isInfinitive) { $mainverbinf = true; } $keymainverb = $this->ordrefrase[$i]; // agafem el key del main verb pel pas dels modificadors } else { if ($slotaux->category == "Secondary Verb") { $indexsecondaryverb = $i; if ($slotaux->isInfinitive) { $secondaryverbinf = true; } } else { if ($slotaux->category == "Theme") { if ($slotaux->level == 1 && $slotaux->defvalueused && $slotaux->defvalue == "ho") { $indextheme1 = $i; } else { if ($slotaux->level == 2 && $slotaux->defvalueused && $slotaux->defvalue == "ho") { $indextheme2 = $i; } } } else { if ($slotaux->category == "Desire") { $indexdesire = $i; } else { if ($slotaux->category == "Permission") { $indexpermission = $i; } else { if ($slotaux->category == "Subject") { if ($slotaux->defvalueused) { // esborrem el tu o jo if ($slotaux->defvalue == '1' || $slotaux->defvalue == '2') { $slotaux->slotstring = array(); } } else { // esborrem el tu o el jo if ($slotaux->paraulafinal->text == "jo" || $slotaux->paraulafinal->text == "tu") { $slotaux->slotstring = array(); } // esborrem el subjecte del verb secundari, si és el mateix que el del principal if ($slotaux->level == 2 && $this->subjsiguals) { $slotaux->slotstring = array(); } } } } } } } } } $indexreceiver1 = -1; $indexreceiver2 = -1; $receiver1pron = false; $receiver2pron = false; // si és una ordre els pronoms aniran darrere el verb i tindran una altra forma $ordre = $tipusfrase == "ordre"; $elementaux = array(); // TRANSFORMAR ELS PRONOMS A FEBLES DEL RECEIVER for ($i = 0; $i < $numslots; $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Receiver") { // si hi ha valors per defecte if ($slotaux->defvalueused) { if ($slotaux->defvalue == "mi") { // posar "me", si és infinitiu o ordre positiva, els apòstrofs després if ($slotaux->level == 1 && $mainverbinf || $slotaux->level == 1 && $ordre && !$this->frasenegativa) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } else { if ($slotaux->level == 2 && $secondaryverbinf) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } else { $slotaux->slotstring = array(); $elementaux[0] = "em"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; if ($slotaux->level == 1) { $indexreceiver1 = $i; $receiver1pron = true; } else { if ($slotaux->level == 2) { $indexreceiver2 = $i; $receiver2pron = true; } } } } } else { if ($slotaux->defvalue == "tu") { // posar "te" if ($slotaux->level == 1 && $mainverbinf || $slotaux->level == 1 && $ordre && !$this->frasenegativa) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } else { if ($slotaux->level == 2 && $secondaryverbinf) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } else { $slotaux->slotstring = array(); $elementaux[0] = "et"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; if ($slotaux->level == 1) { $indexreceiver1 = $i; $receiver1pron = true; } else { if ($slotaux->level == 2) { $indexreceiver2 = $i; $receiver2pron = true; } } } } } } } else { if ($slotaux->level == 1 && $mainverbinf || $slotaux->level == 1 && $ordre && !$this->frasenegativa) { // si són pronoms personals, posem la forma correcta pels receivers de darrere el verb if ($matching->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsAfterReceiver[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } } else { if ($slotaux->level == 1) { // si són pronoms personals, posem la forma correcta pels receivers d'abans del verb if ($matching->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsFrontReceiver[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } } else { if ($slotaux->level == 2 && $secondaryverbinf) { // si són pronoms personals, posem la forma correcta pels receivers de darrere el verb if ($matching->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsAfterReceiver[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } else { if ($slotaux->level == 2) { // si són pronoms personals, posem la forma correcta pels receivers d'abans del verb if ($matching->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsFrontReceiver[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } } } } } } // Fi if slotaux = receiver } // Fi for transformar pronoms // ORDRE DELS PRONOMS // amb tota la info recollida, movem els pronoms de lloc si cal // pel main verb si és infinitiu (els d'ordre ja són a darrere) if ($mainverbinf) { // el theme 1 if ($indextheme1 != -1) { $temp = $this->ordrefrase[$indextheme1]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme1, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); $indextheme1 = $indexmainverb; $indexmainverb -= 1; } // el receiver 1 if ($indexreceiver1 != -1) { $temp = $this->ordrefrase[$indexreceiver1]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver1, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); $indexreceiver1 = $indexmainverb; $indexmainverb -= 1; } } // pel verb secundari si és infinitiu if ($secondaryverbinf) { // el theme 2 if ($indextheme2 != -1) { $temp = $this->ordrefrase[$indextheme2]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); $indextheme2 = $indexsecondaryverb; $indexsecondaryverb -= 1; } // el receiver 2 if ($indexreceiver2 != -1) { $temp = $this->ordrefrase[$indexreceiver2]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver2, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); $indexreceiver2 = $indexsecondaryverb; $indexsecondaryverb -= 1; } } // ORDRE MODIFICADORS DE FRASE QUE NO VAN AL PRINCIPI: "NO", "TAMBÉ" // agafem els modificadors, si n'hi ha $slotmainverb = $this->slotarray[$keymainverb]; $counter = 0; $indexsmodifs = array(); $janegatiu = false; if ($slotmainverb->CModassigned) { for ($i = 0; $i < count($slotmainverb->cmpMod); $i++) { $keymodifaux = $slotmainverb->CModassignedkey[$i]; $slotmodifaux = $slotmainverb->cmpMod[$keymodifaux]; // si és del grup que va darrere el subjecte (ex: no, també) if ($matching->isModAfterSubj($slotmodifaux->paraulafinal->text)) { // indiquem, que si la frase era negativa, ja no caldrà afegir el no if ($slotmodifaux->paraulafinal->text == "no") { $janegatiu = true; } // Creem un slot, el posem a slotarray i de moment al final d'ordrefrase $counter += 1; $newslotmodif = new Myslot(); $newslotmodif->category = "Modifier " . $counter; $newslotmodif->grade = "opt"; $newslotmodif->type = "modif"; $newslotmodif->full = true; $newslotmodif->paraulafinal = $slotmodifaux->paraulafinal; $elementaux = array(); $elementaux[0] = $slotmodifaux->paraulafinal->text; $elementaux[1] = $slotmodifaux->paraulafinal; $newslotmodif->slotstring[] = $elementaux; $newslotmodif->puntsfinal = 7; $this->slotarray["Modifier " . $counter] = $newslotmodif; $this->ordrefrase[] = "Modifier " . $counter; $indexsmodifs[] = $numslots; } } } // afegim un slot amb el no si la frase era negativa i no l'hem afegit ja if ($this->frasenegativa && !$janegatiu) { // Creem un slot, el posem a slotarray i de moment al final d'ordrefrase $counter += 1; $newslotmodif = new Myslot(); $newslotmodif->category = "Modifier " . $counter; $newslotmodif->grade = "opt"; $newslotmodif->type = "modif"; $newslotmodif->full = true; $elementaux = array(); $elementaux[0] = "no"; $elementaux[1] = null; $newslotmodif->slotstring[] = $elementaux; $newslotmodif->puntsfinal = 7; $this->slotarray["Modifier " . $counter] = $newslotmodif; $this->ordrefrase[] = "Modifier " . $counter; $indexsmodifs[] = $numslots; } // si hem trobat algun d'aquests slots, els col·loquem al lloc on toqui if ($counter > 0) { for ($i = 0; $i < count($indexsmodifs); $i++) { $indexmodifaux = $indexsmodifs[$i]; // si hi ha un verb de desig, posar-los abans, amb els de permís van darrere del permís if ($indexdesire != -1) { $indexaux = $indexdesire; $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del receiver array_splice($this->ordrefrase, $indexaux, 0, $temp); } else { if (!$mainverbinf && (!$ordre || $this->frasenegativa)) { // si hi ha receiver, que sempre va abans del theme en versió pronominal // el posem abans del receiver if ($receiver1pron) { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del receiver array_splice($this->ordrefrase, $indexreceiver1, 0, $temp); } else { if ($indextheme1 != -1) { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del receiver array_splice($this->ordrefrase, $indextheme1, 0, $temp); } else { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del receiver array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } } else { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del receiver array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } } } // Fi si hi ha algun slot de modificador d'aquesta mena // AJUNTAR PREPS+ARTS / PRONOMS FEBLES I APÒSTROFS $frasebruta = $this->frasefinal . $this->printFraseFinalSlotString(); // perps + arts $patterns[0] = '/[[:space:]][d][e][[:space:]][e][l][[:space:]]/u'; $patterns[1] = '/[[:space:]][d][e][[:space:]][e][l][s][[:space:]]/u'; $patterns[2] = '/[[:space:]][a][[:space:]][e][l][[:space:]]/u'; $patterns[3] = '/[[:space:]][a][[:space:]][e][l][s][[:space:]]/u'; $patterns[4] = '/[[:space:]][p][e][r][[:space:]][e][l][[:space:]]/u'; $patterns[5] = '/[[:space:]][p][e][r][[:space:]][e][l][s][[:space:]]/u'; // de => d' $patterns[6] = '/[[:space:][d][e][[:space:]](?=[(aeiouAEIOUhH)])/u'; // em => m'; et => t' $patterns[7] = '/[[:space:]][e][m][[:space:]](?=[(aeiouAEIOUhH)])/u'; $patterns[8] = '/[[:space:]][e][t][[:space:]](?=[(aeiouAEIOUhH)])/u'; //verb acabat en vocal + pronoms de receiver a darrere $patterns[9] = '/(?<=[aeiou]@VERBUM)[[:space:]]me[[:space:]]/u'; $patterns[10] = '/(?<=[aeiou]@VERBUM)[[:space:]]te[[:space:]]/u'; $patterns[11] = '/(?<=[aeiou]@VERBUM)[[:space:]]li[[:space:]]/u'; $patterns[12] = '/(?<=[aeiou]@VERBUM)[[:space:]]nos[[:space:]]/u'; $patterns[13] = '/(?<=[aeiou]@VERBUM)[[:space:]]vos[[:space:]]/u'; $patterns[14] = '/(?<=[aeiou]@VERBUM)[[:space:]]los[[:space:]]/u'; // verb acabat en vocal+r + pronoms de receiver a darrere $patterns[15] = '/(?<=[aeiou]r@VERBUM)[[:space:]]me[[:space:]]/u'; $patterns[16] = '/(?<=[aeiou]r@VERBUM)[[:space:]]te[[:space:]]/u'; $patterns[17] = '/(?<=[aeiou]r@VERBUM)[[:space:]]li[[:space:]]/u'; $patterns[18] = '/(?<=[aeiou]r@VERBUM)[[:space:]]nos[[:space:]]/u'; $patterns[19] = '/(?<=[aeiou]r@VERBUM)[[:space:]]vos[[:space:]]/u'; $patterns[20] = '/(?<=[aeiou]r@VERBUM)[[:space:]]los[[:space:]]/u'; // verb+pronom feble de receiver ja enganxat, seguit de "ho" $patterns[21] = "/(?<=@VERBUM)'m[[:space:]]ho[[:space:]]/u"; $patterns[22] = "/(?<=@VERBUM)'t[[:space:]]ho[[:space:]]/u"; $patterns[23] = "/(?<=@VERBUM)-li[[:space:]]ho[[:space:]]/u"; $patterns[24] = "/(?<=@VERBUM)'ns[[:space:]]ho[[:space:]]/u"; $patterns[25] = "/(?<=@VERBUM)-vos[[:space:]]ho[[:space:]]/u"; $patterns[26] = "/(?<=@VERBUM)'ls[[:space:]]ho[[:space:]]/u"; $patterns[27] = "/(?<=@VERBUM)-me[[:space:]]ho[[:space:]]/u"; $patterns[28] = "/(?<=@VERBUM)-te[[:space:]]ho[[:space:]]/u"; $patterns[29] = "/(?<=@VERBUM)-nos[[:space:]]ho[[:space:]]/u"; $patterns[30] = "/(?<=@VERBUM)-vos[[:space:]]ho[[:space:]]/u"; $patterns[31] = "/(?<=@VERBUM)-los[[:space:]]ho[[:space:]]/u"; // netejar espais abans i després dels apòstrofs, si n'hi ha $patterns[32] = "/[[:space:]]'/u"; $patterns[33] = "/'[[:space:]]/u"; // netejar @VERBUM $patterns[34] = "/@VERBUM/u"; $replacements[0] = ' del '; $replacements[1] = ' dels '; $replacements[2] = ' al '; $replacements[3] = ' als '; $replacements[4] = ' pel '; $replacements[5] = ' pels '; $replacements[6] = " d'"; $replacements[7] = " m'"; $replacements[8] = " t'"; $replacements[9] = "'m "; $replacements[10] = "'t "; $replacements[11] = "-li "; $replacements[12] = "'ns "; $replacements[13] = "-vos "; $replacements[14] = "'ls "; $replacements[15] = "-me "; $replacements[16] = "-te "; $replacements[17] = "-li "; $replacements[18] = "-nos "; $replacements[19] = "-vos "; $replacements[20] = "-los "; $replacements[21] = "-m'ho "; $replacements[22] = "-t'ho "; $replacements[23] = "-li-ho "; $replacements[24] = "'ns-ho "; $replacements[25] = "-vos-ho "; $replacements[26] = "'ls-ho "; $replacements[27] = "-m'ho "; $replacements[28] = "-t'ho "; $replacements[29] = "-nos-ho "; $replacements[30] = "-vos-ho "; $replacements[31] = "-los-ho "; $replacements[32] = "'"; $replacements[33] = "'"; $replacements[34] = ""; $frasebruta = preg_replace($patterns, $replacements, $frasebruta); // fem una assignació prèvia $this->frasefinal = $frasebruta; // afegim les expressions de temps que van a darrere, si n'hi havia for ($i = 0; $i < count($this->timeexpr); $i++) { $wordaux = $this->timeexpr[$i]; if (!$matching->isFrontAdvTemps($wordaux->text)) { // el posem darrere de la frase $frasebruta .= $wordaux->text . " "; } } // afegim les expressions a darrere de la frase, si la frase no era buida, // afegim una coma abans $numexprs = count($this->exprsarray); if ($numexprs > 0 && $this->frasefinal != " ") { $frasebruta .= ", "; $frasebruta = preg_replace("/[[:space:]],/u", ",", $frasebruta); } for ($i = 0; $i < $numexprs; $i++) { // l'hola sempre va a davant if ($this->exprsarray[$i] == "hola") { $fraseaux = $frasebruta; $frasebruta = " " . $this->exprsarray[$i]; // si la frase no era buida, afegim una coma if ($this->frasefinal != " ") { $frasebruta = $frasebruta . ", " . $fraseaux; } } else { $frasebruta .= $this->exprsarray[$i] . " "; } } // POSAR ELS PUNTS O EXCLAMACIONS O INTERROGANTS // esborrar l'últim espai i una coma al final si hi és. També l'espai del principi $frasebruta = preg_replace("/[[:space:]]\$/u", "", $frasebruta); $frasebruta = preg_replace("/,\$/u", "", $frasebruta); $frasebruta = substr($frasebruta, 1); $frasebruta[0] = strtoupper($frasebruta[0]); $llargfrase = strlen($frasebruta); $lastcharacter = $frasebruta[$llargfrase - 1]; if ($lastcharacter != "?") { if ($tipusfrase == "exclamacio") { $frasebruta .= "!"; } else { if ($tipusfrase == "pregunta" || $tipusfrase == "permis") { $frasebruta .= "?"; } else { $frasebruta .= "."; } } } $this->frasefinal = $frasebruta; // DEBUG // echo $frasebruta.'<br /><br />'; }