dizballanze

Hanging punctuation class

Jan 29th, 2012
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.95 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Класс для добавления весячей пунктуации
  4.  */
  5. class Hanging extends CApplicationComponent {
  6.     // Константы классов
  7.     const CLASS_QUOTE_LEFT = 1;
  8.     const CLASS_QUOTE_RIGHT = 2;
  9.     const CLASS_BKT_LEFT = 3;
  10.     const CLASS_BKT_RIGHT = 4;
  11.    
  12.     // HTML-классы
  13.     public $class_quote_left = 'punct-ql';
  14.     public $class_quote_right = 'punct-qr';
  15.     public $class_bkt_left = 'punct-ls';
  16.     public $class_bkt_right = 'punct-rs';
  17.  
  18.     // Хэш классов
  19.     protected $classes_array = array();
  20.    
  21.     /**
  22.      * Выполняем обработку
  23.      * @param string $text
  24.      * @return string
  25.      */
  26.     public function process($text) {
  27.        
  28.         $this->classes_array = array(
  29.             self::CLASS_QUOTE_LEFT => $this->class_quote_left,
  30.             self::CLASS_QUOTE_RIGHT => $this->class_quote_right,
  31.             self::CLASS_BKT_LEFT => $this->class_bkt_left,
  32.             self::CLASS_BKT_RIGHT => $this->class_bkt_right,
  33.         );
  34.        
  35.         $lines = explode(PHP_EOL, $text);
  36.        
  37.         $words = array();
  38.         $classes = array();
  39.         foreach ($lines as $num=>$line){
  40.             $words[$num] = explode(' ', $line);
  41.             $classes[$num] = array();
  42.         }
  43.        
  44.         foreach ($words as $line_num => $line){
  45.             foreach ($line as $word_num => $word){
  46.                
  47.                 $first_letter = mb_substr($word, 0, 1, 'utf-8');
  48.                 if (!isset ($classes[$line_num][$word_num]))
  49.                     $classes[$line_num][$word_num] = array();
  50.                
  51.                 if (in_array($first_letter, array('&laquo;', '«', '('))){
  52.                     $quote = in_array($first_letter, array('&laquo;', '«'));
  53.                     $classes[$line_num][$word_num][] = $quote ? self::CLASS_QUOTE_LEFT : self::CLASS_BKT_LEFT;
  54.                     if ($word_num){
  55.                         $classes[$line_num][$word_num-1][] = $quote ? self::CLASS_QUOTE_RIGHT : self::CLASS_BKT_RIGHT;
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.        
  61.         $text = '';
  62.         foreach ($words as $line_num => $line){
  63.             foreach ($line as $word_num => $word){
  64.                 if (!empty($classes[$line_num][$word_num])){
  65.                     $words[$line_num][$word_num] = $this->wrapWord($words[$line_num][$word_num], $classes[$line_num][$word_num]);
  66.                 }
  67.             }
  68.             $text .= implode(' ', $words[$line_num]);
  69.         }
  70.         return $text;
  71.     }
  72.    
  73.     /**
  74.      * Обварачиваем слова
  75.      * @param string $word
  76.      * @param array $classes
  77.      * @return string
  78.      */
  79.     protected function wrapWord($word, Array $classes){
  80.         $html = '<span class="';
  81.         $cls = array();
  82.         foreach ($classes as $class){
  83.             $cls[] = $this->classes_array[$class];
  84.         }
  85.         $html = $html . implode(' ', $cls);
  86.         $html = $html . '">' . $word . '</span>';
  87.         return $html;
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment