//
// Latex Project Public Licence (lppl1.3) applies
// Originally written by Kwanleung Tse
// First Release : 1st July, 2014
// Last Update : 25th September, 2014
//
//

package worker4math.hktex2;

import java.util.ArrayList;
import java.util.HashMap;

public class Parsepreparation {
	
	public String parsepreparation(String molecule2, HashMap<String, Integer> symboltype, HashMap<String, String> matchsymbol) {
	
	char temp1,temp2;
	int length=0;
	int i=0;
	int j=-1;
	int ii=0;
	boolean insidetabular=false;
	String molecule = "";
	String key="";
	length = molecule2.length();
	Fontfile font = new Fontfile();
	font.fontfile();
	Textattributefile text = new Textattributefile();
	text.textattributefile();
	Colorfile color = new Colorfile();
	color.colorfile();

	ArrayList<String> atom  = new ArrayList<String>();
	int i2=0;
	molecule2 = molecule2+"!!!!";
	for (i=0;i2<=length;i++){
	
		temp1=molecule2.charAt(i2);
		temp2=molecule2.charAt(i2+1);
	
		if (temp1=='!' && temp2=='!'){i2=length+1;}
		else if (temp1!='!' && temp1 !='}' && temp1 !='{'){molecule=molecule+temp1; i2++;}
		else if (temp1=='!'){
			key="";
			for (ii=i2+1;!(molecule2.charAt(ii)==' ' ||molecule2.charAt(ii)=='}' || molecule2.charAt(ii)=='{'|| molecule2.charAt(ii)=='!'|| molecule2.charAt(ii)=='('|| molecule2.charAt(ii)==')');ii++){
				key = key + molecule2.charAt(ii);
			}
		if (key.equals("frac")){molecule = molecule + "!fra!onb{"; j++; atom.add("onb"); i2=i2+key.length()+2;}
		else if (key.equals("odb")){molecule = molecule + "!odb{"; j++; atom.add("odb"); i2=i2+key.length()+2;}
		else if (key.equals("tabular")){
			molecule = molecule + "!bta{"; j++; atom.add("bta"); i2=i2+key.length()+2;	
			int i4=molecule2.indexOf("{",i2);			
			molecule=molecule+molecule2.substring(i2,i4+1);         
            for (i=i2;i<=i4-2;i++){
          	  if (molecule2.charAt(i)=='l' || molecule2.charAt(i)=='c' || molecule2.charAt(i)=='r'){
          	  }
            }             
            i2=i4+1;
            insidetabular=true;
			}
		else if (key.equals("line")){
			molecule = molecule + "!bln{"; j++; atom.add("bln"); i2=i2+key.length()+2; if (molecule2.charAt(i2)=='}'){molecule=molecule+"!dno"; i2++;};
		}
		else if (key.equals("block")){molecule = molecule +"!openblock ";j++; atom.add("block"); i2=i2+key.length()+2;}
		else if (key.equals("vspace")){molecule = molecule + "!vsp{"; i2=i2+key.length()+2;
		key="";
		for (ii=i2;!(molecule2.charAt(ii)=='}');ii++){
		    key = key + molecule2.charAt(ii);}
		    molecule = molecule + key+"}";
		    i2=i2+key.length()+1;
		}
		else if (key.equals("hspace")){molecule = molecule + "!hsp{" ;  i2=i2+key.length()+2;
		key="";
		for (ii=i2;!(molecule2.charAt(ii)=='}');ii++){
		    key = key + molecule2.charAt(ii);}
		    molecule = molecule + key+"}";
		    i2=i2+key.length()+1;
		}
		else if (key.equals("^")){molecule = molecule + "!osp{" ; j++; atom.add(key); i2=i2+key.length()+2;}
		else if (key.equals("_")){molecule = molecule + "!osu{"; j++; atom.add(key); i2=i2+key.length()+2;}
		else if (key.equals("mbox")){molecule = molecule + "!obx{"; j++; atom.add(key); i2=i2+key.length()+2;}	
		else if (key.equals("dno")){molecule = molecule + "!dno ";i2=i2+key.length()+2;}	
		else if (key.equals("noindent")){i2=i2+key.length()+2;}	
		else if (symboltype.containsKey(key) && symboltype.get(key) < 10  ){
			molecule = molecule + "!V" + key +"{"; j++; atom.add(key); i2=i2+key.length()+2;
			temp1=molecule2.charAt(i2);
			temp2=molecule2.charAt(i2+1);
			if (temp1 == '!' && temp2 == '.'){molecule = molecule +"!."; i2=i2+2;};
		}
		else if (symboltype.containsKey(key) && symboltype.get(key) >= 10 ){
			i2=i2+key.length()+1; if (molecule2.charAt(i2)==' '){i2++; molecule = molecule + "!" + key +" ";}  else if (molecule2.charAt(i2)=='!' || molecule2.charAt(i2)=='}' ){molecule = molecule + "!" + key;} }
		else if (text.attribute.contains(key)){
			if (molecule2.charAt(i2+key.length()+1)=='('){molecule = molecule + "!Ao"+key+molecule2.substring(i2+key.length()+1,molecule2.indexOf(")",i2+key.length()+1)+2); j++; atom.add(key); i2=molecule2.indexOf(")",i2+key.length()+1)+2;
			} else {molecule = molecule + "!Ao"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;};
		}
		else if (Header.sizefactor.containsKey(key)){molecule = molecule + "!Xo"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;}
		else if (font.fontname.contains(key)){molecule = molecule + "!Fo"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;}
		else if (color.colorinteger.containsKey(key)){molecule = molecule + "!Co"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;}
	} else if (temp1=='{' && insidetabular){
	molecule=molecule+"!olb{"; j++; atom.add("olb"); i2++;
    }else if (temp1=='}'){
			key = atom.get(j); atom.remove(j); j--;
			if (symboltype.containsKey(key) && symboltype.get(key) == 1){
				molecule = molecule + "!V" + matchsymbol.get(key) +"}";  i2=i2+1;
				temp1=molecule2.charAt(i2);
				temp2=molecule2.charAt(i2+1);
				if (temp1 == '!' && temp2 == '.'){molecule = molecule +"!."; i2=i2+2;};
			} else if (symboltype.containsKey(key) &&
					symboltype.get(key) < 10){
				molecule = molecule + "!V" + key +"}";  i2=i2+1;
			} else if (key.equals("onb")){
				molecule = molecule + "!cnb}!odb{"; j++; atom.add("odb"); i2=i2+2;
			} else if (key.equals("odb")){
				molecule = molecule + "!cdb}";  i2=i2+1;	
			} else if (key.equals("bta")){
				molecule = molecule + "!eta}";  i2=i2+1;	insidetabular=false;
			} else if (key.equals("bln")){
				molecule = molecule + "!eln}";  i2=i2+1;				
			} else if (key.equals("^")){
				molecule = molecule + "!csp}";  i2=i2+1;	
			} else if (key.equals("_")){
				molecule = molecule + "!csu}";  i2=i2+1;	
			} else if (key.equals("olb")){
				molecule = molecule + "!clb}";  i2=i2+1;
			} else if (key.equals("mbox")){
				molecule = molecule + "!cbx}";  i2=i2+1;			
			}	else if (key.equals("block")){
				molecule = molecule +"!closeblock "; i2=i2+1;
			}	else if (text.attribute.contains(key)){
				molecule = molecule + "!Ac"+key+"}"; i2=i2+1;
			}   else if (Header.sizefactor.containsKey(key)){
				molecule = molecule + "!Xc"+key+"}"; i2=i2+1;				
			}	else if (font.fontname.contains(key)){
				molecule = molecule + "!Fc"+key+"}"; i2=i2+1;
			}	else if (color.colorinteger.containsKey(key)){
				molecule = molecule + "!Cc"+key+"}"; i2=i2+1;		
		}		
    }
	}
	return molecule;
	}}

