blob: 682842d4d7da05c13ebe8a671a8c7ce23f245d66 [file] [log] [blame]
<?php
/**********************************************************************
* formateString *
* *
* Version: 1.2 *
* Date: 04-10-2017 *
* Author: Dan Machado *
* Use within exfpdf class *
**********************************************************************/
class formatedString{
public $parced_str;
public $style_map;
public $positions;
private $np;
public $iterator;
public $width;
public $lines;
public $linesmap;
public $used_fonts;
private function get_style($str){
$style=array('font-family'=>false, 'font-weight'=>false, 'font-style'=>false,
'font-size'=>false, 'font-color'=>false, 'href'=>'');
$tmp=explode(';', trim($str, '",\', '));
foreach($tmp as $x){
if($x && strpos($x,':')>0){
$r=explode(':',$x);
$r[0]=trim($r[0]);
$r[1]=trim($r[1]);
if(isset($style[$r[0]]) || $r[0]=='style'){
if($r[0]=='style' || $r[0]=='font-style'){
$r[1]=strtoupper($r[1]);
if(strpos($r[1], 'B')!==false){
$style['font-weight']='B';
}
if(strpos($r[1], 'I')!==false){
$style['font-style']='I';
}
if(strpos($r[1], 'U')!==false){
$style['font-style'].='U';
}
}
elseif($r[1]){
if($r[0]=='href'){
$style[$r[0]]=implode(':', array_slice($r,1));
}
else{
$style[$r[0]]=$r[1];
}
}
}
}
}
return $style;
}
private function style_merge($style1, $style2){
$result=$style1;
foreach($style2 as $k=>$v){
if($v){
$result[$k]=$v;
}
}
return $result;
}
private function style_parcer($text, &$font_data){
$str=trim(strtr($text, array("\r"=>'', "\t"=>'')));
$rep=array('[bB]{1}'=>'B', '[iI]{1}'=>'I', '[iI]{1}[ ]*[bB]{1}'=>'BI', '[bB]{1}[ ]*[iI]{1}'=>'BI' );
foreach($rep as $a=>$v){
$str=preg_replace('/<[ ]*'.$a.'[ ]*>/', "<$v>", $str);
$str=preg_replace('/<[ ]*\/+[ ]*'.$a.'[ ]*>/', "</$v>", $str);
}
$str=preg_replace('/<BI>/', '<s "font-weight:B;font-style:I">', $str);
$str=preg_replace('/<\/BI>/', "</s>", $str);
$str=preg_replace('/<B>/', '<s "font-weight:B;">', $str);
$str=preg_replace('/<\/B>/', "</s>", $str);
$str=preg_replace('/<I>/', '<s "font-style:I;">', $str);
$str=preg_replace('/<\/I>/', "</s>", $str);
$open=array();
$total=array();
$lt="<s";
$rt="</s>";
$j=strpos($str, $lt, 0);
while($j!==false){
if($j>0 && ord($str[$j-1])==92){
$j=strpos($str, $lt, $j+1);
continue;
}
$k=strpos($str, '>',$j+1);
$open[$j]=substr($str, $j+2, $k-($j+2));
$total[]=$j;
$j=strpos($str, $lt, $j+1);
}
$j=strpos($str, $rt, 0);
while($j!==false){
$total[]=$j;
$j=strpos($str, $rt, $j+1);
}
sort($total);
$cs='';
foreach($font_data as $k=>$v){
$cs.=$k . ':'. $v . '; ';
}
$cs=$this->get_style($cs);
$tmp=array($cs);
$blocks=array();
$blockstyle=array();
$n=count($total);
$k=0;
for($i=0; $i<$n; $i++){
$blocks[]=substr($str, $k, $total[$i]-$k);
$blockstyle[]=$cs;
if(isset($open[$total[$i]])){
$cs=$this->style_merge($cs, $this->get_style($open[$total[$i]]));
array_push($tmp, $cs);
$k=strpos($str, '>',$total[$i]+1)+1;
}
else{
$k=$total[$i]+4;
array_pop($tmp);
$l=count($tmp)-1;
$cs=$tmp[$l];
}
}
if($k<strlen($str)){
$blocks[]=substr($str, $k);
$blockstyle[]=$cs;
}
$n=count($blocks);
for($i=0; $i<$n; $i++){
$this->parced_str.=strtr($blocks[$i], array('\<s'=>'<s'));
if(strlen($blocks[$i])>0){
$blockstyle[$i]['style']=$blockstyle[$i]['font-weight'] . $blockstyle[$i]['font-style'];
unset($blockstyle[$i]['font-weight']);
unset($blockstyle[$i]['font-style']);
$this->style_map[strlen($this->parced_str)-1]=$blockstyle[$i];
}
}
}
public function __construct($text, $width, &$font_data){
$this->iterator=0;
$this->parced_str='';
$this->style_map=array();
$this->style_parcer($text, $font_data);
$this->positions=array_keys($this->style_map);
$this->np=(bool)count($this->positions);
$this->width=$width;
$this->lines=array('');
$this->linesmap[0]=array(0, 0, 0);
$this->used_fonts=array();
}
public function get_str(){
return $this->parced_str;
}
public function get_current_style($i){
if(!$this->np){
return '';
}
while($this->positions[$this->iterator]<$i){
$this->iterator++;
}
return $this->style_map[$this->positions[$this->iterator]];
}
public function break_by_style($t){
$i=$this->linesmap[$t][0];
$j=$this->linesmap[$t][1];
$this->iterator=0;
$result=array('chunks'=>array(), 'style'=>array(), 'height'=>0, 'width'=>$this->linesmap[$t][2]);
if(strlen($this->parced_str)==0){
return $result;
}
$cs=$this->get_current_style($i);
$result['height']=$cs['font-size'];
$r=0;
$result['chunks'][$r]='';
$result['style'][$r]=$cs;
while($this->parced_str[$j]==' '){
$j--;
}
$tmp=$i;
for($k=$i; $k<=$j; $k++){
if($this->parced_str[$tmp]==' ' && $this->parced_str[$k]==' '){
$tmp=$k;
continue;
}
if($cs!=$this->get_current_style($k)) {
$r++;
$cs=$this->get_current_style($k);
$result['chunks'][$r]='';
$result['style'][$r]=$cs;
if($result['height']<$cs['font-size']){
$result['height']=$cs['font-size'];
}
}
$result['chunks'][$r].=$this->parced_str[$k];
$tmp=$k;
}
return $result;
}
}
?>