<?php
   session_start();
   ini_set('allow_url_fopen', 1);
   ini_set("default_socket_timeout", 60);
   mb_language("Japanese");
   @require_once 'fml2tex.config.php';	// 定数define

   // for Local Test
   if (array_key_exists("QUERY_STRING",$_SERVER)==FALSE){
	//$s = 'ref=file:///D:/test.html&eno=9';
	//$_REQUEST["ref"] = "ameblo.jp/kafuka-no-ochan/entry-10473995917.html";
	//$_REQUEST["eno"] = "01";
	//$s = '式 \matrix(1#2#f(x); 1#0#0; (f(x))+1#0#1)';
	$s = "式 Σ[a、b] a/b";
   	$_SERVER["QUERY_STRING"] = rawurlencode($s);
  	$test = TRUE;
   }// End Test

   // <a or <img
   $_session["qstr"] = rawurldecode($_SERVER["QUERY_STRING"] );
       if ($_session["qstr"] == ""){
          // リダイレクト-> kafuka Blog / SourceFoge
          header("Location: http://blogs.yahoo.co.jp/kafukanoochan/62474900.html\n\n"); 
          exit;
       }
   if (substr($_session["qstr"],0, 4) == 'ref='){
           $_session["func"]   = '//ExprIndr';
           $_session["refurl"] = $_REQUEST["ref"];
           if ($_session["refurl"] == 'this'){
	       $_session["refurl"] = $_SERVER['HTTP_REFERER'];
	   }
           $_session["refno"]  = '';
           if (array_key_exists("no",$_REQUEST) ){       // expr no
               $_session["refno"] =  $_REQUEST["no"];
           }
           if (array_key_exists("eno",$_REQUEST) ){      // expr no
               $_session["refno"] =  $_REQUEST["eno"];
           }
           if (array_key_exists("gno",$_REQUEST) ){      // graph no
               $_session["func"]  = '//GraphIndr';
               $_session["refno"] =  $_REQUEST["gno"];
               $_session["size"] =  '100';
               if (array_key_exists("size",$_REQUEST) ){
                  $_session["size"] =  $_REQUEST["size"];
               }  
           }
   }else if (substr($_session["qstr"],0, 4) == 'help'){
           $_session["help"]  = '';
           if (array_key_exists("help",$_REQUEST) ){
               $_session["help"] = $_REQUEST["help"];	// '' guid editerTeX
           }
           $_session["func"] = '//Help';
   }else{					// 式/数式表示
           $_session["func"] = '//Expr';
   }
   $reslt = '';
   $err   = '';    
try{
   $Lp = fopen('lock.txt','w');
   $sts = flock($Lp, LOCK_EX);  //排他ロックを行います
   if ($sts===FALSE){ 
       for ($i=1;$i<9;$i++){
           $sts = flock($Lp, LOCK_EX);  //排他ロック
           if ($sts){     
              break;
           }
           sleep(1);
       }
   }
   if (   $_session["func"] == '//ExprIndr' || $_session["func"] == '//Expr'){              
      if ($_session["func"] == '//ExprIndr'){
      	  $refurl = $_session["refurl"];   
          $refno  = $_session["refno"];
          $expr = getExpr_rtn($refurl, $refno);    	// 式(間接指定) 
      }else{
          $expr = qstr_expr_rtn($_session["qstr"]);	// 式xxxx / 数式表示xxxx -> 式xxxx
      }
      if ($expr == ''){
          $err = 'ExprMissing';
      }else if(mb_substr($expr,0,1,'SJIS') == '式'){
   	  	  $expr = preconvREQUEST(substr($expr,2  ), $GooTbl);
	  	  if (strpos($expr, "\\TeX") !== FALSE){
				$posTeX = strpos($expr, "\\TeX");
   				$reslt = substr($expr, 0,pos);		// cut \TeX option.
  				$reslt = $reslt + substr($expr, posTeX+4, strlen($expr)-posTeX-4);
	  	  }else{
	  	  	    $opt = strpos($expr, "\\small");
      		    $wk = preConvForTOSHI($expr, $opt);		// Add { } at \over  And ∫_( , ) -> ∫_{}^{}
          		$wk = convToTeX($wk.'      ', $grk,$grk2,$grk3);
	  			$reslt = convMatrixInTeX($wk);
	  	  }
          $TeXstr = rawurlencode($reslt);      // %20 ' " () [] ? &
          if (isset($test) ){
				print "\n expr:".$expr."\n";
                print "\n reslt:".$reslt;		// Local test
				print "\n".$mimeTeXurl;
          }else{
				$pg = '';
	     		if (strpos($TeXstr,"\\inline") === FALSE && strpos($TeXstr,"\\textstyle") === FALSE){
          	    	$pg = @file_get_contents($mimeTeXurl.$TeXstr);
				}else{
          	    	$pg = @file_get_contents($mimeTeXinL."\\small ".$TeXstr);
				}
				if ($pg == ''){
		    		$err = 'mimeTeX not Active';
				}else{
          	    	header('Content-Type: image/gif');
		    		print ''.$pg;
				}
          }
      }else{
	  	  $err = $expr;
      }
   }else if($_session["func"] == '//GraphIndr'){      // ?ref=http://...&gno=nn)
      $refurl = $_session["refurl"];   
      $refno  = $_session["refno"];
      $url = getGraph_rtn($refurl, $refno);      // URL of 図(間接指定) 
      if (mb_substr($url,0,1,'SJIS') == '図'){
	  	$reslt = substr($url,2 );
        if (isset($test) ){
       		print "\n graph:".$reslt;	// Local test
	  	}else{
			$pg = '';
			$pg = @file_get_contents($reslt);
			if ($pg == ''){
		    	$err = 'Graph not exist';
			}else{
          	    header('Content-Type: image/gif');
		    	print ''.$pg;
			}
        }
      }else{
	  	$err = $url;
      }
   }else if($_session["func"] == '//Help'){
	  $help = $_session["help"];
          if ($help == '' || $help == 'guid'){
		$reslt = $GuidURL;
	  }else if($help == 'sample1'){
		$reslt = $SampleTxtURL;
	  }else if($help == 'sample2'){
		$reslt = $SampleHtmlURL;
	  }else if($help == 'TeX' || $help == 'tex'){
		$reslt = $HelpTeXurl;
	  }else{
		$err = 'UnknownHelp';
 	  }
	  if ($err == ''){
          	header("Location: $reslt\n\n"); 
	  }
   }else{
        $err = 'UnknownFunction';
   }
//fprintf($Lp,"%s", "\n [".$qstr . "] ".$reslt.$err);
   if ($err <> ''){
     	//header("Content-Type: text/html; charset=SJIS");
	//print ''.$err;
        $errmsg = @file_get_contents($mimeTeXinL.$err);
        header('Content-Type: image/gif');
	print ''.$errmsg;
   }
}catch (Exception $ex) {
     @header("Content-Type: text/html; charset=SJIS");
     @fprintf($Lp,"\n Exception!! ");
     @fprintf($Lp,"\n%s", "QUERY_STRING=".$_session["qstr"]);
     @fprintf($Lp,"\n%s", "FUNC=".$_session["func"] );
     @fprintf($Lp,"\n%s", "EXPR=".$expr);
     @fprintf($Lp,"\n%s", $ex->getLine().$ex->getMessage() );
     print  "Exception=".$ex->getLine().$ex->getMessage();
}
   flock ($Lp, LOCK_UN);    //ロック解放
   fclose($Lp);
   exit;
//End Main

function qstr_expr_rtn($qstr){
      if ( mb_substr('式',0,1,'SJIS') == mb_substr($qstr,0,1,'SJIS') ){
             return $qstr;
      }
      if ( mb_substr('数式表示',0,4,'SJIS') == mb_substr($qstr,0,4,'SJIS') ){
             return '式'.substr($qstr,8 );
      }
      if (strlen($qstr) <= 2){
            return 'CanNotEncode';
      }
      // 自動検出
      $encd = mb_detect_encoding($qstr, 'EUC-JP,SJIS,UTF-8,JIS');
      if ($encd != ''){
      	   $expr = mb_convert_encoding($qstr,"SJIS", $encd);
           if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){
             	return $expr;
           }
           if ( mb_substr('数式表示',0,4,'SJIS') == mb_substr($expr,0,4,'SJIS') ){
             	return '式'.substr($expr,8 );
           }
      }
      // Gooブログ対策 (%C3%A5 -> %E5   %C2 -> '')-> UTF-8
      $qstr2 = utf8_decode($qstr);
      $encd = mb_detect_encoding($qstr2, 'EUC-JP,SJIS,UTF-8,JIS');
      $expr  = mb_convert_encoding($qstr2,'SJIS', $encd);
      if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){
             return $expr;
      }
      if ( mb_substr('数式表示',0,4,'SJIS') == mb_substr($expr,0,4,'SJIS') ){
             return '式'.substr($expr,8 );
      }
      // Yahooブログ(EUC-JP) だけは救う
      $expr = mb_convert_encoding($qstr,"SJIS", 'EUC-JP');
      if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){
             	return $expr;
      }
      if ( mb_substr('数式表示',0,4,'SJIS') == mb_substr($expr,0,4,'SJIS') ){
             	return '式'.substr($expr,8 );
      }
      return 'EncodeFail ['.substr($qstr,0,8).']';
}

function getEncdFromHtml($pg){
    $encd = '';
    if (strlen($pg) < 10){
        return $encd;
    }
    $i = strpos($pg,'http-equiv="content-type"');
    if ($i === FALSE)	$i = strpos($pg,'http-equiv="Content-Type"');
    if ($i === FALSE)	$i = strpos($pg,"http-equiv=");
    
    if ($i !== FALSE){
        $j = strpos($pg,'>', $i);
        $s1 = substr($pg, $i, $j-$i);
        $i = strpos($s1, 'charset=');
        if ($i !== FALSE){
            $j = strpos($s1,'"', $i);
            if ($j === FALSE){
                $j = strpos($s1,"'", $i);
            }
            if ($j !== FALSE){
                $encd = substr($s1, $i+8,$j-$i-8);
            }
        }
    }
    //print $s1."   ->".$encd."\n";
    return $encd;
}
function getGraph_rtn($refurl, $refno){     // 図 間接指定
    if ($refurl == ''){
         return 'RefUrlMissing';
    }
    if ($refno == ''){
         return 'RefNoMissing';
    }
    $pg = getPageByRefURL($refurl);
    if (substr($pg,0,1) == '@'){
	return substr($pg,1,20);
    }
    $L = strlen    ('/*図'.$refno);
    $i = strpos($pg,'/*図'.$refno);
        if ($i === FALSE){
            return 'GraphNotFound';
        }
    $pg = substr($pg,$i+$L+1 );
    $i = strpos($pg, 'src=');
        if ($i === FALSE){
            return 'SRC=NotFound';
        }
    $src = substr($pg, $i+5 );
    $delm= substr($pg, $i+4,1);
    $j = strpos($src, $delm);
    if ($j <= 0){
            return 'SRC=NotClosed';
    }
    $src = substr($src,0,$j);
    return '図'.$src;
}
function getExpr_rtn($refurl, $refno){     // 式 間接指定
    if ($refurl == ''){
         return 'RefUrlMissing';
    }
    if ($refno == ''){
         return 'RefNoMissing';
    }
    $pg = getPageByRefURL($refurl);
    if (substr($pg,0,1) == '@'){
	return substr($pg,1,20);
    }
    $L = strlen    ('/*式'.$refno);
    $i = strpos($pg,'/*式'.$refno);
        if ($i === FALSE){
            return 'ExprNotFound';
        }
    $expr = substr($pg,$i+$L );
    $j = strpos($expr,'*/',0);
        if ($j==FALSE){
            $j = strpos($expr,'/*',0);
        }
        if ($j>0){
            $expr = substr($expr,0, $j);
        }
    if (substr($refurl,-4) == '.txt' || substr($refurl,-4) == '.TXT'){
        $expr2 = preconvTxt ($expr);
    }else{
        $expr2 = preconvHtml($expr);
    }
    return  '式'.$expr2;
}

function getPageByRefURL($refurl){    
    // 式定義.txt Get
    if (substr($refurl,0,7) == 'http://'){
    }else if(substr($refurl,0,7) == 'file://'){
    }else{
          $refurl = 'http://'.$refurl;
    }
    $pg = "";
    $pg = @file_get_contents($refurl);
    if (strpos($pg, '</html>') > 0 || strpos($pg, '</HTML>') > 0){
    }else{
     	 $pg = @file_get_contents($refurl);
    }
    if (strlen($pg) < 10){
         return '@RefURLcannotOpen';
    }
    if (mb_strpos($pg,'/*式', 0,'SJIS'))   return $pg;

    if (substr($refurl,-4) == '.txt' || substr($refurl,-4) == '.TXT'){
    }else{
    	$encd = getEncdFromHtml($pg);
    	$pg =  mb_convert_encoding($pg,"SJIS", $encd);
    }
    return $pg;
}

function preconvREQUEST($org, $preconvTbl){
   	$line = "";

   	for($i=0; $i<5000 && $i<mb_strlen($org, 'SJIS'); ){
   		
      	if (mb_substr($org,$i, 6, 'SJIS')=='&nbsp;'){
            $line .= ' ';
            $i = $i + 6;
      	}else if (mb_substr($org,$i, 5, 'SJIS')=='&amp;'){   // &
            $line .= '&';
            $i = $i + 5;
      	}else if (mb_substr($org,$i, 6, 'SJIS')=='&quot;'){  // "
            $line .= '”';
            $i = $i + 6;
      	}else if (mb_substr($org,$i, 4, 'SJIS')=='&gt;'){    // >
            $line .= '>';
            $i = $i + 4;
      	}else if (mb_substr($org,$i, 4, 'SJIS')=='&lt;'){    // <
            $line .= '<';
            $i = $i + 4;
      	}else if(mb_substr($org,$i,1, 'SJIS')=='&'){
      	  	$a = mb_substr($org,$i,9, 'SJIS');
      	  	$j = mb_strpos($a, ';', 0,'SJIS');
      	  	if ($j > 0){
      	  		$a = mb_substr($a, 0,$j+1, 'SJIS');
      	  		$nxt = mb_strLen($a, 'SJIS');
            	if (array_key_exists($a, $preconvTbl) ){
             		$line .= $preconvTbl[$a] ;
             		$i += $nxt;
        		}else{
	    			$line .= "?";
	    			$i += 1;
	    		}
	    	}else{
	    			$line .= "&";
	    			$i += 1;
	  		}
      	}else{
         	if (mb_substr($org,$i,2, 'SJIS') == '  '){
                $line .= ' ';         	// cut 1space
            	$i += 2;
            }else{
         	    $a = mb_substr($org,$i,1,'SJIS');
         	    if (array_key_exists($a, $preconvTbl) ){
             	    $line .= $preconvTbl[$a] ;
         	    }else{            //  no found in tbl
             	    $line .= $a;
             	}
            	$i++;
     	    }
      	}
   	}//For
   	return $line;
}
function preconvHtml($org){
   $line = "";

   $L = strlen("\n");
   for($i=0; $i<2000 && $i<=strlen($org);){
      if (substr($org,$i, 6)=='&nbsp;'){
            $line .= ' ';
            $i = $i + 6;
      }else if (substr($org,$i, 5)=='&amp;'){    // &
            $line .= '&';
            $i = $i + 5;
      }else if (substr($org,$i, 4)=='&gt;'){     // >
            $line .= '>';
            $i = $i + 4;
      }else if (substr($org,$i, 6)=='&quot;'){   // "
            $line .= '”';
            $i = $i + 6;
      }else if (substr($org,$i, 4)=='&lt;'){     // <
            $line .= '<';
            $i = $i + 4;
      }else if (substr($org,$i, 5)=='&#92;'){    // \
            $line .= "\\";
            $i = $i + 5;
      }else if (substr($org,$i, 2)=='¥'){
            $line .= "\\";
            $i = $i + 2;
      }else if (substr($org,$i, 4)=='<br>'){
            //$line .= ' ';
            $i = $i + 4;
      }else if (substr($org,$i, 6)=='<br />'){
            //$line .= ' ';
            $i = $i + 6;
      }else if (substr($org,$i, 20)=="<div class='indent'>"){
            $i = $i + 20;
      }else if (substr($org,$i, 6)=="</div>"){
            $i = $i + 6;
      }else if (substr($org,$i, 4)=='</p>'){
            $i = $i + 4;
      }else if (substr($org,$i, 3)=='<p '){
            $j = strpos($org,'>', $i+3);
            if ($j === FALSE){
                $j  =  $i+2;
            }
            $i = $j+1;
      }else if (substr($org,$i, $L) == "\n"){
            //$line .= ' ';
            $i += $L;
      }else if (substr($org,$i, strlen("\r") ) == "\r"){
            //$line .= ' ';
            $i += strlen("\r");
      /*
      }else if (substr($org,$i, 2)=="\\\\"){ 
            $line .= "\\";
            $i = $i + 2;
      */
      }else if (substr($org,$i, 2)=='\"'){ 
            $line .= "”";
            $i = $i + 2;
      }else if (substr($org,$i, 1)=='"'){ 
            $line .= "”";
            $i = $i + 1;
      }else if (substr($org,$i, 1)=="'"){ 
            $line .= "’";
            $i = $i + 1;
      }else if (substr($org,$i, 1)==','){ 
            $line .= '、';
            $i = $i + 1;
      }else{
            $line .= substr($org,$i,1);
            $i += 1;
      }
   }
   return $line;
}
function preconvTxt($org){
   $line = "";

   for($i=0; $i<2000 && $i<=strlen($org);){
      if (substr($org,$i, strlen("\n") ) == "\n"){
          //$line .= ' ';
          $i += strlen("\n");
      }else{
          $line .= substr($org,$i,1);
          $i += 1;
      }
   }
   return $line;
}

function convToTeX($pStr, $zenTb1,$zenTb2,$zenTb3){
   	$line = "";

   	$org  = ' '.$pStr;
   	for($i=1; $i<1000 && $i<=mb_strlen($org,'SJIS')-5;){
      	if (mb_substr($org,$i, 4,'SJIS')=='hbar'){
	    	if ( chkAlpha(mb_substr($org,$i+4,1, 'SJIS')) ){
            	    $line .= "hbar";
	    	}else{
	    		$a = mb_substr($org,$i-1,1, 'SJIS');
	    		if ($a == 'i'){
            	    $line .= "\\hbar";				// ihbar
            	}else if ( chkAlpha($a) || $a=="\\" || $a=='¥'){		// \ or a-z
            	    $line .= "hbar";
            	}else{		
            	    $line .= "\\hbar";
            	}
	    	}
            $i += 4;
      	}else if (mb_substr($org,$i, 5,'SJIS')=='ihbar'){
            $line .= "i\\hbar";
      		$i += 5;
        }else if (mb_substr($org,$i, 4,'SJIS')=="Lim_"){
        	$line .= "\\lim";
        	$i += 3;			// _ から処理
      	}else{
            $a = mb_substr($org,$i,3,'SJIS');
            if (array_key_exists($a, $zenTb3) ){
             	$a = $zenTb3[$a] ;
	     		$nxt = 3;
            }else{            
             	$a = mb_substr($org,$i,2,'SJIS');
             	if (array_key_exists($a, $zenTb2) ){
             	    $a = $zenTb2[$a] ;
	     	    	$nxt = 2;
             	}else{            
         	    	$a = mb_substr($org,$i,1,'SJIS');
         	    	if (array_key_exists($a, $zenTb1) ){
             	    	$a = $zenTb1[$a] ;
	     	     		$nxt = 1;
         	    	}else{            //  no found in tbl
	     	     		$nxt = 1;
                     	if (strlen($a) >= 2){   // not ANK
                      	    $a = '?';        // -> %3F
                     	}
             	    }
             	}
     	    }
            $line .= $a;
            $i += $nxt;
      	}
   	}//For
   	//printf("\n Line=".$line . " orgnL=".mb_strlen($org) );
   	return $line;
}
function convMatrixInTeX($org){
   $line = "";

   $kaklvl  = 0;			// vector( matrix(  make \begin{pmatrix}  
   $kaktyp1 = 'ンン';			// (1->0)   make  \end{pmatrix}   (>=1)  conv ; to \\
   $kaktyp2 = 'ンン';
   for($i=0; $i<1000 && $i<=mb_strlen($org,'SJIS');){
       if (mb_substr($org,$i,7,'SJIS')=="\\vector" || mb_substr($org,$i,7,'SJIS')=="\\matrix"){
	    $kaktyp1 = mb_substr($org,$i+7,1,'SJIS');
	    if ($kaktyp1 == '(' ){
		$kaktyp2 =  ')';
	    	$kaklvl  =  1;
            	$line .= "\\begin{pmatrix}";
	    }else if($kaktyp1 == '['){
		$kaktyp2 = ']';
	    	$kaklvl  =  1;
            	$line .= "\\begin{bmatrix}";
	    }else if($kaktyp1 == '|'){
		$kaktyp2 = '|';
	    	$kaklvl  =  1;
            	$line .= "\\begin{vmatrix}";
	    }else{
		$line .= mb_substr($org,$i,8,'SJIS');
	    }
            $i += 8;
       }else if(mb_substr($org,$i, 1,'SJIS') == $kaktyp2){	// ) ] |
     	    if ($kaklvl >= 1){
	        $kaklvl -= 1;
                if ($kaklvl == 0){
	    	    if($kaktyp2 == ')' ){
            	    	$line .= "\\end{pmatrix}";
	    	    }else if($kaktyp2 == ']'){
            	    	$line .= "\\end{bmatrix}";
	    	    }else if($kaktyp2 == '|'){
            	    	$line .= "\\end{vmatrix}";
		    }else{
            	    	$line .= $kaktyp2;
		    }
	    	}else{
            	    $line .= $kaktyp2;
             	}
	    }else{
            	$line .= $kaktyp2;
            }
            $i += 1;
      }else if(mb_substr($org,$i, 1,'SJIS') == $kaktyp1){	// ( [ |
     	    if ($kaklvl >= 1)  $kaklvl += 1;
            $line .= $kaktyp1;
            $i += 1;
      }else if(mb_substr($org,$i, 1,'SJIS') == ';'){
     	 if ($kaklvl == 1){
             $line .= "\\\\";
	 }else{
             $line .= ';';
      	 }
         $i += 1;
      }else if(mb_substr($org,$i, 2,'SJIS') == '##'){
     	 if ($kaklvl == 1){
             $line .= "\\\\";
	 }else{
             $line .= '##';
      	 }
         $i += 2;
      }else if(mb_substr($org,$i, 1,'SJIS') == '#'){
     	 if ($kaklvl == 1){
             $line .= "&";
	 }else{
             $line .= '#';
      	 }
         $i += 1;
      }else{
         $line .= mb_substr($org,$i, 1,'SJIS');
	 $i += 1;
      }
   }
   //printf("\n Line=".$line . " orgnL=".mb_strlen($org) );
   return $line;
}
//----------------------------------------------------------------------------------------------//
function preConvForTOSHI($pStr, $opt){
	$wk = $pStr;
	if ($opt === FALSE){	// != '[[expr('){
		if (mb_strpos($wk,"/",0,'SJIS')>0){
			;								// {}は既にちゃんと入れているはず
		}else if (mb_strpos($pStr,"∫",0,'SJIS')===FALSE || mb_strpos($pStr,"/",0,'SJIS')===FALSE ){
			if (mb_strpos($pStr,"|",0,'SJIS')===FALSE || mb_strpos($pStr,"/",0,'SJIS')===FALSE ){
				$wk = preConvOverKako($wk);		// {}を補う (でなければ、手で入れて/に直す)
			}
		}
	}
	$wk = preConvIntRange($wk);		// 範囲指定  ->  _{xxx}^{xxx}
	return $wk;
}
function preConvOverKako($pStr){
   	$org = $pStr;
   	
	for ($n=0; $n<99; $n++){
		$p = mb_strpos($org,"/",0, 'SJIS');
		if ($p === FALSE){
			$p = mb_strpos($org,"/",0, 'SJIS');
			if ($p === FALSE){
				//$org .= "=".$n;
				break;
			}
		}
		$L = mb_strlen($org,'SJIS');
		$flg = true;
		for ($i=$p-1; $i>=0; ){
			$s1 = mb_substr($org,$i,1,'SJIS');
			if ($s1 == "{" || $s1 == "{"){
				$flg = false;		// { 挿入不要
				break;
			}
			if ($s1==")" || $s1==")" || $s1=="}" || $s1=="]" || $s1=="}"){	// nest -> skip  ただし、] なら範囲指定とみなす
				$j = nestKakoBack($org, $i);
				$i = $j-1;
			}else if ($s1=="+" || $s1=="+" || $s1=="-" || $s1=="ー" || $s1=="-" || $s1=="=" || $s1=="=" || $s1=="," || $s1=="、" || $s1==";"){
				break;
			}else if ($s1== "(" || $s1=="(" || $s1=="[" || $s1=="["){
				break;
			}else if ($s1=='∫' || $s1=="Σ" || $s1=="Π"){
				break;		
			}else if ($s1=="]"){      // 範囲指定とみなして、分数範囲の終わりとする
				break;
			}else{
				$i -= 1;
			}
		}
		if ($flg){
			if ($i<0){
				$wk1 = "{".mb_substr($org, 0,$p, 'SJIS');
			}else{
				$wk1 = mb_substr($org,0, $i+1,'SJIS')."{".mb_substr($org,$i+1, $p-$i-1, 'SJIS');
			}
		}else{
			$wk1 = mb_substr($org, 0,$p, 'SJIS');
		}
		$flg = true;
		for ($i=$p+1; $i<$L; ){
			$s1 = mb_substr($org,$i,1,'SJIS');
			if ($s1 == "}" || $s1 == "}"){
				$flg = false;		// { 挿入不要
				break;
			}
			if ($s1=="(" || $s1=="(" || $s1=="[" || $s1=="[" || $s1=="{" || $s1=="{"){	// nest -> skip to )
				$j = nestKako($org, $i);
				$i = $j+1;
			}else if ($s1=="+" || $s1=="+" || $s1=="-" || $s1=="ー" || $s1=="-" || $s1=="=" || $s1=="=" || $s1=="," || $s1=="、" || $s1==";"){
				break;
			}else if ($s1==")" || $s1==")" || $s1=="]" || $s1=="]"){
				break;
			}else{
				$i += 1;
			}
		}
		if ($flg){
			if ($i >= $L){
				$wk2 = mb_substr($org, $p+1,$L-$p-1,'SJIS').'}';
			}else{
				$wk2 = mb_substr($org, $p+1,$i-$p-1,'SJIS')."}".mb_substr($org,$i,$L-$i,'SJIS');
			}
		}else{
			$wk2 = mb_substr($org, $p+1,$L-$p-1,'SJIS');
		}
		if (mb_substr($wk2,0,1,'SJIS')=="d"){
			$wk2 = "d".mb_substr($wk2,1,mb_strlen($wk2,'SJIS')-1,'SJIS');   // ???
		}
		$org = $wk1."\\over ".$wk2;
	}
	return $org;
}
function preConvIntRange($pStr){
   	$line = "";

   	$org = $pStr;
   	$L = mb_strlen($org,'SJIS');
   	for($i=0; $i<1000 && $i<=$L; ){
		if (mb_substr($org,$i, 1,'SJIS')=='∫'    || mb_substr($org,$i, 1,'SJIS')=='Σ'    || mb_substr($org,$i, 1,'SJIS')=='Π'
      	 || mb_substr($org,$i, 4,'SJIS')=="\\int" || mb_substr($org,$i, 4,'SJIS')=="\\sum" || mb_substr($org,$i, 5,'SJIS')=="\\prod"
      	 || mb_substr($org,$i, 4,'SJIS')=="\\lim" || mb_substr($org,$i, 3,'SJIS')=="Lim"){
      		$svPos = $i;
      		if (mb_substr($org,$i, 5,'SJIS')=="\\prod"){
      	 		$i += 5;
      	 	}else if (mb_substr($org,$i, 4,'SJIS')=="\\int" || mb_substr($org,$i, 4,'SJIS')=="\\sum" || mb_substr($org,$i, 4,'SJIS')=="\\lim"){
      	 		$i += 4;
      	 	}else if (mb_substr($org,$i, 3,'SJIS')=="Lim"){
      	 		$i += 3;
      	 	}else{
      	 		$i += 1;
      	 	}
      	 	if ($i >= $L){
      	 		$line .= mb_substr($org, $svPos, $L-$svPos,'SJIS');
      	 		break;
      	 	}
      	 	$s1 = mb_substr($org,$i, 1,'SJIS');
      		if ($s1=='(' || $s1=='(' || $s1=='[' || $s1=="["){
      	 	 	$j = nestKako($org, $i);
      	 	 	if ($j >= $L){
      	 			$line .= mb_substr($org, $svPos, $L-$svPos,'SJIS');
      	 	 		break;
      	 	 	}
      	 	 	$j += 1;		// )の次
      	 	 	$s1 = mb_substr($org, $i,$j-$i, 'SJIS');
      	 	 	$staRange = getParm(1, $s1);
      	 	 	$endRange = getParm(2, $s1);
      	 	 	
      	 	 	$line .= mb_substr($org, $svPos,$i-$svPos, 'SJIS');		// (の前
      	 	 	if ($staRange != ''){
      	 	 		$line .= '_{'.$staRange.'}';
      	 	 	}
      	 	 	if ($endRange != ''){
      	 	 		$line .= '^{'.$endRange.'}';
      	 	 	}
      	 	 	$i = $j;
      	 	}else{
      	 		$i = $svPos;
      	 		$line .= mb_substr($org, $i,1,'SJIS');
      	 		$i += 1;
      	 	}
      	}else{
      		$line .= mb_substr($org,$i, 1,'SJIS');
      		$i += 1;
      	}
    }
    return $line;
}

function chkAlpha($s){
    $s1 = strtolower($s);
    $s2 = strtoupper($s);
    if ($s1 == $s2){
		return FALSE;		// 記号、数字
    }else{
		return TRUE;		// 英字
    }
}
function nestKako($s1, $pos){
    $kakL = mb_substr($s1,$pos,1, 'SJIS');
    if ($kakL == '(' || $kakL == '('){
    	$kakL2 = '(';
		$kakR1 = ')'; $kakR2  = ')';
    }else if($kakL=='[' || $kakL == '['){
    	$kakL2 = '[';
		$kakR1 = ']'; $kakR2  = ']';
    }else if($kakL=='{' || $kakL == '{'){
    	$kakL2 = '{';
		$kakR1 = '}'; $kakR2  = '}';
    }else{
    	$kakL2 = '|';
		$kakR1 = '|'; $kakR2  = '|';
    }
    $lvl = 1;
    for ($i=$pos+1; $i<mb_strlen($s1,'SJIS');  ){
    	$a = mb_substr($s1,$i,1, 'SJIS');
		if ($a==$kakR1 || $a==$kakR2){
	    	$lvl = $lvl-1;
  	    	if ($lvl <=0){
				break;
	    	}
	    	$i = $i+1;
		}else if($a==$kakL || $a==$kakL2){
	    	$lvl = $lvl+1;
	    	$i = $i+1;
		}else{
	    	$i = $i+1;
		}
    }
    return $i;
}
function nestKakoBack($s1, $pos){
    $kakR = mb_substr($s1,$pos,1, 'SJIS');
    if ($kakR == ')' || $kakR == ')'){
    	$kakR2 = ')';
		$kakL1  = '('; $kakL2  = '(';
    }else if($kakR==']' || $kakR == ']'){
    	$kakR2 = ']';
		$kakL1 = '['; $kakL2  = '[';
    }else if($kakR=='}' || $kakR == '}'){
    	$kakR2 = '}';
		$kakL1 = '{'; $kakL2  = '{';
    }else{
    	$kakR2 = '|';
		$kakL1 = '|'; $kakL2  = '|';
    }
    $lvl = 1;
    for ($i=$pos-1; $i>=0;  ){
    	$a = mb_substr($s1,$i,1, 'SJIS');
		if ($a==$kakL1 || $a==$kakL2){
	    	$lvl = $lvl-1;
  	    	if ($lvl <=0){
				break;
	    	}
	    	$i = $i-1;
		}else if($a==$kakR || $a==$kakR2){
	    	$lvl = $lvl+1;
	    	$i = $i-1;
		}else{
	    	$i = $i-1;
		}
    }
    return $i;
}

function getParm($n, $pStr){	
	$xxx = "UNDEF";	// return value

	$s1 = mb_substr($pStr,0,1, 'SJIS');
	if ($s1 == '(' || $s1 == '('){
	    $tmDelm  = ')'; $tmDelm2 = ')';
	}else if ($s1=='[' || $s1 == '['){
	    $tmDelm  = ']'; $tmDelm2 = ']';
	}else if ($s1=='{' || $s1 ==  '}'){
	    $tmDelm  = '}'; $tmDelm2 = '}';
	}else{
		return "Error";
	}
	$str = $pStr.$tmDelm;
	$j=1;		// 開始位置 str[0]は ( か [
	for ($cnt=1; $cnt<=$n; ++$cnt){
		for ($pos=$j; $pos<mb_strlen($str,'SJIS'); ){
		 	$s1 = mb_substr($str,$pos,1, 'SJIS');
			if ($s1=='(' || $s1=='(' || $s1=='[' || $s1=='[' || $s1=='{' || $s1=='{'){
				$pos = nestKako($pStr, $pos);
				if ($pos>=mb_strlen($pStr, 'SJIS') )	break;
				$pos += 1;
				
		 		$s1 = mb_substr($str,$pos,1, 'SJIS');
			}
			if ($s1=="," || $s1=='、' || $s1==$tmDelm || $s1==$tmDelm2){
		    	break;
			}
			$pos += 1;
	    }
		if ($pos>=mb_strlen($pStr, 'SJIS') )	break;
		
	    $xxx = mb_substr($str, $j, $pos-$j, 'SJIS');
	    if (mb_substr($str, $pos,1, 'SJIS') == $tmDelm || mb_substr($str, $pos,1, 'SJIS') == $tmDelm2){
		 	break;
	    }
	    $j = $pos+1;
	}
	if ($cnt < $n){
		$xxx = '';
	}else{
	 	if (mb_substr($xxx,0,1,'SJIS')==' ' || mb_substr($xxx,0,1,'SJIS')==' ' || mb_substr($xxx,0,1,'SJIS')=="\n")	$xxx = mb_substr($xxx,1 ,mb_strlen($xxx, 'SJIS')-1, 'SJIS');
	 	if (mb_substr($xxx,0,1,'SJIS')==' ' || mb_substr($xxx,0,1,'SJIS')==' ' || mb_substr($xxx,0,1,'SJIS')=="\n")	$xxx = mb_substr($xxx,1 ,mb_strlen($xxx, 'SJIS')-1, 'SJIS');
	 	if (mb_substr($xxx,0,2,'SJIS')=="\r\n")	$xxx = mb_substr($xxx,2, mb_strlen($xxx,'SJIS')-2,'SJIS');
	 	
	 	if (mb_substr($xxx,mb_strlen($xxx,'SJIS')-1,1,'SJIS')==' ' || mb_substr($xxx, mb_strlen($xxx,'SJIS')-1,1,'SJIS')==' ')	$xxx = mb_substr($xxx,0, mb_strlen($xxx, 'SJIS')-1, 'SJIS');
	 	if (mb_substr($xxx,mb_strlen($xxx,'SJIS')-1,1,'SJIS')==' ' || mb_substr($xxx, mb_strlen($xxx,'SJIS')-1,1,'SJIS')==' ')	$xxx = mb_substr($xxx,0, mb_strlen($xxx, 'SJIS')-1, 'SJIS');

	 	if (mb_substr($xxx,mb_strlen($xxx,'SJIS')-1,1,'SJIS')=="\n")	$xxx = mb_substr($xxx,0, mb_strlen($xxx,'SJIS')-1, 'SJIS');
	 	if (mb_substr($xxx,mb_strlen($xxx,'SJIS')-2,2,'SJIS')=="\r\n")	$xxx = mb_substr($xxx,0, mb_strlen($xxx,'SJIS')-2, 'SJIS');
	}
	return $xxx;
}

?>