diff options
Diffstat (limited to 'systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java')
-rw-r--r-- | systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java new file mode 100644 index 0000000000..d61a27701d --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java @@ -0,0 +1,221 @@ +// +// 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 android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseBooleanArray; + + +public class Parsetext { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsetext(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, int superblocknumber, SuperBlock superblock, String line, + float referencex, float referencey, + ArrayList<Typeface> tf ,String attribute0, String attribute1, Boolean dohyphenation, float indent){ + + float pagewidth = containerwidth-Header.rightsidemargin-Header.leftsidemargin; + float maxheight = 0.0f; + float maxdepth = 0.0f; + + int i,ii; + int nummolecule = 0; + int fontsize = Integer.parseInt(attribute0.substring(1,4)); + + error.put(tid,false); + errormessage.put(tid,""); + + Boolean newline=false; + + String molecule = ""; + + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Integer.parseInt(attribute0.substring(1,4))); + textpaint.setTypeface(tf.get(Integer.parseInt(attribute0.substring(4,7)))); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + referencey=referencey+textbounds.height()-textbounds.bottom; + Float sizeofblank=textpaint.measureText(" "); + + Separatetext line2superblock = new Separatetext(); + + line2superblock = new Separatetext(); + line2superblock.separatetext(line); + nummolecule = line2superblock.nummolecule; + + Float blockheight = 0.0f; + Float blockwidth = 0.0f; + Float blockdepth = 0.0f; + ArrayList<String> subblock = new ArrayList<String>(); + ArrayList<Float> subblockxpos = new ArrayList<Float>(); + ArrayList<Float> subblockypos = new ArrayList<Float>(); + ArrayList<String> subblockattribute = new ArrayList<String>(); + + maxheight = 0.0f; + maxdepth = 0.0f; + synchronized(this){superblock.create(tid);} + + for (ii=0;ii<=nummolecule-1;ii++){ // First parse + molecule = line2superblock.molecule.get(ii); + if (ii==0) {molecule=molecule.trim(); + if (molecule.length()>=9 && molecule.substring(0,9).equals("!noindent")){indent = 0; molecule=molecule.substring(9); molecule=molecule.trim();}} + + if (!line2superblock.text.get(ii)){ + Parsepreparation newmolecule = new Parsepreparation(); + molecule=newmolecule.parsepreparation(molecule,Symbol.symboltype,Symbol.matchsymbol); + + Parseblock superblock2block = new Parseblock(); + molecule=molecule.trim(); + + superblock2block.parseblock(tid,canvas, block, molecule,tf,attribute1); + if (Block.error.get(tid)==true){error.put(tid, true); errormessage.put(tid, Block.errormessage.get(tid)); return;}; + blockheight=Block.blockheight2.get(tid); + blockwidth=Block.blockwidth2.get(tid); + blockdepth=Block.blockdepth2.get(tid); + maxheight = Math.max(maxheight,Block.blockheight2.get(tid) ); + maxdepth = Math.max(maxdepth, Block.blockdepth2.get(tid)); + int numatom=Block.subblock2.get(tid).size(); + for (i=0;i<=numatom-1;i++){ + Block.subblockxpos2.get(tid).set(i,Block.subblockxpos2.get(tid).get(i)+referencex+indent); + Block.subblockypos2.get(tid).set(i,Block.subblockypos2.get(tid).get(i)+referencey); + subblock.add(Block.subblock2.get(tid).get(i)); + subblockxpos.add(Block.subblockxpos2.get(tid).get(i)); + subblockypos.add(Block.subblockypos2.get(tid).get(i)); + subblockattribute.add(Block.subblockattribute2.get(tid).get(i)); + } + synchronized(this){ + if (newline && SuperBlock.blockatom.get(tid*1000+SuperBlock.superblocklinenumber.get(tid)).size()>0){ + if (subblock.size()>0){ + superblock.create(tid); + superblock.add(tid,subblock,subblockxpos, subblockypos,subblockattribute, blockwidth, blockheight, blockdepth, 'x',0); + } + }else { + superblock.add(tid,subblock,subblockxpos, subblockypos,subblockattribute,blockwidth, blockheight, blockdepth,'x', 0); + } + } + + if (numatom>0){ + indent =subblockxpos.get(0)+blockwidth-referencex+sizeofblank; + if (indent >= pagewidth && ii<nummolecule-1){ + referencey=subblockypos.get(numatom-1)+(float)fontsize; + indent=0; + }else { + referencey=subblockypos.get(numatom-1); + }} + + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + }else if (!molecule.equals("")){ + if (dohyphenation && Header.dohyphenation){ + + ParagraphFormatting paragraph = new ParagraphFormatting(); + ParagraphBlock.newfirstline.put(tid, false); + paragraph.paragraphformatting(canvas,paragraphblock, pagewidth, molecule, tid, indent, attribute0, tf.get(Integer.parseInt(attribute0.substring(4,7)))); + blockheight=(float)ParagraphBlock.line.size()*(float)fontsize; + blockwidth=ParagraphBlock.linelength.get(tid); + blockdepth=0.0f; + maxheight = Math.max(maxheight,(float)ParagraphBlock.line.get(tid).size()*(float)fontsize ); + int numline=ParagraphBlock.line.get(tid).size(); + for (i=0;i<=numline-1;i++){ + + if (!(ParagraphBlock.line.get(tid).get(i).equals(""))){ + subblock.add(ParagraphBlock.line.get(tid).get(i)); + subblockxpos.add(ParagraphBlock.xpos.get(tid).get(i)+referencex); + subblockypos.add(ParagraphBlock.ypos.get(tid).get(i)+referencey); + subblockattribute.add(ParagraphBlock.attribute.get(tid).get(i)); + ParagraphBlock.xpos.get(tid).set(i,ParagraphBlock.xpos.get(tid).get(i)+referencex); + ParagraphBlock.ypos.get(tid).set(i,ParagraphBlock.ypos.get(tid).get(i)+referencey); + + if (i==0 && !ParagraphBlock.newfirstline.get(tid)){ + synchronized(this){ superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0);} + }else { + synchronized(this){ + if (subblock.size()>0 && SuperBlock.blockatom.get(tid*1000+SuperBlock.superblocklinenumber.get(tid)).size()>0){ + superblock.create(tid); + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } else if (subblock.size()>0) { + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } + } + } + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + } + } + if (numline > 0){indent=ParagraphBlock.xpos.get(tid).get(numline-1)+ParagraphBlock.xpos.get(tid).get(numline-1)-referencex; + if (indent >= pagewidth && ii<nummolecule-1){ + referencey=ParagraphBlock.ypos.get(tid).get(numline-1)+(float)fontsize; + indent=0; + }else { + referencey=ParagraphBlock.ypos.get(tid).get(numline-1); + }}; + } + else { + + ParagraphFormatting2 paragraph2 = new ParagraphFormatting2(); + paragraph2.paragraphformatting2(canvas, paragraphblock, pagewidth, molecule, tid, indent, attribute0, tf.get(Integer.parseInt(attribute0.substring(4,7)))); + blockheight=(float)ParagraphBlock.line.get(tid).size()*(float)fontsize; + blockwidth=ParagraphBlock.linelength.get(tid); + blockdepth=0.0f; + + maxheight = Math.max(maxheight,(float)ParagraphBlock.line.get(tid).size()*(float)fontsize ); + int numline=ParagraphBlock.line.get(tid).size(); + for (i=0;i<=numline-1;i++){ + if (!(ParagraphBlock.line.get(tid).get(i).equals(""))){ + subblock.add(ParagraphBlock.line.get(tid).get(i)); + subblockxpos.add(ParagraphBlock.xpos.get(tid).get(i)+referencex); + subblockypos.add(ParagraphBlock.ypos.get(tid).get(i)+referencey); + subblockattribute.add(ParagraphBlock.attribute.get(tid).get(i)); + ParagraphBlock.xpos.get(tid).set(i,ParagraphBlock.xpos.get(tid).get(i)+referencex); + ParagraphBlock.ypos.get(tid).set(i,ParagraphBlock.ypos.get(tid).get(i)+referencey); + + if (i==0 && !ParagraphBlock.newfirstline.get(tid)){ + synchronized(this){superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.tlinelength.get(tid).get(i), (float) fontsize, 0.0f,'x', 0);} + }else { + synchronized(this){ + if (subblock.size()>0 && SuperBlock.blockatom.get(tid*1000+SuperBlock.superblocklinenumber.get(tid)).size()>0){ + superblock.create(tid); + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } else if (subblock.size()>0) { + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } + } + } + + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + } + } + if (numline > 0) {indent=ParagraphBlock.xpos.get(tid).get(numline-1)+ParagraphBlock.width.get(tid).get(numline-1)-referencex; + if (indent >= pagewidth && ii<nummolecule-1){ + referencey=ParagraphBlock.ypos.get(tid).get(numline-1)+(float)fontsize; + indent=0; + newline=true; + + }else { + referencey=ParagraphBlock.ypos.get(tid).get(numline-1); + newline=false; + }}; + } + }} + thisypos.put(tid, referencey+maxdepth+Header.linegap); + error.put(tid, false); + errormessage.put(tid, ""); + }; + } + + +
\ No newline at end of file |