<?php

/**
* @name Glavna Vokativ klasa
* @package Vokativ
* @author Nemanja Avramović, po ideji Miloša Vukotića
* @link http://vokativ.vokabular.org/
* @version 0.1.4
*/

class Vokativ {

    var 
$izuzeci = array(); //ovde smestamo izuzetke od pravila, to radi konstruktor klase (funkcija Vokativ())
    
var $cirilica false//da li koristimo cirilicu ili ne? moze se koristiti funkcija da_li_je_cirilica($tekst) pri postavljanju ovoga
    
var $izvor NULL//odakle je izvučen vokativ - iz rečnika ili iz algoritma
    
var    $azbuka = array( //parovi za transliteraciju
        
"а" => "a"
        
"б" => "b"
        
"в" => "v"
        
"г" => "g"
        
"д" => "d"
        
"ђ" => "đ"
        
"е" => "e"
        
"ж" => "ž"
        
"з" => "z"
        
"и" => "i"
        
"ј" => "j"
        
"к" => "k"
        
"л" => "l"
        
"љ" => "lj"
        
"м" => "m"
        
"н" => "n"
        
"њ" => "nj"
        
"о" => "o"
        
"п" => "p"
        
"р" => "r"
        
"с" => "s"
        
"т" => "t"
        
"ћ" => "ć"
        
"у" => "u"
        
"ф" => "f"
        
"х" => "h"
        
"ц" => "c"
        
"ч" => "č",
        
"џ" => "dž"
        
"ш" => "š",
        
"А" => "A"
        
"Б" => "B"
        
"В" => "V"
        
"Г" => "G"
        
"Д" => "D"
        
"Ђ" => "Đ"
        
"Е" => "E"
        
"Ж" => "Ž"
        
"З" => "Z"
        
"И" => "I"
        
"Ј" => "J"
        
"К" => "K"
        
"Л" => "L"
        
"Љ" => "LJ"
        
"М" => "M"
        
"Н" => "N"
        
"Њ" => "NJ"
        
"О" => "O"
        
"П" => "P"
        
"Р" => "R"
        
"С" => "S"
        
"Т" => "T"
        
"Ћ" => "Ć"
        
"У" => "U"
        
"Ф" => "F"
        
"Х" => "H"
        
"Ц" => "C"
        
"Ч" => "Č",
        
"Џ" => "DŽ"
        
"Ш" => "Š",
        );
        
    
/**
    * @name Vokativ
    * @description Konstruktor klase
    * @param object $src Objekat loader-a
    * @return NULL
    */
    
    
function Vokativ($src NULL) {
        if (!isset(
$src)) { die("Objekat 'loader' klase nije prosleđen!"); }
        elseif (!
is_object($src)) { die("Objekat 'loader' klase u stvari nije objekat!"); }
        elseif (!
method_exists($src,'napravi_niz')) { die("Objekat 'loader' klase nema definisan metod napravi_niz()!"); }
        else {
            
$this->izuzeci $src->napravi_niz();
        }
    }
    
    
/**
    * @name mb_ucfirst
    * @description Interna funkcija za kapitalizovanje prvog velikog slova kod multibajt stringova
    * @param string $string String koji se kapitalizuje
    * @return string
    */
    
    
function mb_ucfirst($string) {
        
$string mb_strtoupper(mb_substr($string01'utf-8'), 'utf-8') . mb_substr($string1mb_strlen($string'utf-8'), 'utf-8');
        return 
$string;
    }
    
    
/**
    * @name correct_case
    * @description Interna funkcija koja sređuje izgled stringa tako što ga prvo prebaci u mala slova a onda poveća prvo slovo
    * @param string $str String koji se sređuje
    * @return string
    */
    
    
function correct_case($str) {
        return 
$this->mb_ucfirst(mb_strtolower($str'utf-8'));
    }
    
    
/**
    * @name my_substr
    * @description Interna funkcija koja vraća deo utf-8 stringa
    * @param string $str String koji se sređuje
    * @return string
    */
    
    
function my_substr($str,$start) {
        return 
mb_substr($str,$start,mb_strlen($str,'utf-8'),'utf-8');
    }
    
    
/**
    * @name da_li_je_cirilica
    * @description Funkcija koja utvrđuje da li prosleđeni string sadrži ćirilična slova u sebi
    * @param string $tekst String koji se proverava
    * @return boolean
    */
    
    
function da_li_je_cirilica($tekst) {
        foreach (
$this->azbuka as $cir=>$lat) {
            if (
strpos($tekst$lat) !== false) { return false; }
        }
        return 
true;
    }
    
    
/**
    * @name skloni_visak
    * @description Funkcija koja sređuje ulazni string tako što ostavlja samo slova u njemu,
    * uzima samo prvu reč ako ih ima više, prebacuje string u latinicu i prebacuje ga u UPPERCASE
    * @param string $input String koji se sređuje
    * @return string
    */
    
    
function skloni_visak($input) {
        
$input trim($input);
        
$input stripslashes($input);
        
$input strip_tags($input);
        
        if (
strpos($input' ') !== false) { //ovde uzimamo samo prvu rec ukoliko uneti string sadrzi jedan ili vise razmaka
            
$tmp explode(' '$input);
            
$input $tmp[0];
        } 
        
        
$input $this->preslovljavanje($input);
        
        
$regex '/[^a-zA-ZŠĐČĆŽšđčćž]/'//samo slova da ostanu. Trebalo bi dodati da pokupi samo prvu rijec (ako je neko unio recenicu ili ime/prezime), ovako samo spoji sve u jednu rec - vidi par redova iznad :)
        
$input preg_replace($regex''$input);
        
        return 
mb_strtoupper($input'utf-8'); 
    }
    
    
/**
    * @name napravi_vokativ
    * @description Funkcija koja pravi vokativ od nominativa
    * @param string $tekst Imenica (string) u nominativu
    * @return string
    */
    
    
function napravi_vokativ($ime) {
        
$vokativ '';
        
        if (
$this->cirilica) { $ime $this->preslovljavanje($ime); } //ako koristimo ćirilicu prebacujemo ime u latinicu pošto donji algoritam radi sa latinicom
        
$ime $this->skloni_visak($ime); //sređujemo string
        
        
if (isset($this->izuzeci[$ime])) {
            
//izvor je rečnik
            
$this->izvor 'rečnik';
            
//ako postoji izuzetak odmah vraćamo njegov vokativ u ćirilici ili latinici
            
return ($this->cirilica) ? $this->correct_case($this->preslovljavanje($this->izuzeci[$ime], false)) : $this->correct_case($this->izuzeci[$ime]);
        }
            
        if(
substr($ime, -3) == 'TAR' || substr($ime, -3) == 'DAR'//PETAR, ALEKSANDAR
            
$vokativ substr_replace($ime'RE', -2);
            
        elseif(
substr($ime, -3) == 'ICA' && strlen($ime) > 4)    //MILICA , LJUBICA ALI NE  I MICA i CICA
            
$vokativ substr_replace($ime'CE', -2);
            
        elseif(
substr($ime, -2) == 'CA')    //MACA, CECA...
            
$vokativ substr_replace($ime'CO', -2);
            
        elseif(
substr($ime, -2) == 'SA')    //PERSA, BOSA
            
$vokativ substr_replace($ime'SO', -2);
            
        elseif(
substr($ime, -4) == 'OLAC')    //KOLAC
            
$vokativ substr_replace($ime'OČE', -4);
        
        elseif(
substr($ime, -4) == 'ALAC')    //ZNALAC
            
$vokativ substr_replace($ime'ALČE', -4);
        
        elseif(
substr($ime, -4) == 'ILAC')    //MISLILAC
            
$vokativ substr_replace($ime'IOČE', -4);
        
        elseif(
substr($ime, -4) == 'ELAC')    //ŽETELAC
            
$vokativ substr_replace($ime'EOČE', -4);    
        
        elseif(
substr($ime, -3) == 'SAC')    //PISAC
            
$vokativ substr_replace($ime'ŠČE', -3);
            
        elseif(
substr($ime, -3) == 'RAC')    //MUDRAC
            
$vokativ substr_replace($ime'RČE', -3);
            
        elseif(
substr($ime, -3) == 'VAC')    //VALJEVAC
            
$vokativ substr_replace($ime'VČE', -3);
        
        elseif((
substr($ime, -2) == 'KA') && (strlen($ime) > 4))  //DARINKA, MILKA, BORKA, ALI NE I RAKA, MIKA
            
$vokativ $ime;
            
        elseif(
substr($ime, -2) == 'JA' && substr($ime, -3) != 'IJA' && substr($ime, -3) != 'DJA' && substr($ime, -3) != 'NJA'//MAJA ALI NE I MARIJA, SANJA, NITI PEDJA (NE PEĐA)
            
$vokativ substr_replace($ime'JO', -2);
            
        elseif(
substr($ime, -2) == 'VA' || substr($ime, -2) == 'DA' || substr($ime, -2) == 'BA' || substr($ime, -2) == 'KA'//SAVA, DADA, SLOBA, RAKA
            
$vokativ substr_replace($ime'O', -1);
            
        elseif(
substr($ime, -3) == 'ARA' || substr($ime, -3) == 'ERA' || substr($ime, -3) == 'ORA'//PERA, DARA, BORA
            
$vokativ substr_replace($ime'RO', -2);
            
        elseif(
substr($ime, -1) == 'K')     //CUTUK 
            
$vokativ substr_replace($ime'Č', -1).'E';
            
        elseif(
substr($ime, -1) == 'G')        //PREDRAG
            
$vokativ substr_replace($ime'Ž', -1).'E';

        
//ć, đ, č, dž, š, ž, lj, nj, j
        
elseif($this->my_substr($ime, -1) == 'Ć' || $this->my_substr($ime, -1) == 'Đ' || $this->my_substr($ime, -1) == 'Č' || $this->my_substr($ime, -2) == 'DŽ' || $this->my_substr($ime, -1) == 'Š' || $this->my_substr($ime, -1) == 'Ž' || $this->my_substr($ime, -2) == 'LJ' || $this->my_substr($ime, -2) == 'NJ' || $this->my_substr($ime, -1) == 'J')
            
$vokativ $ime.'U';
            
        elseif(
substr($ime, -1) == 'A' || substr($ime, -1) == 'O' || substr($ime, -1) == 'E' || substr($ime, -1) == 'I'//VANJA, MARKO, MILE, MIKI
            
$vokativ $ime;
            
        else
            
$vokativ $ime.'E';
            
        
//ako koristimo ćirilicu vraćamo napravljeni vokativ iz latinice u ćirilicu
        
if ($this->cirilica) { $vokativ $this->preslovljavanje($vokativfalse); }
        
        
//izvor je algoritam
        
$this->izvor 'algoritam';
        
        
//vraćamo sređen vokativ (mala slova, prvo veliko)
        
return $this->correct_case($vokativ);
    }
    
    
/**
    * @name preslovljavanje
    * @description Funkcija koja preslovljava ulazni tekst iz ćirilice u latinicu i obrnuto
    * @param string $tekst String koji se preslovljava
    * @return string
    */
    
    
function preslovljavanje($tekst$cir_u_lat true) {
        
$azbuka $this->azbuka;
        
        if (!
$cir_u_lat)
            
$azbuka array_flip($azbuka);
        
        return 
strtr($tekst$azbuka);    
    }


}

?>