From 3faea455168abd154168997d2b79fe677fb2afa0 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 10 May 2008 00:34:52 +0000 Subject: missed new executables git-svn-id: svn://tug.org/texlive/trunk@8001 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/tex4htk/java/GroupMn.java | 77 + Build/source/texk/tex4htk/java/HtJsml.java | 351 +++++ Build/source/texk/tex4htk/java/HtSpk.java | 211 +++ Build/source/texk/tex4htk/java/JsmlFilter.java | 49 + Build/source/texk/tex4htk/java/JsmlMathBreak.java | 51 + Build/source/texk/tex4htk/java/OoFilter.java | 60 + Build/source/texk/tex4htk/java/OoUtilities.java | 243 ++++ Build/source/texk/tex4htk/java/OomFilter.java | 62 + Build/source/texk/tex4htk/java/README | 1 + Build/source/texk/tex4htk/java/xtpipes.java | 7 + .../source/texk/tex4htk/java/xtpipes/FileInfo.java | 170 +++ .../texk/tex4htk/java/xtpipes/InputObject.java | 323 +++++ .../source/texk/tex4htk/java/xtpipes/Xtpipes.java | 1472 ++++++++++++++++++++ .../texk/tex4htk/java/xtpipes/XtpipesUni.java | 41 + .../tex4htk/java/xtpipes/util/ScriptsManager.java | 196 +++ .../java/xtpipes/util/ScriptsManagerLH.java | 26 + 16 files changed, 3340 insertions(+) create mode 100755 Build/source/texk/tex4htk/java/GroupMn.java create mode 100755 Build/source/texk/tex4htk/java/HtJsml.java create mode 100755 Build/source/texk/tex4htk/java/HtSpk.java create mode 100755 Build/source/texk/tex4htk/java/JsmlFilter.java create mode 100755 Build/source/texk/tex4htk/java/JsmlMathBreak.java create mode 100755 Build/source/texk/tex4htk/java/OoFilter.java create mode 100755 Build/source/texk/tex4htk/java/OoUtilities.java create mode 100755 Build/source/texk/tex4htk/java/OomFilter.java create mode 100755 Build/source/texk/tex4htk/java/README create mode 100755 Build/source/texk/tex4htk/java/xtpipes.java create mode 100755 Build/source/texk/tex4htk/java/xtpipes/FileInfo.java create mode 100755 Build/source/texk/tex4htk/java/xtpipes/InputObject.java create mode 100755 Build/source/texk/tex4htk/java/xtpipes/Xtpipes.java create mode 100755 Build/source/texk/tex4htk/java/xtpipes/XtpipesUni.java create mode 100755 Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManager.java create mode 100755 Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManagerLH.java (limited to 'Build/source/texk/tex4htk/java') diff --git a/Build/source/texk/tex4htk/java/GroupMn.java b/Build/source/texk/tex4htk/java/GroupMn.java new file mode 100755 index 00000000000..c54d051c0eb --- /dev/null +++ b/Build/source/texk/tex4htk/java/GroupMn.java @@ -0,0 +1,77 @@ +package tex4ht; +import org.xml.sax.helpers.*; +import org.xml.sax.*; +import java.io.PrintWriter; + +public class GroupMn extends XMLFilterImpl { + PrintWriter out = null; + boolean inMn = false; + String ns; + int level = -1; + public GroupMn( PrintWriter out, PrintWriter log, boolean trace){ + this.out = out; + } + public void startElement(String ns, String sName, + String qName, Attributes attr) { + level++; + try{ + if( inMn ){ + if( level == 0 ){ if( !qName.equals( "mn" ) ){ + if( qName.equals( "mo" ) ){ + String cls = attr.getValue( "class" ); + if( (cls == null) || !cls.equals("MathClass-punc") ){ + inMn = false; + super.endElement(ns, "mn-group", "mn-group"); + } + } else { + inMn = false; + super.endElement(ns, "mn-group", "mn-group"); +} } + } + } else { if( qName.equals( "mn" ) ){ + inMn = true; level = 0; + Attributes att = new AttributesImpl(); + super.startElement(ns, "mn-group", "mn-group", att); + this.ns = ns; +} else if( qName.equals( "mo" ) ){ + String cls = attr.getValue( "class" ); + if( (cls != null) && cls.equals("MathClass-punc") ){ + inMn = true; level = 0; + Attributes att = new AttributesImpl(); + super.startElement(ns, "mn-group", "mn-group", att); + this.ns = ns; +} } + } + super.startElement(ns, sName, qName, attr); + } catch( Exception e ){ + System.out.println( "--- GroupMn Error 1 --- " + e); + } + } + public void endElement(String ns, String sName, String qName){ + try{ + if( level < 0) { + if( inMn ){ + inMn = false; + super.endElement(ns, "mn-group", "mn-group"); +} + + } + super.endElement(ns, sName, qName); + } catch( Exception e ){ + System.out.println( "--- GroupMn Error 2 --- " + e); + } + level--; + } + public void characters(char[] ch, int start, int length){ + try{ + if ( inMn && (level < 0) ) { + String s = new String(ch, start, length); + if (!s.trim().equals("")) { + inMn = false; + super.endElement(ns, "mn-group", "mn-group"); + } } + super.characters(ch, start, length); + } catch( Exception e ){ + System.out.println( "--- GroupMn Error 3 --- " + e); +} } } + diff --git a/Build/source/texk/tex4htk/java/HtJsml.java b/Build/source/texk/tex4htk/java/HtJsml.java new file mode 100755 index 00000000000..188cdee85f5 --- /dev/null +++ b/Build/source/texk/tex4htk/java/HtJsml.java @@ -0,0 +1,351 @@ +package tex4ht; +import org.w3c.dom.*; +public class HtJsml { + private static void insertLevelPrefix(Node node, int level){ + if( level == 0 ){ return; } + if (node.getNodeType() == Node.ELEMENT_NODE) { + if( node.getNodeName().equals( "level" ) ){ + Node attr = node.getAttributes().getNamedItem("prefix"); +if( attr != null ){ + String prefix = attr.getNodeValue(); + String s = ""; + for(int j=0; j= '0') && (ch <= '9') ){ + digit[i] = '0'; bool = true; + } else if( (ch == '.') || (ch == ',') ){ digit[i] = ch; } + else { digit[i] = 'x';} +} } } + + if( bool ){ + bool = false; +for (int i = 0; i < n; i++) { + if( digit[i] == '.' ){ + for (; i < n; i++) { + if( digit[i] == ',' ){ + bool = true; break; + } } + break; +} } + + if( !bool ){ + for (int i = 0; i < n; i++) { + if( digit[i] == ',' ){ + if( ( ((i+3) >= n) + || (digit[i+1] != '0') + || (digit[i+2] != '0') + || (digit[i+3] != '0') + ) + || + ( + ((i+4) < n) && (digit[i+4] == '0') + ) + || + ( + (i>3) && (digit[i-4] == '0') + ) + ){ bool = true; break; + } else { i += 3; } +} } } + + if( bool ){ + for (int i = 0; i < n; i++) { + if( digit[i] == ',' ){ digit[i] = 'x'; } +} } + + bool = false; +for (int i = 0; i < n; i++) { + if( (digit[i] == 'x') + || (digit[i] == ',') ){ bool = false; } + else if( digit[i] == '.' ){ + if( bool ){ + for (int j = 0; j < n; j++) { + if( (digit[j] == '.') || (digit[j] == ',') ){ + digit[j] = 'x'; + } } + break; + } + bool = true; +} } + + if( digit[n-1] == '.' ){ digit[n-1] = 'x'; } + + } + Node parent = node.getParentNode(); +Element g = dom.createElement( "mn-group-s" ); +Element cur = dom.createElement( "mn-group" ); +for(int i=0; i max) { max = d; } +} } +level += max; + + if( ndName.equals("msub") + || ndName.equals("msup") + || ndName.equals("msubsup") +) { + return 0; +} + + if (ndName.equals("mfrac")) { + if( (clValue != null) && clValue.equals("word-frac") +) { + return 0; +} + + if( cont > 0 ){ + if ( prevCont == 0 ){ + Node child = node.getFirstChild(); +if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-end")) { + setContinuedNote(child); +} } } + + } + Node child = node.getLastChild(); +if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-end")) { + node.removeChild( child ); +} } } + + level = 0; + } else if ( prevCont > 0 ){ + Node child = node.getLastChild(); +if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-end")) { + setContinuedNote(child); +} } } + + level = 0; + } else + if( level > 0 ){ + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() + .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if (clsName.equals("begin-end")) { + insertLevelPrefix(child, level); +} } } } + + } + level++; + } } + return level; +} + + public static void scriptLevel(Node dom) { + setScriptLevel(dom.getFirstChild(), ""); +} +private static void setScriptLevel(Node node, String prefix) { + String clName = null; + if (node.hasChildNodes()) { + if (node.hasAttributes()) { + Node cl = node.getAttributes().getNamedItem("class"); + if (cl != null) { + clName = cl.getNodeValue(); + if( clName.equals("mrow-sub") + || + clName.equals("mrow-super") + ){ + if( !prefix.equals("") ){ + Node child = node.getFirstChild(); +if( (child.getNodeType() == Node.ELEMENT_NODE) + && + child.hasAttributes() +){ + Node cls = child.getAttributes().getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-script") + || + clsName.equals("mid-script") + ) { + child = child.getFirstChild(); + String s = child.getNodeValue(); + ((org.w3c.dom.Text) child).setData( prefix + s ); +} } } + +} +if( clName.equals( "mrow-sub" ) ){ + prefix += " sub "; +} else if( clName.equals( "mrow-super" ) ){ + prefix += " super "; +} + + } } } + String ndName = node.getNodeName(); + if( + ndName.equals("msqrt") + || + ndName.equals("mroot") + ){ prefix = ""; } + NodeList children = node.getChildNodes(); +for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + setScriptLevel(child, prefix); +} } + +} } + + public static void rootLevel(Node d) { + dom = (Document) d; + setRootLevel(d.getFirstChild()); +} +private static int setRootLevel( Node node ){ + int level = 0; +// String clName = null; + if (node.hasChildNodes()) { + NodeList children = node.getChildNodes(); +int max = 0; +for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + int d = setRootLevel(child); + if( d > max ){ max = d; } +} } +level += max; + + String ndName = node.getNodeName(); + if( ndName.equals("msub") || ndName.equals("msup") || + ndName.equals("msubsup") +) { + return 0; +} + + if( ndName.equals("msqrt") || ndName.equals("mroot") ){ + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() + .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if( clsName.equals("begin-root") + || clsName.equals("mid-root") + || clsName.equals("end-root") + ){ + insertLevelPrefix(child, level); +} } } } + + level++; + } } + return level; +} + +} + diff --git a/Build/source/texk/tex4htk/java/HtSpk.java b/Build/source/texk/tex4htk/java/HtSpk.java new file mode 100755 index 00000000000..1f0e9c0a0bd --- /dev/null +++ b/Build/source/texk/tex4htk/java/HtSpk.java @@ -0,0 +1,211 @@ +package tex4ht; +import org.w3c.dom.*; +public class HtSpk { + public static void fracLevel(Node dom) { + setFracLevel(dom.getFirstChild(), 0); +} +private static int setFracLevel(Node node, int cont) { + int level = 0; + String clName = null; + if (node.hasChildNodes()) { + if (node.hasAttributes()) { + Node cl = node.getAttributes().getNamedItem("class"); + if (cl != null) { clName = cl.getNodeValue(); } + } + NodeList children = node.getChildNodes(); +int max = 0; +for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + int d = setFracLevel(child, + (clName != null) && + clName.equals("continuous-mfrac")? + 2 : + ((clName != null) && + clName.equals("continuous-mfrac")? + (cont-1) : cont) + ); + if (d > max) { max = d; } +} } +level += max; + + if( clName != null ){ + if( clName.equals("msub") || clName.equals("msup") || + clName.equals("msubsup") +) { + return 0; +} + + if( clName.equals("continuous-mfrac") ) { + if( cont > 0 ){ + Node child = node.getLastChild(); +if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-end")) { + node.removeChild( child ); +} } } + + } else { for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() + .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-end")) { + child = child.getFirstChild(); + String s = child.getNodeValue(); + s = s.replaceFirst("begin", "begin continued"); + s = s.replaceFirst("end", "end continued"); + ((org.w3c.dom.Text) child).setData(s); +} } } } + } + return 0; +} + + if (clName.equals("mfrac")) { + if( cont > 0 ){ + Node child = node.getLastChild(); +if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if ( clsName.equals("begin-end")) { + node.removeChild( child ); +} } } + + } else if( level > 0 ){ + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() + .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if (clsName.equals("begin-end")) { + child = child.getFirstChild(); + String s = child.getNodeValue(); + String bg = "", ov = "", en = ""; + for(int j=0; j max ){ max = d; } +} } +level += max; + + if( clName != null ){ + if( clName.equals("msub") || clName.equals("msup") || + clName.equals("msubsup") +) { + return 0; +} + + if( clName.equals("msqrt") || clName.equals("root") ){ + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + Node cls = child.getAttributes() + .getNamedItem("class"); + if (cls != null) { + String clsName = cls.getNodeValue(); + if( clsName.equals("begin-root") + || clsName.equals("mid-root") + || clsName.equals("end-root") + ){ + child = child.getFirstChild(); + String s = child.getNodeValue(); + String nested = ""; + for(int j=0; j scripts, + Method method, PrintWriter log, boolean trace) { + this.out = out; + } + public void characters(char[] ch, int start, int length) { + String s = XtpipesUni.toUni(ch, start, length, "<>&"); + out.print( s ); + if( !s.trim().equals("") ){ + delete = false; + } } + public void startElement(String ns, String sName, + String qName, + Attributes atts) { + if( !( delete && qName.equals("BREAK") ) ){ + String s = "<" + qName + "\n"; + for (int i = 0; i < atts.getLength(); i++) { + String name = atts.getQName(i); + if (name != "xmlns") { + s += (" " + name + "=\"" + + XtpipesUni.toUni(atts.getValue(i), "<>&\"") + + "\""); + } } + if( qName.equals( "BREAK" ) ){ + s += "/"; + delete = true; + } + s += ">"; + out.print(s); + } } + public void endElement(String ns, String sName, String qName) { + if( !qName.equals( "BREAK" ) ){ + String s = ""; + out.print(s); +} } } + diff --git a/Build/source/texk/tex4htk/java/OoFilter.java b/Build/source/texk/tex4htk/java/OoFilter.java new file mode 100755 index 00000000000..976518eaff4 --- /dev/null +++ b/Build/source/texk/tex4htk/java/OoFilter.java @@ -0,0 +1,60 @@ +package tex4ht; +/**********************************************************/ +/* OoFilterImpl.java 2008-02-20-10:22 */ +/* Copyright (C) 2006--2008 Eitan M. Gurari */ +/* */ +/* This work may be distributed and/or modified under the */ +/* conditions of the LaTeX Project Public License, either */ +/* version 1.3 of this license or (at your option) any */ +/* later version. The latest version of this license is */ +/* in */ +/* http://www.latex-project.org/lppl.txt */ +/* and version 1.3 or later is part of all distributions */ +/* of LaTeX version 2003/12/01 or later. */ +/* */ +/* This work has the LPPL maintenance status "maintained".*/ +/* */ +/* This Current Maintainer of this work */ +/* is Eitan M. Gurari. */ +/* */ +/* gurari@cse.ohio-state.edu */ +/* http://www.cse.ohio-state.edu/~gurari */ +/**********************************************************/ + + +import org.xml.sax.helpers.*; +import org.xml.sax.*; +import java.io.PrintWriter; + +public class OoFilter extends XMLFilterImpl { + PrintWriter out = null; + public OoFilter( PrintWriter out, + PrintWriter log, boolean trace ){ + this.out = out; + } + public void startElement(String ns, String sName, + String qName, Attributes attr) { + if( qName.equals( "draw:frame" ) ){ + String name = attr.getValue("draw:name"); + if( (name != null) + && (attr.getValue("svg:width") == null) + && (attr.getValue("svg:hieght") == null) + ){ + java.awt.Image image = new javax.swing.ImageIcon(name).getImage(); + int width = image.getWidth(null); + int height = image.getHeight(null); + if( (width>0) && (height>0) ){ + org.xml.sax.helpers.AttributesImpl attrs = + new org.xml.sax.helpers.AttributesImpl( attr ); + attrs.addAttribute(null, "svg:width", "svg:width", + "String", (width * 72 / 110) + "pt"); + attrs.addAttribute(null, "svg:width", "svg:height", + "String", (height * 72 / 110) + "pt"); + attr = attrs; + } } } + try{ + super.startElement(ns, sName, qName, attr); + } catch( Exception e ){ + System.err.println( "--- OoFilter Error 1 --- " + e); +} } } + diff --git a/Build/source/texk/tex4htk/java/OoUtilities.java b/Build/source/texk/tex4htk/java/OoUtilities.java new file mode 100755 index 00000000000..63fa8195ccb --- /dev/null +++ b/Build/source/texk/tex4htk/java/OoUtilities.java @@ -0,0 +1,243 @@ +package tex4ht; +/**********************************************************/ +/* OoUtilities.java 2008-02-20-10:22 */ +/* Copyright (C) 2006--2008 Eitan M. Gurari */ +/* */ +/* This work may be distributed and/or modified under the */ +/* conditions of the LaTeX Project Public License, either */ +/* version 1.3 of this license or (at your option) any */ +/* later version. The latest version of this license is */ +/* in */ +/* http://www.latex-project.org/lppl.txt */ +/* and version 1.3 or later is part of all distributions */ +/* of LaTeX version 2003/12/01 or later. */ +/* */ +/* This work has the LPPL maintenance status "maintained".*/ +/* */ +/* This Current Maintainer of this work */ +/* is Eitan M. Gurari. */ +/* */ +/* gurari@cse.ohio-state.edu */ +/* http://www.cse.ohio-state.edu/~gurari */ +/**********************************************************/ + + +import org.w3c.dom.*; +public class OoUtilities { + public static void mtable(Node dom) { + Node mtr, mtd, d; + int cols = 0; + Node node = dom.getFirstChild(); + if (node.hasChildNodes()) { + mtr = node.getLastChild(); + while( mtr != null){ + if( mtr.getNodeType() == Node.ELEMENT_NODE ){ + if (mtr.hasChildNodes()) { + mtd = mtr.getLastChild(); + int count = 0; + while( mtd != null){ + if( mtd.getNodeType() == Node.ELEMENT_NODE ){ + count++; + d = mtd.getFirstChild(); + if( d != null ){ + boolean remove = true; +for(Node i=d; i!=null; i=i.getNextSibling() ){ + if( (i.getNodeType() == Node.ELEMENT_NODE) + && !i.getNodeName().equals("math:mspace") ) { + remove = false; break; +} } +if( remove ){ + while( d != null ){ + mtd.removeChild(d); + d = mtd.getFirstChild(); +} } + + } + if( d != null ){ + if( + (d.getNodeType() == Node.TEXT_NODE) + && d.getNodeValue().trim().equals("") +){ + d.getParentNode().removeChild(d); + d = null; +} + + } } + d = mtd; + mtd = mtd.getPreviousSibling(); + if( + (d.getNodeType() == Node.TEXT_NODE) + && d.getNodeValue().trim().equals("") +){ + d.getParentNode().removeChild(d); + d = null; +} + + if( (d != null) + && (d.getNodeType() == Node.ELEMENT_NODE) ){ + if( (d.getNextSibling()==null) + && (d.getFirstChild()==null) ){ + d.getParentNode().removeChild(d); + d = null; +} + + if( d == null ){ count--; } + } } + if( count > cols ){ cols = count; } + } } + d = mtr; + mtr = mtr.getPreviousSibling(); + if( + (d.getNodeType() == Node.TEXT_NODE) + && d.getNodeValue().trim().equals("") +){ + d.getParentNode().removeChild(d); + d = null; +} + + if( d != null ){ + if( (d.getNextSibling()==null) + && (d.getFirstChild()==null) ){ + d.getParentNode().removeChild(d); + d = null; +} + +} } } + + if (node.hasChildNodes()) { + mtr = node.getFirstChild(); + while( mtr != null){ + if( mtr.getNodeType() == Node.ELEMENT_NODE ){ + int count = 0; + if (mtr.hasChildNodes()) { + mtd = mtr.getFirstChild(); + while( mtd != null){ + if( mtd.getNodeType() == Node.ELEMENT_NODE ){ + mtr.insertBefore( ((Document) dom).createTextNode("\n"), mtd ); + + count++; + } + mtd = mtd.getNextSibling(); + } + } + if( count < cols ){ + for(int i = count; i < cols; i++){ + mtr.appendChild( ((Document) dom).createElement("math:mtd") ); +} + + } } + mtr = mtr.getNextSibling(); +} } + +} + + public static void table(Node dom) { + Node mtr, mtd, d; +// int cols = 0; + Node node = dom.getFirstChild(); + + mtr = node.getLastChild(); +while( (mtr != null) + && (mtr.getNodeType() == Node.TEXT_NODE) + && mtr.getNodeValue().trim().equals("") ){ + node.removeChild(mtr); + mtr = node.getLastChild(); +} + + if( (mtr != null) && (mtr.getPreviousSibling() != null) ){ + boolean bool = false; +if( mtr.getNodeName().equals("table:table-row") + && mtr.hasAttributes() +){ + NamedNodeMap attributes = mtr.getAttributes(); + Node styleAttr = attributes.getNamedItem( "table:style-name" ); + String style = (styleAttr==null)? null + : styleAttr.getNodeValue(); + if( (style != null) + && ( style.equals("hline-row") + || style.equals("cline-row") + ) + ){ + bool = true; +} } + + if( !bool ){ + mtd = mtr.getFirstChild(); +while( mtd != null){ + d = mtd.getNextSibling(); + if( justSpace(mtd) ){ mtr.removeChild(mtd); } + mtd = d; +} + + + mtd = mtr.getFirstChild(); + if( (mtd != null) + && (mtd.getNextSibling() == null) + && justSpace(mtd) + ){ + node.removeChild(mtr); + } } } + int n = 0; +mtr = node.getFirstChild(); +while( mtr != null ){ + if( + (mtr.getNodeType() == Node.ELEMENT_NODE) + && + mtr.getNodeName().equals("table:table-row") + ){ + int m = 0; +mtd = mtr.getFirstChild(); +while( mtd != null ){ + if( + (mtd.getNodeType() == Node.ELEMENT_NODE) + && + mtd.getNodeName().equals("table:table-cell") + ){ + m++; + } + mtd = mtd.getNextSibling(); +} + + if( m > n ){ n = m; } + } + mtr = mtr.getNextSibling(); +} + + mtr = node.getFirstChild(); +while( mtr != null ){ + d = mtr.getNextSibling(); + if( + (mtr.getNodeType() == Node.ELEMENT_NODE) + && + mtr.getNodeName().equals("table:table-column") + ){ + n--; + if( n < 0 ){ + mtr.getParentNode().removeChild(mtr); + } } + mtr = d; +} + +} + + static boolean justSpace(Node node){ + if( node == null ){ return true; } + if( node.getNodeType() == Node.TEXT_NODE ){ + if( !node.getNodeValue().trim().equals("") ){ return false; } + } else { + if( node.getNodeType() == Node.ELEMENT_NODE ){ + String nm = node.getNodeName(); + if( + !nm.equals("table:table-cell") + && !nm.equals("text:p") + ){ + return false; + } } + } + if(!justSpace( node.getNextSibling() )){ return false; } + if(!justSpace( node.getFirstChild() )){ return false; } + return true; +} + +} + diff --git a/Build/source/texk/tex4htk/java/OomFilter.java b/Build/source/texk/tex4htk/java/OomFilter.java new file mode 100755 index 00000000000..4af1c72e61e --- /dev/null +++ b/Build/source/texk/tex4htk/java/OomFilter.java @@ -0,0 +1,62 @@ +package tex4ht; +/**********************************************************/ +/* OomFilterImpl.java 2008-02-20-10:22 */ +/* Copyright (C) 2006--2008 Eitan M. Gurari */ +/* */ +/* This work may be distributed and/or modified under the */ +/* conditions of the LaTeX Project Public License, either */ +/* version 1.3 of this license or (at your option) any */ +/* later version. The latest version of this license is */ +/* in */ +/* http://www.latex-project.org/lppl.txt */ +/* and version 1.3 or later is part of all distributions */ +/* of LaTeX version 2003/12/01 or later. */ +/* */ +/* This work has the LPPL maintenance status "maintained".*/ +/* */ +/* This Current Maintainer of this work */ +/* is Eitan M. Gurari. */ +/* */ +/* gurari@cse.ohio-state.edu */ +/* http://www.cse.ohio-state.edu/~gurari */ +/**********************************************************/ + + +import org.xml.sax.helpers.*; +import org.xml.sax.*; +import java.io.PrintWriter; + +public class OomFilter extends XMLFilterImpl { + PrintWriter out = null; + boolean mtext = false; + public OomFilter( PrintWriter out, + PrintWriter log, boolean trace ){ + this.out = out; + } + public void startElement(String ns, String sName, + String qName, Attributes attr) { + if( qName.equals( "math:mtext" ) ){ mtext = true; } + try{ + super.startElement(ns, sName, qName, attr); + } catch( Exception e ){ + System.err.println( "--- OomFilter Error 1 --- " + e); + } + } + public void endElement(String ns, String sName, String qName){ + if( qName.equals( "math:mtext" ) ){ mtext = false; } + try{ + super.endElement(ns, sName, qName); + } catch( Exception e ){ + System.err.println( "--- OomFilter Error 2 --- " + e); + } } + public void characters(char[] ch, int start, int length){ + try{ + if ( mtext ) { + for(int i = start; i registry = + new java.util.HashMap (); +static String slash = System.getProperty("file.separator"); +static String ii_scriptDir; +static PrintWriter log; +static boolean trace; + + public FileInfo(PrintWriter log, String iii_scriptDir, boolean trace){ + FileInfo.log = log; + FileInfo.ii_scriptDir = iii_scriptDir; + FileInfo.trace = trace; + classPaths = FileInfo.getPaths( System.getProperty("java.class.path") ); +if( iii_scriptDir != null ){ + scriptPaths = FileInfo.getPaths( iii_scriptDir ); +} + + + } + public static String searchFile( String file ){ + String key = ((ii_scriptDir == null)? "" : ii_scriptDir ) + + "!" + file; + String result = (String) registry.get( key ); + if( result == null ){ + for(int i=0; i<2; i++){ + if( trace ){ + log.println( "Searching: " + file ); + } + if( (new File(file)).exists() ){ + result = ( file.indexOf(slash) == -1 )? + (System.getProperty("user.dir") + slash + file) + : + file; + } + else { + if( ii_scriptDir != null ){ + int k = scriptPaths.length; +while( k>0 ){ + k--; + if( trace ){ + log.println( "Searching: " + file + + ", recursively in directory: " + scriptPaths[k] ); + } + result = searchDirectory( new File(scriptPaths[k]), file); + if( result != null ){ break; } +} +String s = ii_scriptDir + file; +if( (new File( s )).exists() ){ result = s; } + + } + if( result == null ){ + int k = classPaths.length; +String toFile = "xtpipes" + slash + "lib" + slash + file; +while( k>0 ){ + k--; + String s = classPaths[k] + toFile; + if( trace ){ log.println( "Searching: " + s ); } + if( new File(s).exists() ){ result = s; break; } +} + + } } + if( result != null ){ break; } + file = new File(file).getName(); + } + if( result != null ){ + result = FileInfo.cleanPath(result); + registry.put(key, result); + } + } + if( trace ){ + if( result == null ){ + log.println( + "Directory paths from xtpipes command line option -i: " + + ii_scriptDir ); + } else { log.println( "Found: " + result + "\n" ); } + log.flush(); + } + return result; +} + + static String [] getPaths( String dirs ){ + String [] paths = null; + paths = dirs.split( System.getProperty("path.separator") ); + int k = paths.length; + while( k>0 ){ + k--; + paths[k] = cleanPath( paths[k] ); + + int len = paths[k].length(); + if( (len>1) && (paths[k].lastIndexOf(slash + ".") == (len-1)) ){ + paths[k] = paths[k].substring(0,len-1); + } else if( (len>0) && ((len-1) != paths[k].lastIndexOf( slash )) ){ + paths[k] += slash; + } } + return paths; +} + + public static String cleanPath( String path ){ + String slash = System.getProperty("file.separator"); + String userDir = System.getProperty( "user.dir" ); + if( (path.length() > 0) && (path.charAt(0) == '~') ){ + if( (path.length() == 1) || (path.charAt(1) != '~') ){ + path = System.getProperty( "user.home" ) + + path.substring(1); + } } + + if( path.startsWith("..") ){ + path = userDir.substring(0, + Math.max(0,Math.max( + userDir.lastIndexOf("/") + , + userDir.lastIndexOf("\\") + ))) + + path.substring(2); + } + if( path.startsWith(".") ){ + path = userDir + slash + path.substring(1); + } + + int i; + while( + ((i=path.indexOf("/..")) != -1) + || + ((i=path.indexOf("\\..")) != -1) + ){ + String s = path.substring(0,i); + int j = Math.max(s.lastIndexOf("/"), s.lastIndexOf("\\")); + path = path.substring(0,j) + path.substring(i+3); + } + while( + ((i=path.indexOf("/.")) != -1) + || + ((i=path.indexOf("\\.")) != -1) + ){ + String s = path.substring(0,i); + int j = Math.max(s.indexOf("/"), s.indexOf("\\")); + path = path.substring(0,j) + path.substring(i+2); + } + + return path; +} + + static String searchDirectory(File dir, String file) { + String result = null; + if( dir.isDirectory() ){ + String [] children = dir.list(); + for (int i=0; i': if( token != null ){ + token = token . replaceAll( "\\s+", " "); + if( type == 9 + ){ + if( xtpipes == null ){ + int n = token.length(); + if( (n > 1) && (token.charAt( n - 1 ) == '?') + && (token.startsWith("xtpipes") ) ){ + String s = token . substring(7,n-1) . replaceAll( "\\s+", ""); + n = s.length(); + if( (n>6) && (s.startsWith("file=")) + && (s.charAt(5) == s.charAt(n-1)) ){ + xtpipes = s.substring(6,n-1); + } } } +} else if( type == 11 + ){ + if( metaType == null ){ + token = token . replaceAll( "\\s+", ""); + int k = token.indexOf("http-equiv"); + int n = token.indexOf("content"); + if( (k != -1) && (n != -1) ){ + if( token.length() > (Math.max(k,n)+3) ){ + if( token.substring(k+12).startsWith("Content-Type") ){ + token = token.substring(n+9); + n = token.indexOf(";"); + if( n !=-1 ){ metaType = token.substring(0,n); } + } } } } +} else if( (type == 2 +) && (root == null) ){ + root = token; +} + + token = null; + } + break; + case '\n': + case ' ': if( token != null ){ + if( type == 2 + ){ + if( token.equals("meta") ){ + if( metaType == null ){ + type = 11 +; + token = " "; + } else { + token = null; + } + } else { + if( root == null ){ + root = token; + } + token = null; + } +} else if( type == 4 + ){ + if( token.equals("DOCTYPE") ){ + type = 5 +; + token = " "; + } else { token = null; } +} else if( type == 5 + ){ + if( !token.trim().equals("") ){ + dtdRoot = token.trim(); + token = " "; + type = 6 +; + } else { token = null; } +} else if( type == 6 + ){ + if( !token.trim().equals("") ){ + token = token.trim(); + if( token.equals("PUBLIC") ){ + type = 7 +; + token = ""; + } else if( token.equals("SYSTEM") ){ + type = 8 +; + token = ""; + } else { token = null; } + } +} else { token += ' '; } + + } + break; + case '"': + case '\'': if( token == null ){ break; } + if( !token.trim().equals("") ){ + if( token.trim().charAt(0) == ch ){ + if( type == 7 + ){ + publicId = token.trim().substring(1); + type = 8 +; + token = ""; + break; + } + else if( type == 8 + ){ + systemId = token.trim().substring(1); + token = null; + break; + } +} } + + default: if( token != null ){ + if( type == 3 + ){ + if( ch == 'D' ){ + type = 4 +; + token += (char) ch; + } else { token = null; type = 0 +; } + } + else + if( token.equals("") && (type == 1 +) ){ + switch( ch ){ + case '!': type = 3 +; + break; + case '?': type = 9 + ; + break; + default: if( Character.isLetter(ch) + && ((root == null) || (metaType == null)) ){ + type = 2 +; + token += (char) ch; + } else { token = null; } +} + + } else { token += (char) ch; } +} } + + m++; +} } + + if( trace ){ + log.println( + " url = " + url + + "\n contentType = " + contentType + + "\n publicId = " + publicId + + "\n systemId = " + systemId + + "\n xtpipes = " + xtpipes + + "\n root = " + root + + "\n dtdRoot = " + dtdRoot + ); +} } + + public InputStream getInputStream(){ return inputStream; } + public String getFilename(){ + return (url == null)? + ( (connection == null)? filename + : + connection . getURL() . toString() + ) + : url; + } + public String getContentType(){ return contentType; } + public String getMetaType(){ return metaType; } + public String getPublicId(){ return publicId; } + public String getSystemId(){ return systemId; } + public String getXtpipes(){ return xtpipes; } + public String getRoot(){ return root; } + public String getDtdRoot(){ return dtdRoot; } +} + diff --git a/Build/source/texk/tex4htk/java/xtpipes/Xtpipes.java b/Build/source/texk/tex4htk/java/xtpipes/Xtpipes.java new file mode 100755 index 00000000000..3efc2344c34 --- /dev/null +++ b/Build/source/texk/tex4htk/java/xtpipes/Xtpipes.java @@ -0,0 +1,1472 @@ +package xtpipes; +/* +Xtpipes.java (2008-01-26-00:38) +*/ +// import xtpipes.util.InputObject; +// import xtpipes.util.FileInfo; +import java.net.URLConnection; +import java.io.*; +import java.lang.reflect.*; +import java.util.HashMap; +import java.util.Stack; +import javax.xml.parsers.*; +import javax.xml.transform.*; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.*; +import org.w3c.dom.*; +import org.xml.sax.*; +import org.xml.sax.helpers.*; +import java.net.URL; +import java.lang.reflect.Constructor; +import java.util.ArrayList; + +class XtpipesPrintWriter extends PrintWriter { + public XtpipesPrintWriter() { + super(System.out, true); + } + public XtpipesPrintWriter (PrintStream ps, boolean b){ + super(ps, b); + } + public XtpipesPrintWriter (OutputStream ps, boolean b){ + super(ps, b); + } + public XtpipesPrintWriter (FileWriter fw){ + super(fw); + } + public void print(String str) { + super.print( XtpipesUni.toUni(str, "") ); + } + public void println(String str) { + super.println( XtpipesUni.toUni(str, "") ); +} } + +public class Xtpipes { + private static HashMap map; +private static boolean needScript; +private static boolean returnDom; +private static String result; +static PrintWriter logWriter = new PrintWriter( System.err ); +private static String inFile, + inData; +private static boolean exceptionErrs, messages; +public static InputObject inputObject; +private static String outFileName; +private static PrintWriter outPrintWriter; +private static boolean returnToFile = false; +public static String scriptFile; +private static String scriptMap; +static String i_scriptDir; +private static TransformerFactory fc; +private static Transformer identityTransformer; +private static SAXParserFactory saxFactory; +private static DocumentBuilder domBuilder; +private static Stack saxReaderStack; +private static Method method; +private static String rootName; +static boolean trace; +private static String [] ml2xml = null; +static Class ml2xmlClassObj = null; +public static String errMssg; + + public static void main(String args[]) throws Exception { + map = new HashMap (); +needScript = true; +returnDom = false; +result = null; +inFile = null; +inData = null; +exceptionErrs = false; +messages = false; +outFileName = null; +outPrintWriter = null; +scriptFile = null; +i_scriptDir = null; +scriptMap = null; +saxReaderStack = new Stack (); +rootName = null; +trace = false; + + mainMethod(args); +} + + public static void xtpipes(String [] args, + OutputStream out, + PrintWriter log) + throws Exception { + map = new HashMap (); +needScript = true; +returnDom = false; +result = null; +inFile = null; +inData = null; +exceptionErrs = false; +messages = false; +outFileName = null; +outPrintWriter = null; +scriptFile = null; +i_scriptDir = null; +scriptMap = null; +saxReaderStack = new Stack (); +rootName = null; +trace = false; + + outPrintWriter = new XtpipesPrintWriter( out, true ); + logWriter = (log==null)? (new PrintWriter( System.err )) : log; + mainMethod(args); + outPrintWriter.flush(); +} + + public static Document getDOM(String args[]) + throws Exception { + map = new HashMap (); +needScript = true; +returnDom = false; +result = null; +inFile = null; +inData = null; +exceptionErrs = false; +messages = false; +outFileName = null; +outPrintWriter = null; +scriptFile = null; +i_scriptDir = null; +scriptMap = null; +saxReaderStack = new Stack (); +rootName = null; +trace = false; + + returnDom = true; + mainMethod(args); + Document dom = null; + if( result == null ){ + System.err.println( + "--- xtpipes warning --- getDOM without from 4xt file: " + + scriptFile ); + } else { + try{ + byte [] bytes = result.getBytes("UTF-8"); + InputStream is = new ByteArrayInputStream( bytes ); + dom = domBuilder.parse (is); + } catch ( org.xml.sax.SAXParseException e ){ + if( Xtpipes.trace ){ + Xtpipes.logWriter.println( + "\n---------------------------------------------------\n" + + result + + "\n---------------------------------------------------\n" ); + } + String s = ""; + for( int n=0; n [] argTypes = { }; + Method m = ml2xmlClassObj.getMethod( "closeFiles", argTypes ); + Object parmValues[] = new Object[0]; + m.invoke( null, parmValues ); +} + + } + return dom; +} +public static Document getDOM(String s, String args[]) + throws Exception { + map = new HashMap (); +needScript = true; +returnDom = false; +result = null; +inFile = null; +inData = null; +exceptionErrs = false; +messages = false; +outFileName = null; +outPrintWriter = null; +scriptFile = null; +i_scriptDir = null; +scriptMap = null; +saxReaderStack = new Stack (); +rootName = null; +trace = false; + + returnDom = true; + inData = s; + mainMethod(args); + Document dom = null; + if( result == null ){ + System.err.println( + "--- xtpipes warning --- getDOM without" + + " from 4xt file: " + + scriptFile ); + } else { + try{ + byte [] bytes = result.getBytes("UTF-8"); + InputStream is = new ByteArrayInputStream( bytes ); + dom = domBuilder.parse (is); + } catch ( org.xml.sax.SAXParseException e ){ + instructionErr( null, "improper xml: " + e.getMessage() + + "\n code starts with: " + + result.substring(0, Math.min(100,result.length())) + , 17 ); + } catch ( Exception e ){ + instructionErr( null, e.toString(), 6 ); + } + if( ml2xmlClassObj != null ){ + Class [] argTypes = { }; + Method m = ml2xmlClassObj.getMethod( "closeFiles", argTypes ); + Object parmValues[] = new Object[0]; + m.invoke( null, parmValues ); +} + + } + return dom; +} +public static Document getDOM(String args[], PrintWriter log) + throws Exception { + logWriter = (log==null)? new PrintWriter( System.err ) : log; + return getDOM(args); +} +public static Document getDOM(String s, String args[], PrintWriter log) + throws Exception { + logWriter = (log==null)? (new PrintWriter( System.err )) : log; + return getDOM(s, args); +} + + private static void mainMethod(String args[]) throws Exception { + try{ + String xtpipes_call = + " xtpipes (2008-01-26-00:38)" + + "\n Command line options: " + + "\n java xtpipes [-trace] [-help] [-m] [-E] [-s script_file]" + + " [-S script_map]" + + "\n [-i script_dir] [-o out_file] " + + "\n [-x...ml2xml_arg...] " + + "(-d in_data | in_file)" + + "\n -m messages printing mode" + + "\n -E error messages into exception calls" + + "\n in_data XML data directly into the command line\n" +; + + boolean help=false; +for( int n=0; n cls = Xtpipes.class; +Class [] argTypes = { Node.class, String.class }; +method = cls.getMethod( "execute", argTypes ); + + if( scriptMap != null ){ + try{ + String f = FileInfo.searchFile( scriptMap ); + if( f == null ){ + throw new java.io.FileNotFoundException( scriptMap ); + } else { + scriptMap = f; + } + XMLReader saxReader; +if( saxReaderStack.empty() ){ + SAXParser saxParser = saxFactory.newSAXParser(); + saxReader = saxParser.getXMLReader(); + saxReader.setEntityResolver(new org.xml.sax.EntityResolver() { + public InputSource resolveEntity( + String publicId, String systemId) { + if( (new File(systemId)).exists() ){ + return new org.xml.sax.InputSource( systemId ); + } + StringReader strReader = new StringReader(""); + return new org.xml.sax.InputSource(strReader); + } +}); + +} else { + saxReader = (XMLReader) saxReaderStack.pop(); +} + + saxReader.setContentHandler( new DefaultHandler(){ + private Stack condition = new Stack (); +public void startDocument () { + condition.push( new Boolean(true) ); +} +public void startElement(String ns, String sName, + String qName, Attributes atts) { + if( condition == null ){ return; } + if( Xtpipes.trace ){ + String s = "<" + qName + "\n"; + for(int i=0; i"; + Xtpipes.logWriter.println( s ); +} + + condition.pop(); +} + + } ); + InputStream inputStream = + (InputStream) (new File(scriptMap).toURI().toURL().openStream()); + saxReader.parse( new InputSource(inputStream) ); + saxReaderStack.push( saxReader ); + } catch( java.io.FileNotFoundException e ){ + instructionErr( null, + "File not found: " + e.getMessage() + + "; command line option -i", + 33 ); + } catch( Exception e ){ + instructionErr( null, e.toString(), e.getStackTrace(), 27 ); + } +} +if( scriptFile == null ){ + scriptFile = "xtpipes-default.4xt"; +} + + while( needScript ){ + if( scriptFile == null ){ + instructionErr( null, "Missing 4xt script file name", 32 ); + } + String f = FileInfo.searchFile( scriptFile ); +if( f == null ){ + throw new java.io.FileNotFoundException( scriptFile ); +} else { + scriptFile = f; +} + + Document script = validatingDomBuilder.parse(scriptFile); + if( trace ){ + logWriter.println( "(" + scriptFile + ")" ); +} + + execute( script.getFirstChild() ); + } + if( outFileName != null ){ + outPrintWriter.close(); +} + + Xtpipes.logWriter.flush(); + } catch( org.xml.sax.SAXParseException e ){ + String s = "Improper file " + scriptFile + ": " + e.getMessage(); + instructionErr( null, s, 2 ); + } catch( java.io.FileNotFoundException e ){ + String s; + if( scriptFile.equals( e.getMessage() ) ){ + s = "Could not find file: " + scriptFile; + } else { + s = "Problem at script " + scriptFile + ": Could not find file " + + e.getMessage(); + } + instructionErr( null, s, 3 ); + } catch( Exception e ){ + String s = "Problems at file: " + scriptFile + "\n " + e; + instructionErr( null, s, 4 ); +} } + + private static void execute( Node node ) throws Exception { + while( node != null ){ + if( node.getNodeType()==Node.ELEMENT_NODE ){ + String instruction = node.getNodeName(); + if( trace ){ + logWriter.print( "[##] = xtpipes => " + instruction ); + if( node.hasAttributes() ){ + NamedNodeMap attributes = node.getAttributes(); + for(int i=0; i < attributes.getLength(); i++ ){ + Node attr = attributes.item(i); + logWriter.print( " " + attr.getNodeName() + + "=\"" + attr.getNodeValue() + "\"" ); + } } + logWriter.println(); logWriter.flush(); +} + + if( instruction.equals( "xtpipes" ) ){ + // String errMsg = ""; +needScript = false; +if( node.hasChildNodes() ){ + if( outFileName != null ){ + try { + FileWriter fw = new FileWriter( outFileName ); + outPrintWriter = new XtpipesPrintWriter( fw ); + returnToFile = true; + } catch(Exception e){ + instructionErr( null, e.toString(), 12 ); +} } + + if( node.hasAttributes() ){ + Node attr = node.getAttributes() + .getNamedItem( "signature" ); + if ( (attr != null) && messages ) { + logWriter.println( attr.getNodeValue() ); +} + + attr = node.getAttributes() + .getNamedItem( "preamble" ); + if( (attr != null) + && attr.getNodeValue().equals( "yes" ) ){ + // BufferedReader br = null; +try { + String s; + boolean front = true; + rootName = "<" + ((rootName==null)? inputObject.getRoot() : rootName); + if( inData == null ){ + // FileReader fr = new FileReader(inFile); +// BufferedReader in = new BufferedReader(fr); +URLConnection connection = + new URL(inFile).openConnection(); +connection.setRequestProperty("User-Agent", + "[" + + System.getProperty("os.name") + + " / " + + System.getProperty("os.arch") + + "]" + + "[" + + System.getProperty("java.version") + + " - " + + System.getProperty("java.vendor") + + "]" +); +InputStream inputStream = connection.getInputStream(); +BufferedReader in = new BufferedReader ( + new InputStreamReader ( inputStream ) ); + +while ( ((s = in.readLine()) != null) && front ) { + int i = s.indexOf( rootName ); + if( i > -1 ){ + front = false; + s = s.substring(0,i); + } + outPrintWriter.println(s); + returnToFile = false; +} +in.close(); + + } else { + int i = inData.indexOf( rootName ); +if( i > -1 ){ + front = false; + s = inData.substring(0,i); +} else { s = ""; } +outPrintWriter.println(s); +returnToFile = false; + + } +} catch (Exception e) { + System.err.println( + "--- Error --- Couldn't copy preamble: " + e); +} + +} } + + execute( node.getFirstChild() ); +} else { + if( inData == null ){ + /* +errMsg = "Searching in " + + inFile + ": "; +*/ +scriptFile = inputObject.getXtpipes(); +rootName = inputObject.getRoot(); +needScript = true; + +} else { + scriptFile = inputObject.getXtpipes(); +rootName = inputObject.getRoot(); +needScript = true; + +} + +} + + } else if( instruction.equals( "set" ) ){ + String name = node.getAttributes().getNamedItem( "name" ) + .getNodeValue(); +Node cdata = node.getFirstChild(); +while( cdata.getNodeType() != Node.CDATA_SECTION_NODE ){ + cdata = cdata.getNextSibling(); +} +String code = cdata.getNodeValue().trim(); +map.put( name, (Object) code ); + + } else if( instruction.equals( "get" ) ){ + try { + String name = node.getAttributes() + .getNamedItem( "name" ).getNodeValue(); + String file = node.getAttributes() + .getNamedItem( "file" ).getNodeValue(); + StreamSource in = new StreamSource( new File(file) ); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + identityTransformer.transform( in, new StreamResult(baos) ); + byte [] bytes = baos.toByteArray(); + map.put( name, (Object) new String(bytes) ); +} catch( Exception e ){ + instructionErr( node, e.toString(), 14 ); +} + + } else if( instruction.equals( "print" ) ){ + String name = node.getAttributes() + .getNamedItem( "name" ).getNodeValue(); +String xml = (String) map.get(name); +if( node.getAttributes().getNamedItem( "file" )==null ){ + if( !Xtpipes.trace ){ + logWriter.println( "[##] = xtpipes => print: " + scriptFile ); + } + logWriter.println( XtpipesUni.toUni(xml, "") ); +} else { + String file = node.getAttributes() + .getNamedItem( "file" ).getNodeValue(); + try{ + FileWriter fw = new FileWriter( file ); + XtpipesPrintWriter out = new XtpipesPrintWriter( fw ); + out.println( xml ); + out.close(); + } catch(Exception e){ + instructionErr( node, e.toString(),15 ); +} } + + } else if( instruction.equals( "return" ) ){ + String name = node.getAttributes() + .getNamedItem( "name" ).getNodeValue(); +result = (String) map.get(name); +if( returnToFile ){ + outPrintWriter.println(result); +} + + } else if( instruction.equals( "if" ) ){ + try{ + String xml = node.getAttributes() + .getNamedItem( "xml" ).getNodeValue(); +String dtd = node.getAttributes() + .getNamedItem( "dtd" ).getNodeValue(); +// String root = node.getAttributes() +// .getNamedItem( "root" ).getNodeValue(); +String doc = "\n" + + "\n" + + (String) map.get(xml) ; + + byte [] bytes = doc.getBytes("UTF-8"); + ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); + InputSource in = new InputSource( bais ); + SAXParser saxParser = saxFactory.newSAXParser(); + XMLReader xmlReader = saxParser.getXMLReader(); + xmlReader.parse( in ); + if( trace ){ + logWriter.print( "--> true" ); +} + + execute( node.getFirstChild() ); +} catch ( Exception e ){ if( trace ){ + logWriter.print( "--> true" ); +} + } + + } else if( instruction.equals( "xslt" ) ){ + try{ + Node xmlNode = node.getAttributes().getNamedItem( "xml" ); +StreamSource inDoc = null; +String xml; +if( xmlNode == null ){ + if( inData == null ){ + inDoc = new StreamSource( new File(inFile) ); +} else { + byte [] bytes = inData.getBytes("UTF-8"); + ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); + inDoc = new StreamSource( bais ); +} + +} else { + xml = xmlNode.getNodeValue(); + String doc = (String) map.get(xml); + if( doc!=null ){ + byte [] bytes = doc.getBytes("UTF-8"); + ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); + inDoc = new StreamSource( bais ); +} } + + String xslt = node.getAttributes() + .getNamedItem( "xsl" ).getNodeValue(); +String templates = (String) map.get(xslt); +byte [] bytes = templates.getBytes("UTF-8"); +ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); +StreamSource inXslt = new StreamSource( bais ); + + Node nameNode = node.getAttributes().getNamedItem("name"); +StreamResult outDoc; +CharArrayWriter caos = null; +if( nameNode == null ){ + outDoc = new StreamResult(outPrintWriter); + returnToFile = false; +} else { + caos = new CharArrayWriter(); + outDoc = new StreamResult(caos); +} + + errMssg = null; + fc.setErrorListener( new ErrorListener() { + public void warning(TransformerException e) throws TransformerException { + showSpecifics(e); + } + public void error(TransformerException e) throws TransformerException { + showSpecifics(e); + } + public void fatalError(TransformerException e) throws TransformerException { + showSpecifics(e); + } + void showSpecifics(TransformerException e) + throws TransformerException{ + String err = e.getMessage() ; + String loc = e.getLocationAsString(); + if( loc != null ){ err = loc + ": " + err; } + err = "XSL stylesheet problem: " + err; + if( errMssg == null ){ errMssg = err; } + throw new TransformerException(err); +} } + ); + Transformer transformer = fc.newTransformer( inXslt ); + transformer.setErrorListener( new ErrorListener() { + public void warning(TransformerException e) throws TransformerException { + showSpecifics(e); + } + public void error(TransformerException e) throws TransformerException { + showSpecifics(e); + } + public void fatalError(TransformerException e) throws TransformerException { + showSpecifics(e); + } + void showSpecifics(TransformerException e) + throws TransformerException{ + String err = e.getMessage() ; + String loc = e.getLocationAsString(); + if( loc != null ){ err = loc + ": " + err; } + if( errMssg == null ){ errMssg = err; } + err = "XML document prblem: " + err; + throw new TransformerException(err); +} } + ); + transformer.transform(inDoc, outDoc ); + if( nameNode != null ){ + String name = nameNode.getNodeValue(); + char [] chars = caos.toCharArray() ; + map.put( name, (Object) new String(chars) ); +} + + +} catch ( javax.xml.transform.TransformerException e ){ + if( Xtpipes.trace ){ e.printStackTrace(); } + instructionErr( node, + e.getMessage() + + + ((errMssg==null)? "" : ("; " +errMssg)) + , 37); +} catch ( Exception e ){ + if( Xtpipes.trace ){ e.printStackTrace(); } + instructionErr( node, (errMssg==null)? e.toString() + : e.toString() + "; " + errMssg + , 16 ); +} + + } else if( instruction.equals( "dom" ) ){ + try{ + Node xmlNode = node.getAttributes().getNamedItem( "xml" ); +Document dom; +if( xmlNode == null ){ + if( inData == null ){ + dom = domBuilder.parse( new File(inFile) ); +} else { + byte [] bytes = inData.getBytes("UTF-8"); + InputStream is = new ByteArrayInputStream( bytes ); + dom = domBuilder.parse (is);} + +} else { + String xml = xmlNode.getNodeValue(); + String doc = (String) map.get(xml); + if( doc == null ){ + instructionErr( node, "improper xml attribute value", 18 ); + } + byte [] bytes = doc.getBytes("UTF-8"); + InputStream is = new ByteArrayInputStream( bytes ); + dom = domBuilder.parse (is); +} + + String className = node.getAttributes() + .getNamedItem( "class" ).getNodeValue(); +String methodName = node.getAttributes() + .getNamedItem( "method" ).getNodeValue(); +Class cls = Class.forName( className ); +Class [] argTypes = { Node.class }; +Method m = cls.getMethod( methodName, argTypes ); +Object parmValues[] = new Object[1]; +parmValues[0] = dom; +m.invoke( null, parmValues ); + + Node nameNode = node.getAttributes().getNamedItem("name"); +StreamResult outDoc; +CharArrayWriter caos = null; +if( nameNode == null ){ + outDoc = new StreamResult(outPrintWriter); + returnToFile = false; +} else { + caos = new CharArrayWriter(); + outDoc = new StreamResult(caos); +} + +cleanXmlns(dom); +DOMSource domSource = new DOMSource(dom); +try{ + identityTransformer.transform( domSource, outDoc ); +} catch ( javax.xml.transform.TransformerException e ){ + String s = Xtpipes.trace? + ( + "\n------------------------ xml code ------------------------\n" + + serialize( dom ) + + "\n----------------------------------------------------------\n" + ) + : ""; + instructionErr( node, e.getMessage() + s, 35 ); +} +if( nameNode != null ){ + String name = nameNode.getNodeValue(); + char [] chars = caos.toCharArray() ; + String domString = new String(chars); + Node dcl = node.getAttributes().getNamedItem( "dcl" ); +if( ((dcl == null) || (dcl.getNodeValue().equals("no") )) + && + (domString.length() > 7) + && + domString.startsWith("") + 2 ); +} + + map.put( name, (Object) domString ); +} + +} catch ( NoSuchMethodException e ){ + instructionErr( node, + "could not find method: " + e.getMessage(), 18 ); +} catch ( java.lang.reflect.InvocationTargetException e ){ + if( Xtpipes.trace ){ e.printStackTrace(); } + instructionErr( node, e.getCause().toString(), 36); +} catch ( Exception e ){ + if( Xtpipes.trace ){ e.printStackTrace(); } + instructionErr( node, e.toString(), 20 ); +} + + } else if( instruction.equals( "sax" ) ){ + String errMsg = ""; +try{ + Node xmlNode = node.getAttributes().getNamedItem( "xml" ); +InputSource inputSource=null; +String xml = null; +if( xmlNode == null ){ + if( inData == null ){ + xml = inFile; +} else { + byte [] bytes = inData.getBytes("UTF-8"); + ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); + inputSource = new InputSource( bais ); +} + +} else { + xml = xmlNode.getNodeValue(); + String doc = (String) map.get(xml); + if( doc!=null ){ + byte [] bytes = doc.getBytes("UTF-8"); + ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); + inputSource = new InputSource( bais ); +} } + + String [] className = node.getAttributes() + .getNamedItem( "content-handler" ) + .getNodeValue() + .split(","); + + Class [] argTypes = { + PrintWriter.class, HashMap.class, Method.class, + PrintWriter.class, boolean.class }; +Node nameNode = node.getAttributes().getNamedItem("name"); +PrintWriter out; +CharArrayWriter caos = null; +if( nameNode == null ){ + out = outPrintWriter; + returnToFile = false; +} else { + caos = new CharArrayWriter(); + out = new PrintWriter( caos ); +} + +Object parmValues[] = new Object[5]; +parmValues[0] = out; +HashMap scripts = new HashMap (); +Node script = node.getFirstChild(); +while( script != null ){ + if( script.getNodeType()==Node.ELEMENT_NODE ){ + String element = script.getAttributes().getNamedItem( "element" ) + .getNodeValue(); + if( scripts.containsKey(element) ){ + System.err.println( + "--- Warning --- redfining script: " + element ); + } + scripts.put( element, (Object) script ); + } + script = script.getNextSibling(); +} + parmValues[1] = scripts; +parmValues[2] = method; +parmValues[3] = Xtpipes.logWriter; +parmValues[4] = (Object) Xtpipes.trace; +Class cls = Class.forName( className[0].trim() ); +Constructor c = cls.getConstructor( argTypes ); +Object ch = (Object) c.newInstance( parmValues ); + + XMLReader saxReader; +if( saxReaderStack.empty() ){ + SAXParser saxParser = saxFactory.newSAXParser(); + saxReader = saxParser.getXMLReader(); + saxReader.setEntityResolver(new org.xml.sax.EntityResolver() { + public InputSource resolveEntity( + String publicId, String systemId) { + if( (new File(systemId)).exists() ){ + return new org.xml.sax.InputSource( systemId ); + } + StringReader strReader = new StringReader(""); + return new org.xml.sax.InputSource(strReader); + } +}); + +} else { + saxReader = (XMLReader) saxReaderStack.pop(); +} + + XMLReader reader = saxReader; + for( int i=1; i [] argTyp = { String.class, String[].class }; +Constructor con = ml2xmlClassObj.getConstructor( argTyp ); +try{ + if( Xtpipes.trace ){ + String s = "Calling: ml2xml.Ml2xml(inputStream," + + "new String[]{" ; + for(int i=0; i < Xtpipes.ml2xml.length; i++){ + s += ((i==0)? "\"" : ", \"") + Xtpipes.ml2xml[i] + "\""; + } + s += "})"; + Xtpipes.logWriter.println( s ); +} + + inputStream = (InputStream) con.newInstance( + new Object[]{xml, ml2xml} + ); +} catch(java.lang.reflect.InvocationTargetException ite){ + String s = "Problem at: ml2xml.Ml2xml(" + xml + "," + + "new String[]{" ; + for(int i=0; i < Xtpipes.ml2xml.length; i++){ + s += ((i==0)? "\"" : ", \"") + Xtpipes.ml2xml[i] + "\""; + } + s += "})"; + instructionErr( null, s + "; " + ite.getCause(), 38); +} + +} +saxReader.parse( new InputSource(inputStream) ); +if( Xtpipes.ml2xml != null ){ + Class [] argTyp = {}; + Method m = ml2xmlClassObj . getMethod( "closeFiles", argTyp ); + m.invoke( null, new Object[0] ); +} + + + } else { + errMsg = "xtpipes sax parsing error"; + saxReader.parse( inputSource ); + } + if( nameNode != null ){ + String name = nameNode.getNodeValue(); + char [] chars = caos.toCharArray() ; + map.put( name, (Object) new String(chars) ); +} + + saxReaderStack.push( reader ); +} catch ( java.io.FileNotFoundException e ){ + instructionErr( node, errMsg + + "could not find file: " + e.getMessage(), 19 ); +} catch ( ClassNotFoundException e ){ + instructionErr( node, errMsg + + " class not found: " + + e.getMessage() + "\n classpath = " + + System.getProperty("java.class.path") + + " ---", 22 ); +} catch ( java.lang.reflect.InvocationTargetException e ){ + instructionErr( node, errMsg + ": " + e.getCause(), 23 ); +} catch ( Exception e ){ +// e.printStackTrace(); + instructionErr( node, errMsg + e.toString(), 29 ); +} + + } else { + instructionErr( node, "Improper instruction: " + instruction, 11 ); + } } + node = node.getNextSibling(); +} } + + public static String execute( Node node, String xml ) + throws Exception { + String name = "."; + String old = (String) map.get(name); + map.put( name, (Object) xml ); + execute( node.getFirstChild() ); + String s = (String) map.get(name); + if( old != null ){ map.put( name, (Object) old ); } + return s; +} + + private static void instructionErr( Node node, String e, int num ) + throws Exception { + String err = "--- xtpipes error " + num + " --- "; + if( node != null ){ + err += "At <" + node.getNodeName(); + NamedNodeMap attr = node.getAttributes(); + for(int i=0; i [] argTypes = { }; + Method m = ml2xmlClassObj.getMethod( "closeFiles", argTypes ); + Object parmValues[] = new Object[0]; + m.invoke( null, parmValues ); +} + + Xtpipes.logWriter.flush(); + if( exceptionErrs ) { throw new Exception( err ); } + else { + System.err.println( err ); + System.exit(1); + } +} +private static void instructionErr( Node node, String e, + StackTraceElement[] st, int num ) + throws Exception { + Xtpipes.logWriter.println( + "--- xtpipes error " + num + " --- " + e + ); + for(int i=st.length-1; i>=0; i-- ){ + Xtpipes.logWriter.println( st[i].toString() ); + } + instructionErr( node, e, num ); +} + + static String serialize( Node root ){ + if( root.getNodeType() == Node.TEXT_NODE) { + return root.getNodeValue(); + } + if( root.getNodeType() == Node.ELEMENT_NODE) { + String ser = ""; + String tagName = root.getNodeName(); + ser += "<" + tagName; + NamedNodeMap attributes = root.getAttributes(); +for(int i = 0; i < attributes.getLength(); i++) { + Attr attribute = (Attr) attributes.item(i); + ser += "\n" + attribute.getName() + "=\"" + + attribute.getValue() + "\" "; +} + + ser += "\n>"; + NodeList children = root.getChildNodes(); +if(children.getLength() > 0) { + for(int i = 0; i < children.getLength(); i++) { + ser += serialize(children.item(i)); +} } + + ser += ""; + return ser; + } + if( root.getNodeType() == Node.DOCUMENT_NODE) { + String ser = ""; + NodeList children = root.getChildNodes(); +if(children.getLength() > 0) { + for(int i = 0; i < children.getLength(); i++) { + ser += serialize(children.item(i)); +} } + + return ser; + } + if( root == null ){ return "null"; } + return ""; +} + + static ArrayList nsName, nsValue; +static void cleanXmlns( Node root ){ + if( root.getNodeType() == Node.ELEMENT_NODE) { + int top = nsName.size(); + ArrayList remove = new ArrayList(); +NamedNodeMap attributes = root.getAttributes(); +for(int i = 0; i < attributes.getLength(); i++) { + Attr attribute = (Attr) attributes.item(i); + String name = attribute.getName(); + if( name.startsWith("xmlns") ){ + if( (name.length() == 5) || (name.charAt(5) == ':') ){ + String value = attribute.getValue(); + boolean bool = false; +for(int k=nsName.size(); k>0; ){ + k--; + if( ((String) nsName.get(k)) . equals(name) ){ + bool = ((String) nsValue.get(k)) . equals(value); + break; +} } + + if( bool ){ remove.add(attribute); + } else { nsName.add(name); nsValue.add(value); } +} } } +for(int i=remove.size(); i>0; ){ + i--; + ((Element) root).removeAttributeNode( (Attr) remove.get(i) ); +} +remove = null; + + NodeList children = root.getChildNodes(); +if(children.getLength() > 0) { + for(int i = 0; i < children.getLength(); i++) { + cleanXmlns(children.item(i)); +} } + + for(int i=nsName.size(); i>top; ){ + i--; + nsName.remove(i); + nsValue.remove(i); + } + } else if( root.getNodeType() == Node.DOCUMENT_NODE) { + nsName = new ArrayList(); + nsValue = new ArrayList(); + NodeList children = root.getChildNodes(); +if(children.getLength() > 0) { + for(int i = 0; i < children.getLength(); i++) { + cleanXmlns(children.item(i)); +} } + + nsName = null; + nsValue = null; +} } + +} +class XtpipesEntityResolver implements org.xml.sax.EntityResolver { + public InputSource resolveEntity(String publicID, String systemID) + throws SAXException { + if( Xtpipes.trace ){ + Xtpipes.logWriter.println( "Resolving: publicID = \" " + publicID + + "\" systemID = \"" + systemID + "\"" ); + } + String file = FileInfo.searchFile( systemID ); + if( file != null ){ + try{ + file = new File(file).toURI().toURL().toString(); + return new InputSource( file ); + } catch( java.net.MalformedURLException mfe){ + throw new SAXException( + "--- xtpipes error 30 --- improper file name: " + file ); + } } + return null; +} + +} + + diff --git a/Build/source/texk/tex4htk/java/xtpipes/XtpipesUni.java b/Build/source/texk/tex4htk/java/xtpipes/XtpipesUni.java new file mode 100755 index 00000000000..7050d590d17 --- /dev/null +++ b/Build/source/texk/tex4htk/java/xtpipes/XtpipesUni.java @@ -0,0 +1,41 @@ +// 2008-01-26-00:38 +package xtpipes; +public class XtpipesUni{ + private static int D800 = Integer.parseInt("D800", 16); +private static int DFFF = Integer.parseInt("DFFF", 16); +private static int DC00 = Integer.parseInt("DC00", 16); +private static int X400 = Integer.parseInt("400",16); +private static int X10000 = Integer.parseInt("10000",16); + + +public static String toUni( char[] ch, int start, int length, + String filter ){ + StringBuffer buf = new StringBuffer(length); + for (int i = 0; i < length; i++) { + int chr = ch[ start + i ]; + boolean ascii = (chr == '\n') + || (chr > 31) && (chr < 127) ; + if( filter.indexOf(chr) > -1 ){ ascii = false; } + + if( (chr >= D800) && (chr<= DFFF) ){ + chr = ((ch[i] - D800) * X400 + (ch[++i] - DC00)) + X10000; + } + + + buf.append( + ascii ? Character.toString((char) chr) + : ("&#x" + + Integer.toHexString(chr).toUpperCase() + + ";" ) ); + } + return new String(buf); +} + + public static String toUni( String s, String filter ){ + char [] ch = s.toCharArray(); + int length = ch.length; + return toUni(ch, 0, length, filter); +} + +} + diff --git a/Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManager.java b/Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManager.java new file mode 100755 index 00000000000..2d2c06a715f --- /dev/null +++ b/Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManager.java @@ -0,0 +1,196 @@ +// 2008-01-26-00:38 +package xtpipes.util; +import java.util.ArrayList; +import java.util.HashSet; +import xtpipes.XtpipesUni; + + +import org.xml.sax.helpers.DefaultHandler; +import org.xml.sax.*; +import java.io.*; +import java.lang.reflect.*; +import java.util.HashMap; +import java.util.Stack; + +public class ScriptsManager extends DefaultHandler { + boolean inBody = false; +ArrayList nsName = new ArrayList(), + nsValue = new ArrayList(); +Stack nsStack = new Stack(); + + PrintWriter out = null, log = null; + HashMap scripts = null; + Method method = null; + boolean savemode=false; + String code="", match = null; + Stack stack = new Stack(); + public ScriptsManager( PrintWriter out, + HashMap scripts, Method method, + PrintWriter log, boolean trace ){ + this.out = out; + this.log = (log==null)? new PrintWriter( System.err ) : log; + this.scripts = scripts; + this.method = method; + } + public void characters(char[] ch, int start, int length){ + add( XtpipesUni.toUni(ch, start, length, "<>&") ); + } + public void startElement(String ns, String sName, + String qName, Attributes atts) { + int top = nsName.size(); +nsStack.push( new Integer(top) ); + + String key = (atts==null)? + null + : (qName + "::" + atts.getValue("class")); +boolean flag = (key != null) && scripts.containsKey(key); + +if( !flag ){ + key = qName; + flag = scripts.containsKey(key); +} + + inBody = true; + String s = "<" + qName + "\n"; + for(int i=0; i0; ){ + k--; + if( ((String) nsName.get(k)) . equals(name) ){ + bool = ((String) nsValue.get(k)) . equals(value); + break; +} } + + if( !bool ){ + nsName.add(name); nsValue.add(value); +} } } + + s += " " + name + "=\"" + + XtpipesUni.toUni(value, "<>&\"") + "\""; + } + if( flag ){ HashSet registry = new HashSet(); +for(int i=nsName.size(); i>top; ){ + i--; + registry.add( (String) nsName.get(i) ); +} +for(int i=top; i>0; ){ + i--; + String nm = (String) nsName.get(i); + if( ! registry.contains(nm) ){ + registry.add( nm ); + s += " " + nm + "=\"" + + XtpipesUni.toUni( (String) nsValue.get(i), "<>&\"") + "\""; +} } + } + s += ">" ; + if( flag ){ + Object [] state = { new Boolean(savemode), code, match }; + stack.push( state ); + savemode=true; code=""; match= key; +} else { + Object [] state = { new Boolean(savemode), null, null }; + stack.push( state ); +} +add( s ); + +} + + public void endElement(String ns, String sName, String qName){ + String s = ""; + add( s ); + Object [] state = (Object []) stack.pop(); + if( (String) state[1] != null ){ + Object parmValues[] = new Object[2]; +parmValues[0] = scripts.get( match ); +parmValues[1] = code; +try { + s = (String) method.invoke( null, parmValues ); +} catch(java.lang.reflect.InvocationTargetException e){ + log.println("--- ScriptsManager Error 1 --- " + e.getCause() ); + log.flush(); +} catch (Exception e){ + log.println("--- ScriptsManager Error 2 --- " + e ); + log.flush(); +} + + savemode = ((Boolean) state[0]).booleanValue(); +code = (String) state[1]; +match = (String) state[2]; + + int top = ((Integer) nsStack.pop()) . intValue(); +for(int i=nsName.size(); i>top; ){ + i--; + nsName.remove(i); + nsValue.remove(i); +} + + int m = s.indexOf('>'); +char [] attrs = s.substring(0,m).toCharArray(); +int result = qName.length()+1, + mark = result, + from=-1, + control = 12 +; +char delimiter = ' '; +String name=""; + +for(int i=result; i0; ){ + k--; + if( ((String) nsName.get(k)) . equals(name) ){ + bool = ((String) nsValue.get(k)) . equals(value); + break; +} } + + if( bool ){ result = mark; } + } + mark = result; + control = 12 +; +} + break; } +} } +s = (new String(attrs,0,result)) + s.substring(m); + + add( s ); + } else { int top = ((Integer) nsStack.pop()) . intValue(); +for(int i=nsName.size(); i>top; ){ + i--; + nsName.remove(i); + nsValue.remove(i); +} + } +} + + void add(String s){ + if( savemode ){ code+=s; } + else { out.print(s); } +} } + diff --git a/Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManagerLH.java b/Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManagerLH.java new file mode 100755 index 00000000000..b5fe3526208 --- /dev/null +++ b/Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManagerLH.java @@ -0,0 +1,26 @@ +// 2008-01-26-00:38 +package xtpipes.util; +import org.xml.sax.ext.LexicalHandler; +// import org.xml.sax.ContentHandler; +import java.io.PrintWriter; +public class ScriptsManagerLH implements LexicalHandler { + ScriptsManager contentHandler; + PrintWriter log; + public ScriptsManagerLH( ScriptsManager contentHandler, + PrintWriter log, boolean trace ){ + this.contentHandler = contentHandler; + this.log = (log==null)? new PrintWriter( System.err ) : log; + } + public void comment(char[] ch, int start, int length){ + if( contentHandler.inBody ){ + String s = new String(ch, start, length); + contentHandler.add( ""); + } } + public void startEntity(String x){} + public void endEntity(String x){} + public void startCDATA(){} + public void endCDATA(){} + public void startDTD(String x, String y, String z){} + public void endDTD(){} +} + -- cgit v1.2.3