I18N_Arabic
[ class tree: I18N_Arabic ] [ index: I18N_Arabic ] [ all elements ]

Source for file Arabic.php

Documentation is available at Arabic.php

  1. <?php
  2. /**
  3.  * ----------------------------------------------------------------------
  4.  *  
  5.  * Copyright (c) 2006-2016 Khaled Al-Shamaa.
  6.  *  
  7.  * http://www.ar-php.org
  8.  *  
  9.  * PHP Version 5
  10.  *  
  11.  * ----------------------------------------------------------------------
  12.  *  
  13.  * LICENSE
  14.  *
  15.  * This program is open source product; you can redistribute it and/or
  16.  * modify it under the terms of the GNU Lesser General Public License (LGPL)
  17.  * as published by the Free Software Foundation; either version 3
  18.  * of the License, or (at your option) any later version.
  19.  *  
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU Lesser General Public License for more details.
  24.  *  
  25.  * You should have received a copy of the GNU Lesser General Public License
  26.  * along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>.
  27.  *  
  28.  * ----------------------------------------------------------------------
  29.  *  
  30.  * Class Name: PHP and Arabic Language
  31.  *  
  32.  * Filename:   Arabic.php
  33.  *  
  34.  * Original    Author(s): Khaled Al-Sham'aa <khaled@ar-php.org>
  35.  *  
  36.  * Purpose:    Set of PHP classes developed to enhance Arabic web
  37.  *             applications by providing set of tools includes stem-based searching,
  38.  *             translitiration, soundex, Hijri calendar, charset detection and
  39.  *             converter, spell numbers, keyboard language, Muslim prayer time,
  40.  *             auto-summarization, and more...
  41.  *              
  42.  * ----------------------------------------------------------------------
  43.  *
  44.  * @desc   Set of PHP classes developed to enhance Arabic web
  45.  *          applications by providing set of tools includes stem-based searching,
  46.  *          translitiration, soundex, Hijri calendar, charset detection and
  47.  *          converter, spell numbers, keyboard language, Muslim prayer time,
  48.  *          auto-summarization, and more...
  49.  *          
  50.  * @category  I18N
  51.  * @package   I18N_Arabic
  52.  * @author    Khaled Al-Shamaa <khaled@ar-php.org>
  53.  * @copyright 2006-2016 Khaled Al-Shamaa
  54.  *    
  55.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  56.  * @version   4.0 released in Jan 8, 2016
  57.  * @link      http://www.ar-php.org
  58.  */
  59.  
  60. /**
  61.  * Core PHP and Arabic language class
  62.  *  
  63.  * @category  I18N
  64.  * @package   I18N_Arabic
  65.  * @author    Khaled Al-Shamaa <khaled@ar-php.org>
  66.  * @copyright 2006-2016 Khaled Al-Shamaa
  67.  *    
  68.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  69.  * @link      http://www.ar-php.org
  70.  */  
  71. {
  72.     private $_inputCharset  'utf-8';
  73.     private $_outputCharset 'utf-8';
  74.     private $_compatible    array();
  75.     private $_lazyLoading   array();
  76.     private $_useAutoload;
  77.     private $_useException;
  78.     private $_compatibleMode;
  79.     
  80.     /**
  81.      * @ignore
  82.      */
  83.     public $myObject;
  84.     
  85.     /**
  86.      * @ignore
  87.      */
  88.     public $myClass;
  89.     
  90.     /**
  91.      * @ignore
  92.      */
  93.     public $myFile;
  94.  
  95.     /**
  96.      * Load selected library/Arabic class you would like to use its functionality
  97.      *          
  98.      * @param string  $library        [AutoSummarize|CharsetC|CharsetD|Date|Gender|
  99.      *                                 Glyphs|Identifier|KeySwap|Numbers|Query|Salat|
  100.      *                                 Soundex|StrToTime|WordTag|CompressStr|Mktime|
  101.      *                                 Transliteration|Stemmer|Standard|Normalise]
  102.      * @param boolean $useAutoload    True to use Autoload (default is false)
  103.      * @param boolean $useException   True to use Exception (default is false)
  104.      * @param boolean $compatibleMode True to support old naming style before
  105.      *                                 version 3.0 (default is true)
  106.      *
  107.      * @desc Load selected library/class you would like to use its functionality
  108.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  109.      */
  110.     public function __construct(
  111.         $library$useAutoload=false$useException=false$compatibleMode=true
  112.     {
  113.         $this->_useAutoload    $useAutoload;
  114.         $this->_useException   $useException;
  115.         $this->_compatibleMode $compatibleMode;
  116.  
  117.         $xml simplexml_load_file(dirname(__FILE__).'/Arabic/data/config.xml');
  118.  
  119.         foreach ($xml->xpath("//compatible/case"as $case{
  120.             $this->_compatible["{$case['old']}"= (string)$case;
  121.         }
  122.  
  123.         foreach ($xml->xpath("//lazyLoading/case"as $case{
  124.             $this->_lazyLoading["{$case['method']}"= (string)$case;
  125.         
  126.  
  127.         /* Set internal character encoding to UTF-8 */
  128.         mb_internal_encoding("utf-8");
  129.  
  130.         if ($this->_useAutoload{
  131.             // It is critical to remember that as soon as spl_autoload_register() is
  132.             // called, __autoload() functions elsewhere in the application may fail 
  133.             // to be called. This is safer initial call (PHP 5 >= 5.1.2):
  134.             if (false === spl_autoload_functions()) {
  135.                 if (function_exists('__autoload')) {
  136.                     spl_autoload_register('__autoload'false);
  137.                 }
  138.             }
  139.             
  140.             spl_autoload_extensions('.php,.inc,.class');
  141.             spl_autoload_register('I18N_Arabic::autoload'false);
  142.         }
  143.         
  144.         if ($this->_useException{
  145.             set_error_handler('I18N_Arabic::myErrorHandler');
  146.         }
  147.         
  148.         if ($library{
  149.             if ($this->_compatibleMode 
  150.                 && array_key_exists($library$this->_compatible)
  151.             {
  152.                 $library $this->_compatible[$library];
  153.             }
  154.  
  155.             $this->load($library);
  156.         }
  157.     }
  158.  
  159.     /**
  160.      * Include file that include requested class
  161.      * 
  162.      * @param string $className Class name
  163.      * 
  164.      * @return null 
  165.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  166.      */ 
  167.     public static function autoload($className
  168.     {
  169.         include self::getClassFile($className);
  170.     }
  171.  
  172.     /**
  173.      * Error handler function
  174.      * 
  175.      * @param int    $errno   The level of the error raised
  176.      * @param string $errstr  The error message
  177.      * @param string $errfile The filename that the error was raised in
  178.      * @param int    $errline The line number the error was raised at
  179.      * 
  180.      * @return boolean FALSE
  181.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  182.      */ 
  183.     public static function myErrorHandler($errno$errstr$errfile$errline)
  184.     {
  185.         if ($errfile == __FILE__ 
  186.             || file_exists(
  187.                 dirname(__FILE__).DIRECTORY_SEPARATOR.'Arabic'.
  188.                 DIRECTORY_SEPARATOR.basename($errfile)
  189.             )
  190.         {
  191.             $msg  '<b>Arabic Class Exception:</b> ';
  192.             $msg .= $errstr;
  193.             $msg .= " in <b>$errfile</b>";
  194.             $msg .= " on line <b>$errline</b><br />";
  195.     
  196.             throw new ArabicException($msg$errno);
  197.         }
  198.         
  199.         // If the function returns false then the normal error handler continues
  200.         return false;
  201.     }
  202.  
  203.     /**
  204.      * Load selected Arabic library and create an instance of its class
  205.      * 
  206.      * @param string $library Library name
  207.      * 
  208.      * @return null 
  209.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  210.      */ 
  211.     public function load($library)
  212.     {
  213.         if ($this->_compatibleMode 
  214.             && array_key_exists($library$this->_compatible)
  215.         {
  216.             $library $this->_compatible[$library];
  217.         }
  218.  
  219.         $this->myFile  $library;
  220.         $this->myClass 'I18N_Arabic_' $library;
  221.         $class         'I18N_Arabic_' $library;
  222.  
  223.         if (!$this->_useAutoload{
  224.             include self::getClassFile($this->myFile)
  225.         }
  226.  
  227.         $this->myObject   new $class();
  228.         $this->{$library&$this->myObject;
  229.     }
  230.     
  231.     /**
  232.      * Magic method __call() allows to capture invocation of non existing methods.
  233.      * That way __call() can be used to implement user defined method handling that
  234.      * depends on the name of the actual method being called.
  235.      *
  236.      * @param string $methodName Method name
  237.      * @param array  $arguments  Array of arguments
  238.      * 
  239.      * @method Call a method from loaded sub class and take care of needed
  240.      *          character set conversion for both input and output values.
  241.      *
  242.      * @return The value returned from the __call() method will be returned to
  243.      *          the caller of the method.
  244.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  245.      */                                  
  246.     public function __call($methodName$arguments)
  247.     {
  248.         if ($this->_compatibleMode 
  249.             && array_key_exists($methodName$this->_compatible)
  250.         {
  251.             $methodName $this->_compatible[$methodName];
  252.         }
  253.  
  254.         // setMode & getMode [Date*|Query], setLang [Soundex*|CompressStr]  
  255.         if ('I18N_Arabic_'.$this->_lazyLoading[$methodName!= $this->myClass{
  256.             $this->load($this->_lazyLoading[$methodName]);
  257.         }
  258.  
  259.         // Create an instance of the ReflectionMethod class
  260.         $method new ReflectionMethod($this->myClass$methodName);
  261.         
  262.         $params     array();
  263.         $parameters $method->getParameters();
  264.  
  265.         foreach ($parameters as $parameter{
  266.             $name  $parameter->getName();
  267.             $value array_shift($arguments);
  268.             
  269.             if (is_null($value&& $parameter->isDefaultValueAvailable()) {
  270.                 $value $parameter->getDefaultValue();
  271.             }
  272.             
  273.             if ($methodName == 'decompress'
  274.                 || ($methodName == 'search' && $name == 'bin')
  275.                 || ($methodName == 'length' && $name == 'bin')
  276.             {
  277.                 $params[$name$value;
  278.             else {
  279.                 $params[$nameiconv($this->getInputCharset()'utf-8'$value);
  280.             }
  281.         }
  282.  
  283.         $value call_user_func_array(array(&$this->myObject$methodName)$params);
  284.  
  285.         if ($methodName == 'tagText'{
  286.             $outputCharset $this->getOutputCharset();
  287.             foreach ($value as $key=>$text{
  288.                 $value[$key][0iconv('utf-8'$outputCharset$text[0]);
  289.             }
  290.         elseif ($methodName == 'compress' 
  291.                   || $methodName == 'getPrayTime'
  292.                   || $methodName == 'str2graph'
  293.         {
  294.         else {
  295.             $value iconv('utf-8'$this->getOutputCharset()$value);
  296.         }
  297.  
  298.         return $value;
  299.     }
  300.  
  301.     /**
  302.      * Garbage collection, release child objects directly
  303.      *          
  304.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  305.      */
  306.     public function __destruct(
  307.     {
  308.         $this->_inputCharset  null;
  309.         $this->_outputCharset null;
  310.         $this->myObject      null;
  311.         $this->myClass       null;
  312.     }
  313.  
  314.     /**
  315.      * Set charset used in class input Arabic strings
  316.      *          
  317.      * @param string $charset Input charset [utf-8|windows-1256|iso-8859-6]
  318.      *      
  319.      * @return TRUE if success, or FALSE if fail
  320.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  321.      */
  322.     public function setInputCharset($charset)
  323.     {
  324.         $flag true;
  325.         
  326.         $charset  strtolower($charset);
  327.         $charsets array('utf-8''windows-1256''cp1256''iso-8859-6');
  328.         
  329.         if (in_array($charset$charsets)) {
  330.             if ($charset == 'windows-1256'{
  331.                 $charset 'cp1256';
  332.             }
  333.             $this->_inputCharset $charset;
  334.         else {
  335.             $flag false;
  336.         }
  337.         
  338.         return $flag;
  339.     }
  340.     
  341.     /**
  342.      * Set charset used in class output Arabic strings
  343.      *          
  344.      * @param string $charset Output charset [utf-8|windows-1256|iso-8859-6]
  345.      *      
  346.      * @return boolean TRUE if success, or FALSE if fail
  347.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  348.      */
  349.     public function setOutputCharset($charset)
  350.     {
  351.         $flag true;
  352.         
  353.         $charset  strtolower($charset);
  354.         $charsets array('utf-8''windows-1256''cp1256''iso-8859-6');
  355.         
  356.         if (in_array($charset$charsets)) {
  357.             if ($charset == 'windows-1256'{
  358.                 $charset 'cp1256';
  359.             }
  360.             $this->_outputCharset $charset;
  361.         else {
  362.             $flag false;
  363.         }
  364.         
  365.         return $flag;
  366.     }
  367.  
  368.     /**
  369.      * Get the charset used in the input Arabic strings
  370.      *      
  371.      * @return string return current setting for class input Arabic charset
  372.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  373.      */
  374.     public function getInputCharset()
  375.     {
  376.         if ($this->_inputCharset == 'cp1256'{
  377.             $charset 'windows-1256';
  378.         else {
  379.             $charset $this->_inputCharset;
  380.         }
  381.         
  382.         return $charset;
  383.     }
  384.     
  385.     /**
  386.      * Get the charset used in the output Arabic strings
  387.      *         
  388.      * @return string return current setting for class output Arabic charset
  389.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  390.      */
  391.     public function getOutputCharset()
  392.     {
  393.         if ($this->_outputCharset == 'cp1256'{
  394.             $charset 'windows-1256';
  395.         else {
  396.             $charset $this->_outputCharset;
  397.         }
  398.         
  399.         return $charset;
  400.     }
  401.  
  402.     /**
  403.      * Get sub class file path to be included (mapping between class name and
  404.      * file name/path become independent now)
  405.      *          
  406.      * @param string $class Sub class name
  407.      *                                  
  408.      * @return string Sub class file path
  409.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  410.      */
  411.     protected static function getClassFile($class)
  412.     {
  413.         $dir  dirname(__FILE__DIRECTORY_SEPARATOR 'Arabic';
  414.         $file $dir DIRECTORY_SEPARATOR $class '.php';
  415.  
  416.         return $file;
  417.     }
  418.     
  419.     /**
  420.      * Send/set output charset in several output media in a proper way
  421.      *
  422.      * @param string   $mode [http|html|mysql|mysqli|pdo|text_email|html_email]
  423.      * @param resource $conn The MySQL connection handler/the link identifier
  424.      *                                  
  425.      * @return string header formula if there is any (in cases of html,
  426.      *                 text_email, and html_email)
  427.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  428.      */
  429.     public function header($mode 'http'$conn null)
  430.     {
  431.         $mode strtolower($mode);
  432.         $head '';
  433.         
  434.         switch ($mode{
  435.         case 'http':
  436.             header('Content-Type: text/html; charset=' $this->_outputCharset);
  437.             break;
  438.         
  439.         case 'html':
  440.             $head .= '<meta http-equiv="Content-type" content="text/html; charset=';
  441.             $head .= $this->_outputCharset '" />'
  442.             break;
  443.         
  444.         case 'text_email':
  445.             $head .= 'MIME-Version: 1.0\r\nContent-type: text/plain; charset=';
  446.             $head .= $this->_outputCharset '\r\n'
  447.             break;
  448.  
  449.         case 'html_email':
  450.             $head .= 'MIME-Version: 1.0\r\nContent-type: text/html; charset=';
  451.             $head .= $this->_outputCharset '\r\n'
  452.             break;
  453.         
  454.         case 'mysql':
  455.             if ($this->_outputCharset == 'utf-8'{
  456.                 mysql_set_charset('utf8');
  457.             elseif ($this->_outputCharset == 'windows-1256'{
  458.                 mysql_set_charset('cp1256');
  459.             }
  460.             break;
  461.  
  462.         case 'mysqli':
  463.             if ($this->_outputCharset == 'utf-8'{
  464.                 $conn->set_charset('utf8');
  465.             elseif ($this->_outputCharset == 'windows-1256'{
  466.                 $conn->set_charset('cp1256');
  467.             }
  468.             break;
  469.  
  470.         case 'pdo':
  471.             if ($this->_outputCharset == 'utf-8'{
  472.                 $conn->exec('SET NAMES utf8');
  473.             elseif ($this->_outputCharset == 'windows-1256'{
  474.                 $conn->exec('SET NAMES cp1256');
  475.             }
  476.             break;
  477.         }
  478.         
  479.         return $head;
  480.     }
  481.  
  482.     /**
  483.      * Get web browser chosen/default language using ISO 639-1 codes (2-letter)
  484.      *          
  485.      * @return string Language using ISO 639-1 codes (2-letter)
  486.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  487.      */
  488.     public static function getBrowserLang()
  489.     {
  490.         $lang substr($_SERVER['HTTP_ACCEPT_LANGUAGE']02)// ar, en, etc...
  491.  
  492.         return $lang;
  493.     }
  494.  
  495.     /**
  496.      * There is still a lack of original, localized, high-quality content and
  497.      * well-structured Arabic websites; This method help in tag HTML result pages
  498.      * from Arabic forum to enable filter it in/out.
  499.      *
  500.      * @param string $html The HTML content of the page in question
  501.      *
  502.      * @return boolean True if the input HTML is belong to a forum page
  503.      * @author Khaled Al-Shamaa <khaled@ar-php.org>
  504.      */
  505.     public static function isForum($html)
  506.     {
  507.         $forum false;
  508.         
  509.         if (strpos($html'vBulletin_init();'!== false{
  510.             $forum true;
  511.         }
  512.         
  513.         return $forum;
  514.     }
  515. }
  516.  
  517. /**
  518.  * Arabic Exception class defined by extending the built-in Exception class.
  519.  *  
  520.  * @category  I18N
  521.  * @package   I18N_Arabic
  522.  * @author    Khaled Al-Shamaa <khaled@ar-php.org>
  523.  * @copyright 2006-2013 Khaled Al-Shamaa
  524.  *    
  525.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  526.  * @link      http://www.ar-php.org
  527.  */  
  528. class ArabicException extends Exception
  529. {
  530.     /**
  531.      * Make sure everything is assigned properly
  532.      * 
  533.      * @param string $message Exception message
  534.      * @param int    $code    User defined exception code
  535.      */         
  536.     public function __construct($message$code=0)
  537.     {
  538.         parent::__construct($message$code);
  539.     }
  540. }

Documentation generated on Fri, 01 Jan 2016 10:25:49 +0200 by phpDocumentor 1.4.0