přihlásit se
k47.cz
se skytými titulkami

PHP Objektová obálka pspell

autor: kaja47 - © - publikováno: 26. září 2009 15:04 - sekce obsah » programování #2015
štítky: a
Tento článek obsahuje zhruba 400 slov a jeho přečtení Vám zabere 2 až 4 minuty
PHP Objektová obálka pspell

Kdo programoval v PHP ví, že většina rozšíření používá procedurální API a jenom některá z rozšíření nabízejí pěkný objektový přístup. Bohužel funkce kontroly pravopisu pspell nejsou jedním z nich. Nabízí se několik možností, jak používat pspell v objektově orientované aplikaci: používat procedury, což není ono; napsat si vlastní objektovou obálku, nebo použít tuto.

Použití je intuitivní:

//vytvoříme instanci SpellCheckeru
//konstruktor má parametry odpovídající parametrům funkce pspell_config_create
$spellCheker = new SpellChecker('cz');

//nebudeme kontrolovat slova kratší než 3 znaky
$spellCheker->ignoreWordShorterThan(3);

//zkontroluje jedno slovo, vrátí TRUE/FALSE podle toho, jestli je napsané správně
$ok = $spellCheker->check('nejneobdělávavatelnější');

//hromadná kontrola slov
//parametrem funkce checkWords je pole slov
//vrací pole stejně velké pole boolean hodnot, které udávají, jestli bylo slovo
//s daným klíčem ve vstupním poli správné nebo ne
$ok = $spellCheker->checkWords(array('hele', 'vole', 'kde', 'mám', 'káru'));

//navrhne 4 varianty slova (navrhuje i v případě, že je slovo napsáno správně)
$spellCheker->suggest('tryčko', 4);

//navrhne 4 varianty pro všechna špatně zapsaná slova v poli $mnohoSlov
$spellCheker->suggestWords($mnohoSlov, 4);

A tady už je kód:

class SpellChecker extends Object {

        private $link = NULL;
        private $changed = FALSE;

        private $lang;
        private $spelling = NULL;
        private $jargon  = NULL;
        private $encoding = 'utf-8';
        private $mode = 0;
        private $ignoreWordShorterThan = NULL;


        public function __construct( $lang, $spelling = NULL, $jargon = NULL, $encoding = 'utf-8', $mode = 0 )
        {
                $this->lang = $lang;
                $this->spelling = $spelling;
                $this->jargon = $jargon;
                $this->encoding = $encoding;
                $this->mode = $mode;
        }


        public function setSpelling( $spelling )
        {
                $this->spelling = $spelling;
                $this->changed = TRUE;
        }


        public function setJargon( $jargon )
        {
                $this->jargon = $jargon;
                $this->changed = TRUE;
        }


        public function setEncoding( $encoding )
        {
                $this->encoding = $encoding;
                $this->changed = TRUE;
        }


        public function setMode( $mode )
        {
                $this->mode = $mode;
                $this->changed = TRUE;
        }


        public function ignoreWordShorterThan( $characters )
        {
                $this->ignoreWordShorterThan = $characters;
                $this->changed = TRUE;
        }


        private function getLink()
        {
                if( $this->link === NULL || $this->changed === TRUE ){
                        $this->link = $this->buildLink();
                }
                return $this->link;
        }


        private function buildLink()
        {
                $config = pspell_config_create( $this->lang, $this->spelling, $this->jargon, $this->encoding );
                if( $this->ignoreWordShorterThan !== NULL ) {
                        pspell_config_ignore( $config, $this->ignoreWordShorterThan );
                }

                pspell_config_mode( $config, $this->mode );

                return pspell_new_config( $config );
        }



        public function check($word)
        {
                return pspell_check( $this->getLink(), $word );
        }


        public function checkWords(array $words)
        {
                $checked = array();
                foreach ( $words as $key => $word )
                {
                        $checked[ $key ] = $this->check( trim($word) );
                }
                return $checked;
        }


        public function checkText($text)
        {
                throw new NotImplementedException();
        }


        public function suggest($word, $maxSuggestions = NULL)
        {
                $suggestions = pspell_suggest( $this->getLink(), $word );
                return array_slice( $suggestions, 0, (int)$maxSuggestions );
        }


        public function suggestWords(array $words, $maxSuggestions = NULL)
        {
                $checked = $this->checkWords( $words );
                $suggestions = array();
                foreach( $words as $key => $word )
                {
                        $suggestions[$key] = ( $checked[$key] !== TRUE ? $this->suggest($word, $maxSuggestions) : NULL );
                }
                return $suggestions;
        }

}

může vás taká zajímat:

komentáře RSS

Zatím žádné komentáře. Buďte první.
Komentář bude formátován pomocí Texy! syntaxe.
Např: **tučný text**, *kurzíva*, "text odkazu":adresa.
Na ostatní komentáře můžete odkazovat pomocí [čísla komentáře].

Napište komentář!

 

o autorovi:

Kaja47 Jmenuji se K., v síti také známý jako kaja47 - tak trochu spisovatel, trochu programátor, trochu webař, ateista, milovník divné hudby atd atd.
mail:
jabber: kaja47@jabbim.cz
homepage: k47.cz
twitter: kaja47

výhružky

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

další projekty

wyhledawacz fel.log stalkr vtipy.k47.cz k47.shop Zkracovač adres stripbot

živě z twitteru

ಠ_ಠ ... ಠ_ಠ ... ಠ_ಠ ... ಠ_ಠ ... ಠ_ಠ ... ಠ_ಠ ... ಠ_ಠ
Proč mi nikdo neřekl, že Pozvakowski znějí tak zatraceně epicky http://www.youtube.com/watch?v=zY1PtK-x7rw
RT @imatrix Námořnictvo Spojených státu amerických zkouší laserové střílny http://is.gd/dQN6L
@kneza Takže teď už víš, kdo skoupil všechno evropské kakao. :)
Johnny Lee: Wii Remote hacks http://u.k47.cz/9j #TED

K. K. na Twitteru
Cenzuruje váš poskytovatel připojení?

poslední články

Our Ceasing Voice - Passenger Killed in Hit and Run
hudební článek | 27. července 2010
Blogerská řetěžovka #7linkscz
interní článek | 26. července 2010
Příliš mnoho informací
| 16. července 2010
669.318
| 19. června 2010
669.317
| 19. června 2010
Dissapeared
grafika | 16. června 2010
get_calling_class() pro PHP 5.2
programování | 13. června 2010
Čtyři zajímavé TED-talky
| 4. června 2010

poslední komentáře

Příliš mnoho informací
kaja47 | 21. července 2010
Příliš mnoho informací
Klíště | 21. července 2010
Příliš mnoho informací
kaja47 | 20. července 2010
Příliš mnoho informací
Klíště | 16. července 2010
Primer - fascince filmem
Tombuben | 29. června 2010
Primer - fascince filmem
kaja47 | 29. června 2010
Primer - fascince filmem
Tombuben | 28. června 2010

největší kecalové

helbion helbion
Radar Radar

K47i © 2002 - 2010 K. aka Kaja47