/[LeafOK_CVS]/fenglin/lib/str_process.inc.php
ViewVC logotype

Diff of /fenglin/lib/str_process.inc.php

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.9 by sysadm, Sat Mar 1 09:02:28 2025 UTC Revision 1.24 by sysadm, Fri Oct 31 10:31:55 2025 UTC
# Line 1  Line 1 
1  <?  <?php
2    function str_length(string $str, bool $skip_ctrl_seq = false) : int
3    {
4            $len = strlen($str);
5            $ret = 0;
6    
7            for ($i = 0; $i < $len; $i++)
8            {
9                    $c = $str[$i];
10    
11                    if ($c == "\r" || $c == "\7") // skip
12                    {
13                            continue;
14                    }
15    
16                    if ($skip_ctrl_seq && $c == "\033" && $i + 1 < $len && $str[$i + 1] == "[") // Skip control sequence
17                    {
18                            for ($i = $i + 2;
19                                    $i < $len && (ctype_digit($str[$i]) || $str[$i] == ';' || $str[$i] == '?');
20                                    $i++)
21                                    ;
22    
23                            if ($i < $len && $str[$i] == 'm') // valid
24                            {
25                                    // skip
26                            }
27                            else if ($i < $len && ctype_alpha($str[$i]))
28                            {
29                                    // unsupported ANSI CSI command
30                            }
31                            else
32                            {
33                                    $i--;
34                            }
35    
36                            continue;
37                    }
38    
39                    // Process UTF-8 Chinese characters
40                    $v1 = ord($c);
41                    if ($v1 & 0x80) //head of multi-byte character
42                    {
43                            $v2 = ($v1 & 0x70) << 1;
44                            while ($v2 & 0x80)
45                            {
46                                    $i++;
47                                    $c .= $str[$i];
48                                    $v2 = ($v2 & 0x7f) << 1;
49                            }
50    
51  function split_line($str,$prefix="",$width=76)                          $ret += 2;
52                    }
53                    else
54                    {
55                            $ret++;
56                    }
57            }
58    
59            return $ret;
60    }
61    
62    function split_line(string $str, string $prefix = "", int $width = PHP_INT_MAX, int $lines_limit = PHP_INT_MAX, string $end_of_line = "\n") : string
63  {  {
64          if ($width<=0)          if ($width <= 0)
65                  return $str;          {
66                            $width = PHP_INT_MAX;
67            }
68    
69          $result = "";          $result = "";
70          $len = mb_strlen($str,'UTF-8');          $len = strlen($str);
71          $prefix_len = mb_strlen($prefix,'UTF-8');          $prefix_len = str_length($prefix);
72    
73            $lines_count = 0;
74    
75          $line = $prefix;          $line = $prefix;
76          $line_len = $prefix_len;          $line_len = $prefix_len;
77          for($i=0;$i<$len;$i++)          for ($i = 0; $i < $len && $lines_count < $lines_limit; $i++)
78          {          {
79                  $c = mb_substr($str,$i,1,'UTF-8');                  $c = $str[$i];
                 $line.=$c;  
80    
81                  // Each UTF-8 CJK character should use two character length for display                  // Skip special characters
82                  $line_len += (strlen($c) <= 2 ? 1 : 2);                  if ($c == "\r" || $c == "\7")
83                    {
84                            continue;
85                    }
86    
87                  if ($line_len >= $width)                  if ($c == "\n")
88                  {                  {
89                          $result .= ($line . "\n");                          if ($lines_count + 1 >= $lines_limit)
90                            {
91                                    break;
92                            }
93    
94                            $result .= ($line . $end_of_line);
95                            $lines_count++;
96                          $line = $prefix;                          $line = $prefix;
97                          $line_len = $prefix_len;                          $line_len = $prefix_len;
98                            continue;
99                  }                  }
         }  
         $result .= ($line . "\n");  
100    
101          return $result;                  // Process UTF-8 Chinese characters
102  }                  $v1 = ord($c);
103                    if ($v1 & 0x80) //head of multi-byte character
104                    {
105                            $v2 = ($v1 & 0x70) << 1;
106                            while ($v2 & 0x80)
107                            {
108                                    $i++;
109                                    $c .= $str[$i];
110                                    $v2 = ($v2 & 0x7f) << 1;
111                            }
112    
113                            // Each UTF-8 CJK character should use two character length for display
114                            if ($line_len + 2 > $width)
115                            {
116                                    if ($lines_count + 1 >= $lines_limit)
117                                    {
118                                            break;
119                                    }
120    
121                                    $result .= ($line . $end_of_line);
122                                    $lines_count++;
123                                    $line = $prefix;
124                                    $line_len = $prefix_len;
125                            }
126                            $line_len += 2;
127                    }
128                    else
129                    {
130                            $line_len++;
131                    }
132    
133  function str_process($str,$prefix="",$width=76)                  if ($line_len > $width)
134  {                  {
135          $result = "";                          if ($lines_count + 1 >= $lines_limit)
136                                    {
137          $lines = explode("\n",str_replace("\r\n","\n",$str));                                  break;
138                            }
139    
140          foreach($lines as $tmp => $line)                          $result .= ($line . $end_of_line);
141          {                          $lines_count++;
142                  $result .= split_line($line,$prefix,$width);                          $line = $prefix;
143                            $line_len = $prefix_len + 1;
144                    }
145    
146                    $line .= $c;
147          }          }
           
         return $result;  
 }  
148    
149  function str_b_lines($str,$max_line=1)          if ($lines_count < $lines_limit)
 {  
         $result = "";  
         $l = 0;  
         $lines = explode("\n",str_replace("\r\n","\n",$str));  
         foreach($lines as $tmp => $line)  
150          {          {
151                  $result .= ($line."\n");                  $result .= $line;
                 $l += (mb_strlen($line,'UTF-8')/128 + 1);  
                 if ($l >= $max_line)  
                         break;  
152          }          }
153    
154          return $result;          return $result;
155  }  }
   
 ?>  


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1