//Commentary:

// Expose a simple REPL as a server to emacspeak-maths.
// Usage Model:
// The Emacs  client sends requests of the form:
// command: args --- where args are comma-separated.
// The server responds with a Lisp S-expression.
// This S-expression is an annotated string.
// Annotations are ACSS property/value specifications.
// At any given time, the server loop is working with a given math expression,
// Emacs issues browse/render commands against that expression.

// Code:

// Load the TCP Library
net = require('net');

// Initialize Math rendering system.
var mjx = require('mathjax-node');
var sre = require('speech-rule-engine');
sre.setupEngine({markup: 'acss'});


// Handle to connected Emacspeak-maths client:
var client;

// table of request handlers:

var handlers = {};

// Add the various handlers:

// Accept a LaTeX math expression:
//Warning: this errors out.

handlers.enter = function (expr) {
  mjx.typeset({math: expr,
               format: 'TeX',
               mml:true},
              function(data) {sre.walk(data.mml)}
             );
  // Find a better alternative to passing raw kbd values.
  sre.move(9);
  return "done";
}

// Implement Handlers:
handlers.up = function () {};
handlers.down = fucntion () {};
handlers.left = function () {};
handlers.right = function () {};
handlers.repeat = function () {};

// Start a TCP Server
net.createServer(function (socket) {
  // Identify this client
  socket.name = socket.remoteAddress + ":" + socket.remotePort 

  // Record this client:
  client = socket;

  // Send a nice welcome message and announce
  socket.write("Welcome " + socket.name + "\n");
  // Handle incoming messages from Emacs:.
  socket.on('data', function (data) {
    respond(data, socket);
  });

  // Shutdown server on disconnect:
  socket.on('end', function () {
    
    // server.shutdown();
  });
  
  // Send out response:
  function respond(message, sender ) {
    // ToDo: write handlers for the different actions:
    var result =handlers.enter(message);
    sender.write(result);
    // Debug: Log it to the server output too
    process.stdout.write(result);
  }

}).listen(5000);

// Put a friendly message on the terminal of the server.
console.log("Math server running at port 5000\n");

@@ -509,16 +509,20 @@
 Library%0A
+var 
 net = re
@@ -1166,16 +1166,17 @@
 done%22;%0A%7D
+;
 %0A%0A// Imp
@@ -1244,10 +1244,10 @@
 = fu
-c
 n
+c
 tion
@@ -1558,48 +1558,26 @@
  // 
-Send a nice welcome message and announce
+Announce yourself:
 %0A  s
@@ -1663,17 +1663,17 @@
 m Emacs:
-.
+:
 %0A  socke
@@ -1810,13 +1810,8 @@
 ) %7B%0A
-    %0A
     
@@ -1915,55 +1915,167 @@
  // 
-ToDo: write handlers for the different actions:
+handle requests that have single argument for now:%0A    var request = message.split(':');%0A    var handler =handlers%5Brequest%5B0%5D%5D;%0A    if (handler != undefined) %7B
 %0A   
@@ -2091,30 +2091,33 @@
 lt =
+ 
 handler
-s.enter(message
+.apply(request%5B1%5D
 );%0A 
@@ -2221,16 +2221,110 @@
 esult);%0A
+      %7D else %7B%0A        process.stdout.write(%22Handler %22 + handler +%22not defined. %22);%0A        %7D%0A
   %7D%0A%0A%7D).

check datatype of data -- doesn't work like a string