inc/textutils.php

<?php

define
('TAG_PARA',' ');
define('TAG_INDENTPARA',':');
define('TAG_OL','#'); /* OL and UL need to be the */
define('TAG_UL','*'); /* same as the Wiki-code    */
define('TAG_INDENT','>');
define('TAG_CENTER','|');
/* The TINDENT and TCENTER tags denote tags that should be closed when
 * the paragraph closes.
 */
define('TAG_TINDENT','I');
define('TAG_TCENTER','C');
/* The list syntax allows one blank line without breaking the list.  
 * The LINEMARK tag is a dummy tag to note that that line has been found.
 */
define('TAG_LINEMARK','L');
/* The OLDREV and NEWREV tags denote text deleted and added in this
 * revision, respectively.
 */
define('TAG_OLDREV','O');
define('TAG_NEWREV','N');

function 
open_tag(&$outtext, &$neststate$tags) {
  for (
$i 0$i strlen($tags); $i++) {
    
$tag $tags{$i};
    
$neststate .= $tag;
    switch(
$tag) {
      case 
TAG_ITALICS:
        
$outtext .= "<i>";
        break;
      case 
TAG_BOLD:
        
$outtext .= "<b>";
        break;
      case 
TAG_PARA:
        
$outtext .= "<p>\n";
        break;
      case 
TAG_INDENTPARA:
        
$outtext .= "<p class='text'>\n";
        break;
      case 
TAG_OL:
        
$outtext .= "<ol>\n";
        break;
      case 
TAG_UL:
        
$outtext .= "<ul>\n";
        break;
      case 
TAG_INDENT:
      case 
TAG_TINDENT:
        
$outtext .= "<div class='indent'>";
        break;
      case 
TAG_CENTER:
      case 
TAG_TCENTER:
        
$outtext .= "<div class='center'>";
        break;
      case 
TAG_LINEMARK:
        break;
      case 
TAG_OLDREV:
        
$outtext .= "<div class='oldrev'>";
        break;
      case 
TAG_NEWREV:
        
$outtext .= "<div class='newrev'>";
        break;
      default:
        
$neststate substr($neststate,0,strlen($neststate)-1);
        break;
    }
  }
}

function 
close_tag(&$outtext, &$neststate$tagset=null) {
  if (
$neststate == "")
    return 
false;
  if (
$tagset === null) {
    
$tag $neststate{strlen($neststate)-1};
    
$neststate substr($neststate,0,strlen($neststate)-1);
    switch(
$tag) {
      case 
TAG_ITALICS:
        
$outtext .= "</i>";
        break;
      case 
TAG_BOLD:
        
$outtext .= "</b>";
        break;
      case 
TAG_PARA:
      case 
TAG_INDENTPARA:
        
$outtext .= "\n</p>";
        break;
      case 
TAG_OL:
        
$outtext .= "</ol>\n";
        break;
      case 
TAG_UL:
        
$outtext .= "</ul>\n";
        break;
      case 
TAG_INDENT:
      case 
TAG_CENTER:
      case 
TAG_TINDENT:
      case 
TAG_TCENTER:
      case 
TAG_OLDREV:
      case 
TAG_NEWREV:
        
$outtext .= "</div>";
        break;
      case 
TAG_LINEMARK:
        break;
    }
    return 
true;
  }
  if (
strcspn($neststate,$tagset) == strlen($neststate))
    return 
false;
  while (
strlen($neststate)>&&
      
strpos($tagset,$neststate{strlen($neststate)-1}) === false)
    
close_tag($outtext$neststate);
  
close_tag($outtext$neststate);
  return 
true;
}

function 
close_all_tags(&$outtext, &$neststate) {
  while(
close_tag($outtext$neststate))
    ;
}

function 
close_all_of_tags(&$outtext, &$neststate$tagset) {
  while(
$neststate && strcspn($neststate$tagset) != strlen($neststate))
    
close_tag($outtext$neststate);
}

function 
close_all_but_tags(&$outtext, &$neststate$tagset) {
  while(
$neststate && strspn($neststate$tagset) != strlen($neststate))
    
close_tag($outtext$neststate);
}

function 
is_standalone_indent($line) {
  if (!
$line)
    return 
false;
  if (
strlen($line) % != 0)
    return 
false;
  if (
substr($line,strlen($line)-3) == "|||")
    
$line substr($line,0,strlen($line)-3);
  if (
strspn($line,'>') == strlen($line))
    return 
true;
  if (
strspn($line,'<') == strlen($line))
    return 
true;
  return 
false;
}

function 
list_state($neststate) {
  
$liststate "";
  for (
$i 0$i strlen($neststate); $i++) {
    if (
$neststate{$i} == TAG_OL || $neststate{$i} == TAG_UL)
      
$liststate .= $neststate{$i};
  }
  return 
$liststate;
}

function 
encode_line(&$outtext, &$neststate$line$curpage=null, &$isbold=false, &$isitalic=false) {
  
$line rtrim($line);
  
$isbold false;
  
$isitalic false;
  if (
$line == "-") {
    
close_all_but_tags($outtext$neststateTAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
    
$outtext .= "\n<hr class='narrow' />\n\n";
  } elseif (
$line == "--") {
    
close_all_but_tags($outtext$neststateTAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
    
$outtext .= "\n<hr class='medium' />\n\n";
  } elseif (
$line == "---") {
    
close_all_but_tags($outtext$neststateTAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
    
$outtext .= "\n<hr class='wide' />\n\n";
  } elseif (
$line == "") {
    if (
strcspn($neststateTAG_OL.TAG_UL) != strlen($neststate)) {
      if (
close_tag($outtext$neststateTAG_LINEMARK)) {
        
close_all_of_tags($outtext$neststateTAG_OL.TAG_UL);
        
$outtext .= "<br />\n";
      } else
        
open_tag($outtext$neststateTAG_LINEMARK);
    } elseif (
close_tag($outtext$neststateTAG_PARA.TAG_INDENTPARA)) {
      
close_all_of_tags($outtext$neststateTAG_TINDENT.TAG_TCENTER);
    } else {
      
$outtext .= "<br />\n";
    }
  } elseif (
is_standalone_indent($line)) {
    
close_all_but_tags($outtext$neststateTAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
    for (
$i 0$i strlen($line); $i += 3) {
      if (
$line{$i} == '>') {
        
close_all_of_tags($outtext$neststateTAG_CENTER);
        
open_tag($outtext$neststateTAG_INDENT);
      } elseif (
$line{$i} == '<') {
        
close_all_of_tags($outtext$neststateTAG_CENTER);
        
close_tag($outtext$neststateTAG_INDENT);
      } elseif (
$line{$i} == '|') {
        if (!
close_tag($outtext$neststateTAG_CENTER))
          
open_tag($outtext$neststateTAG_CENTER);
      }
    }
  } elseif (
strspn($line,"#*") > &&
      (
strspn($line,"#*") == strlen($line) ||
       
$line{strspn($line,"#*")} == " ")) {
    if(
close_tag($outtext$neststateTAG_LINEMARK))
      
$outtext .= "<br />\n";
    
$liststate list_state($neststate);
    for (
$i 0$i strspn($line,"#*"); $i++) {
      if (
$i >= strlen($liststate))
        
open_tag($outtext$neststate$line{$i});
      elseif (
$line{$i} != $liststate{$i}) {
        for (
$j strlen($liststate)-1$j >= $i$j--)
          
close_tag($outtext$neststate$liststate{$j});
        
$liststate substr($liststate,0,$i);
        
open_tag($outtext$neststate$line{$i});
      }
    }
    for (
$j strlen($liststate)-1$j >= $i$j--)
      
close_tag($outtext$neststate$liststate{$j});
    
$outtext .= "<li>" format_text(substr($line,$i), $curpage$isbold$isitalic) . "\n";
  } elseif (
strspn($line,"=") > &&
      (
strspn($line"=") == strlen($line) ||
       
$line{strspn($line,"=")} == " ")) {
    if(
close_tag($outtext$neststateTAG_LINEMARK))
      
$outtext .= "<br />\n";
    
$liststate list_state($neststate);
    
/*if (strlen($liststate) == strspn($line,"="))
      $outtext .= "<BR>";
    else */
{
      for (
$i strlen($liststate); $i strspn($line,"="); $i++)
        
open_tag($outtext$neststateTAG_UL);
      for (
$i strlen($liststate); $i strspn($line,"="); $i--)
        
close_tag($outtext$neststateTAG_OL.TAG_UL);
    }
    
$outtext .= "<li class='blank'>" format_text(substr($linestrspn($line,"=")), $curpage$isbold$isitalic) . "\n";
  } else {
    
close_all_of_tags($outtext$neststateTAG_OL.TAG_UL);
    if (
strcspn($neststate,TAG_PARA.TAG_INDENTPARA) == strlen($neststate))
      
$beginpara true;
    else
      
$beginpara false;
    while (
substr($line,0,3) == ">>>") {
      if (
$beginpara)
        
open_tag($outtext$neststateTAG_TINDENT);
      
$line substr($line,3);
    }
    if (
substr($line,0,3) == "|||") {
      if (
$beginpara)
        
open_tag($outtext$neststateTAG_TCENTER);
      
$line substr($line,3);
    }
    if (
$beginpara) {
      if (
substr($line,0,3) == "   ")
        
open_tag($outtext$neststateTAG_INDENTPARA);
      else
        
open_tag($outtext$neststateTAG_PARA);
    } else
      
$outtext .= "<br />\n";
    
$outtext .= format_text($line$curpage$isbold$isitalic);
  }
}

function 
encode_text($text$curpage=null) {
  
$neststate "";
  
$outtext "";
  
$lines explode("\n",$text);
  foreach (
$lines as $line) {
    
encode_line($outtext$neststate$line$curpage);
  }
  
close_all_tags($outtext$neststate);
  return 
$outtext;
}

function 
encode_diff($diffarray$curpage=null) {
  
$neststate "";
  
$outtext "";
  
$leftoverline "";
  
$isbold false;
  
$isitalic false;
  for (
$diffidx 0$diffidx count($diffarray); $diffidx++) {
    if (
$diffarray[$diffidx][1] === null) {
      
$lines explode("\n",$diffarray[$diffidx][0]);
      for (
$line array_shift($lines); count($lines) > 0$line array_shift($lines)) {
        if (
$leftoverline === null)
          
$outtext .= format_text($line$curpage$isbold$isitalic);
        else
          
encode_line($outtext$neststate$line$curpage);
        
$leftoverline "";
      }
      if (
$diffidx count($diffarray) - && (
            (
strpos($diffarray[$diffidx+1][0], "\n") !== false &&
             (
strpos($diffarray[$diffidx+1][0], "\n") !=
              
strlen($diffarray[$diffidx+1][0]) - || !trim($line))) ||
            (
strpos($diffarray[$diffidx+1][1], "\n") !== false &&
             (
strpos($diffarray[$diffidx+1][1], "\n") !=
              
strlen($diffarray[$diffidx+1][1]) - || !trim($line)))
           )) {
        if (
$leftoverline === null) {
          
$outtext .= format_text($line$curpage$isbold$isitalic);
          
$leftoverline "";
        } else
          
$leftoverline $line;
      } else {
        
encode_line($outtext$neststate$line$curpage$isbold$isitalic);
        
$leftoverline null;
      }
    } else {
      if (
$leftoverline === null) {
        if (
trim($diffarray[$diffidx][0])) {
          
$outtext .= "<span class='oldrev'>";
          
$outtext .= format_text($diffarray[$diffidx][0], $curpage$isbold$isitalic);
          
$outtext .= "</span>";
        }
        if (
trim($diffarray[$diffidx][1])) {
          
$outtext .= "<span class='newrev'>";
          
$outtext .= format_text($diffarray[$diffidx][1], $curpage$isbold$isitalic);
          
$outtext .= "</span>";
        }
      } else {
        
$savestate $neststate;
        
close_all_tags($outtext$neststate);
        if (
trim($diffarray[$diffidx][0])) {
          
open_tag($outtext$neststateTAG_OLDREV $savestate);
          
$lines explode("\n"$diffarray[$diffidx][0]);
          
$line $leftoverline array_shift($lines);
          while (
count($lines) > 0) {
            
encode_line($outtext$neststate$line$curpage);
            
$line array_shift($lines);
          }
          if (
trim($line))
            
encode_line($outtext$neststate$line$curpage);
          
close_all_tags($outtext$neststate);
        } elseif(
trim($leftoverline)) {
          
open_tag($outtext$neststateTAG_OLDREV $savestate);
          
encode_line($outtext$neststate$leftoverline$curpage);
          
close_all_tags($outtext$neststate);
        }
        if (
trim($diffarray[$diffidx][1])) {
          
open_tag($outtext$neststateTAG_NEWREV $savestate);
          
$lines explode("\n"$diffarray[$diffidx][1]);
          
$line $leftoverline array_shift($lines);
          while (
count($lines) > 0) {
            
encode_line($outtext$neststate$line$curpage);
            
$line array_shift($lines);
          }
          if (
trim($line))
            
encode_line($outtext$neststate$line$curpage);
          
close_all_tags($outtext$neststate);
        } elseif(
trim($leftoverline)) {
          
open_tag($outtext$neststateTAG_NEWREV $savestate);
          
encode_line($outtext$neststate$leftoverline$curpage);
          
close_all_tags($outtext$neststate);
        }
        
open_tag($outtext$neststate$savestate);
      }
    }
  }
  
close_all_tags($outtext$neststate);
  return 
$outtext;
}

function 
format_title($text$isitalic=false) {
  
$outtext "";
  if (
$isitalic)
    
$outtext .= "<i>";
  while (
$text) {
    
$len strcspn($text"'");
    
$outtext .= encode_html_chars(substr($text0$len));
    
$text substr($text$len);
    if (
substr($text,0,2) == "''") {
      
$outtext .= $isitalic "</i>" "<i>";
      
$isitalic = !$isitalic;
      
$text substr($text2);
    } else {
      
$outtext .= $text{0};
      
$text substr($text1);
    }
  }
  if (
$isitalic)
    
$outtext .= "</i>";
  return 
$outtext;
}

function 
format_text($text$curpage=null, &$isbold=false, &$isitalic=false) {
  
$outtext "";
  if (
$isbold)
    
$outtext .= "<b>";
  if (
$isitalic)
    
$outtext .= "<i>";
  
$curpage normalize($curpage);
  while (
$text) {
    
$len strcspn($text"'{[");
    
$outtext .= encode_html_chars(substr($text0$len));
    
$text substr($text$len);
    if (
substr($text,0,5) == "'''''" && $isbold && $isitalic) {
      
$outtext .= "</i></b>";
      
$isbold false;
      
$isitalic false;
      
$text substr($text5);
    } elseif (
substr($text,0,3) == "'''") {
      if (!
$isitalic)
        
$outtext .= $isbold "</b>" "<b>";
      else
    
$outtext .= "</i>" . ($isbold "</b>" "<b>") . "<i>";
      
$isbold = !$isbold;
      
$text substr($text3);
    } elseif (
substr($text,0,2) == "''") {
      
$outtext .= $isitalic "</i>" "<i>";
      
$isitalic = !$isitalic;
      
$text substr($text2);
    } elseif (
substr($text,0,2) == "[[") {
      
$outtext .= "[";
      
$text substr($text2);
    } elseif (
substr($text,0,2) == "{{") {
      
$outtext .= "{";
      
$text substr($text2);
    } elseif (
$text{0} == "[") {
      
$len strcspn($text,"]") - 1;
      
$link substr($text1$len);
      
$text substr($text$len 2);
      if (
substr($link07) != "http://" &&
          
substr($link06) != "ftp://")
        
$link "http://$link";
      
$linktext encode_html_chars($link);
      
$rawlink strtr(rawurlencode($link), array("%2F"=>"/","%3A"=>":"));
      
$outtext .= "<a href=\"$rawlink\" class='ext'>$linktext</a>";
    } elseif (
$text{0} == "{") {
      
$len strcspn($text,"}") - 1;
      
$link substr($text1$len);
      
$text substr($text$len 2);
      if (
$link{0} == '-') {
        
$link "$curpage/" substr($link1);
      } elseif (
$link{0} == '=') {
        
$curdir $curpage;
        while(
$link{0} == "=" && strrpos($curdir,"/") !== false) {
          
$curdir substr($curdir,0,strrpos($curdir,"/"));
          
$link substr($link,1);
        }
        if (
$link{0} != "=")
          
$link "$curdir/$link";
      }
      
$nlink=normalize($link);
      if(
$nlink)
        
$addlink=true;
      else
        
$addlink=false;
      if(
check_page("$nlink")||check_files("$nlink"))
        
$exists=true;
      else
        
$exists=false;
      if (
$isitalic)
        
$outtext .= "</I>";
      if(
$addlink)
        
$outtext.="<a href=\"/".($exists?$nlink:strtr(rawurlencode($link),array("%2F"=>"/"))."?edit").
          
"\" class='".($exists?"int'>":"broken'>");
      
$outtext.=format_title(get_title($link),$isitalic);
      if(
$addlink)
        
$outtext.="</a>";
      if (
$isitalic)
        
$outtext .= "<i>";
    } else {
      
$outtext .= $text{0};
      
$text substr($text1);
    }
  }
  if (
$isitalic)
    
$outtext .= "</i>";
  if (
$isbold)
    
$outtext .= "</b>";
  return 
$outtext;
}

?>


Notes:


Edit this page!
View the most recent revision to this page.
If you haven't yet, read the Wiki Introduction.
Up one level to inc/.
Return to user's home page: Flouri
Return to the Wiki Home.
Hosted by Shyou.org Webservices.