source: lliurex-jocomunico/trunk/fuentes/lliurex-jocomunico.install/var/lib/application/libraries/Myword.php @ 5728

Last change on this file since 5728 was 5728, checked in by joamuran, 3 years ago

Added zero-installed and updated jocomunico

  • Property svn:executable set to *
File size: 22.2 KB
Line 
1<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
2
3class Myword {
4   
5    /*
6     * THE FUNCTIONS USED IN THE ARTICLES' MODULE CAN BE FOUND AT THE END OF THE FILE (BEGIN AT LINE 176)
7     */
8   
9    var $id; // Id de la paraula dins la seva taula
10    var $identry; // Id de l'entrada (FRASE): serveix per eliminar paraules dels elements seleccionats
11    var $tipus; // Tipus de la paraula que coincideix amb la PoS i la taula de la BBDD
12    var $used = false; // si la paraula ja està adjudicada a un slot del pattern o no
13    var $classes = array(); // Per si la paraula és de diferents classes (dins del mateix tipus)
14                            // Ex: Per noms (lloc, event)...
15    var $text; // Paraula en text
16    var $img; // Enllaç al pictograma
17    var $imgtemp; // Enllaç per si han canviat la imatge del pictograma a la interfície
18    var $supportsExpansion; // Si la paraula pot ser utilitzada dins el sistema d'expansió
19    var $defaultverb = 0; // Pels noms i pels adjectius, el verb per defecte si no hi ha més paraules a la frase
20    var $subjdef = false; // Pels adjectius, el subjecte per defecte si no hi ha més paraules a la frase
21   
22    var $propietats = array(); // Varia segons el tipus de paraula. És la fila de la BBDD
23    var $patterns = array(); // Només pels verbs
24   
25    var $inputorder; // Número a l'entrada, de 0 a n-1
26    // només s'utilitzaran si l'idioma té estructura SVO (Subject-Verb-Object)
27    var $beforeverb = false; // Si apareix abans o després del 1er verb
28    var $beforeverb2 = false; // Si apareix entre dos verbs: només quan hi ha dos verbs, quan n'hi ha un sempre està a true
29   
30    var $slotstemps = array(); // Array amb els slots temporals on és la paraula. Hi ha les KEYS dels slots
31    var $slotstempsext = array(); // Array per adjs i modificadors, igual que l'anterior, però té les keys
32                                  // a l'element [0] i els punts de l'slot on pot fer de complement a [1]
33    var $slotfinal = null; // nom de l'slot on es queda finalment la paraula
34   
35    var $assignadaAComplement = false;
36   
37   
38    // Modificadors
39    var $plural;
40    var $fem;
41    var $coord;
42   
43    var $paraulacoord = array(); // si n'hi ha, paraules coordinades amb aquesta
44   
45    function __construct() {}
46   
47    public function initialise($paraula, $infobbdd, $order, $beforeverb, $beforeverb2, $prov) 
48    {
49        $this->inputorder = $order;
50        $this->beforeverb = $beforeverb;
51        $this->beforeverb2 = $beforeverb2;
52       
53        $this->id = $paraula->pictoid;
54        if ($prov) $this->identry = $paraula->ID_RSTPSentencePicto;
55        else $this->identry = $paraula->ID_RSHPSentence;
56        $this->tipus = $paraula->pictoType;
57        $this->img = $paraula->imgPicto;
58        $this->imgtemp = $paraula->imgtemp;
59        $this->supportsExpansion = $paraula->supportsExpansion;
60       
61        if ($paraula->isplural == '1') $this->plural = true;
62        else $this->plural = false;
63       
64        if ($paraula->isfem == '1') $this->fem = true;
65        else $this->fem = false;
66       
67        if ($paraula->coordinated == '1') $this->coord = true;
68        else $this->coord = false;
69       
70        switch ($this->tipus)
71        {
72            case 'name':
73                $this->text = $infobbdd[0]->nomtext;
74                $this->defaultverb = $infobbdd[0]->defaultverb;
75                $this->propietats = $infobbdd[0];
76                foreach ($infobbdd as $row) {
77                    array_push($this->classes, $row->class);
78                }
79                break;
80           
81            case 'verb':
82                $this->text = $infobbdd[0]->verbtext;
83                foreach ($infobbdd as $row) {
84                    array_push($this->patterns, $row);
85                }
86                break;
87           
88            case 'adj':
89                $this->text = $infobbdd[0]->masc;
90                $this->defaultverb = $infobbdd[0]->defaultverb;
91                $this->subjdef = $infobbdd[0]->subjdef;
92                $this->propietats = $infobbdd[0];
93                foreach ($infobbdd as $row) {
94                    array_push($this->classes, $row->class);
95                }
96                break;
97           
98            case 'adv':
99                $this->text = $infobbdd[0]->advtext;
100                $this->propietats = $infobbdd[0];
101                foreach ($infobbdd as $row) {
102                    array_push($this->classes, $row->type);
103                }
104                break;
105           
106            case 'expression':
107                $this->text = $infobbdd[0]->exprtext;
108                $this->propietats = $infobbdd[0];
109                foreach ($infobbdd as $row) {
110                    array_push($this->classes, $row->type);
111                }
112                break;
113           
114            case 'modifier':
115                $this->text = $infobbdd[0]->masc;
116                $this->propietats = $infobbdd[0];
117                array_push($this->classes, $infobbdd[0]->type);
118                break;
119           
120            case 'questpart':
121                $this->text = $infobbdd[0]->parttext;
122                $this->propietats = $infobbdd[0];
123                array_push($this->classes, $infobbdd[0]->complement1);
124                array_push($this->classes, $infobbdd[0]->complement2);
125                break;
126           
127            default:
128                break;
129        }
130               
131    }
132   
133    public function initSingleVerbWord($verbid, $infobbdd)
134    {
135        $this->id = $verbid;
136        $this->tipus = "verb";
137       
138        $this->plural = false;
139        $this->fem = false;
140        $this->coord = false;
141       
142        $this->text = $infobbdd[0]->verbtext;
143        $this->img = $infobbdd[0]->imgPicto;
144        foreach ($infobbdd as $row) {
145            array_push($this->patterns, $row);
146        }
147    }
148
149    public function isType($tipus)
150    {
151        return ($this->tipus == $tipus);
152    }
153   
154    public function isClass($classe)
155    {
156        for ($i=0; $i<count($this->classes); $i++) {
157            if ($this->classes[$i] == $classe) return true;
158        }
159        return false;
160    }
161   
162    public function searchSlotIndex($slotkey)
163    {
164        $index = -1;
165       
166        $found = false;
167       
168        $i=0;
169       
170        while ($i<count($this->slotstemps) && !$found) {
171           
172            if ($this->slotstemps[$i] == $slotkey) {
173                $index = $i;
174                $found = true;
175            }
176            $i++;
177        }
178       
179        return $index;
180    }
181   
182   
183    /*
184     * FUNCTIONS FOR THE ARTICLES' MODULE
185     */
186   
187    /*
188     * This function returns the correct form of the definite article
189     * for the word in this class
190     */
191    public function giveDefiniteArticle()
192    {       
193        $CI = &get_instance();
194        $CI->load->library('Mymatching');
195       
196        // create an object of the class Mymatching, which has encoded the Lists
197        // and the Answers (operators)
198        $matching = new Mymatching();
199       
200        // the character encoding of the words from the database is utf-8
201        // so we set the php system to utf-8
202        mb_internal_encoding( 'utf-8' );
203       
204        // letters that we want to replace
205        $patterns[0] = '/[à]/u'; 
206        $patterns[1] = '/[è|é]/u';
207        $patterns[2] = '/[í|ï]/u';
208        $patterns[3] = '/[ò|ó]/u';
209        $patterns[4] = '/[ú|ü]/u';
210       
211        $replacements[0] = 'a';
212        $replacements[1] = 'e';
213        $replacements[2] = 'i';
214        $replacements[3] = 'o';
215        $replacements[4] = 'u';
216       
217        $wordoriginal = $this->text;
218        $wordlowered = mb_strtolower($wordoriginal); // word in lowercase
219                       
220        // remove the accents from lowercase word
221        $wordlowerednoaccents = preg_replace($patterns, $replacements, $wordlowered);
222               
223        // a
224        if ($this->tipus == "name") {
225            // b
226            if ($this->plural || $this->propietats->singpl == "pl") {
227                    // d
228                    if ($this->propietats->mf == "masc" && !$this->fem) return $matching->answers["R"];
229                    else return $matching->answers["S"];
230            }
231            else {
232                // c -> We use regular expressions to verify the condition       
233                if (preg_match('/^[bcdfgjklmnpqrstvwxyz]/', $wordlowered) == '1') {
234
235                    // d
236                    if ($this->propietats->mf == "masc" && !$this->fem)  return $matching->answers["O"];
237                    else return $matching->answers["P"];
238                }
239                // e -> We use regular expressions to verify the condition
240                else if (preg_match('/^([aeo]|[h][aeo])/', $wordlowerednoaccents) == '1') {
241                   
242                    //f
243                    if (isset($matching->listB[$wordlowered]) || isset($matching->listD[$wordlowered]) || isset($matching->listF[$wordlowered])) {
244                        return $matching->answers["P"];
245                    }
246                    else return $matching->answers["Q"];
247                }
248                // g -> We use regular expressions to verify the condition
249                else if (preg_match('/^([iu]|[h][iu])/', $wordlowerednoaccents) == '1') {
250                    // see if the i or u are unstressed   
251                   
252                    $aux = $this->StressedOrNonVocalic($wordlowered);
253                    $stressed = $aux[0];
254                    $nonvocalic = $aux[1];
255                   
256                    // h
257                    if (!$stressed) {
258                        // d
259                        if ($this->propietats->mf == "masc" && !$this->fem) {
260                            // i&m
261                            if ($nonvocalic && !isset($matching->listH[$wordlowered])) return $matching->answers["O"];
262                            else return $matching->answers["Q"];
263                        }
264                        else return $matching->answers["P"];
265                    }
266                    else {
267                       
268                        // j
269                        if (isset($matching->listA[$wordlowered]) || isset($matching->listE[$wordlowered])) return $matching->answers["P"];
270                       
271                        // k
272                        else if (isset($matching->listG[$wordlowered])) {
273                            // d
274                            if ($this->propietats->mf == "masc" && !$this->fem) return $matching->answers["O"];
275                            else return $matching->answers["P"];
276                        }
277                        else return $matching->answers["Q"];
278                    }
279                }
280               
281                else {
282                    // l
283                    if (isset($matching->listC[$wordlowered])) return $matching->answers["Q"];
284                    else return $matching->answers["O"];
285                }
286            }
287        }
288        else return null;
289       
290    }  // End function giveDefiniteArticle
291   
292   
293    // it returns a pair: [0] if it is stressed [1] if it is non-vocalic
294    function StressedOrNonVocalic($wordlowered)
295    {
296        $output = array();
297       
298        $accentsCatalan = array("à", "è", "é", "í", "ò", "ó", "ú");
299        $diphthongs = array("ai", "ei", "ii", "oi", "ui", "au", "eu", "iu", "ou", "uu", "üe", "üi");
300        // at the beginning of a word this combinations are added to the previous ones as possible diphthongs
301        $diphthongsBeginning = array("ia", "ie", "io", "iu", "ua", "ue", "ui", "uo");
302        $triphthongs = array("uau", "uai");
303        $nonvocalic = false;
304        $stressed = false;
305       
306        $numsyllables = 0;
307
308        // if the "i" or "u" have an accent, then they are stressed
309        if (in_array($wordlowered, $accentsCatalan)) $stressed = true;
310        else {
311
312            $numletters = strlen($wordlowered);
313
314            // we loop the word letter by letter from the end to the beginning
315            for ($i=$numletters-1;$i>=0; $i--) {
316                $currentLetter = $wordlowered[$i];
317
318                // if the current letter is a vowel
319                if (preg_match('/^[aàeèéiíïoòóuü]/u', $currentLetter) == '1') {
320                    // if we have reached the beginning of the word
321                    if ($i==0) $numsyllables++;
322                    else {
323                        $nextletter = $wordlowered[$i-1];
324
325                        // if the next letter is not a vowel
326                        if (preg_match('/^[aàeèéiíïoòóuü]/u', $nextletter) == '0') {
327                            $numsyllables++;
328                            $i--; // we skip the next letter as it is already treated
329                        }
330                        else {
331                            $aux2letters = $nextletter.$currentLetter;
332
333                            // we are at the beginning of the word
334                            if ($i-1 == 0) {
335                                // if it is a diphthong
336                                if (in_array($aux2letters, $diphthongs) || in_array($aux2letters, $diphthongsBeginning)) {
337                                    $numsyllables++;
338                                    $i--;
339                                    $nonvocalic = true;
340                                }
341                                // if it is not a diphthong
342                                else {
343                                    $numsyllables += 2;
344                                    $i--;
345                                }
346                            }
347                            // if we are not at the beginning
348                            else {
349                                $afternextletter = $wordlowered[$i-2];
350
351                                // if it is not a vowel
352                                if (preg_match('/^[aàeèéiíïoòóuü]/u', $afternextletter) == '0') {
353
354                                    // if we reached the beginning and the first letter is an "h"
355                                    if ($i-2==0 && $afternextletter == "h") {
356                                        // if it is a diphthong
357                                        if (in_array($aux2letters, $diphthongs) || in_array($aux2letters, $diphthongsBeginning)) {
358                                            $numsyllables++;
359                                            $i -= 2;
360                                            $nonvocalic = true;
361                                        }
362                                        else {
363                                            $numsyllables += 2;
364                                            $i -= 2;
365                                        }
366                                    }
367                                    // see if it is a diphthong
368                                    else if (in_array($aux2letters, $diphthongs)) {
369                                        $numsyllables++;
370                                        $i -= 2; // we skip the next two letters
371                                    }
372                                    // if it is not a diphthong
373                                    else {
374                                        $numsyllables += 2;
375                                        $i -=2;
376                                    }
377                                }
378                                // if it is a vowel
379                                else {
380                                    $aux3letters = $afternextletter.$aux2letters;
381
382                                    // see if it is a triphthong
383                                    if (in_array($aux3letters, $triphthongs)) {
384                                        $numsyllables++;
385                                        $i -= 3; // we skip an extra letter as for sure it will be a vowel
386                                                    // there is not any word in catalan with 4 vowels together
387                                    }
388                                    // if it was not
389                                    else {
390                                        $numsyllables += 2;
391                                        $i -= 3;
392                                    }
393                                }
394                            }
395                        }
396                    }
397                }
398            }
399        }
400       
401        // if we already found that it is stressed
402        if ($stressed) {
403            $output[0] = $stressed;
404            $output[1] = $nonvocalic;
405        }
406       
407        // RULES
408        else {
409            // if the word has 1 syllable
410            if ($numsyllables == 1) {
411                // it is only unstressed when it is also nonvocalic
412                if ($nonvocalic) $stressed = false;
413                else $stressed = true;
414            }
415            else if ($numsyllables == 2) {
416                // we already checked that it is not accentuated
417                // then if the word ends in vowel, "s", "en" or "in" it is unstressed
418                if (preg_match('/([aàeèéiíïoòóuü]|[s]|[ei][n])$/u', $currentLetter) == '1') {
419                    $stressed = false;
420                }
421                else $stressed = true;
422            }
423            // if it has three or more syllables it is unstressed
424            // because we already checked that it is not accentuated
425            else {
426                $stressed = false;
427            }
428           
429            $output[0] = $stressed;
430            $output[1] = $nonvocalic;
431        }
432       
433        return $output;
434    }
435   
436    /*
437     * This function returns the correct form of the definite article
438     * for the word in this class, taking into account the context
439     */
440    public function giveDefiniteArticleContext($masc, $plural)
441    {       
442        $CI = &get_instance();
443        $CI->load->library('Mymatching');
444       
445        // create an object of the class Mymatching, which has encoded the Lists
446        // and the Answers (operators)
447        $matching = new Mymatching();
448       
449        // the character encoding of the words from the database is utf-8
450        // so we set the php system to utf-8
451        setlocale(LC_ALL, 'es_CA');
452        mb_internal_encoding( 'utf-8' );
453       
454        // letters that we want to replace
455        $patterns[0] = '/[à|À]/u'; 
456        $patterns[1] = '/[è|é|É|È]/u';
457        $patterns[2] = '/[í|ï|Í|Ï]/u';
458        $patterns[3] = '/[ò|ó|Ò|Ó]/u';
459        $patterns[4] = '/[ú|ü|Ú|Ü]/u';
460       
461        $replacements[0] = 'a';
462        $replacements[1] = 'e';
463        $replacements[2] = 'i';
464        $replacements[3] = 'o';
465        $replacements[4] = 'u';
466       
467        $wordoriginal = $this->text;
468        $wordlowered = strtolower($wordoriginal); // word in lowercase
469               
470        // remove the accents from lowercase word
471        $wordlowerednoaccents = preg_replace($patterns, $replacements, $wordlowered);
472               
473        // a
474        if ($this->tipus == "name") {
475            // b
476            if ($plural) {
477                    // d
478                    if ($masc) return $matching->answers["R"];
479                    else return $matching->answers["S"];
480            }
481            else {
482                // m -> New rule: if it's a proper noun, the article is "en"
483                if ($this->propietats->ispropernoun == '1' && $masc) {
484                    return $matching->answers["T"];
485                }
486                else { 
487                    // c -> We use regular expressions to verify the condition       
488                    if (preg_match('/^[bcdfgjklmnpqrstvwxyz]/', $wordlowerednoaccents) == '1') {
489
490                        // d
491                        if ($masc)  return $matching->answers["O"];
492                        else return $matching->answers["P"];
493                    }
494                    // e -> We use regular expressions to verify the condition
495                    else if (preg_match('/^([aeo]|[h][aeo])/', $wordlowerednoaccents) == '1') {
496                        //f
497                        if (isset($matching->listB[$wordlowered]) || isset($matching->listD[$wordlowered]) || isset($matching->listF[$wordlowered])) {
498                            return $matching->answers["P"];
499                        }
500                        else return $matching->answers["Q"];
501                    }
502                    // g -> We use regular expressions to verify the condition
503                    else if (preg_match('/^([iu]|[h][iu])/', $wordlowerednoaccents) == '1') {
504                        // see if the i or u are unstressed   
505
506                        $aux = $this->StressedOrNonVocalic($wordlowered);
507                        $stressed = $aux[0];
508                        $nonvocalic = $aux[1];
509
510                        // h
511                        if (!$stressed) {
512                            // d
513                            if ($masc) {
514                                // i&m
515                                if ($nonvocalic && !isset($matching->listH[$wordlowered])) return $matching->answers["O"];
516                                else return $matching->answers["Q"];
517                            }
518                            else return $matching->answers["P"];
519                        }
520                        else {
521
522                            // j
523                            if (isset($matching->listA[$wordlowered]) || isset($matching->listE[$wordlowered])) return $matching->answers["P"];
524
525                            // k
526                            else if (isset($matching->listG[$wordlowered])) {
527                                // d
528                                if ($masc) return $matching->answers["O"];
529                                else return $matching->answers["P"];
530                            }
531                            else return $matching->answers["Q"];
532                        }
533                    }
534
535                    else {
536                        // l
537                        if (isset($matching->listC[$wordlowered])) return $matching->answers["Q"];
538                        else return $matching->answers["O"];
539                    }
540                }
541            }
542        }
543        else return null;
544       
545    }  // End function giveDefiniteArticleContext
546   
547    public function giveIndefiniteArticleContext ($masc, $plural)
548    {
549        if ($masc && !$plural) return "un ";
550        else if ($masc && $plural) return "uns ";
551        else if (!$masc && !$plural) return "una ";
552        else return "unes ";
553    }
554   
555}
556
557/* End of file Myword.php */
Note: See TracBrowser for help on using the repository browser.