<?php
/***************************************************************************************************
 * Texyla
 * Version:            	0.4
 * Author:				Petr Vaněk aka krteczek (krteczek@jaknato.com)
 *						Jan Marek
 *						Lukáš Voda
 * Latest update: 		28. června 2007 11:20 (2007/06/28 11:20)
 ***************************************************************************************************
 *  Encoding:           UTF-8
 ***************************************************************************************************
 *	Vytvořil: 			Petr Vaněk aka krteczek
 *
 *	Web: 					http://texyla.jaknato.com
 *
 *  Licence:			Texyla je k dispozici pod GPL licencí
 *  					(její český překlad naleznete v souboru gpl.cs.html)
 *
 *  Tento program je volný software; můžete jej šířit a modifikovat podle
 *  ustanovení Obecné veřejné licence GNU, vydávané Free Software
 *  Foundation; a to buď verze 2 této licence anebo (podle vašeho uvážení)
 *  kterékoli pozdější verze.
 *
 *  Tento program je rozšiřován v naději, že bude užitečný, avšak BEZ
 *  JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo
 *  VHODNOSTI PRO URČITÝ ÚČEL. Další podrobnosti hledejte ve Obecné
 *  veřejné licenci GNU.
 *
 *  Kopii Obecné veřejné licence GNU jste měl obdržet spolu s tímto
 *  programem; pokud se tak nestalo, napište o ni Free Software Foundation,
 *  Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *************************************************************************************************
	
		Rozhodl jsem se přepsat php jádro texyly tak aby bylo snadno použitelné i při 
		zpracování údajů z formuláře(ů) v samotném php.
		
		Takže jsou dvě možnosti použití texyla.php:
		
			1. zavolá si ho texyla.js pomocí httprequestu (tak jako doteď)
			2. tento soubor je možno includovat do vašich php scriptů:
					include('./texyla/texyla.php');				
				na místě kde to potřebujete a zavolat funkci texyla:
					texyla(text, konfigurace, kodovani, jednoradkovy) 
				s těmito parametry:
					text 				=> text který má být zpracovám texy
					konfigurace 	=> jaká má být použita konfigurace pro texy
												Možnosti: 'admin', 'forum', 'oneline', 'webalize'
					kodovani			=> v jakém kódování je text ke zpracování
												Příklady: 'utf-8', 'windows-1250', 'iso-8859-2'
											'utf-8' je defaultní kódování, není třeba uvádět, jedině když
											použijete zároveň i čtvrtý parametr (jednořádkový
					jednořádkový	=> pro rozlišení ošetření jednořádkových textů (témata, jména, emaily...)
												Možnosti: true, false
											false je defaultní hodnota, není třeba uvádět

*****/
//error_reporting(E_ALL);

define('TEXYLA_FILE_NOT_FOUND', 1);
define('TEXYLA_OLD_PHP',2);
define('TEXYLA_ACCESS_DENIED',3);
define('TEXYLA_EMPTY_FORM',4);
define('TEXYLA_ICONV_MISSING', 5);

//include texy
$texyFile = dirname(__FILE__) . '/texy/texy.compact.php';
require_once($texyFile);

if(!empty($_POST['texylaAjax']))
	{
		/*
			zpracováváme požadavky texyla.js volané přes httprequest

			Odstraníme případné ošetření zpětnými lomítky "\" způsobené zaplou 
			directivou MagicQuotesGpc.
			Doporučuji použít vždy.
		*/
		removeMagicQuotesGpc();

		/*
			zavoláme funkci texyla a předáme jí obsah textarey, konfiguraci 
			texy, kodovani neposila, js automaticky posílá text v utf-8, takže nemusíme 
			posílat kodování, a automaticky předpokládáme,
			že se jedná o text z textarea, čili je to $oneLine === false což je defaultní nastavení.
			výsledek zobrazíme (=== odešleme)
		*/		
		echo texyla(@$_POST['texylaContent'], @$_POST['texylaTexyCfg']);
		exit;
	}



function texyla($content, $texyCfg, $encoding = 'utf-8', $oneLine = false)
	{
		$emoticonsWidth = 0;
		$emoticonsHeight = 0;
		
		if((!function_exists('iconv')) && ($encoding != 'utf-8'))
			{
				texylaErrorMsg(TEXYLA_ICONV_MISSING);
			}
		/*
			jaky pouzit config
		*/
		$texyCfg = texylaTexyCfg($texyCfg);
		
		
		/*
			sestaveni cesty ke konfigu
		*/
		$texyCfgFile = dirname(__FILE__) . '/texy/cfg/' . $texyCfg . '.php';
		
		if(!is_bool($oneLine))
			{
				/*
					pokud není bool nastavíme na false (blokový text)
				*/
				$oneLine = false;
			}
		if(!class_exists('Texy'))
			{	
				/*
					Neexistuje třída Texy
				*/
				return texylaErrorMsg(TEXYLA_FILE_NOT_FOUND, $texyFile);
			}
		if(empty($content))
			{
				/*
					prázdný formulář  (nebyl poslán text ke zpracování)
				*/
				return texylaErrorMsg(TEXYLA_EMPTY_FORM);
			}
			
		/*
			iniciace texy
		*/
		$texy = new Texy();
		
		/*
			vypnutí xhtml syntaxe (<tag />)
		*/
		$texy->xhtml = TRUE;
		
		/*
			nastavíme kódování v kterém je zpracováváný text
			(default je utf)
		*/
		$texy->encoding = $encoding;
			

		if(($texyCfg == 'webalize') && ($encoding == 'utf-8'))
			{
				/*
					*******************************************************************************************
					!!! Toto je v Testovací fázi !!! Bugreporty prosím na http://texyla.jaknato.com/khostu.php
					*******************************************************************************************
					Jedná se o odstranění diakritiky...
					Výsledek obsahuje pouze a-z, čísla a spojovník.
					Není třeba načítat konfiguraci, 
					Pokud používáte jiné kódování než je utf-8 musí být text v utf-8
					
					Je však možné povolit i další ASCII znaky:

						$nadpis = "článek/PHP 5.2.1 a funkce is_array()";
						echo Texy::webalize($nadpis); // standardní chování

						→ clanek-php-5-2-1-a-funkce-is-array

						$addChar = '/_.';// navíc povolíme znaky: / _ .
						echo Texy::webalize($nadpis,$addChar); 

						→ clanek/php-5.2.1-a-funkce-is_array

						Ještě dodám, že funkce funguje korektně i při chybné implementaci iconv (glibc).
					
					Pro odstranění diakritiky je nutná funkce iconv
					
				*/
				
				if(!function_exists('iconv'))
					{
						texylaErrorMsg(TEXYLA_ICONV_MISSING);
					}
				$content = (strtolower($encoding) == 'utf-8' ? $content : iconv($encoding, 'utf-8', $content));
				$addChar = '';
				return Texy::webalize($content, $addChar);			
			}	


		if(!file_exists($texyCfgFile))
			{
				/*
					neexistuje (nebyl nalezen/includován) soubor s konfigurací pro texy
				*/
				return texylaErrorMsg(TEXYLA_FILE_NOT_FOUND, $texyCfgFile);
			}
		/*
			includujeme soubor s nastavením Texy!
		*/
		if(!include($texyCfgFile))
			{
				/*
					Nepodařilo se načíst konfigurační soubor
				*/
				return texylaErrorMsg(TEXYLA_ACCESS_DENIED, $texyFile);
			}
		/*
			iniciace pomocné třídy dodávající rozměry pro tagy img u smajlíků
		*/
		$texy->handler = new texyEmoticonsAddSize($emoticonsWidth, $emoticonsHeight);
		
		
		/*****
			Provedeme zpracování poslaného obsahu pomocí Texy!
		*******/
		return $texy->process($content, $oneLine);
	}//end texyla

function texylaTexyCfg($cfg)
{
	//vrátí název konfigu konfiguračnímu souboru pro texy
	switch($cfg)
	{
		case 'admin': return 'admin'; break;
		case 'oneline': return 'oneline'; break;
		case 'webalize': return 'webalize'; break;
		default: return 'forum';
	}
}

function texylaErrorMsg($numMsg, $cesta = '')
{
	/*
		slouží k zobrazení chybových hlášek texyly.
	*/
	switch ($numMsg)
	{
		case 1:
			echo '<p>Neexistuje soubor ' . $cesta . '!</p>';
			exit;
		break;
		case 2:
			echo '<p>Nepodporovaná verze php.</p>';				
			exit;
		break;
		case 3:
			echo '<p>Nejsou správně nastavena přístupová práva k souboru ' . $cesta . '</p>';
			exit;
		break;
		case 4:
			return '<p>Odeslali jste prázdný formulář.</p>';
		break;
		case 5:
			echo '<p>Chybí funkce iconv, která slouží k změně znakové sady zpracovávaného textu. Nelze pokračovat.</p>';
			exit;	
		break;
	}
}

class texyEmoticonsAddSize
{

    /**
     * User handler for emoticons
     * @param TexyLineParser
     * @param string  emoticon e.g. :-)
     * @param string  emoticon as typed, e.g. :-)))
     * @return TexyHtml|string|FALSE|Texy::PROCEED
     ******************
     * Prostě se jedná o podpůrnou třídu/funkci, která automaticky 
     * přidává smajlíkům rozměry.
     ******************
     * Autor: David Grudl aka dgx
     */
    function __construct($width, $height)
    	{
    		$this->width = $width;
    		$this->height = $height;
    	}
    	
	function emoticonsAddSize()
		{
        // generate references (see http://www.dgx.cz/trine/item/how-to-emulate-php5-object-model-in-php4)
        foreach ($this as $key => $foo) $GLOBALS['$$HIDDEN$$'][] = & $this->$key;

        $args = func_get_args();
        call_user_func_array(array(&$this, '__construct'), $args);
		}

	function emoticon($parser, $emoticon, $rawEmoticon)
		{
        /** @var TexyHtml */
        $el = $parser->texy->emoticonModule->solve($emoticon, $rawEmoticon);

        $el->attrs['width']  = $this->width;
        $el->attrs['height'] = $this->height;
        return $el;
    }

}


function removeMagicQuotesGpc()
{
	/*****
	*	Tato funkce slouží k odstranění ošetření způsobeného
	*	direktivou magic_quotes_gpc (jedná se o zpětná lomítka přidávána
	*	před uvozovky a apostrofy).
	*	Byla publikována Jakubem Vránou na http://php.vrana.cz/vypnuti-magic_quotes_gpc.php
	*****/
	if(get_magic_quotes_gpc())
	{
		$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST, &$_FILES);
		while (list($key, $val) = each($process))
		{
			foreach ($val as $k => $v)
			{
				unset($process[$key][$k]);
				if (is_array($v))
				{
					$process[$key][($key < 5 ? $k : stripslashes($k))] = $v;
					$process[] =& $process[$key][($key < 5 ? $k : stripslashes($k))];
				}
				else
				{
					$process[$key][stripslashes($k)] = stripslashes($v);

   			}
			}
		}
	}
}
?>