Package fi.celia.asciimath

Source Code of fi.celia.asciimath.DtBookAsciiMath

/**
*
*/
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;
  }
}
TOP

Related Classes of fi.celia.asciimath.DtBookAsciiMath

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.