]> matita.cs.unibo.it Git - helm.git/commitdiff
* added show/hide cursro methods
authorLuca Padovani <luca.padovani@unito.it>
Thu, 13 Feb 2003 12:40:34 +0000 (12:40 +0000)
committerLuca Padovani <luca.padovani@unito.it>
Thu, 13 Feb 2003 12:40:34 +0000 (12:40 +0000)
* some code cleanup
* fix in reset
* fix in get_tex (binding ocaml)
* added tex to mml translator

33 files changed:
helm/DEVEL/mathml_editor/Makefile.am
helm/DEVEL/mathml_editor/Makefile.in
helm/DEVEL/mathml_editor/TML.dtd
helm/DEVEL/mathml_editor/configure.ac
helm/DEVEL/mathml_editor/dictionary-tex.xml
helm/DEVEL/mathml_editor/ocaml/c_mathml_editor.cc
helm/DEVEL/mathml_editor/ocaml/c_mathml_editor.h
helm/DEVEL/mathml_editor/ocaml/i_mathml_editor.ml
helm/DEVEL/mathml_editor/ocaml/mathml_editor.ml
helm/DEVEL/mathml_editor/ocaml/ml_mathml_editor.c
helm/DEVEL/mathml_editor/src/AMathMLFactory.hh
helm/DEVEL/mathml_editor/src/APushParser.cc
helm/DEVEL/mathml_editor/src/APushParser.hh
helm/DEVEL/mathml_editor/src/CMathMLFactoryXSLT.cc
helm/DEVEL/mathml_editor/src/CMathMLFactoryXSLT.hh
helm/DEVEL/mathml_editor/src/CMathMLFactoryXSLTDiff.cc
helm/DEVEL/mathml_editor/src/CMathMLFactoryXSLTDiff.hh
helm/DEVEL/mathml_editor/src/LPushLexer.hh
helm/DEVEL/mathml_editor/src/TDocument.cc
helm/DEVEL/mathml_editor/src/TDocument.hh
helm/DEVEL/mathml_editor/src/TPushParser.cc
helm/DEVEL/mathml_editor/src/TPushParser.hh
helm/DEVEL/mathml_editor/src/TTokenizer.cc
helm/DEVEL/mathml_editor/src/TTokenizer.hh
helm/DEVEL/mathml_editor/test/.cvsignore
helm/DEVEL/mathml_editor/test/editor.cc
helm/DEVEL/mathml_editor/test/guiGTK.c
helm/DEVEL/mathml_editor/textomml/.cvsignore [new file with mode: 0644]
helm/DEVEL/mathml_editor/textomml/Makefile.am [new file with mode: 0644]
helm/DEVEL/mathml_editor/textomml/config.dirs.in [new file with mode: 0644]
helm/DEVEL/mathml_editor/textomml/main.cc [new file with mode: 0644]
helm/DEVEL/mathml_editor/xsl/tml-mmlp.xsl
helm/DEVEL/mathml_editor/xsl/tml-tex.xsl

index 8f4639ebf4c1698c1be23202292e62ab03888352..20f515335782a7368299ae12f7c9f6d4b3984634 100644 (file)
@@ -1,5 +1,5 @@
 #EXTRA_DIST = BUGS HISTORY LICENSE aclocal.m4 debian/
-SUBDIRS = src test ocaml
+SUBDIRS = src test ocaml textomml
 CLEANFILES = core
 
 bin_SCRIPTS = editex-config
index fdf08ab3e71ee626f82b0525479cf4ea16804fdf..cdb115fcd60d25fe6b089ee3e50e5a2cb8149f33 100644 (file)
@@ -101,7 +101,7 @@ RANLIB = @RANLIB@
 STRIP = @STRIP@
 VERSION = @VERSION@
 
-SUBDIRS = src test ocaml
+SUBDIRS = src test ocaml textomml
 CLEANFILES = core
 
 bin_SCRIPTS = editex-config
index a808c5ba7848062b150d81a6293c39fd72000e21..dcff7abad5058a80d118a8b7eb697ecaf3ae2118 100644 (file)
@@ -54,5 +54,8 @@
   left-open (0|1) #IMPLIED>
 
 <!ELEMENT cursor EMPTY>
-<!ATTLIST %TML.common.attrib; val CDATA #REQUIRED>
+<!ATTLIST
+  %TML.common.attrib;
+  val CDATA #REQUIRED
+  visible (0|1) #REQUIRED>
 
index dd7b07b7b58df414ad4444bee1e8d4d4c26d3099..be109d69c013a55db0db2074af5326291a9aff6f 100644 (file)
@@ -240,6 +240,8 @@ AC_CONFIG_FILES([
  Makefile 
  src/Makefile
  test/Makefile
+ textomml/Makefile
+ textomml/config.dirs
  ocaml/Makefile
  editex-config
 ])
index 6bb3c5eb91bfab231e09457ec3010ec5bf14bfe4..4eff38632eeb5a789f1cc80e2886e6bb8a8effbf 100644 (file)
   <entry name="underbrace"   pattern="#1" limits="1"/>
   <entry name="cases"        pattern="#1" table="1"/>
 
-  <!-- MACRO for testing  -->
-  <entry name="red"        pattern="{"/>
-  <entry name="green"      pattern="#1\over"/>
-  <entry name="duedelim"   pattern="#1\over\over#2"/>
-
 </dictionary>
index 284f1ed508f4904c5abe5e21fd9fae75b6d9dd7b..88acf9b190d0072dd08852103bb99dc1c3badf44 100644 (file)
@@ -119,13 +119,29 @@ c_mathml_editor_drop(Editor* editor, int alt)
   editor->lexer->drop(alt != 0);
 }
 
+extern "C" int
+c_mathml_editor_cursor_hide(Editor* editor)
+{
+  assert(editor);
+  return editor->parser->hideCursor();
+}
+
+extern "C" int
+c_mathml_editor_cursor_show(Editor* editor)
+{
+  assert(editor);
+  return editor->parser->showCursor();
+}
+
 extern "C" char*
 c_mathml_editor_get_tex(const Editor* editor)
 {
   assert(editor);
   DOM::Document res = editor->tml_tex->apply(editor->parser->document());
-  DOM::Element root = res.get_documentElement();
-  return strdup(std::string(root.get_nodeValue()).c_str());
+  assert(res);
+  res.normalize();
+  assert(res.get_firstChild() && res.get_firstChild().get_nodeName() == "#text");
+  return strdup(std::string(res.get_firstChild().get_nodeValue()).c_str());
 }
 
 extern "C" void
index 7e7c0e38e701a7c68468b1fb421e0b6396f88aa9..729ca01517e78bdbbb6d10bc4f622c08129be1fc 100644 (file)
@@ -13,6 +13,8 @@ int            c_mathml_editor_thaw(Editor*);
 void           c_mathml_editor_reset(Editor*);
 void           c_mathml_editor_push(Editor*, char);
 void           c_mathml_editor_drop(Editor*, int);
+int            c_mathml_editor_cursor_hide(Editor*);
+int            c_mathml_editor_cursor_show(Editor*);
 char*          c_mathml_editor_get_tex(const Editor*);
 GdomeDocument* c_mathml_editor_get_tml(const Editor*);
 GdomeDocument* c_mathml_editor_get_mml(const Editor*);
index f3ca57454533f90b13f63fc30a880ca9c5e154c9..62c1a380577fe26e962dcdcc781503c61c1acc8d 100644 (file)
@@ -24,6 +24,12 @@ external push : editor:t -> ch:char -> unit
 external drop : editor:t -> alt:bool -> unit
   = "ml_mathml_editor_drop"
 
+external cursor_hide : editor:t -> unit
+  = "ml_mathml_cursor_hide"
+
+external cursor_show : editor:t -> unit
+  = "ml_mathml_cursor_show"
+
 external get_tex : editor:t -> string
   = "ml_mathml_editor_get_tex"
 
index 58ca8f769f653b31652683ecb0218606665519f5..7354c8e95f96dd09f1acd587d364422bee36f81f 100644 (file)
@@ -18,6 +18,12 @@ let push = I_mathml_editor.push
 let drop = I_mathml_editor.drop
 ;;
 
+let cursor_hide = I_mathml_editor.cursor_hide
+;;
+
+let cursor_show = I_mathml_editor.cursor_show
+;;
+
 let get_tex = I_mathml_editor.get_tex
 ;;
 
index 79594c2a8bbd566e3245c1cc515b65b0f463c7b9..bbe8884353d7d70a4013de14b8aa157ec74f7d32 100644 (file)
@@ -102,6 +102,22 @@ ml_mathml_editor_drop(value v, value alt)
   CAMLreturn(Val_unit);
 }
 
+value
+ml_mathml_editor_cursor_hide(value v)
+{
+  CAMLparam1(v);
+  ml_Editor* editor = Editor_val(v);
+  CAMLreturn(Val_bool(c_mathml_editor_cursor_hide(editor->c_editor)));
+}
+
+value
+ml_mathml_editor_cursor_show(value v)
+{
+  CAMLparam1(v);
+  ml_Editor* editor = Editor_val(v);
+  CAMLreturn(Val_bool(c_mathml_editor_cursor_show(editor->c_editor)));
+}
+
 value
 ml_mathml_editor_get_tex(value v)
 {
index 5186c63bbdcae4b850ec1ec541e344f45ba90e90..92c1eb4093930e39cb69d7fc256eeebc6e6844f5 100644 (file)
@@ -32,7 +32,6 @@ public:
   AMathMLFactory(class ALogger& l) : logger(l) { };
   virtual ~AMathMLFactory() { };
 
-  virtual void reset(void) = 0;
   virtual void documentModified(class TDocument&) = 0;
   virtual DOM::Document document(void) const = 0;
 
index 9ff5eff1f6fbd74219de81e0abecfb0538249e14..76690c044a4d9b806b9b949adf49bcea1651f957 100644 (file)
@@ -2,12 +2,6 @@
 #include "APushParser.hh"
 #include "AMathMLFactory.hh"
 
-void
-APushParser::reset()
-{
-  if (factory) factory->reset();
-}
-
 bool
 APushParser::freeze()
 {
index 3a3aa8842c350092c0aecd84577537b4f5724c93..5344b7272fdca474f9a79db9a411fa2464c92608 100644 (file)
@@ -33,10 +33,12 @@ public:
   APushParser(class ALogger& l, class AMathMLFactory& f) : logger(l), factory(&f), freeze_level(0) { };
   virtual ~APushParser() { };
 
-  virtual void reset(void);
+  virtual void reset(void) = 0;
   virtual void push(const class TToken&) = 0;
   virtual std::string drop(void) = 0;
   virtual void setCursorHint(const std::string&) = 0;
+  virtual bool hideCursor(void) = 0;
+  virtual bool showCursor(void) = 0;
 
   virtual bool freeze(void);
   virtual bool thaw(void);
index 2b714cb91f83d175f1757fb0c627a8f097d49c41..027aebcdfd68a9a4428bfd9721f7bfdfc7c4a6f5 100644 (file)
@@ -7,12 +7,6 @@
 
 CMathMLFactoryXSLT::CMathMLFactoryXSLT(ALogger& l, const DOMX::XSLTStylesheet& s)
   : AMathMLFactory(l), style(s)
-{
-  reset();
-}
-
-void
-CMathMLFactoryXSLT::reset()
 {
   DOM::DOMImplementation di;
   DOM::DocumentType dt;
@@ -22,32 +16,31 @@ CMathMLFactoryXSLT::reset()
 void
 CMathMLFactoryXSLT::documentModified(TDocument& doc)
 {
-  if (TNode dirty = doc.dirtyNode()) 
-    {
-      std::vector< std::pair<DOM::GdomeString, DOM::GdomeString> > dirtyId;
-      if (result.get_documentElement().hasAttribute("xref"))
-       dirtyId.push_back(std::make_pair(DOM::GdomeString("id"),
-                                        DOM::GdomeString("'" + std::string(dirty["id"]) + "'")));
-      DOM::Document res = style.apply(doc.document(), dirtyId);
-      assert(res);
-      style.save(doc.document(), stdout);
-
-      DOM::Element root = res.get_documentElement();
-      assert(root);
-      assert(root.hasAttribute("xref"));
+  cout << "passo di qui" << endl;
+  std::vector< std::pair<DOM::GdomeString, DOM::GdomeString> > dirtyId;
+  if (TNode dirty = doc.dirtyNode())
+    if (result.get_documentElement().hasAttribute("xref"))
+      dirtyId.push_back(std::make_pair(DOM::GdomeString("id"),
+                                      DOM::GdomeString("'" + std::string(dirty["id"]) + "'")));
+  DOM::Document res = style.apply(doc.document(), dirtyId);
+  assert(res);
+  style.save(doc.document(), stdout);
 
-      if (result.get_documentElement().hasAttribute("xref"))
-       {
-         bool ok = subst(result.get_documentElement(), root.getAttribute("xref"), result.importNode(root, true));
-         assert(ok);
-       }
-      else
-       result.replaceChild(result.importNode(root, true), result.get_documentElement());
-       
-      style.save(result, stdout);
+  DOM::Element root = res.get_documentElement();
+  assert(root);
+  assert(root.hasAttribute("xref"));
 
-      doc.clearDirty();
+  if (result.get_documentElement().hasAttribute("xref"))
+    {
+      bool ok = subst(result.get_documentElement(), root.getAttribute("xref"), result.importNode(root, true));
+      assert(ok);
     }
+  else
+    result.replaceChild(result.importNode(root, true), result.get_documentElement());
+
+  style.save(result, stdout);
+
+  doc.clearDirty();
 }
 
 bool
index 9d129a3782b9389574c4c1026800afa8eff9aa00..898d958979887db6076fb531f9f13062ee2d7442 100644 (file)
@@ -10,7 +10,6 @@ class CMathMLFactoryXSLT : public AMathMLFactory
 public:
   CMathMLFactoryXSLT(class ALogger&, const class GdomeSmartDOMExt::XSLTStylesheet&);
 
-  virtual void reset(void);
   virtual void documentModified(class TDocument&);
   virtual GdomeSmartDOM::Document document(void) const { return result; };
 
index 53fa5aa3679b61ee39a6ea270fde5cbaf41a0ac2..c26407b2ee5e12cd488d8f98999a63de41099f01 100644 (file)
@@ -8,12 +8,6 @@
 
 CMathMLFactoryXSLTDiff::CMathMLFactoryXSLTDiff(ALogger& l, const DOMX::XSLTStylesheet& s)
   : AMathMLFactory(l), style(s)
-{
-  reset();
-}
-
-void
-CMathMLFactoryXSLTDiff::reset()
 {
   DOM::DOMImplementation di;
   DOM::DocumentType dt;
@@ -23,40 +17,27 @@ CMathMLFactoryXSLTDiff::reset()
 void
 CMathMLFactoryXSLTDiff::documentModified(TDocument& doc)
 {
-  if (TNode dirty = doc.dirtyNode()) 
-    {
-      std::vector< std::pair<DOM::GdomeString, DOM::GdomeString> > dirtyId;
-      if (false && result.get_documentElement().hasAttribute("xref"))
-       dirtyId.push_back(std::make_pair(DOM::GdomeString("id"),
-                                        DOM::GdomeString("'" + std::string(dirty["id"]) + "'")));
-      DOM::Document res = style.apply(doc.document(), dirtyId);
-      assert(res);
-      //cout << "*** THE DIRTY FRAGMENT HAS ID = " << std::string(dirty["id"]) << endl;
-      //style.save(doc.document(), stdout);
-      cout << "*** THE CURRENT DOCUMENT:" << endl;
-      if (result) style.save(result, stdout);
-      cout << "*** THE NEW DOCUMENT:" << endl;
-      style.save(res, stdout);
-      cout << "*** THE DIFF:" << endl;
-      DOMX::Diff diff = DOMX::Diff::diff(result, res);
-      style.save(diff.document(), stdout);
-      diff.patch();
 #if 0
-      DOM::Element root = res.get_documentElement();
-      assert(root);
-      assert(root.hasAttribute("xref"));
-      if (result.get_documentElement().hasAttribute("xref"))
-       {
-         bool ok = subst(result.get_documentElement(), root.getAttribute("xref"), result.importNode(root, true));
-         assert(ok);
-       }
-      else
-       result = res;
+  std::vector< std::pair<DOM::GdomeString, DOM::GdomeString> > dirtyId;
+  if (TNode dirty = doc.dirtyNode()) 
+    if (false && result.get_documentElement().hasAttribute("xref"))
+      dirtyId.push_back(std::make_pair(DOM::GdomeString("id"),
+                                      DOM::GdomeString("'" + std::string(dirty["id"]) + "'")));
 #endif
-      //style.save(result, stdout);
+  DOM::Document res = style.apply(doc.document());
+  assert(res);
+  //cout << "*** THE DIRTY FRAGMENT HAS ID = " << std::string(dirty["id"]) << endl;
+  //style.save(doc.document(), stdout);
+  cout << "*** THE CURRENT DOCUMENT:" << endl;
+  if (result) style.save(result, stdout);
+  cout << "*** THE NEW DOCUMENT:" << endl;
+  style.save(res, stdout);
+  cout << "*** THE DIFF:" << endl;
+  DOMX::Diff diff = DOMX::Diff::diff(result, res);
+  style.save(diff.document(), stdout);
+  diff.patch();
 
-      doc.clearDirty();
-    }
+  doc.clearDirty();
 }
 
 bool
index ac933b5d7c317659c8e13e90837452bfb9ba0159..fdc298f19b44e866f15436104ede620d539f7edb 100644 (file)
@@ -9,7 +9,6 @@ class CMathMLFactoryXSLTDiff : public AMathMLFactory
 public:
   CMathMLFactoryXSLTDiff(class ALogger&, const DOMX::XSLTStylesheet&);
 
-  virtual void reset(void);
   virtual void documentModified(class TDocument&);
   virtual DOM::Document document(void) const { return result; };
 
index 1466298b01723a9b6b73c67b464479532e874c3c..03ba29c0284b475353853a4494d97ee3b4f816e2 100644 (file)
@@ -1,5 +1,5 @@
 
-#ifndef __TPushLexer_hh__
+#ifndef __LPushLexer_hh__
 #define __LPushLexer_hh__
 
 #include <string>
index e578b79f46ae9d8411f3d00931c8c5dcbacac2e1..cbf163c7afc185b024d89098bd6c9a28b682dfaf 100644 (file)
@@ -27,6 +27,15 @@ TDocument::~TDocument()
   et.removeEventListener("DOMSubtreeModified", *this, false);
 }
 
+void
+TDocument::reset()
+{
+  DOM::Element root = doc.createElementNS(TML_NS_URI, "tml:tex");
+  root.setAttributeNS(XMLNS_NS_URI, "xmlns:tml", TML_NS_URI);
+  doc.replaceChild(root, doc.get_documentElement());
+  clearDirty();
+}
+
 void
 TDocument::serialize(const char* filename) const
 {
@@ -89,7 +98,7 @@ TDocument::findCommonAncestor(const DOM::Node& node1, const DOM::Node& node2)
   unsigned d1 = nodeDepth(n1);
   unsigned d2 = nodeDepth(n2);
 
-  cout << "finding common ancestor " << d1 << " " << d2 << endl;
+  // cout << "finding common ancestor " << d1 << " " << d2 << endl;
 
   while (d1 < d2)
     {
@@ -157,10 +166,12 @@ TDocument::handleEvent(const DOM::Event& ev)
   DOM::MutationEvent me(ev);
   assert(me);
 
+#if 0
   if (dirty)
     cout << "TDocument::handleEvent DIRTY BEFORE = " << dirty.getAttribute("id") << endl;
   else
     cout << "TDocument::handleEvent DIRTY BEFORE = (nil)" << endl;
+#endif
 
   if (DOM::Node node = me.get_target())
     if (dirty)
@@ -170,7 +181,8 @@ TDocument::handleEvent(const DOM::Event& ev)
   else
     assert(0);
 
+#if 0
   cout << "TDocument::handleEvent target = " << DOM::Node(me.get_target()).get_nodeName() << " DIRTY AFTER = "
        << dirty.getAttribute("id") << " ME = " << DOM::Node(me.get_target()).get_nodeName() << endl;
-  
+#endif
 }
index b1ca562c63431125a7f54a7b0919e8709a0f6afd..e1ef858927ba589e3631eedac90cef1feff50c97 100644 (file)
@@ -11,6 +11,7 @@ public:
   TDocument(void);
   ~TDocument();
 
+  void  reset(void);
   TNode create(const std::string&, unsigned = 0) const;
   TNode createG(unsigned id = 0) const { return create("g", id); };
   TNode createC(const std::string&, unsigned = 0) const;
index 836be35a894eeacd5c11727e5aad6d01d794a6ae..a3fb9772996a11becbd03e578b62b6badac40ca2 100644 (file)
@@ -5,27 +5,36 @@
 
 TPushParser::TPushParser(ALogger& l, const TDictionary& d) : APushParser(l), dictionary(d)
 {
-  reset();
+  init();
 }
 
 TPushParser::TPushParser(ALogger& l, AMathMLFactory& f, const TDictionary& d) : APushParser(l, f), dictionary(d)
 {
-  reset();
+  init();
 }
 
 TPushParser::~TPushParser()
 {
 }
 
+void
+TPushParser::init()
+{
+  cursor = doc.create("cursor");
+  cursor["visible"] = "1";
+  hiddenCursor = 0;
+  reset();
+}
+
 void
 TPushParser::reset()
 {
-  APushParser::reset();
+  cout << "passo di qui dentro pushparser " << factory << endl;
   nextId = 1;
-  cursor = doc.create("cursor");
-  cursor["id"] = "I0";
-  doc.clearDirty();
+  if (cursor.parent()) cursor.remove();
+  doc.reset();
   doc.root().append(cursor);
+  if (factory) factory->documentModified(doc);
 }
 
 std::string
@@ -1688,6 +1697,32 @@ TPushParser::setCursorHint(const std::string& c)
     }
 }
 
+bool
+TPushParser::hideCursor()
+{
+  if (hiddenCursor++ == 0)
+    {
+      cursor["visible"] = "0";
+      if (factory && doc.dirtyNode() && !frozen()) factory->documentModified(doc);
+      return true;
+    }
+  else
+    return false;
+}
+
+bool
+TPushParser::showCursor()
+{
+  if (hiddenCursor > 0 && --hiddenCursor == 0)
+    {
+      cursor["visible"] = "1";
+      if (factory && doc.dirtyNode() && !frozen()) factory->documentModified(doc);
+      return true;
+    }
+  else
+    return false;
+}
+
 bool
 TPushParser::thaw()
 {
index 186e9087a3ab1a156fab938d4da70085d8b67f3c..06020b52ff6b6b2ca14094a18c9a6ef4afeabb60 100644 (file)
@@ -21,12 +21,16 @@ public:
   virtual void push(const TToken&);
   virtual std::string drop(void);
   virtual void setCursorHint(const std::string&);
+  virtual bool hideCursor(void);
+  virtual bool showCursor(void);
 
   virtual bool thaw(void);
 
   DOM::Document document(void) const { return doc.document().cloneNode(true); }
 
 private:
+  void init(void);
+
   std::string PRIME(void) const;
   bool isPrimes(const TNode&) const;
 
@@ -82,6 +86,7 @@ private:
   unsigned  nextId;
   TDocument doc;
   TNode     cursor;
+  unsigned  hiddenCursor;
   const class TDictionary& dictionary;
 };
 
index 1002733a7a0ea1f4ea39adeb0154232b877995cd..a78b7cc5d6c129d25543ef6c6e993c3235fd9a40 100644 (file)
@@ -24,6 +24,12 @@ TTokenizer::tokenize(const std::string& s)
   return res;
 }
 
+void
+TTokenizer::reset()
+{
+  assert(0);
+}
+
 void
 TTokenizer::push(const TToken& token)
 {
index 62d08241c13d6af833440a7c97d203dc3240e0d7..da534fed7253c01e9f6f69e421f2bde1a8e89b37 100644 (file)
@@ -17,9 +17,12 @@ public:
   std::vector<TToken> tokenize(const std::string&);
 
 private:
+  virtual void reset(void);
   virtual void push(const TToken&);
   virtual std::string drop(void);
   virtual void setCursorHint(const std::string&) { };
+  virtual bool hideCursor(void) { return false; };
+  virtual bool showCursor(void) { return false; };
 
   std::list<TToken> tokens;
 };
index 6a37f8d48bde38eacc80bd0237202cf7ed210583..bdefc79b9449a71640ab469b7089241bd051b1ca 100644 (file)
@@ -3,4 +3,3 @@
 Makefile
 Makefile.in
 editor
-test
index 62435ca788e95322d9ca128f88231a17960039da..181dbf540657817d1421d9db1abaae7dd37a3401 100644 (file)
@@ -14,7 +14,8 @@ extern void *parseMathMLFile(char *);
 
 struct Context
 {
-  Context(const std::string& s, TPushLexer& l, TPushParser& p) : buffer(s), i(0), lexer(l), parser(p) { };
+  Context(const std::string& s, TPushLexer& l, TPushParser& p, DOMX::XSLTStylesheet& ts) 
+    : buffer(s), i(0), lexer(l), parser(p), texStyle(ts) { };
 
   void send(void)
   {
@@ -26,8 +27,22 @@ struct Context
   unsigned i;
   TPushLexer& lexer;
   TPushParser& parser;
+  DOMX::XSLTStylesheet& texStyle;
 };
 
+extern "C" void
+edit_output_tex(Context* data)
+{
+  assert(data);
+  DOM::Document res = data->texStyle.apply(data->parser.document());
+#if 0
+  res.normalize();
+  DOM::Node c = res.get_firstChild();
+  if (c) cout << "HEY, there is a child! " << c.get_nodeName() << " " << c.get_nodeValue() << endl;
+#endif
+  data->texStyle.save(res, stdout);
+}
+
 extern "C" int
 edit_timeout(Context* data)
 {
@@ -69,6 +84,16 @@ edit_drop(Context* context, gboolean alt)
   GUI_thaw();
 }
 
+extern "C" void
+edit_reset_tex(Context* context)
+{
+  assert(context != NULL);
+  GUI_freeze();
+  context->lexer.reset();
+  context->parser.reset();
+  GUI_thaw();
+}
+
 void
 main(int argc, char* argv[])
 {
@@ -81,10 +106,13 @@ main(int argc, char* argv[])
 
   logger.info("loading the stylesheet...");
   DOM::DOMImplementation di;
-  DOM::Document docStyle = di.createDocumentFromURI("./xsl/tml-mmlp.xsl");
-  DOMX::XSLTStylesheet style(docStyle);
+  DOM::Document mmlStyleDoc = di.createDocumentFromURI("./xsl/tml-mmlp.xsl");
+  DOMX::XSLTStylesheet mmlStyle(mmlStyleDoc);
+
+  DOM::Document texStyleDoc = di.createDocumentFromURI("./xsl/tml-tex.xsl");
+  DOMX::XSLTStylesheet texStyle(texStyleDoc);
 
-  CMathMLFactoryXSLTDiff factory(logger, style);
+  CMathMLFactoryXSLTDiff factory(logger, mmlStyle);
   TPushParser parser(logger, factory, dictionary);
   TPushLexer lexer(logger, parser);
 
@@ -101,7 +129,7 @@ main(int argc, char* argv[])
   style.save(result, stdout);
 #endif
 
-  Context context("", lexer, parser);
+  Context context("", lexer, parser, texStyle);
 
   GUI_init(&argc, &argv, "mathmleditor", 500, 600, &context);
   GUI_load_document(gdome_cast_doc(static_cast<GdomeNode*>(factory.document())));
index 7426e3f5db0da0ed6b629e8820fe46b0e192e9e3..306ec67facf52439422a7797db4c85984c9153bb 100644 (file)
@@ -48,6 +48,7 @@ static GtkWidget* get_main_menu(void);
 static void file_open(GtkWidget*, gpointer);
 static void file_re_open(GtkWidget*, gpointer);
 static void file_close(GtkWidget*, gpointer);
+static void file_output_tex(GtkWidget*, gpointer);
 static void options_font_manager(GtkWidget*, FontManagerId);
 static void options_set_font_size(GtkWidget*, gpointer);
 static void options_change_font_size(GtkWidget*, gboolean);
@@ -57,6 +58,7 @@ static void options_transparency(GtkWidget*, gpointer);
 static void edit_delete_selection(GtkWidget*, gpointer);
 static void edit_select_parent(GtkWidget*, gpointer);
 static void edit_reset_selection(GtkWidget*, gpointer);
+static void edit_reset(GtkWidget*, gpointer);
 static void edit_insert(GtkWidget*, gpointer);
 static void help_about(GtkWidget*, gpointer);
 
@@ -65,6 +67,7 @@ static GtkItemFactoryEntry menu_items[] = {
   { "/File/_Open...",                  "<control>O", file_open,     0, NULL },
   { "/File/_Reopen",                   NULL,         file_re_open,  0, NULL },
   { "/File/_Close",                    "<control>W", file_close,    0, NULL },
+  { "/File/Output _TeX",               NULL,         file_output_tex, 0, NULL },
   { "/File/sep1",                      NULL,         NULL,          0, "<Separator>" },
   { "/File/_Quit",                     "<control>Q", gtk_main_quit, 0, NULL },
 
@@ -73,6 +76,7 @@ static GtkItemFactoryEntry menu_items[] = {
   { "/Edit/Delete Selection",          NULL, edit_delete_selection, 0, NULL },
   { "/Edit/Select Parent",             NULL, edit_select_parent,    0, NULL },
   { "/Edit/sep1",                      NULL,         NULL,          0, "<Separator>" },
+  { "/Edit/_Reset",                    NULL, edit_reset,            0, NULL },
   { "/Edit/Insert...",                 "<control>I", edit_insert,   0, NULL },
 
   { "/_Options",                       NULL, NULL,                  0,  "<Branch>" },
@@ -298,6 +302,13 @@ file_open(GtkWidget* widget, gpointer data)
   gtk_widget_show (fs);
 }
 
+static void
+file_output_tex(GtkWidget* widget, gpointer data)
+{
+  g_assert(context != NULL);
+  edit_output_tex(context);
+}
+
 static void
 options_font_manager(GtkWidget* widget, FontManagerId id)
 {
@@ -369,6 +380,13 @@ edit_reset_selection(GtkWidget* widget, gpointer data)
     }
 }
 
+static void
+edit_reset(GtkWidget* widget, gpointer data)
+{
+  g_assert(context != NULL);
+  edit_reset_tex(context);
+}
+
 static void
 insert_tex(GtkWidget* widget, GtkEntry* entry)
 {
diff --git a/helm/DEVEL/mathml_editor/textomml/.cvsignore b/helm/DEVEL/mathml_editor/textomml/.cvsignore
new file mode 100644 (file)
index 0000000..c54770a
--- /dev/null
@@ -0,0 +1,6 @@
+.deps
+.libs
+Makefile
+Makefile.in
+textomml
+config.dirs
diff --git a/helm/DEVEL/mathml_editor/textomml/Makefile.am b/helm/DEVEL/mathml_editor/textomml/Makefile.am
new file mode 100644 (file)
index 0000000..d547d93
--- /dev/null
@@ -0,0 +1,17 @@
+
+bin_PROGRAMS = textomml
+
+textomml_SOURCES = main.cc
+
+LDADDS = \
+  $(GMETADOM_LIBS) \
+  $(GDOMEXSLT_LIBS) \
+  $(top_builddir)/src/.libs/libeditex.a
+
+textomml_LDADD = $(LDADDS)
+
+INCLUDES = \
+  $(GMETADOM_CFLAGS) \
+  $(GDOMEXSLT_CFLAGS) \
+  -I$(top_srcdir)/src
+
diff --git a/helm/DEVEL/mathml_editor/textomml/config.dirs.in b/helm/DEVEL/mathml_editor/textomml/config.dirs.in
new file mode 100644 (file)
index 0000000..4979189
--- /dev/null
@@ -0,0 +1 @@
+#define PKGDATADIR "@prefix@/share/@PACKAGE@"
diff --git a/helm/DEVEL/mathml_editor/textomml/main.cc b/helm/DEVEL/mathml_editor/textomml/main.cc
new file mode 100644 (file)
index 0000000..3774940
--- /dev/null
@@ -0,0 +1,168 @@
+
+#include <getopt.h>
+
+#include <fstream>
+
+#include "dom.hh"
+#include "TPushParser.hh"
+#include "TPushLexer.hh"
+#include "TDictionary.hh"
+#include "CLoggerConsole.hh"
+#include "CMathMLFactoryXSLT.hh"
+#include "CMathMLFactoryXSLTDiff.hh"
+#include "AMathMLConsumer.hh"
+
+#include "config.dirs"
+
+enum CommandLineOptionId {
+  OPTION_VERSION = 256,
+  OPTION_HELP,
+  OPTION_VERBOSE,
+  OPTION_DICTIONARY,
+  OPTION_TML_XSLT,
+  OPTION_XSLT
+};
+
+static std::string tml_xslt = PKGDATADIR"/tml-mmlp.xsl";
+static std::string dictionary = PKGDATADIR"/dictionary-tex.xml";
+static bool xslt = true;
+
+static bool
+parseBoolean(const char* s, bool& res)
+{
+  assert(s != NULL);
+  if (!strcmp(s, "yes")) {
+    res = true;
+    return true;
+  } else if (!strcmp(s, "no")) {
+    res = false;
+    return true;
+  }
+
+  return false;
+}
+
+static void
+printVersion()
+{
+  std::cout << "TeX to MathML converter " << VERSION << " - Luca Padovani (C) 2003" << std::endl
+           << "This program is covered by the GNU Lesser General Public Licence" << std::endl;
+}
+
+static void
+printHelp()
+{
+  static char* helpMsg = "\
+Usage: textomml [options] file\n\n\
+  -V, --version                   Output version information\n\
+  -h, --help                      This small usage guide\n\
+  -v, --verbose[=0-3]             Display messages\n\
+      --dictionary=<path>         Full path of the dictionary\n\
+      --tml-xslt=<path>           Full path of the XSLT stylesheet\n\
+      --xslt[=yes|no]             Enable/disable XSLT transformation (default='yes')\n\
+";
+
+  std::cout << helpMsg << std::endl;
+  exit(0);
+}
+
+static void
+parseError(const char* option)
+{
+  assert(option != NULL);
+  std::cerr << "error while parsing option `" << option << "'" << std::endl << std::endl;
+  printHelp();
+}
+
+void
+main(int argc, char* argv[])
+{
+  CLoggerConsole logger;
+
+  while (TRUE) {
+    int option_index = 0;
+    static struct option long_options[] =
+    {
+      { "version",      no_argument,       NULL, OPTION_VERSION },
+      { "help",         no_argument,       NULL, OPTION_HELP },
+      { "verbose",       optional_argument, NULL, OPTION_VERBOSE },
+      { "dictionary",    required_argument, NULL, OPTION_DICTIONARY },
+      { "tml-xslt",      required_argument, NULL, OPTION_TML_XSLT },
+      { "xslt",          optional_argument, NULL, OPTION_XSLT },
+
+      { NULL,            no_argument, NULL, 0 }
+    };
+
+    int c = getopt_long(argc, argv, "Vhv::", long_options, &option_index);
+
+    if (c == -1) break;
+
+    switch (c) {
+    case OPTION_VERSION:
+    case 'V':
+      printVersion();
+      break;
+
+    case OPTION_HELP:
+    case 'h':
+      printHelp();
+      break;
+
+    case OPTION_VERBOSE:
+    case 'v':
+      if (optarg == NULL) logger.verbosity(ALogger::Warning);
+      else logger.verbosity(ALogger::Level(*optarg - '0'));
+      break;
+
+    case OPTION_DICTIONARY:
+      dictionary = optarg;
+      break;
+
+    case OPTION_TML_XSLT:
+      tml_xslt = optarg;
+      break;
+
+    case OPTION_XSLT:
+      if (optarg == NULL) printHelp();
+      else if (!parseBoolean(optarg, xslt)) parseError("xslt");
+      break;
+
+    case '?':
+      break;
+
+    default:
+      std::cerr << "*** getopt returned `" << c << "' value" << std::endl;
+      break;
+    }
+  }
+
+  TDictionary dict(logger);
+  logger.info("loading dictionary: `" + dictionary + "'");
+  dict.load("dictionary-test.xml");
+
+  logger.info("loading stylesheet: `" + tml_xslt + "'");
+  DOM::DOMImplementation di;
+  DOM::Document docStyle = di.createDocumentFromURI("./xsl/tml-mmlp.xsl");
+  DOMX::XSLTStylesheet style(docStyle);
+
+  CMathMLFactoryXSLT factory(logger, style);
+  TPushParser parser(logger, factory, dict);
+  TPushLexer lexer(logger, parser);
+
+  if (optind < argc)
+    {
+      ifstream file(argv[optind]);
+      if (!file)
+       {
+         std::cerr << "can't open input file `" << argv[optind] << "'" << std::endl;
+         exit(1);
+       }
+      
+      parser.freeze();
+      char ch;
+      while (file.get(ch)) lexer.push(ch);
+      parser.thaw();
+    }
+  else
+    printHelp();
+}
index 8736053872db15bd8c9b00518b0d4cd910786493..34f44b3e80a3ffad4ab6b802d268b8f681d72246 100644 (file)
@@ -93,7 +93,7 @@
     </xsl:choose>
   </xsl:template>
 
-  <xsl:template match="tml:cursor">
+  <xsl:template match="tml:cursor[@visible='1']">
     <xsl:param name="annotation" select="/.."/>
     <xsl:choose>
       <xsl:when test="$annotation">
     </xsl:choose>
   </xsl:template>
 
+  <xsl:template match="tml:cursor[not(@visible) or @visible='0']">
+  </xsl:template>
+
   <xsl:template match="tml:sb[@under='1'][*[1]/tml:sp[@over='1']]">
     <m:munderover>
       <xsl:if test="@id">
         </xsl:attribute>
       </xsl:if>
       <xsl:apply-templates select="*[1]"/>
-      <xsl:if test="tml:g/tml:cursor">
+      <xsl:if test="tml:g/tml:cursor[@visible='1']">
         <m:msub>
           <m:mtext mathcolor="#808080">}</m:mtext>
          <m:mtext><xsl:value-of select="@name"/></m:mtext>
index f3ba8d5cede319821469bd482e31ea2dc4470fe3..a8b9878d82f74258ed9e55182e39468f19e5668a 100644 (file)
@@ -34,7 +34,9 @@
 
   <xsl:template match="tml:i">
     <xsl:choose>
-      <xsl:when test="@name">\<xsl:value-of select="@name"/><xsl:value-of select="' '"/></xsl:when>
+      <xsl:when test="@name">\<xsl:value-of select="@name"/>
+        <xsl:if test="parent::tml:g and following-sibling::tml:i"><xsl:value-of select="' '"/></xsl:if>
+      </xsl:when>
       <xsl:when test="string-length(@val)=1"><xsl:value-of select="@val"/></xsl:when>
       <xsl:otherwise>{\it <xsl:value-of select="@val"/>}</xsl:otherwise>
     </xsl:choose>
@@ -42,7 +44,9 @@
 
   <xsl:template match="tml:n">
     <xsl:choose>
-      <xsl:when test="@name">\<xsl:value-of select="@name"/><xsl:value-of select="' '"/></xsl:when>
+      <xsl:when test="@name">\<xsl:value-of select="@name"/>
+        <xsl:if test="parent::tml:g and following-sibling::tml:n"><xsl:value-of select="' '"/></xsl:if>
+      </xsl:when>
       <xsl:when test="string-length(@val)=1"><xsl:value-of select="@val"/></xsl:when>
       <xsl:otherwise>{\rm <xsl:value-of select="@val"/>}</xsl:otherwise>
     </xsl:choose>