/**
*
*/
package fi.celia.asciimath;
import java.io.*;
import java.nio.charset.CharacterCodingException;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import java.util.logging.*;
import fi.celia.asciimath.xml.AsciiMathXml;
import fi.celia.convert.chars.DecoderCharacterSet;
import fi.celia.convert.chars.DecoderCharacterSetException;
//import fi.nkl.ml4.impl.IlmoitaRivistaImpl;
/**
* This class contains methods which are called from gui class (application).
*
* @author tkassila
*/
public class DtBookAsciiMath {
//private static String m_lmoitaRivista;
private static String CR = DecoderCharacterSet.getCarriageReturn();
/**
* Onko sovellus tai osa sovellusta, tai kutsutaanko esim pipeline'sta
* käsin (ei vielä toimi classloader ja xml-xsl-framework ongelmien takia).
*/
protected static boolean bApplication = true;
private String m_strKorjattuDtBookTiedostoNimi = "";
public static final String UTF_8 = "UTF-8";
public static final String UTF_16 = "UTF-16";
public static final String UTF_16BE = "UTF-16BE";
public static final String UTF_16LE = "UTF-16LE";
public static final String ISO_8859_1 = "ISO-8859-1";
public static final String US_ASCII = "US-ASCII";
private static final String cnstLATIN1 = "8859-1";
private static final String cnstUTF8 = "UTF-8";
private StringBuffer sbML4 = new StringBuffer();
private boolean m_LastExec_bDtbookContainsMixedCharsets = false;
private int executeResult = 0;
//private StringBuffer sbMessage = new StringBuffer ();
private String strMessageLabel = "";
private boolean bExecuteAndRenameOK = false;
private static Properties m_property = null;
private boolean bExecutedOnes = false;
private static Logger logger;
private String m_strError;
private StringBuffer m_sbPrintData = null;
private HashMap<String, List<AsciiMathBlockValue>> m_hmAsciiMaps = null;
/**
* Tämä properties tiedosto kirjoitetaan käyttäjän kotihakemistoon, josta
* se on luettavissa seuraavalla käynnistyksellä. Se antaa oletusarvot
* uuteen käynnistykseen. Ja taletetaan ohjelmaa lopetettaessa.
*/
private static String default_dtbook2ml4_properties = "dtbook2asciimath.properties";
private String m_strUserHome;
/**
* Konstruktori.
*/
public DtBookAsciiMath(Logger p_logger, String strUserHome)
{
logger = p_logger;
m_strUserHome = strUserHome;
}
/**
* Onko käynnissä oleva luokka instanssi sovellus (main) vai ei,
* kutsutaanko toisen luokan sisältä, esim pipeline.
*/
public static void setApplication(boolean value) { bApplication = value; }
public String getKorjattuDtBookTiedostoNimi()
{
return m_strKorjattuDtBookTiedostoNimi;
}
public boolean getLastExecOfVariableDtbookContainsMixedCharsets()
{
return m_LastExec_bDtbookContainsMixedCharsets;
}
public boolean getExecutedOnes() { return bExecutedOnes; }
//public String getSbMessage() { return sbMessage.toString(); }
public String getStrMessageLabel() { return strMessageLabel; }
public String getML4String() { return sbML4.toString(); }
public int getExecuteResult() { return executeResult; }
public boolean getExecuteAndRenameOK() { return bExecuteAndRenameOK; }
public StringBuffer getPrintData() { return m_sbPrintData; }
/**
* Tämä suorittaa varsinaisen dtbook-ml4 muunnoksen.
* Kutsutaan mainista (komentorivi +gui-versiosta sekä Dtbook2InfEtc:stä.
*
* @param bDtbookContainsMixedCharsets
* @param properties
* @param dbtbookFileNameValue
* @param outputFileNameValue
* @param strReadCharacterSetOfInputFile
* @param strWriteCharacterSet
* @param xslDtBook2ML4Path
* @param bGenerateNKLVariablesFromTemplate
* @param bLisaaMerkisto
* @param bErrorConvertedSourceFile
* @throws TransformerException
* @throws DecoderCharacterSetException
* @throws CharacterCodingException
* @throws FileNotFoundException
* @throws IOException
* @throws NullPointerException
* @throws Exception
*/
public void
executeRuleConversion(boolean bDtbookContainsMixedCharsets,
Properties properties,
String dbtbookFileNameValue,
String outputFileNameValue,
String strReadCharacterSetOfInputFile,
String strWriteCharacterSet,
String xslDtBook2ML4Path,
boolean bGenerateNKLVariablesFromTemplate,
boolean bLisaaMerkisto,
boolean bErrorConvertedSourceFile,
boolean bRemoveLFBetweenKKoodi,
String jasciiMathPropertyFileName,
boolean m_bSpaceRule,
boolean m_bNumberRule,
boolean m_bThousandNumberRule,
boolean m_bReplaceRule,
boolean bWarningsOn,
boolean bPrintAsciMaths,
boolean bCheckStrikeErrors,
boolean p_bCorrectStrikeErrors
)
throws DecoderCharacterSetException,
CharacterCodingException,
FileNotFoundException,
IOException,
NullPointerException,
Exception
{
JAsciiMath jAsciiMath = null;
try {
logger.info("executeConversion methodi alkaa" );
bExecuteAndRenameOK = false;
executeResult = 0;
sbML4 = new StringBuffer();
m_strKorjattuDtBookTiedostoNimi = "";
// parametritaksituksia
if (outputFileNameValue == null)
throw new NullPointerException("ml4FileNameValue == null");
if (strWriteCharacterSet == null)
throw new NullPointerException("strWriteCharacterSet == null");
if (strWriteCharacterSet == null)
throw new NullPointerException("strWriteCharacterSet == null");
if (xslDtBook2ML4Path == null)
throw new NullPointerException("xslDtBook2ML4Path == null");
xslDtBook2ML4Path = xslDtBook2ML4Path.trim();
//sbMessage = new StringBuffer ();
sbML4 = new StringBuffer ();
// osa flageista tulee gui-ohjelmasta, osa toisen ohjelman asettama
logger.info("luettaan/asetetaan flageja");
m_LastExec_bDtbookContainsMixedCharsets = bDtbookContainsMixedCharsets;
String exec_dbbookFileNameValue = dbtbookFileNameValue;
//jTextAreaLabel.setText(cnstML4Text);
//jML4TextArea.setText("");
//jML4ScrollPane.setViewportView(getJML4TextArea());
bExecuteAndRenameOK = false;
executeResult = 0;
String line;
//sbMessage = new StringBuffer ();
//sbMessage.append("Muunnos käynnistetty:\n");
//sbMessage.append("DtBook-asiakirja: " + dbbookFileNameValue +"\n");
//sbMessage.append("ML4-asiakirja: " +ml4FileNameValue +"\n");
/*
if (bDtbookContainsMixedCharsets)
{
sbMessage.append("Suoritetaan ensin merkistän muunnos siltä varalta,\n"
+ "dtbook-asiakirja sisältää merkkejä eri merkistäistä (utf-8:sta sekä iso-8859-1:stä\n");
}
jML4TextArea.setText(sbMessage.toString());
*/
//Graphics g = jML4TextArea.getGraphics();
//jML4TextArea.addNotify();
//Thread.sleep(1000);
/* .batin ajo:
Process p = Runtime.getRuntime().exec
("dtbook2ml4.bat " + exec_dbbookFileNameValue + " " + outputFileName);
BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
//System.out.println(line);
sb.append(line +"\n");
}
input.close();
executeResult = p.exitValue();
*/
if (bDtbookContainsMixedCharsets) // jos gui-käyttäjä asettanut, nähtyään vast. virheilmoituksen paneelissa
{
logger.info("muunnetaan dtbook, jossa sekamerkkistäja utf-8:ksi");
String modifiedContent;
modifiedContent =
DecoderCharacterSet.readMixed88591AndUTF8FileConvertIntoUTF8(exec_dbbookFileNameValue);
exec_dbbookFileNameValue = exec_dbbookFileNameValue +"_m";
DecoderCharacterSet.writeToFileByUsingToCharacterSet(
DecoderCharacterSet.UTF_8, modifiedContent,
exec_dbbookFileNameValue);
}
else
{
if (!strReadCharacterSetOfInputFile.equals(cnstUTF8))
{
String modifiedContent;
modifiedContent =
DecoderCharacterSet.readMixed88591AndUTF8FileConvertIntoUTF8(exec_dbbookFileNameValue);
exec_dbbookFileNameValue = exec_dbbookFileNameValue +"_m";
DecoderCharacterSet.writeToFileByUsingToCharacterSet(
DecoderCharacterSet.UTF_8, modifiedContent,
exec_dbbookFileNameValue);
}
}
// read input file content:
File fileInput = new File(exec_dbbookFileNameValue);
FileInputStream is = new FileInputStream(fileInput);
InputStreamReader isr = new InputStreamReader (is, strReadCharacterSetOfInputFile);
BufferedReader input = new BufferedReader(isr);
StringBuffer sb = new StringBuffer ();
while ((line = input.readLine()) != null)
{
//System.out.println(line);
sb.append(line +"\n");
}
input.close();
String strInputData = sb.toString();
if (jasciiMathPropertyFileName == null || jasciiMathPropertyFileName.trim().length() == 0)
jasciiMathPropertyFileName = "dtbookasciimath.properties";
jAsciiMath = new JAsciiMath(jasciiMathPropertyFileName,
bCheckStrikeErrors, p_bCorrectStrikeErrors, false);
jAsciiMath.setWarningsOn(bWarningsOn);
jAsciiMath.setInputData(strInputData);
jAsciiMath.setConvertAsciiMathDataWithSpaceRules(m_bSpaceRule);
jAsciiMath.setConvertAsciiMathDataCommaRule(m_bNumberRule);
jAsciiMath.setConvertAsciiMathDataThousndNumberRule(m_bThousandNumberRule);
jAsciiMath.setConvertAsciiMathDataReplaceAllReservedWords(m_bReplaceRule);
jAsciiMath.setPrintAsciimathValues(bPrintAsciMaths);
// conversion call:
jAsciiMath.replaceAsciiMathBlocks();
//m_strError = asciimath
String strOutput = jAsciiMath.getOutputData();
m_sbPrintData = jAsciiMath.getPrintData();
m_strError = jAsciiMath.toStringError();
if (strOutput != null)
{
File fileOutput = new File(outputFileNameValue);
FileOutputStream os = new FileOutputStream(fileOutput);
OutputStreamWriter osw = new OutputStreamWriter (os, strReadCharacterSetOfInputFile);
osw.write(strOutput.toCharArray());
osw.close();
sbML4.append(strOutput);
if (m_strError == null)
bExecuteAndRenameOK = true;
}
m_hmAsciiMaps = jAsciiMath.getAsciimatHashMapValues();
if (m_strError != null)
executeResult = 1;
logger.info("methodin suoritus ok. Mahdoll. xsl-waringeja voi olla (getWarning...()). Kutsuva ohjelma tarkistaa.");
logger.info("methodi loppu" );
} catch (fi.celia.asciimath.DtbookAsciiMathException amerror) {
amerror.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, amerror);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw amerror;
} catch (DecoderCharacterSetException dcse) {
dcse.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, dcse);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw dcse;
} catch (CharacterCodingException cce) {
cce.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, cce);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw cce;
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, fnfe);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw fnfe;
} catch (IOException ioe) {
ioe.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, ioe);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw ioe;
} catch (Exception err) {
err.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, err);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw err;
}
}
/**
* This method is converting asciimath xml blocks within firefox browser
* into ascimath daisy xml entities.
*
* @param bDtbookContainsMixedCharsets
* @param properties
* @param dbtbookFileNameValue
* @param outputFileNameValue
* @param strReadCharacterSetOfInputFile
* @param strWriteCharacterSet
* @param xslDtBook2ML4Path
* @param bGenerateNKLVariablesFromTemplate
* @param bLisaaMerkisto
* @param bErrorConvertedSourceFile
* @throws TransformerException
* @throws DecoderCharacterSetException
* @throws CharacterCodingException
* @throws FileNotFoundException
* @throws IOException
* @throws NullPointerException
* @throws Exception
*/
public int
executeXmlConversion(boolean bDtbookContainsMixedCharsets,
Properties properties,
String dbtbookFileNameValue,
String outputFileNameValue,
String strReadCharacterSetOfInputFile,
String strWriteCharacterSet,
String xslDtBook2ML4Path,
boolean bGenerateNKLVariablesFromTemplate,
boolean bLisaaMerkisto,
boolean bErrorConvertedSourceFile,
boolean bRemoveLFBetweenKKoodi,
String jasciiMathPropertyFileName,
boolean m_bSpaceRule,
boolean m_bNumberRule,
boolean m_bThousandNumberRule,
boolean m_bReplaceRule,
boolean bWarningsOn,
boolean bPrintAsciMaths,
boolean bCheckStrikeErrors,
boolean p_bCorrectStrikeErrors
)
throws DecoderCharacterSetException,
CharacterCodingException,
FileNotFoundException,
IOException,
NullPointerException,
Exception
{
JAsciiMath jAsciiMath = null;
try {
logger.info("executeConversion methodi alkaa" );
bExecuteAndRenameOK = false;
executeResult = 0;
sbML4 = new StringBuffer();
m_strKorjattuDtBookTiedostoNimi = "";
// parametritaksituksia
if (outputFileNameValue == null)
throw new NullPointerException("ml4FileNameValue == null");
if (strWriteCharacterSet == null)
throw new NullPointerException("strWriteCharacterSet == null");
if (strWriteCharacterSet == null)
throw new NullPointerException("strWriteCharacterSet == null");
if (xslDtBook2ML4Path == null)
throw new NullPointerException("xslDtBook2ML4Path == null");
xslDtBook2ML4Path = xslDtBook2ML4Path.trim();
//sbMessage = new StringBuffer ();
sbML4 = new StringBuffer ();
// osa flageista tulee gui-ohjelmasta, osa toisen ohjelman asettama
logger.info("luettaan/asetetaan flageja");
m_LastExec_bDtbookContainsMixedCharsets = bDtbookContainsMixedCharsets;
String exec_dbbookFileNameValue = dbtbookFileNameValue;
//jTextAreaLabel.setText(cnstML4Text);
//jML4TextArea.setText("");
//jML4ScrollPane.setViewportView(getJML4TextArea());
bExecuteAndRenameOK = false;
executeResult = 0;
String line;
//sbMessage = new StringBuffer ();
//sbMessage.append("Muunnos käynnistetty:\n");
//sbMessage.append("DtBook-asiakirja: " + dbbookFileNameValue +"\n");
//sbMessage.append("ML4-asiakirja: " +ml4FileNameValue +"\n");
/*
if (bDtbookContainsMixedCharsets)
{
sbMessage.append("Suoritetaan ensin merkistän muunnos siltä varalta,\n"
+ "dtbook-asiakirja sisältää merkkejä eri merkistäistä (utf-8:sta sekä iso-8859-1:stä\n");
}
jML4TextArea.setText(sbMessage.toString());
*/
//Graphics g = jML4TextArea.getGraphics();
//jML4TextArea.addNotify();
//Thread.sleep(1000);
/* .batin ajo:
Process p = Runtime.getRuntime().exec
("dtbook2ml4.bat " + exec_dbbookFileNameValue + " " + outputFileName);
BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
//System.out.println(line);
sb.append(line +"\n");
}
input.close();
executeResult = p.exitValue();
*/
if (bDtbookContainsMixedCharsets) // jos gui-käyttäjä asettanut, nähtyään vast. virheilmoituksen paneelissa
{
logger.info("muunnetaan dtbook, jossa sekamerkkistäja utf-8:ksi");
String modifiedContent;
modifiedContent =
DecoderCharacterSet.readMixed88591AndUTF8FileConvertIntoUTF8(exec_dbbookFileNameValue);
exec_dbbookFileNameValue = exec_dbbookFileNameValue +"_m";
DecoderCharacterSet.writeToFileByUsingToCharacterSet(
DecoderCharacterSet.UTF_8, modifiedContent,
exec_dbbookFileNameValue);
}
else
{
if (!strReadCharacterSetOfInputFile.equals(cnstUTF8))
{
String modifiedContent;
modifiedContent =
DecoderCharacterSet.readMixed88591AndUTF8FileConvertIntoUTF8(exec_dbbookFileNameValue);
exec_dbbookFileNameValue = exec_dbbookFileNameValue +"_m";
DecoderCharacterSet.writeToFileByUsingToCharacterSet(
DecoderCharacterSet.UTF_8, modifiedContent,
exec_dbbookFileNameValue);
}
}
// read input file content:
File fileInput = new File(exec_dbbookFileNameValue);
FileInputStream is = new FileInputStream(fileInput);
InputStreamReader isr = new InputStreamReader (is, strReadCharacterSetOfInputFile);
BufferedReader input = new BufferedReader(isr);
StringBuffer sb = new StringBuffer ();
while ((line = input.readLine()) != null)
{
//System.out.println(line);
sb.append(line +"\n");
}
input.close();
String strInputData = sb.toString();
if (jasciiMathPropertyFileName == null || jasciiMathPropertyFileName.trim().length() == 0)
jasciiMathPropertyFileName = "dtbookasciimath.properties";
jAsciiMath = new JAsciiMath(jasciiMathPropertyFileName, bCheckStrikeErrors,
p_bCorrectStrikeErrors, false);
// conversion call:
/*
AsciiMathXml asciimathxml = new AsciiMathXml();
Properties prop = new Properties();
File fileProp = new File(jasciiMathPropertyFileName);
prop.load(new FileReader(fileProp));
String templatefilename = prop.getProperty("asciimathxml_templatefile");
String asciiMathWWWBrowserApplication = prop.getProperty("asciimathxml_wwwbrowserapplication");
asciimathxml.modifyDtbookIntoAsciiMathXml(templatefilename,
dbtbookFileNameValue, jasciiMathPropertyFileName,
asciiMathWWWBrowserApplication, outputFileNameValue);
*/
Properties prop = new Properties();
File fileProp = new File(jasciiMathPropertyFileName);
FileReader freader = new FileReader(fileProp);
prop.load(freader);
String templatefilename = prop.getProperty("asciimathxml_templatefile");
String asciiMathWWWBrowserApplication = prop.getProperty("asciimathxml_wwwbrowserapplication");
String dtbookCharacterSet = "UTF-8";
jAsciiMath.setPrintAsciimathValues(bPrintAsciMaths);
int run_result = jAsciiMath.modifyDtbookIntoAsciiMathXml(templatefilename,
dbtbookFileNameValue, dtbookCharacterSet,
jasciiMathPropertyFileName, asciiMathWWWBrowserApplication,
outputFileNameValue, strWriteCharacterSet, bPrintAsciMaths,
bCheckStrikeErrors, p_bCorrectStrikeErrors);
//m_strError = asciimath
String strOutput = jAsciiMath.getOutputData();
m_sbPrintData = jAsciiMath.getPrintData();
m_strError = jAsciiMath.toStringError();
m_hmAsciiMaps = jAsciiMath.getAsciimatHashMapValues();
//else
//m_sbPrintData = jAsciiMath.
if (strOutput != null)
{
sbML4.append(strOutput);
if (m_strError == null || m_strError.equals(""))
bExecuteAndRenameOK = true;
}
//if (m_strError != null)
//executeResult = 1;
executeResult = run_result;
m_hmAsciiMaps = jAsciiMath.getAsciimatHashMapValues();
logger.info("methodin suoritus ok. Mahdoll. xsl-waringeja voi olla (getWarning...()). Kutsuva ohjelma tarkistaa.");
freader.close();
logger.info("methodi loppu" );
return run_result;
} catch (fi.celia.asciimath.DtbookAsciiMathException amerror) {
amerror.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, amerror);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw amerror;
} catch (DecoderCharacterSetException dcse) {
dcse.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, dcse);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw dcse;
} catch (CharacterCodingException cce) {
cce.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, cce);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw cce;
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, fnfe);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw fnfe;
} catch (IOException ioe) {
ioe.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, ioe);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw ioe;
} catch (Exception err) {
err.printStackTrace();
giveErrorMessage(jAsciiMath, bDtbookContainsMixedCharsets, err);
strMessageLabel = "Ajon aikainen virhe! Ks. yllä olevaa tekstikenttää!";
executeResult = 1;
throw err;
}
//return -1;
}
/**
* Tämä methodi korjaa tagsoup ajon jälkeen siinä ajossa syntyneet xml-headerit takaisin
* alkup. dtbook-tiedoston xsl-headereiksi.
*
* @param props
* @param strDtBookData
* @throws FileNotFoundException
* @throws IOException
* @throws UnsupportedEncodingException
* @return String
*/
public static String
correctXslHeadersOfTagSoupParsed(Properties props, String strDtBookData)
throws FileNotFoundException,
IOException,
UnsupportedEncodingException
{
int indDtFirstBookElement_Begins = strDtBookData.indexOf("<dtbook");
if (indDtFirstBookElement_Begins > -1)
{
int indDtFirstBookElement_End = strDtBookData.indexOf(">", indDtFirstBookElement_Begins);
if (indDtFirstBookElement_End > -1)
{
int indAfterDtFirstBookElement = indDtFirstBookElement_End+1;
int indStopDtBookElement_Start = strDtBookData.indexOf("</dtbook>", indAfterDtFirstBookElement); // indAfterDtFirstBookElement
if (indStopDtBookElement_Start > -1)
{
String strChildElements =
strDtBookData.substring(indAfterDtFirstBookElement, indStopDtBookElement_Start);
if (strChildElements != null)
{
String strModifiedXml_Start = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<!DOCTYPE dtbook PUBLIC \"-//NISO//DTD dtbook 2005-2//EN\" \"http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd\">\n"
+"<dtbook xmlns=\"http://www.daisy.org/z3986/2005/dtbook/\" version=\"2005-2\" xml:lang=\"fi\">\n";
String tmp_ModifiedXml_Start = props.getProperty("xsl_headers");
if (tmp_ModifiedXml_Start != null && tmp_ModifiedXml_Start.trim().length() != 0)
strModifiedXml_Start = tmp_ModifiedXml_Start +"\n";
return strModifiedXml_Start + strChildElements +"</dtbook>";
}
}
}
}
return null;
}
/**
* Tämä hakee xsl-virhetilanteessa kaikki virhe Exceptionit ja tulostaa ne lokiin.
* @param bDtbookContainsMixedCharsets
* @param exception
*/
private void
giveErrorMessage(JAsciiMath jAsciiMath,
boolean bDtbookContainsMixedCharsets,
Exception exception)
{
if (jAsciiMath != null)
m_strError = jAsciiMath.toStringError();
strMessageLabel = "Ajossa tapahtui virhe! Ks. tekstikenttää alhaalla";
logger.severe(strMessageLabel );
sbML4.append("\nAjossa tapahtui virhe:\n");
if (exception != null)
{
sbML4.append(exception.getMessage()+"\n\n");
if (m_strError != null)
sbML4.append("Ks varoituslehdykästä varoitus ja virheitä luetussa tiedostossa!");
printStackTraceIntoLogger(logger, exception, true);
}
}
/** Printataan ruutuun virheilmoitus, ohjelman suoritus loppuu 1 koodiin.
*/
public static void virhe(final String msg) {
System.err.println(msg);
logger.log(Level.ALL, msg);
exit(1);
} // Virhe
/** Lopetetaan ohjelma annetulla koodilla.
*/
public static void exit(int code)
{
String msg = "exit-value: " +code;
if (logger != null)
logger.log(Level.ALL, msg);
else
if (code != 0)
System.err.println(msg);
if (bApplication)
System.exit(code);
}
/** Muutetaan konsolin tulostuksen koodisto annetuksi.
Samalla stdout ja stderr kytketään samaan, parametri määrittää
tehdäänkä yhteys mappaus.
Parametrit: charset: mikä on käytettävä merkistä.
bBuffered: onko puskuroitu tulostus
bErrAlso: kytketäänkä stderr stdouttiin.
*/
public static void setConsoleOutput(final String charset, boolean bBuffered, boolean bErrAlso )
throws Exception {
PrintStream ps = new PrintStream(System.out, bBuffered, charset );
System.setOut(ps);
if (bErrAlso)
System.setErr(ps);
} // setConsoleOutput
public static void
setLogger(Logger p_logger)
{
logger = p_logger;
}
/**
* Ohjelman käytästä, jos käynnistyksessä virhe, tai ilman parametreja.
*/
public static void usage()
{
System.err.println("käytä: " + DtBookAsciiMath.class.getName() + " xslpath dtbookdoc ml4doc");
System.err.println(" - dtbook2ml4 - ohjelman nimi");
System.err.println(" - xslpath - annetaan polku missä ajettavat xsl-tiedostot sijaitsevat");
System.err.println(" - luettava, muokattava dtbook-asiakirja");
System.err.println(" - kirjoitetaan lopputulos ml4-asiakirjaan\n");
System.err.println("tai");
System.err.println("käytä: dtbook2ml4 xslpath dtbookdoc ml4doc [sekamerkkeja]");
System.err.println(" - muuten sama kuin yllä, mutta dtbook sisältää");
System.err.println(" sekamerkkejä (utf-8 ja latin1 eli iso-8859-1)");
System.err.println("tai");
System.err.println("käytä: dtbook2ml4 xslpath dtbookdoc ml4doc [...] [" + default_dtbook2ml4_properties +"=myml4.properties]");
System.err.println(" - muuten sama kuin yllä, mutta käytetään komentorivin");
System.err.println(" omaa asetustiedostoa muunnoksessa");
System.err.println("");
System.err.println("käytä: dtbook2ml4 xslpath dtbookdoc ml4doc [...] [kirjoitusmerkisto=kirj.merkisto]");
System.err.println(" - muuten sama kuin yllä, mutta käytetään ml4-tiedostoa kirjoitettaessa");
System.err.println(" jotakin seur. merkistäistä: " +DecoderCharacterSet.ISO_8859_1 +" (oletus) tai "
+DecoderCharacterSet.US_ASCII +" tai " +DecoderCharacterSet.UTF_8 +"\n");
System.err.println("");
System.err.println("käytä: dtbook2ml4 xslpath dtbookdoc ml4doc [...] [lukumerkisto=luku.merkisto]");
System.err.println(" - muuten sama kuin yllä, mutta käytetään ml4-tiedostoa luettaessa syättätiedostoa");
System.err.println(" jotakin seur. merkistäistä: " +DecoderCharacterSet.ISO_8859_1 +" tai "
+DecoderCharacterSet.US_ASCII +" tai " +DecoderCharacterSet.UTF_8 +" (oletus)");
System.err.println("");
System.err.println("käytä: dtbook2ml4 xslpath dtbookdoc ml4doc [...] [muokkaarivejacfg=muokkaarivejacfg_tiedosto]");
System.err.println(" - muuten sama kuin yllä, mutta muokkausrivejä vaiheessa käytetään antamaasi\n" +
" merkkien ja -jonojen muunnostiedostoa niiden muuntamiseen");
System.err.println("");
System.err.println("Missä [] merkit tarkoittavat vapaaehtoista vaihtoehtoa ja [...] muita vaihtoehtoisia parametrejä");
exit(1);
}
private static void
printStackTraceIntoLogger(Logger logger,
Exception err,
boolean bSystemPrintln )
//throws UnsupportedEncodingException
{
try {
boolean autoFlush = true;
StringWriter out = new StringWriter();
PrintWriter ps = new PrintWriter(out, autoFlush);
err.printStackTrace(ps);
String value = out.toString();
if (logger != null)
logger.severe(value);
if (bSystemPrintln)
System.err.println(value);
} catch (Exception e) {
//skip
}
}
private static final String
annaMerkisto()
{
return "<MERKIT=ISOLATIN>";
} // annaMerkistos
/**
* Tämä methodi muuntaa dtbook:n utf-8 latin1:ksi
* @param dest
* @param bLisaaMerkisto
* @return
* @throws Exception
*/
private static String
muunnaDtbookTextFromUtf8ToLatin1(String dest, boolean bLisaaMerkisto,
String defLanguageRead, String defLanguageWrite)
throws Exception
{
File destFile = new File(dest);
if (!destFile.exists() )
{
String msg = "Muunnettavaa tiedostoa " + dest +"ei ole!";
logger.severe(msg);
virhe(msg);
}
String readWithCharSet = defLanguageRead;
String writeWithCharSet = defLanguageWrite;
System.out.println("luku-merkistö=" + readWithCharSet);
System.out.println("kirjoitus-merkistö=" + writeWithCharSet);
DecoderCharacterSet.CHARACTERSET writeCharacterSet =
DecoderCharacterSet.getCharacterSet(writeWithCharSet);
DecoderCharacterSet.CHARACTERSET readCharacterSet =
DecoderCharacterSet.getCharacterSet(readWithCharSet);
DecoderCharacterSet decoder = new DecoderCharacterSet(
readCharacterSet, writeCharacterSet);
String strTeos = decoder.readFromFileByUsingReadCharacterSet(dest);
if (strTeos == null)
{
String msg = "Tiedostosta " + dest +" ei saatu luettua merkkejä!";
logger.severe(msg);
virhe(msg);
}
int ind = strTeos.indexOf("S OSA");
while(ind != -1)
{
if ((ind-20) >= 0)
System.out.println(strTeos.substring((ind-20), (ind+"S OSA".length())));
else
System.out.println(strTeos.substring(ind, (ind+"S OSA".length())));
ind = strTeos.indexOf("S OSA", ind+1);
}
//String tmpFileName = dest +".tmp";
String tmpFileName = dest;
File tmpFile = new File(tmpFileName);
FileOutputStream bos = new FileOutputStream(tmpFile);
// Alkuun ensin merkistä:
String msg = "Kirjoitetaan muunnetut merkit tiedostoon: " + tmpFileName;
System.out.println(msg);
logger.info(msg);
if (bLisaaMerkisto)
bos.write(decoder.convertCharacterSetBytes(annaMerkisto(), CR));
// Sitten varsinainen julk. teostiedosto.
bos.write(decoder.convertCharacterSetBytes(strTeos, ""));
bos.close();
msg = "Kirjoitus loppu. Ok";
System.out.println(msg);
logger.info(msg);
if (!tmpFile.exists())
{
msg = "Tiedostoa " + destFile.getAbsolutePath() +" ei ole. Ongelma muunnoksen jälkeen takaisin kirjoituksessa!";
logger.severe(msg);
virhe(msg);
}
return tmpFileName;
}
public String getErrorString() { return m_strError; }
public HashMap<String, List<AsciiMathBlockValue>> getAsciiMathHashMap()
{
return m_hmAsciiMaps;
}
}