var vari = this.variables[name];
vari.val = values[name];
}
- }
+ },
+
+ Trace: function () {}
};
Xex.Term = function (type) { this.type = type; }
proto.Eval = function (domain)
{
- return this.func.Call (domain, this.vari, this.args);
+ domain.Trace (this);
+ domain.depth++;
+ try {
+ var result = this.func.Call (domain, this.vari, this.args);
+ } finally {
+ domain.depth--;
+ domain.Trace (' => ' + result + "\n");
+ }
+ return result;
}
proto.Clone = function ()
MIM.State.prototype = proto;
}) ();
+(function () {
+ function Block (index, term)
+ {
+ this.Index = index;
+ if (term.IsStr)
+ this.Data = term.val;
+ else if (term.IsList)
+ {
+ this.Data = new Array ();
+ for (var i = 0; i < term.val.length; i++)
+ this.Data.push (term.val[i].val);
+ }
+ }
+
+ Block.prototype.Count = function () { return this.Data.length; }
+ Block.prototype.get = function (i)
+ {
+ return (this.Data instanceof Array ? this.Data[i] : this.Data.charAt (i));
+ }
+
+ MIM.Candidates = function (candidates, column)
+ {
+ this.column = column;
+ this.row = 0;
+ this.index = 0;
+ this.total = 0;
+ this.blocks = new Array ();
+
+ for (var i = 0; i < candidates.length; i++)
+ {
+ var block = new Block (this.total, candidates[i]);
+ this.blocks.push (block);
+ this.total += block.Count ();
+ }
+ }
+
+ function get_col ()
+ {
+ return (this.column > 0 ? this.index % this.column
+ : this.index - this.blocks[this.row].Index);
+ }
+
+ function prev_group ()
+ {
+ var col = get_col.call (this);
+ var nitems;
+ if (this.column > 0)
+ {
+ this.index -= this.column;
+ if (this.index >= 0)
+ nitems = this.column;
+ else
+ {
+ var lastcol = (this.total - 1) % this.column;
+ this.index = (col < lastcol ? this.total - lastcol + col
+ : this.total - 1);
+ this.row = this.blocks.length - 1;
+ nitems = lastcol + 1;
+ }
+ while (this.blocks[this.row].Index > this.index)
+ this.row--;
+ }
+ else
+ {
+ this.row = this.row > 0 ? this.row - 1 : this.blocks.length - 1;
+ nitems = this.blocks[this.row].Count ();
+ this.index = (this.blocks[this.row].Index
+ + (col < nitems ? col : nitems - 1));
+ }
+ return nitems;
+ }
+
+ function next_group ()
+ {
+ var col = get_col.call (this);
+ var nitems;
+ if (this.column > 0)
+ {
+ this.index += this.column - col;
+ if (this.index < this.total)
+ {
+ if (this.index + col >= this.total)
+ {
+ nitems = this.total - this.index;
+ this.index = this.total - 1;
+ }
+ else
+ {
+ nitems = this.column;
+ this.index += col;
+ }
+ }
+ else
+ {
+ this.index = col;
+ this.row = 0;
+ }
+ while (this.blocks[this.row].Index > this.index)
+ this.row++;
+ }
+ else
+ {
+ this.row = this.row < this.blocks.length - 1 ? this.row + 1 : 0;
+ nitems = this.blocks[this.row].Count ();
+ this.index = (this.blocks[this.row].Index
+ + (col < nitems ? col : nitems - 1));
+ }
+ return nitems;
+ }
+
+ function prev ()
+ {
+ if (this.index == 0)
+ {
+ this.index = this.total - 1;
+ this.row = this.blocks.length - 1;
+ }
+ else
+ {
+ this.index--;
+ if (this.blocks[this.row].Index > this.index)
+ this.row--;
+ }
+ }
+
+ function next ()
+ {
+ this.index++;
+ if (this.index == this.total)
+ {
+ this.index = 0;
+ this.row = 0;
+ }
+ else
+ {
+ var b = this.blocks[this.row];
+ if (this.index == b.Index + b.Count ())
+ this.row++;
+ }
+ }
+
+ function first ()
+ {
+ this.index -= get_col.call (this);
+ while (this.blocks[this.row].Index > this.index)
+ this.row--;
+ }
+
+ function last ()
+ {
+ var b = this.blocks[this.row];
+ if (this.column > 0)
+ {
+ if (this.index + 1 < this.total)
+ {
+ this.index += this.column - get_col.call (this) + 1;
+ while (b.Index + b.Count () <= this.index)
+ b = this.blocks[++this.row];
+ }
+ }
+ else
+ this.index = b.Index + b.Count () - 1;
+ }
+
+ MIM.Candidates.prototype.Current = function ()
+ {
+ var b = this.blocks[this.row];
+ return b.get (this.index - b.Index);
+ }
+
+ MIM.Candidates.prototype.Select = function (selector)
+ {
+ if (selector.type == 'selector')
+ {
+ switch (selector.val)
+ {
+ case '@<': first.call (this); break;
+ case '@>': last.call (this); break;
+ case '@-': prev.call (this); break;
+ case '@+': next.call (this); break;
+ case '@[': prev_group.call (this); break;
+ case '@]': next_group.cal (this); break;
+ default: break;
+ }
+ return this.Current ();
+ }
+ var col, start, end
+ if (this.column > 0)
+ {
+ col = this.index % this.column;
+ start = this.index - col;
+ end = start + this.column;
+ }
+ else
+ {
+ start = this.blocks[this.row].Index;
+ col = this.index - start;
+ end = start + this.blocks[this.row].Count;
+ }
+ if (end > this.total)
+ end = this.total;
+ this.index += selector.val - col;
+ if (this.index >= end)
+ this.index = end - 1;
+ if (this.column > 0)
+ {
+ if (selector.val > col)
+ while (this.blocks[this.row].Index + this.blocks[this.row].Count
+ < this.index)
+ this.row++;
+ else
+ while (this.blocks[this.row].Index > this.index)
+ this.row--;
+ }
+ return this.Current ();
+ }
+}) ();
+
MIM.im_domain = new Xex.Domain ('input-method', null, null);
MIM.im_domain.DefType (MIM.KeySeq.prototype);
MIM.im_domain.DefType (MIM.Marker.prototype);
MIM.im_domain.DefType (MIM.Map.prototype);
MIM.im_domain.DefType (MIM.State.prototype);
+MIM.im_domain.Trace = function (arg)
+{
+ var node = document.getElementById ('log');
+ if (node)
+ node.value = "" + arg + node.value;
+};
+
(function () {
var im_domain = MIM.im_domain;
this.table.length = 0;
}
- function Block (index, term)
- {
- this.Index = index;
- if (term.IsStr)
- this.Data = term.val;
- else if (term.IsList)
- {
- this.Data = new Array ();
- for (var i = 0; i < term.val.length; i++)
- this.Data.push (term.val[i].val);
- }
- }
-
- Block.prototype.Count = function () { return this.Data.length; }
- Block.prototype.get = function (i)
- {
- return (this.Data instanceof Array ? this.Data[i] : this.Data.charAt (i));
- }
-
- function fill_group (start)
- {
- var nitems = this.group.length;
- var r = this.row;
- var b = this.blocks[r];
-
- if (start < b.Index)
- while (start < b.Index)
- b = this.blocks[--r];
- else
- while (start >= b.Index + b.Count ())
- b = this.blocks[++r];
- this.row = r;
-
- var count = b.Count ();
- start -= b.Index;
- for (var i = 0; i < nitems; i++, start++)
- {
- if (start >= count)
- {
- r++;
- if (r == this.blocks.Length)
- return i;
- b = this.blocks[r];
- count = b.Count ();
- start = 0;
- }
- this.group[i] = b.get (start);
- }
- return nitems;
- }
-
- function Candidates (candidates, column)
- {
- this.column = column;
- this.row = 0;
- this.index = 0;
- this.total = 0;
- this.blocks = new Array ();
-
- for (var i = 0; i < candidates.length; i++)
- {
- var block = new Block (this.total, candidates[i]);
- this.blocks.push (block);
- this.total += block.Count ();
- }
- }
-
- Candidates.prototype.Column = function ()
- {
- return (this.column > 0 ? this.index % this.column
- : this.index - this.blocks[this.row].Index);
- }
-
- Candidates.prototype.GroupLength = function ()
- {
- if (this.column > 0)
- {
- var start = this.index - (this.index % this.column);
- return (start + this.column <= this.total ? this.column
- : this.total - start);
- }
- return this.blocks[this.row].Count;
- }
-
- Candidates.prototype.Current = function ()
- {
- var b = this.blocks[this.row];
- return b.get (this.index - b.Index);
- }
-
- Candidates.prototype.PrevGroup = function ()
- {
- var col = this.Column ();
- var nitems;
- if (this.column > 0)
- {
- this.index -= this.column;
- if (this.index >= 0)
- nitems = this.column;
- else
- {
- var lastcol = (this.total - 1) % this.column;
- this.index = (col < lastcol ? this.total - lastcol + col
- : this.total - 1);
- this.row = this.blocks.length - 1;
- nitems = lastcol + 1;
- }
- while (this.blocks[this.row].Index > this.index)
- this.row--;
- }
- else
- {
- this.row = this.row > 0 ? this.row - 1 : this.blocks.length - 1;
- nitems = this.blocks[this.row].Count ();
- this.index = (this.blocks[this.row].Index
- + (col < nitems ? col : nitems - 1));
- }
- return nitems;
- }
-
- Candidates.prototype.NextGroup = function ()
- {
- var col = this.Column ();
- var nitems;
- if (this.column > 0)
- {
- this.index += this.column - col;
- if (this.index < this.total)
- {
- if (this.index + col >= this.total)
- {
- nitems = this.total - this.index;
- this.index = this.total - 1;
- }
- else
- {
- nitems = this.column;
- this.index += col;
- }
- }
- else
- {
- this.index = col;
- this.row = 0;
- }
- while (this.blocks[this.row].Index > this.index)
- this.row++;
- }
- else
- {
- this.row = this.row < this.blocks.length - 1 ? this.row + 1 : 0;
- nitems = this.blocks[this.row].Count ();
- this.index = (this.blocks[this.row].Index
- + (col < nitems ? col : nitems - 1));
- }
- return nitems;
- }
-
- Candidates.prototype.Prev = function ()
- {
- if (this.index == 0)
- {
- this.index = this.total - 1;
- this.row = this.blocks.length - 1;
- }
- else
- {
- this.index--;
- if (this.blocks[this.row].Index > this.index)
- this.row--;
- }
- }
-
- Candidates.prototype.Next = function ()
- {
- this.index++;
- if (this.index == this.total)
- {
- this.index = 0;
- this.row = 0;
- }
- else
- {
- var b = this.blocks[this.row];
- if (this.index == b.Index + b.Count ())
- this.row++;
- }
- }
-
- Candidates.prototype.First = function ()
- {
- this.index -= this.Column ();
- while (this.blocks[this.row].Index > this.index)
- this.row--;
- }
-
- Candidates.prototype.Last = function ()
- {
- var b = this.blocks[this.row];
- if (this.column > 0)
- {
- if (this.index + 1 < this.total)
- {
- this.index += this.column - this.Column () + 1;
- while (b.Index + b.Count () <= this.index)
- b = this.blocks[++this.row];
- }
- }
- else
- this.index = b.Index + b.Count () - 1;
- }
-
- Candidates.prototype.Select = function (selector)
- {
- if (selector.type == 'selector')
- {
- switch (selector.val)
- {
- case '@<': this.First (); break;
- case '@>': this.Last (); break;
- case '@-': this.Prev (); break;
- case '@+': this.Next (); break;
- case '@[': this.PrevGroup (); break;
- case '@]': this.NextGroup (); break;
- default: break;
- }
- return this.Current ();
- }
- var col, start, end
- if (this.column > 0)
- {
- col = this.index % this.column;
- start = this.index - col;
- end = start + this.column;
- }
- else
- {
- start = this.blocks[this.row].Index;
- col = this.index - start;
- end = start + this.blocks[this.row].Count;
- }
- if (end > this.total)
- end = this.total;
- this.index += selector.val - col;
- if (this.index >= end)
- this.index = end - 1;
- if (this.column > 0)
- {
- if (selector.val > col)
- while (this.blocks[this.row].Index + this.blocks[this.row].Count
- < this.index)
- this.row++;
- else
- while (this.blocks[this.row].Index > this.index)
- this.row--;
- }
- return this.Current ();
- }
-
function detach_candidates (ic)
{
ic.candidate_table.clear ();
var sub = out.map;
var branch_actions = this.state.keymap.actions;
- MIM.log ('handling ' + this.keys.val[this.key_head]
- + ' in ' + this.state.name + ':' + this.keymap.name);
+ this.domain.Trace ('handling ' + this.keys.val[this.key_head]
+ + ' in ' + this.state.name + ':'
+ + this.keymap.name + "\n");
this.key_head = out.index;
if (sub != this.keymap)
{
restore_state.call (this);
this.keymap = sub;
- MIM.log ('submap found');
+ this.domain.Trace ('submap found\n');
if (this.keymap.actions)
{
- MIM.log ('taking map actions:');
+ this.domain.Trace ('taking map actions:\n');
if (! this.take_actions (this.keymap.actions))
return false;
}