diff options
Diffstat (limited to 'Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManager.java')
-rwxr-xr-x | Build/source/texk/tex4htk/java/xtpipes/util/ScriptsManager.java | 196 |
1 files changed, 196 insertions, 0 deletions
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<String> nsName = new ArrayList<String>(), + nsValue = new ArrayList<String>(); +Stack<Integer> nsStack = new Stack<Integer>(); + + PrintWriter out = null, log = null; + HashMap<String,Object> scripts = null; + Method method = null; + boolean savemode=false; + String code="", match = null; + Stack<Object[]> stack = new Stack<Object[]>(); + public ScriptsManager( PrintWriter out, + HashMap<String,Object> 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; i<atts.getLength(); i++ ){ + String name = atts.getQName(i), + value = atts.getValue(i); + if( name.startsWith("xmlns") ){ + if( (name.length() == 5) || (name.charAt(5) == ':') ){ + 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 ){ + nsName.add(name); nsValue.add(value); +} } } + + s += " " + name + "=\"" + + XtpipesUni.toUni(value, "<>&\"") + "\""; + } + if( flag ){ HashSet<String> registry = new HashSet<String>(); +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 = "</" + qName + ">"; + 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; i<m; i++ ){ + attrs[result++] = attrs[i]; + switch( control ){ + case 12 +: { if( attrs[i] == '=' ){ + name = (new String(attrs,mark,result-mark-1)).trim(); + control = 13 +; +} + break; } + case 13 +: { if( (attrs[i] == '"') || (attrs[i] == '\'') ){ + delimiter = attrs[i]; + control = 14 +; + from = result; +} + break; } + case 14 +: { if( attrs[i] == delimiter ){ + if( name.startsWith("xmlns") + && ((name.length() == 5) || (name.charAt(5) == ':')) ){ + String value = (new String(attrs,from,result-from-1)).trim(); + 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 ){ 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); } +} } + |