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;
}
}