summaryrefslogtreecommitdiff
path: root/Build/source/texk/tex4htk/java/HtJsml.java
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/tex4htk/java/HtJsml.java')
-rwxr-xr-xBuild/source/texk/tex4htk/java/HtJsml.java351
1 files changed, 351 insertions, 0 deletions
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<level; j++){
+ s += prefix + " ";
+ }
+ ((org.w3c.dom.Element) node).setAttribute( "depth", ""+level);
+ Node child = node.getFirstChild();
+ if( child != null ){
+ node.insertBefore( dom.createTextNode(s), child );
+} }
+
+ } else {
+ NodeList children = node.getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ insertLevelPrefix(child, level);
+} } } }
+private static void setContinuedNote(Node node){
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ if( node.getNodeName().equals( "level" ) ){
+ Node attr = node.getAttributes().getNamedItem("continued");
+if (attr != null) {
+ node = node.getFirstChild();
+ if( node != null ){
+ ((org.w3c.dom.Text) node).setData( attr.getNodeValue() );
+} }
+
+ } else {
+ NodeList children = node.getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ setContinuedNote(child);
+} } } }
+
+ private static Document dom;
+public static void mnGroup(Node d) {
+ dom = (Document) d;
+ setMnGroup(dom.getFirstChild());
+}
+private static void setMnGroup(Node node) {
+ if( node.getNodeName().equals( "mn-group" ) ){
+ boolean bool = false;
+ NodeList children = node.getChildNodes();
+int n = children.getLength();
+char [] digit = new char[n];
+for (int i = 0; i < n; i++) {
+ Node child = children.item(i).getFirstChild();
+ if( child == null ){
+ digit[i] = 'x';
+ } else if( child.getNodeType() != Node.TEXT_NODE ){
+ digit[i] = 'x';
+ } else {
+ String s = child.getNodeValue();
+ if( s.length() != 1 ){
+ digit[i] = 'x';
+ } else {
+ char ch = s.charAt(0);
+ if( (ch >= '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<n; i++ ){
+ Node child = node.getFirstChild();
+ node.removeChild( child );
+ if( digit[i] == 'x' ){
+ if( cur.hasChildNodes() ){ g.appendChild( cur ); }
+ g.appendChild( child );
+ cur = dom.createElement( "mn-group" );
+ } else {
+ cur.appendChild( child );
+} }
+if( cur.hasChildNodes() ){ g.appendChild( cur ); }
+parent.replaceChild( g, node );
+
+ } else if (node.hasChildNodes()) {
+ NodeList children = node.getChildNodes();
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
+ setMnGroup(child);
+} } } }
+
+ public static void fracLevel(Node d) {
+ dom = (Document) d;
+ setFracLevel(dom.getFirstChild(), 0);
+}
+private static int setFracLevel(Node node, int cont) {
+ int level = 0;
+ if (node.hasChildNodes()) {
+ String ndName = node.getNodeName();
+ int prevCont = cont;
+ String clValue = null;
+ if (ndName.equals("mfrac")) {
+ if (node.hasAttributes()) {
+ Node cl = node.getAttributes().getNamedItem("class");
+ if (cl != null) { clValue = cl.getNodeValue(); }
+}
+
+ if( (clValue != null)
+ && clValue.equals("continued-mfrac") ) {
+ cont = 2;
+} else { cont--; }
+
+ }
+ 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,
+ cont
+);
+ if (d > 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;
+}
+
+}
+