Package fi.celia.convert.chars

Source Code of fi.celia.convert.chars.DtBook2Genre

package fi.celia.convert.chars;

import java.lang.StringBuffer;
//import org.apache.xalan.extensions.ExpressionContext;
//import org.apache.xpath.operations.Variable;
//import org.w3c.dom.*;


import java.util.StringTokenizer;

import fi.celia.convert.chars.CharArea;

/**
* Tämä luokka laajentaa dtbook2ml4-ohjelmaa ja sen xslt:n dtbook2ml4.xls
* skriptiä. Sisältää siis xsl:ää laajennusmethodeita, joita xsl-skripti
* kutsuu xsl-ajon aikana. Ks. tämän luokan funktioiden dokumentaatiota sekä
* Dtbook2InfEtc.java dokumentaatiossa kerrotaan tarkemmin, missä tätä ajetaan.
*
* @author tuomask
*
*/
public class DtBook2Genre
{
  // palauta tyhjä merkkijono, kuna haluat false vaikutuksen!!!
   private final String cnstFALSE = ""; // false
   private final String cnstTRUE = "true";
   private static String CR = DecoderCharacterSet.getCarriageReturn();
   /**
    * Korvattaessa merkkiä(merkkijonoa) toiseksi haetaan \\ merkkiä.
    * \\ merkkit toimivat erotin merkkeinä jaettaessa muutettavien
    * ja korvattavien merkkijonoja toisistaan.
    * Javassa c-mäisesti \\\\, josta kääntäjän jälkeen tulee \\ merkkiä.
    */
   public static final String cnstHaeErotinMerkkeja = "\\\\";

  
   public DtBook2Genre()
      {}

   /**
    * Tämä funktio laajentaa xslt:skriptiä. Sen tehtävänä on testata onko tietyn
    * xls-variablen arvo ei-tyhjä merkkijono, jossa ei ole näkyviä merkkejä. Eli
    * kirjaimia ja numeroita. Jos ei ole se palauttaa tyhjän merkkijonon,
    * mikä tarkoittaa samaa kuin false. "true"-arvo tarkoittaa true-arvoa.
    * @param var Arvotettava merkkijono xlst:n variablessta.
    * @return Ks yllä.
    */
   public String
   notEmptyOfChars(String  var)
   {
     //return checkEmptyOfChars(var, cnstFALSE, cnstTRUE);
     //return checkEmptyOfChars(var, cnstTRUE, cnstFALSE);
    if (var == null)
    {
      //System.out.println("d:notEmptyOfChars 1");
      return cnstFALSE;
    }
    String tmp = var.trim();
    if (tmp.length() == 0)
    {
      //System.out.println("d:notEmptyOfChars 2");
      return cnstFALSE;
    }     
   
    char [] arrCh = tmp.toCharArray();
    int max = arrCh.length;   
   
    for(int i = 0; i < max; i++)
    {
      if (Character.isLetterOrDigit(arrCh[i]))
      {
        //System.out.println("d:notEmptyOfChars 3");
        return cnstTRUE;
      }       
    }
   
    //System.out.println("d:notEmptyOfChars 4");
    return cnstFALSE;
   }

   /**
    * Tämä funktio laajentaa xslt:skriptiä. Sen tehtävänä on testata onko tietyn
    * xls-variablen arvo tyhjä merkkijono, jossa ei ole näkyviä merkkejä. Eli
    * kirjaimia ja numeroita. Jos ei ole se palauttaa tyhjän merkkijonon,
    * mikä tarkoittaa samaa kuin false. "true"-arvo tarkoittaa true-arvoa.
    * @param var Arvotettava merkkijono xlst:n variablessta.
    * @return Ks yllä.
    */
   public String
   emptyOfChars(String  var)
   {
    //return checkEmptyOfChars(var, cnstTRUE, cnstFALSE);
     //return checkEmptyOfChars(var, cnstFALSE, cnstTRUE);
    if (var == null)
    {
      //System.out.println("d:notEmptyOfChars 1");
      return cnstTRUE;
    }
    String tmp = var.trim();
    if (tmp.length() == 0)
    {
      //System.out.println("d:notEmptyOfChars 2");
      return cnstTRUE;
    }     
   
    char [] arrCh = tmp.toCharArray();
    int max = arrCh.length;   
   
    for(int i = 0; i < max; i++)
    {
      if (Character.isLetterOrDigit(arrCh[i]))
      {
        //System.out.println("d:notEmptyOfChars 3");
        return cnstFALSE;
      }       
    }
   
    //System.out.println("d:notEmptyOfChars 4");
    return cnstTRUE;
   }  

   private String
   checkEmptyOfChars(String  var, String returnFalse, String returnTrue)
   {
    if (var == null)
    {
      //System.out.println("d:notEmptyOfChars 1");
      return returnTrue;
    }
    String tmp = var.trim();
    if (tmp.length() == 0)
    {
      //System.out.println("d:notEmptyOfChars 2");
      return returnTrue;
    }     
   
    char [] arrCh = tmp.toCharArray();
    int max = arrCh.length;   
   
    for(int i = 0; i < max; i++)
    {
      if (Character.isLetterOrDigit(arrCh[i]))
      {
        //System.out.println("d:notEmptyOfChars 3");
        return returnFalse;
      }       
    }
   
    //System.out.println("d:notEmptyOfChars 4");
    return returnTrue;
   }  

   /**
    * Ks removeSpacesFromBeginOfRow +CR
    * @param var Muutettava merkkijono xlst:n variablessta.
    * @return Muutettu merkkijono.
    */
   public String
   removeSpacesFromBeginOfRowAddCR(String  var)
   {
     return removeSpacesFromBeginOfRow(var) + "\n";
   }
  
   public String
   saada_rivinvaihdot(int tyhjien_rivien_lkm, String  var)
   {
      if (var == null)
      {
        return var;
      }
      String tmp = var.trim();
      if (tmp.length() == 0)
      {
        return tmp;
      }
      String arrRows [] = tmp.split("\n");
      StringBuffer sp = new StringBuffer ();
      int max = arrRows.length;
      String row;
      int cntTyhjia_riveja = 0;
      for(int i = 0; i < max; i++)
      {
        row = arrRows[i];
        if (row == null || row.trim().length() == 0)
        {         
          if (tyhjien_rivien_lkm < 1)
              continue;
          if (cntTyhjia_riveja >= tyhjien_rivien_lkm)
            continue;
           cntTyhjia_riveja++;
           sp.append("\n");
           continue;
        }
        cntTyhjia_riveja = 0;
        sp.append(removeSpacesFromBeginOfRow(row)+"\n");
      }
     
      return sp.toString();     
   }
  
   /**
    * Tämä funktio laajentaa xslt:skriptiä. Sen tehtävänä on poistaa ylimääräiset
    * välilyännit (whiteSpace) merkkijonosta sisältämästä rivin alusta, jonka se
    * palauttaa.
    * @param var Muutettava merkkijono xlst:n variablessta.
    * @return Muutettu merkkijono.
    */
   public String
   removeSpacesFromBeginOfRow(String  var)
   {
    if (var == null)
    {
      //System.out.println("d:removeDupleSpace 1");
      return var;
    }
    int len = var.length();
    if (len == 0)
    {
      return var;
    }     

    String tmp = var.trim();
    if (tmp.length() == 0)
    {
      //System.out.println("d:removeDupleSpace 2 tmp='" +tmp +"'");     
      return var;
    }     
   
    int pos  = len -1;
    int i = 0;
    for( ; i < len; i++)
    if (!Character.isWhitespace(var.charAt(i)))
       break;
   
    if (i == 0) // ei white space poistettavaa rivin alusta
      return var;

    String ret = var.substring(i);
    return ret;
   
    /*
    char [] arrCh = tmp.toCharArray();
    int max = arrCh.length;
    StringTokenizer tokens = new StringTokenizer(tmp);
    StringBuffer sb = new StringBuffer();
    String token;
   
    boolean hasOnlyEnters = true;

    for(;tokens.hasMoreTokens();)
    {
    token = tokens.nextToken();
    if (token == null)
      continue;
    if (token.trim().length() == 0)
    {
      //System.out.println("if (token.trim().length() == 0)");
      continue;
    }
    arrCh = tmp.trim().toCharArray();
    max = arrCh.length;
    hasOnlyEnters = true;
    for(int i = 0; i < max; i++)
      if (Character.isLetterOrDigit(arrCh[i]))
      {
        hasOnlyEnters = false;
        break;
      }
    if (!hasOnlyEnters)
      sb.append(token +' ');   
    }
   
    if (!hasOnlyEnters) // viimeiseksi laitettu ylim. space, ota pois
    {
     int len = sb.length();
     if (len > 0)
     {
       int pos = len-1;
       if (sb.charAt(pos) == ' ')
       {
         sb.replace(pos, pos, "");
       }
     }
    }

    //System.out.println("d:removeDupleSpace 4 tmp='" +tmp +"'");
    return sb.toString();
    */
   
   }  

   /**
    * Tämä funktio laajentaa xslt:skriptiä. Sen tehtävänä on poistaa ylimääräiset
    * välilyännit (whiteSpace, 2x > kpl) merkkijonosta, jonka se palauttaa.
    * @param var Muutettava merkkijono xlst:n variablessta.
    * @return Muutettu merkkijono.
    */
   public String
   removeDupleSpace(String  var)
   {
    if (var == null)
    {
      //System.out.println("d:removeDupleSpace 1");
      return var;
    }
    String tmp = var.trim();
    if (tmp.length() == 0)
    {
      //System.out.println("d:removeDupleSpace 2 tmp='" +tmp +"'");     
      return tmp;
    }     
   
    char [] arrCh = tmp.toCharArray();
    int max = arrCh.length;
    StringTokenizer tokens = new StringTokenizer(tmp);
    StringBuffer sb = new StringBuffer();
    String token;
   
    for(;tokens.hasMoreTokens();)
    {
    token = tokens.nextToken();
    if (token == null)
      continue;
    if (token.trim().length() == 0)
    {
      //System.out.println("if (token.trim().length() == 0)");
      continue;
    }
    arrCh = tmp.trim().toCharArray();
    max = arrCh.length;
    boolean hasOnlyEnters = true;
    for(int i = 0; i < max; i++)
      if (Character.isLetterOrDigit(arrCh[i]))
      {
        hasOnlyEnters = false;
        break;
      }
    if (!hasOnlyEnters)
      sb.append(token +' ');   
    }
   
    //System.out.println("d:removeDupleSpace 4 tmp='" +tmp +"'");
    return sb.toString();
   }  

       private String
       replaceAll(String tmp, String strMuutettava, String strkorvattava)
       {
         if (tmp == null || tmp.trim().length() == 0)
           return tmp;
         if (strMuutettava == null)
           return tmp;
         if (strkorvattava == null)
           return tmp;
         int ind = tmp.indexOf(strMuutettava);
         String alku, loppu;
        
         while(ind != -1)
         {
           alku = tmp.substring(0, ind);
           loppu = tmp.substring(ind + strMuutettava.length());
           tmp = alku + strkorvattava +loppu;
           ind = alku.length() + strkorvattava.length();
           ind = tmp.indexOf(strMuutettava, ind);          
         }
         return tmp;
       }
      
       /**
         * Tämä funktio korvaa merkkejä/merkkijonoja regex-muunnoskutsulla.
         * Muutettavat ja korvattavat parit ilmoitetaan kahtena vastaavan nimisinä
         * paramtritaulukkona. Eli arvot ovat pareittain 2:ssa taulukossa. Ks esim
         * tämän luokan saman niminen methodi, joka kutsuu tätä. Tai MuokkaRiveja-
         * luokkasta. 
         * <p>
         * @param tmp
         * @param arrSearch Ks yllä.
         * @param arrReplace Ks yllä.
         * @return Muutettu merkkijono
         */
        public ConvertedRow
        removeOrConvertChars(String tmp, String [] arrSearch,
            String [] arrReplace, boolean bRegexReplace,
            CharArea [] arrExcludeAreas)
        {
           StringBuffer sb = new StringBuffer();
           String strSearch, strReplace;
          
           int max_search = arrSearch.length;
           int max_replace = arrReplace.length;
      
           int max = tmp.length();
           byte [] arrByteChangedChars = new byte[max];
           for(int i = 0; i < max; i++)
           {
           arrByteChangedChars[i] = 0;
           }
          
           // String inputString = new String(tmp);
          
           char chCurrent = 0;
           char chReplace = 0;
           int ichCurrent;
           boolean bCharFounded = false;
        
           for(int k = 0 ; k < max; k++ )
         {
             chCurrent = tmp.charAt(k);
             ichCurrent = chCurrent;
             chReplace = chCurrent;
             bCharFounded = false;
             strReplace = null;
             for(int i = 0 ; i < max_search; i++ )
             {
                 strSearch = arrSearch[i];
               if (strSearch == null)
                 continue;
               if (strSearch.toString().trim().length() == 0)
               {
                 //System.out.println("if (token.trim().length() == 0)");
                 continue;
               }
               strReplace = arrReplace[i];
               /*
               if (tmp.contains(strMuutettava))
               {
                 int ind = tmp.indexOf(strMuutettava);
                 //System.out.println(strMuutettava +"='" + strMuutettava +" " +ind);
               }
               */
               if (strReplace == null)
                 strReplace = ""; // tmp = tmp.replaceAll(strSearch, "");
              
               char chSearch = 0; // testi koodia:
               if (strSearch.length()>0)
                  chSearch = strSearch.charAt(0);
               int iSearch = chSearch;
               char chReplaceNewValue = 0;
               if (strReplace.length()>0)
                 chReplaceNewValue = strReplace.charAt(0);
               int iReplaceNewValue = chReplaceNewValue; // testikoodia loppu
               // regex-muutos kutsu: jos regexin erikoismerkkejä hakuarvoissa,
               // ne pitää koodata hakuarvoihin erikseen!!! Huom! Erotin merkkeinä \\\\
               // eli kääntäjä muuttaa sen ajossa \\ merkkeiksi.
               //if (bRegexReplace)
                 //tmp = tmp.replaceAll(strMuutettava, strkorvattava);
               //else
                 //tmp = replaceAll(tmp, strMuutettava, strkorvattava);
               if (chCurrent == chSearch)
               {
                 chReplace = chReplaceNewValue;
                 bCharFounded = true;
                 break;
               }                             
             }
             //if (chReplace == chCurrent || chReplace != 0)
             if (!bCharFounded)
               sb.append(chCurrent);
             else
             if (strReplace != null)
               sb.append(strReplace);
             if (bCharFounded && (strReplace != null
               && !strReplace.equals("" +chCurrent))
               || strReplace == null /* chReplace != chCurrent */ )
             arrByteChangedChars[k] = 1;
         }
                  
           /*  Vanhaa koodia; ei toimi, koska StringTokenizer ei selviydy jakamisesta
            * oikein esim: \\\\ , vaan ohittaa kyseisen kohdan siististi päätyen \\\\
            * kohdan jälkeiseen taulukon alkioon.
           StringTokenizer tokenMuutettavat = new StringTokenizer(muutettavatMerkit, haeMerkkeja);
           StringTokenizer tokenkorvattavat = new StringTokenizer(korvattavatMerkit, haeMerkkeja);
           */ 
           //System.out.println("d:removeDupleSpace 4 tmp='" +tmp +"'");
          
           /*
           int maxEA = arrExcludeAreas.length;
           int ind, chEnd;
           CharArea ca;
          
         int max = tmp.length();
           byte [] arrByteChangedChars = new byte[max];
           for(int i = 0; i < max; i++)
           {
           arrByteChangedChars[i] = 0;
           }
             
           for(int i = 0; i < maxEA; i++)
           {
           ca = arrExcludeAreas[i];
           if (ca == null)
             continue;
           chEnd = ca.getChEndChar();
           for (int j = ca.getChStartChar(); j < chEnd; j++)
           {
             if (isCharIn((char)j, arrMuutettavat))
               continue;
             ind = tmp.indexOf("" + j);
             if (ind == -1)
               continue;
             arrByteChangedChars[i] = 1;  // wrong none-changed excluded char founded
           }
           }
           */
           return new ConvertedRow(tmp, sb.toString(), arrByteChangedChars);
           // return tmp;
            }
       
        private boolean
        isCharIn(char ch, String [] arrValues)
        {
          boolean ret = false;
          if (ch < -1 || arrValues == null)
            return false;
          int max = arrValues.length;
          if (arrValues.length == 0)
            return false;
          int maxStr;
          for(int i = 0; i < max; i++)
          {
            maxStr = arrValues[i].length();
            if (arrValues[i] == null || maxStr == 0)
              continue;
            for(int j = 0; j < maxStr; j++)
            {
              if (arrValues[i].charAt(j) == ch)
                return true;
            }
          }
          return false;
        }
  }
TOP

Related Classes of fi.celia.convert.chars.DtBook2Genre

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.