Initial Commit -> Text collaboration works

This commit is contained in:
Kevin Jahns 2014-07-29 21:29:10 +02:00
commit b91135157e
79 changed files with 34627 additions and 0 deletions

3
.directory Normal file
View File

@ -0,0 +1,3 @@
[Dolphin]
Timestamp=2014,7,25,13,13,54
Version=3

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/node_modules/

4
.kateproject Normal file
View File

@ -0,0 +1,4 @@
{
"name": "Yatta!"
, "files": [ { "git": 1 } ]
}

0
.kateproject.d/notes.txt Normal file
View File

92
Gruntfile.coffee Normal file
View File

@ -0,0 +1,92 @@
"use strict"
module.exports = (grunt) ->
# Project configuration.
grunt.initConfig
coffee:
lib:
options:
bare: true
sourceMap: true
expand: true
src: ["lib/**/*.coffee"]
dest: "dest/lib"
ext: ".js"
test:
#options:
#bare: true
expand: true
src: ["test/**/*.coffee"]
dest: "dest/test"
ext: ".js"
watch:
lib:
files: [
"<%= coffee.lib.src %>"
]
tasks: ["coffee:lib"]
test:
files: [
"<%= coffee.lib.src %>"
"<%= coffee.test.src %>"
]
tasks: ["coffeelint", "coffee", "browserify", "test", "codo"]
simplemocha:
all:
src: ['test/**/*.coffee']
options:
timeout: 3000
ignoreLeaks: false
ui: 'bdd'
reporter: 'list'
compilers: 'coffee:coffee-script'
pkg: grunt.file.readJSON('package.json')
coffeelint:
app: [
'lib/**/*.coffee'
'test/**/.coffee'
"Gruntfile.coffee"
]
options:
"indentation":
"level": "ignore"
"no_trailing_whitespace":
"level": "warn"
"max_line_length":
"level": "ignore"
#"line_endings":
# "level": "error"
codo:
options:
name: "Yatta!"
title: "Yatta! Documentation"
extras: ["LICENSE-LGPL"]
#undocumented: yes
verbose: false
stats: false
src: ["./lib"]
browserify:
dist:
files:
'dest/browser/Yatta.js': ['lib/index.coffee']
'dest/browser/Yatta_test.js': ['test/**/*.coffee']
options:
transform: ['coffeeify']
debug: true
bundleOptions: {debug: true}
# These plugins provide necessary tasks.
grunt.loadNpmTasks "grunt-browserify"
grunt.loadNpmTasks "grunt-contrib-coffee"
grunt.loadNpmTasks "grunt-contrib-watch"
grunt.loadNpmTasks "grunt-simple-mocha"
grunt.loadNpmTasks "grunt-coffeelint"
grunt.loadNpmTasks "grunt-codo"
grunt.registerTask "default", ["coffee","coffeelint", "browserify", "simplemocha", "watch"]
grunt.registerTask "production", ["coffee"]
grunt.registerTask "test", ["simplemocha"]

165
LICENSE-LGPL Normal file
View File

@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

4
README.md Normal file
View File

@ -0,0 +1,4 @@
# Yatta!
A Collaboration Framework for arbitrary data structures that is _not_ based on the Operational Transformation.

1
dest/browser/Yatta.js Normal file
View File

@ -0,0 +1 @@
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({},{},[])

View File

@ -0,0 +1,17 @@
<html>
<head>
<meta charset="utf-8">
<title>Test GOTOjs</title>
<link rel="stylesheet" href="../../node_modules/mocha/mocha.css" />
</head>
<body>
<div id="mocha"></div>
<script src="../../node_modules/mocha/mocha.js"></script>
<script>mocha.setup('bdd')</script>
<script src="Yatta_test.js"></script>
<script>
mocha.checkLeaks();
mocha.run();
</script>
</body>
</html>

13099
dest/browser/Yatta_test.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,94 @@
var _;
_ = require("underscore");
module.exports = function(user_list) {
var TestConnector;
return TestConnector = (function() {
function TestConnector(engine, HB, execution_listener) {
var appliedOperationsListener, send_;
this.engine = engine;
this.HB = HB;
this.execution_listener = execution_listener;
send_ = (function(_this) {
return function(o) {
return _this.send(o);
};
})(this);
this.execution_listener.push(send_);
if (!((user_list != null ? user_list.length : void 0) === 0)) {
this.engine.applyOps(user_list[0].getHistoryBuffer().toJson());
}
this.unexecuted = {};
this.applied_operations = [];
appliedOperationsListener = (function(_this) {
return function(o) {
return _this.applied_operations.push(o);
};
})(this);
this.execution_listener.push(appliedOperationsListener);
}
TestConnector.prototype.getOpsInExecutionOrder = function() {
return this.applied_operations;
};
TestConnector.prototype.getRootElement = function() {
if (user_list.length > 0) {
return user_list[0].getRootElement();
}
};
TestConnector.prototype.send = function(o) {
var user, _i, _len, _results;
if (o.creator === this.HB.getUserId()) {
_results = [];
for (_i = 0, _len = user_list.length; _i < _len; _i++) {
user = user_list[_i];
if (!user.getUserId() === this.HB.getUserId()) {
_results.push(user.getConnector().receive(o));
} else {
_results.push(void 0);
}
}
return _results;
}
};
TestConnector.prototype.receive = function(o) {
var _base, _name;
if ((_base = this.unexecuted)[_name = o.creator] == null) {
_base[_name] = [];
}
return this.unexecuted[o.creator].push(o);
};
TestConnector.prototype.flushOne = function(user) {
var _ref;
if (((_ref = this.unexecuted[user]) != null ? _ref.length : void 0) > 0) {
return this.engine.applyOp(this.unexecuted[user].shift());
}
};
TestConnector.prototype.flushOneRandom = function() {
return this.flushOne(_.random(0, user_list.length - 1));
};
TestConnector.prototype.flushAll = function() {
var ops;
for (ops in this.unexecuted) {
this.engine.applyOps(ops);
}
return this.unexecuted = {};
};
TestConnector.prototype.sync = function() {
throw new Error("Can't use this a.t.m.");
};
return TestConnector;
})();
};
//# sourceMappingURL=TestConnector.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "TestConnector.js",
"sourceRoot": "../../../../lib/Connectors/",
"sources": [
"TestConnector.coffee"
],
"names": [],
"mappings": "AACA,IAAA,CAAA;;AAAA,CAAA,GAAI,OAAA,CAAQ,YAAR,CAAJ,CAAA;;AAAA,MAEM,CAAC,OAAP,GAAiB,SAAC,SAAD,GAAA;AACf,MAAA,aAAA;SAAM;AACS,IAAA,uBAAE,MAAF,EAAW,EAAX,EAAgB,kBAAhB,GAAA;AACX,UAAA,gCAAA;AAAA,MADY,IAAC,CAAA,SAAA,MACb,CAAA;AAAA,MADqB,IAAC,CAAA,KAAA,EACtB,CAAA;AAAA,MAD0B,IAAC,CAAA,qBAAA,kBAC3B,CAAA;AAAA,MAAA,KAAA,GAAQ,CAAA,SAAA,KAAA,GAAA;eAAA,SAAC,CAAD,GAAA;iBACN,KAAC,CAAA,IAAD,CAAM,CAAN,EADM;QAAA,EAAA;MAAA,CAAA,CAAA,CAAA,IAAA,CAAR,CAAA;AAAA,MAEA,IAAC,CAAA,kBAAkB,CAAC,IAApB,CAAyB,KAAzB,CAFA,CAAA;AAIA,MAAA,IAAG,CAAA,sBAAK,SAAS,CAAE,gBAAX,KAAqB,CAAtB,CAAP;AACE,QAAA,IAAC,CAAA,MAAM,CAAC,QAAR,CAAiB,SAAU,CAAA,CAAA,CAAE,CAAC,gBAAb,CAAA,CAA+B,CAAC,MAAhC,CAAA,CAAjB,CAAA,CADF;OAJA;AAAA,MAOA,IAAC,CAAA,UAAD,GAAc,EAPd,CAAA;AAAA,MAQA,IAAC,CAAA,kBAAD,GAAsB,EARtB,CAAA;AAAA,MAUA,yBAAA,GAA4B,CAAA,SAAA,KAAA,GAAA;eAAA,SAAC,CAAD,GAAA;iBAC1B,KAAC,CAAA,kBAAkB,CAAC,IAApB,CAAyB,CAAzB,EAD0B;QAAA,EAAA;MAAA,CAAA,CAAA,CAAA,IAAA,CAV5B,CAAA;AAAA,MAYA,IAAC,CAAA,kBAAkB,CAAC,IAApB,CAAyB,yBAAzB,CAZA,CADW;IAAA,CAAb;;AAAA,4BAeA,sBAAA,GAAwB,SAAA,GAAA;aACtB,IAAC,CAAA,mBADqB;IAAA,CAfxB,CAAA;;AAAA,4BAkBA,cAAA,GAAgB,SAAA,GAAA;AACd,MAAA,IAAG,SAAS,CAAC,MAAV,GAAmB,CAAtB;eACE,SAAU,CAAA,CAAA,CAAE,CAAC,cAAb,CAAA,EADF;OADc;IAAA,CAlBhB,CAAA;;AAAA,4BAsBA,IAAA,GAAM,SAAC,CAAD,GAAA;AACJ,UAAA,wBAAA;AAAA,MAAA,IAAG,CAAC,CAAC,OAAF,KAAa,IAAC,CAAA,EAAE,CAAC,SAAJ,CAAA,CAAhB;AACE;aAAA,gDAAA;+BAAA;AACE,UAAA,IAAG,CAAA,IAAQ,CAAC,SAAL,CAAA,CAAJ,KAAwB,IAAC,CAAA,EAAE,CAAC,SAAJ,CAAA,CAA3B;0BACE,IAAI,CAAC,YAAL,CAAA,CAAmB,CAAC,OAApB,CAA4B,CAA5B,GADF;WAAA,MAAA;kCAAA;WADF;AAAA;wBADF;OADI;IAAA,CAtBN,CAAA;;AAAA,4BA4BA,OAAA,GAAS,SAAC,CAAD,GAAA;AACP,UAAA,YAAA;;uBAA0B;OAA1B;aACA,IAAC,CAAA,UAAW,CAAA,CAAC,CAAC,OAAF,CAAU,CAAC,IAAvB,CAA4B,CAA5B,EAFO;IAAA,CA5BT,CAAA;;AAAA,4BAgCA,QAAA,GAAU,SAAC,IAAD,GAAA;AACR,UAAA,IAAA;AAAA,MAAA,kDAAoB,CAAE,gBAAnB,GAA4B,CAA/B;eACE,IAAC,CAAA,MAAM,CAAC,OAAR,CAAgB,IAAC,CAAA,UAAW,CAAA,IAAA,CAAK,CAAC,KAAlB,CAAA,CAAhB,EADF;OADQ;IAAA,CAhCV,CAAA;;AAAA,4BAoCA,cAAA,GAAgB,SAAA,GAAA;aACd,IAAC,CAAA,QAAD,CAAW,CAAC,CAAC,MAAF,CAAS,CAAT,EAAa,SAAS,CAAC,MAAV,GAAiB,CAA9B,CAAX,EADc;IAAA,CApChB,CAAA;;AAAA,4BAuCA,QAAA,GAAU,SAAA,GAAA;AACR,UAAA,GAAA;AAAA,WAAA,sBAAA,GAAA;AACE,QAAA,IAAC,CAAA,MAAM,CAAC,QAAR,CAAiB,GAAjB,CAAA,CADF;AAAA,OAAA;aAEA,IAAC,CAAA,UAAD,GAAc,GAHN;IAAA,CAvCV,CAAA;;AAAA,4BA4CA,IAAA,GAAM,SAAA,GAAA;AACJ,YAAU,IAAA,KAAA,CAAM,uBAAN,CAAV,CADI;IAAA,CA5CN,CAAA;;yBAAA;;OAFa;AAAA,CAFjB,CAAA"
}

56
dest/lib/lib/Engine.js Normal file
View File

@ -0,0 +1,56 @@
var Engine, _;
_ = require("underscore");
Engine = (function() {
function Engine(HB, parser) {
this.HB = HB;
this.parser = parser;
this.unprocessed_ops = [];
}
Engine.prototype.parseOperation = function(json) {
var typeParser;
typeParser = this.parser[json.type];
if (typeParser != null) {
return typeParser(json);
} else {
throw new Error("You forgot to specify a parser for type " + json.type + ". The message is " + (JSON.stringify(json)) + ".");
}
};
Engine.prototype.applyOps = function(ops) {
var o, _i, _len, _results;
_results = [];
for (_i = 0, _len = ops.length; _i < _len; _i++) {
o = ops[_i];
_results.push(this.applyOp(o));
}
return _results;
};
Engine.prototype.applyOp = function(op_json) {
var o, op, unprocessed, _i, _len, _ref;
o = this.parseOperation(o_json);
this.HB.addOperation(o);
if (!o.execute()) {
this.unprocessed_ops.push(o);
}
unprocessed = [];
_ref = this.unprocessed_ops;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
op = _ref[_i];
if (!op.execute()) {
unprocessed.push(op);
}
}
return this.unprocessed_ops = unprocessed;
};
return Engine;
})();
module.exports = Engine;
//# sourceMappingURL=Engine.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "Engine.js",
"sourceRoot": "../../../lib/",
"sources": [
"Engine.coffee"
],
"names": [],
"mappings": "AAAA,IAAA,SAAA;;AAAA,CAAA,GAAI,OAAA,CAAQ,YAAR,CAAJ,CAAA;;AAAA;AAGe,EAAA,gBAAE,EAAF,EAAO,MAAP,GAAA;AACX,IADY,IAAC,CAAA,KAAA,EACb,CAAA;AAAA,IADiB,IAAC,CAAA,SAAA,MAClB,CAAA;AAAA,IAAA,IAAC,CAAA,eAAD,GAAmB,EAAnB,CADW;EAAA,CAAb;;AAAA,mBAGA,cAAA,GAAgB,SAAC,IAAD,GAAA;AACd,QAAA,UAAA;AAAA,IAAA,UAAA,GAAa,IAAC,CAAA,MAAO,CAAA,IAAI,CAAC,IAAL,CAArB,CAAA;AACA,IAAA,IAAG,kBAAH;aACE,UAAA,CAAW,IAAX,EADF;KAAA,MAAA;AAGE,YAAU,IAAA,KAAA,CAAO,0CAAA,GAAyC,IAAI,CAAC,IAA9C,GAAoD,mBAApD,GAAsE,CAAA,IAAI,CAAC,SAAL,CAAe,IAAf,CAAA,CAAtE,GAA2F,GAAlG,CAAV,CAHF;KAFc;EAAA,CAHhB,CAAA;;AAAA,mBAWA,QAAA,GAAU,SAAC,GAAD,GAAA;AACR,QAAA,qBAAA;AAAA;SAAA,0CAAA;kBAAA;AACE,oBAAA,IAAC,CAAA,OAAD,CAAS,CAAT,EAAA,CADF;AAAA;oBADQ;EAAA,CAXV,CAAA;;AAAA,mBAeA,OAAA,GAAS,SAAC,OAAD,GAAA;AAEP,QAAA,kCAAA;AAAA,IAAA,CAAA,GAAI,IAAC,CAAA,cAAD,CAAgB,MAAhB,CAAJ,CAAA;AAAA,IACA,IAAC,CAAA,EAAE,CAAC,YAAJ,CAAiB,CAAjB,CADA,CAAA;AAEA,IAAA,IAAG,CAAA,CAAK,CAAC,OAAF,CAAA,CAAP;AACE,MAAA,IAAC,CAAA,eAAe,CAAC,IAAjB,CAAsB,CAAtB,CAAA,CADF;KAFA;AAAA,IAIA,WAAA,GAAc,EAJd,CAAA;AAKA;AAAA,SAAA,2CAAA;oBAAA;AACE,MAAA,IAAG,CAAA,EAAM,CAAC,OAAH,CAAA,CAAP;AACE,QAAA,WAAW,CAAC,IAAZ,CAAiB,EAAjB,CAAA,CADF;OADF;AAAA,KALA;WAQA,IAAC,CAAA,eAAD,GAAmB,YAVZ;EAAA,CAfT,CAAA;;gBAAA;;IAHF,CAAA;;AAAA,MA+BM,CAAC,OAAP,GAAiB,MA/BjB,CAAA"
}

View File

@ -0,0 +1,67 @@
var Engine, HistoryBuffer, TextYatta, text_types_uninitialized;
text_types_uninitialized = require("../Types/TextTypes.coffee");
HistoryBuffer = require("../HistoryBuffer.coffee");
Engine = require("../Engine.coffee");
TextYatta = (function() {
function TextYatta(user_id, Connector) {
var first_word, text_types;
this.HB = new HistoryBuffer(user_id);
text_types = text_types_uninitialized(this.HB);
this.engine = new Engine(this.HB, text_types.parser);
this.connector = new Connector(this.engine, this.HB, text_types.execution_listener);
this.root_element = this.connector.getRootElement();
if (this.root_element == null) {
first_word = new text_types.types.Word(this.HB.getNextOperationIdentifier());
this.HB.addOperation(first_word);
first_word.execute();
this.root_element = this.HB.addOperation(new text_types.types.ReplaceManager(first_word, this.HB.getNextOperationIdentifier())).execute();
}
}
TextYatta.prototype.getRootElement = function() {
return this.root_element;
};
TextYatta.prototype.getEngine = function() {
return this.engine;
};
TextYatta.prototype.getConnector = function() {
return this.connector;
};
TextYatta.prototype.getHistoryBuffer = function() {
return this.HB;
};
TextYatta.prototype.getUserId = function() {
return this.HB.getUserId();
};
TextYatta.prototype.val = function() {
return this.root_element.val().val();
};
TextYatta.prototype.insertText = function(pos, content) {
return this.root_element.val().insertText(pos, content);
};
TextYatta.prototype.deleteText = function(pos, length) {
return this.root_element.val().deleteText(pos, length);
};
TextYatta.prototype.replaceText = function(text) {
return this.root_element.val().replaceText(text);
};
return TextYatta;
})();
module.exports = TextYatta;
//# sourceMappingURL=TextYatta.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "TextYatta.js",
"sourceRoot": "../../../../lib/Frameworks/",
"sources": [
"TextYatta.coffee"
],
"names": [],
"mappings": "AACA,IAAA,0DAAA;;AAAA,wBAAA,GAA2B,OAAA,CAAQ,2BAAR,CAA3B,CAAA;;AAAA,aACA,GAAgB,OAAA,CAAQ,yBAAR,CADhB,CAAA;;AAAA,MAEA,GAAS,OAAA,CAAQ,kBAAR,CAFT,CAAA;;AAAA;AAKe,EAAA,mBAAC,OAAD,EAAU,SAAV,GAAA;AACX,QAAA,sBAAA;AAAA,IAAA,IAAC,CAAA,EAAD,GAAU,IAAA,aAAA,CAAc,OAAd,CAAV,CAAA;AAAA,IACA,UAAA,GAAa,wBAAA,CAAyB,IAAC,CAAA,EAA1B,CADb,CAAA;AAAA,IAEA,IAAC,CAAA,MAAD,GAAc,IAAA,MAAA,CAAO,IAAC,CAAA,EAAR,EAAY,UAAU,CAAC,MAAvB,CAFd,CAAA;AAAA,IAGA,IAAC,CAAA,SAAD,GAAiB,IAAA,SAAA,CAAU,IAAC,CAAA,MAAX,EAAmB,IAAC,CAAA,EAApB,EAAwB,UAAU,CAAC,kBAAnC,CAHjB,CAAA;AAAA,IAIA,IAAC,CAAA,YAAD,GAAgB,IAAC,CAAA,SAAS,CAAC,cAAX,CAAA,CAJhB,CAAA;AAKA,IAAA,IAAO,yBAAP;AACE,MAAA,UAAA,GAAiB,IAAA,UAAU,CAAC,KAAK,CAAC,IAAjB,CAAsB,IAAC,CAAA,EAAE,CAAC,0BAAJ,CAAA,CAAtB,CAAjB,CAAA;AAAA,MACA,IAAC,CAAA,EAAE,CAAC,YAAJ,CAAiB,UAAjB,CADA,CAAA;AAAA,MAEA,UAAU,CAAC,OAAX,CAAA,CAFA,CAAA;AAAA,MAGA,IAAC,CAAA,YAAD,GAAgB,IAAC,CAAA,EAAE,CAAC,YAAJ,CAAqB,IAAA,UAAU,CAAC,KAAK,CAAC,cAAjB,CAAgC,UAAhC,EAA4C,IAAC,CAAA,EAAE,CAAC,0BAAJ,CAAA,CAA5C,CAArB,CAAkG,CAAC,OAAnG,CAAA,CAHhB,CADF;KANW;EAAA,CAAb;;AAAA,sBAYA,cAAA,GAAgB,SAAA,GAAA;WACd,IAAC,CAAA,aADa;EAAA,CAZhB,CAAA;;AAAA,sBAeA,SAAA,GAAW,SAAA,GAAA;WACT,IAAC,CAAA,OADQ;EAAA,CAfX,CAAA;;AAAA,sBAkBA,YAAA,GAAc,SAAA,GAAA;WACZ,IAAC,CAAA,UADW;EAAA,CAlBd,CAAA;;AAAA,sBAqBA,gBAAA,GAAkB,SAAA,GAAA;WAChB,IAAC,CAAA,GADe;EAAA,CArBlB,CAAA;;AAAA,sBAwBA,SAAA,GAAW,SAAA,GAAA;WACT,IAAC,CAAA,EAAE,CAAC,SAAJ,CAAA,EADS;EAAA,CAxBX,CAAA;;AAAA,sBA2BA,GAAA,GAAK,SAAA,GAAA;WACH,IAAC,CAAA,YAAY,CAAC,GAAd,CAAA,CAAmB,CAAC,GAApB,CAAA,EADG;EAAA,CA3BL,CAAA;;AAAA,sBA8BA,UAAA,GAAY,SAAC,GAAD,EAAM,OAAN,GAAA;WACV,IAAC,CAAA,YAAY,CAAC,GAAd,CAAA,CAAmB,CAAC,UAApB,CAA+B,GAA/B,EAAoC,OAApC,EADU;EAAA,CA9BZ,CAAA;;AAAA,sBAiCA,UAAA,GAAY,SAAC,GAAD,EAAM,MAAN,GAAA;WACV,IAAC,CAAA,YAAY,CAAC,GAAd,CAAA,CAAmB,CAAC,UAApB,CAA+B,GAA/B,EAAoC,MAApC,EADU;EAAA,CAjCZ,CAAA;;AAAA,sBAoCA,WAAA,GAAa,SAAC,IAAD,GAAA;WACX,IAAC,CAAA,YAAY,CAAC,GAAd,CAAA,CAAmB,CAAC,WAApB,CAAgC,IAAhC,EADW;EAAA,CApCb,CAAA;;mBAAA;;IALF,CAAA;;AAAA,MA6CM,CAAC,OAAP,GAAiB,SA7CjB,CAAA"
}

View File

@ -0,0 +1,82 @@
var HistoryBuffer, _;
_ = require("underscore");
HistoryBuffer = (function() {
function HistoryBuffer(user_id) {
this.user_id = user_id;
this.operation_counter = {};
this.buffer = {};
this.change_listeners = [];
}
HistoryBuffer.prototype.getUserId = function() {
return this.user_id;
};
HistoryBuffer.prototype.getOperationCounter = function() {
return _.clone(this.operation_counter);
};
HistoryBuffer.prototype.toJson = function() {
var json, o, user, _i, _len, _ref;
json = [];
_ref = this.buffer;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
user = _ref[_i];
for (o in user) {
json.push(o.toJson());
}
}
return json;
};
HistoryBuffer.prototype.getNextOperationIdentifier = function(user_id) {
var uid;
if (user_id == null) {
user_id = this.user_id;
}
if (this.operation_counter[user_id] == null) {
this.operation_counter[user_id] = 0;
}
uid = {
'creator': user_id,
'op_number': this.operation_counter[user_id]
};
this.operation_counter[user_id]++;
return uid;
};
HistoryBuffer.prototype.getOperation = function(uid) {
var _ref;
if (uid instanceof Object) {
return (_ref = this.buffer[uid.creator]) != null ? _ref[uid.op_number] : void 0;
} else {
throw new Error("This type of uid is not defined!");
}
};
HistoryBuffer.prototype.addOperation = function(o) {
if (this.buffer[o.creator] == null) {
this.buffer[o.creator] = {};
}
if (this.operation_counter[o.creator] == null) {
this.operation_counter[o.creator] = 0;
}
if (this.buffer[o.creator][o.op_number] != null) {
throw new Error("You must not overwrite operations!");
}
this.buffer[o.creator][o.op_number] = o;
if (typeof o.op_number === 'number' && o.creator !== this.getUserId()) {
this.operation_counter[o.creator]++;
}
return o;
};
return HistoryBuffer;
})();
module.exports = HistoryBuffer;
//# sourceMappingURL=HistoryBuffer.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "HistoryBuffer.js",
"sourceRoot": "../../../lib/",
"sources": [
"HistoryBuffer.coffee"
],
"names": [],
"mappings": "AAAA,IAAA,gBAAA;;AAAA,CAAA,GAAI,OAAA,CAAQ,YAAR,CAAJ,CAAA;;AAAA;AAee,EAAA,uBAAE,OAAF,GAAA;AACX,IADY,IAAC,CAAA,UAAA,OACb,CAAA;AAAA,IAAA,IAAC,CAAA,iBAAD,GAAqB,EAArB,CAAA;AAAA,IACA,IAAC,CAAA,MAAD,GAAU,EADV,CAAA;AAAA,IAEA,IAAC,CAAA,gBAAD,GAAoB,EAFpB,CADW;EAAA,CAAb;;AAAA,0BAKA,SAAA,GAAW,SAAA,GAAA;WACT,IAAC,CAAA,QADQ;EAAA,CALX,CAAA;;AAAA,0BAQA,mBAAA,GAAqB,SAAA,GAAA;WACnB,CAAC,CAAC,KAAF,CAAQ,IAAC,CAAA,iBAAT,EADmB;EAAA,CARrB,CAAA;;AAAA,0BAWA,MAAA,GAAQ,SAAA,GAAA;AACN,QAAA,6BAAA;AAAA,IAAA,IAAA,GAAO,EAAP,CAAA;AACA;AAAA,SAAA,2CAAA;sBAAA;AACE,WAAA,SAAA,GAAA;AACE,QAAA,IAAI,CAAC,IAAL,CAAU,CAAC,CAAC,MAAF,CAAA,CAAV,CAAA,CADF;AAAA,OADF;AAAA,KADA;WAIA,KALM;EAAA,CAXR,CAAA;;AAAA,0BAsBA,0BAAA,GAA4B,SAAC,OAAD,GAAA;AAC1B,QAAA,GAAA;AAAA,IAAA,IAAO,eAAP;AACE,MAAA,OAAA,GAAU,IAAC,CAAA,OAAX,CADF;KAAA;AAEA,IAAA,IAAO,uCAAP;AACE,MAAA,IAAC,CAAA,iBAAkB,CAAA,OAAA,CAAnB,GAA8B,CAA9B,CADF;KAFA;AAAA,IAIA,GAAA,GAAM;AAAA,MACF,SAAA,EAAY,OADV;AAAA,MAEF,WAAA,EAAc,IAAC,CAAA,iBAAkB,CAAA,OAAA,CAF/B;KAJN,CAAA;AAAA,IAQA,IAAC,CAAA,iBAAkB,CAAA,OAAA,CAAnB,EARA,CAAA;WASA,IAV0B;EAAA,CAtB5B,CAAA;;AAAA,0BAmCA,YAAA,GAAc,SAAC,GAAD,GAAA;AACZ,QAAA,IAAA;AAAA,IAAA,IAAG,GAAA,YAAe,MAAlB;6DACwB,CAAA,GAAG,CAAC,SAAJ,WADxB;KAAA,MAAA;AAGE,YAAU,IAAA,KAAA,CAAM,kCAAN,CAAV,CAHF;KADY;EAAA,CAnCd,CAAA;;AAAA,0BA2CA,YAAA,GAAc,SAAC,CAAD,GAAA;AACZ,IAAA,IAAO,8BAAP;AACE,MAAA,IAAC,CAAA,MAAO,CAAA,CAAC,CAAC,OAAF,CAAR,GAAqB,EAArB,CADF;KAAA;AAEA,IAAA,IAAO,yCAAP;AACE,MAAA,IAAC,CAAA,iBAAkB,CAAA,CAAC,CAAC,OAAF,CAAnB,GAAgC,CAAhC,CADF;KAFA;AAMA,IAAA,IAAG,2CAAH;AACE,YAAU,IAAA,KAAA,CAAM,oCAAN,CAAV,CADF;KANA;AAAA,IAQA,IAAC,CAAA,MAAO,CAAA,CAAC,CAAC,OAAF,CAAW,CAAA,CAAC,CAAC,SAAF,CAAnB,GAAkC,CARlC,CAAA;AASA,IAAA,IAAG,MAAA,CAAA,CAAQ,CAAC,SAAT,KAAsB,QAAtB,IAAmC,CAAC,CAAC,OAAF,KAAe,IAAC,CAAA,SAAD,CAAA,CAArD;AACE,MAAA,IAAC,CAAA,iBAAkB,CAAA,CAAC,CAAC,OAAF,CAAnB,EAAA,CADF;KATA;WAWA,EAZY;EAAA,CA3Cd,CAAA;;uBAAA;;IAfF,CAAA;;AAAA,MA0EM,CAAC,OAAP,GAAiB,aA1EjB,CAAA"
}

View File

@ -0,0 +1,33 @@
var Replaceable, y, _,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
y = require("Engine");
_ = require("underscore");
Replaceable = (function(_super) {
__extends(Replaceable, _super);
function Replaceable(user_id, content) {
Replaceable.__super__.constructor.call(this, user_id, []);
this.replace(content);
}
Replaceable.prototype.replace = function(content) {
var o, op;
o = this.HB.getLastOperation();
op = new I(content, this.user_id, this.HB.getOperationCounter(this.user_id), o, o.next_cl);
this.HB.addOperation(op).IT();
return op.toJson();
};
Replaceable.prototype.getContent = function() {
return this.HB.getLastOperation().execute();
};
return Replaceable;
})(y.Engine);
//# sourceMappingURL=ReplaceType.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "ReplaceType.js",
"sourceRoot": "../../../lib/",
"sources": [
"ReplaceType.coffee"
],
"names": [],
"mappings": "AACA,IAAA,iBAAA;EAAA;iSAAA;;AAAA,CAAA,GAAI,OAAA,CAAQ,QAAR,CAAJ,CAAA;;AAAA,CACA,GAAI,OAAA,CAAQ,YAAR,CADJ,CAAA;;AAAA;AAIE,gCAAA,CAAA;;AAAa,EAAA,qBAAC,OAAD,EAAU,OAAV,GAAA;AACX,IAAA,6CAAM,OAAN,EAAe,EAAf,CAAA,CAAA;AAAA,IACA,IAAC,CAAA,OAAD,CAAS,OAAT,CADA,CADW;EAAA,CAAb;;AAAA,wBAIA,OAAA,GAAS,SAAC,OAAD,GAAA;AACP,QAAA,KAAA;AAAA,IAAA,CAAA,GAAI,IAAC,CAAA,EAAE,CAAC,gBAAJ,CAAA,CAAJ,CAAA;AAAA,IACA,EAAA,GAAS,IAAA,CAAA,CAAE,OAAF,EAAW,IAAC,CAAA,OAAZ,EAAqB,IAAC,CAAA,EAAE,CAAC,mBAAJ,CAAwB,IAAC,CAAA,OAAzB,CAArB,EAAwD,CAAxD,EAA2D,CAAC,CAAC,OAA7D,CADT,CAAA;AAAA,IAEA,IAAC,CAAA,EAAE,CAAC,YAAJ,CAAiB,EAAjB,CAAoB,CAAC,EAArB,CAAA,CAFA,CAAA;WAGA,EAAE,CAAC,MAAH,CAAA,EAJO;EAAA,CAJT,CAAA;;AAAA,wBAUA,UAAA,GAAY,SAAA,GAAA;WACV,IAAC,CAAA,EAAE,CAAC,gBAAJ,CAAA,CAAsB,CAAC,OAAvB,CAAA,EADU;EAAA,CAVZ,CAAA;;qBAAA;;GADwB,CAAC,CAAC,OAH5B,CAAA"
}

View File

@ -0,0 +1,269 @@
var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
module.exports = function(HB) {
var Delete, Delimiter, Insert, Operation, execution_listener, parser;
parser = {};
execution_listener = [];
Operation = (function() {
function Operation(_arg) {
this.creator = _arg['creator'], this.op_number = _arg['op_number'];
}
Operation.prototype.getUid = function() {
return {
'creator': this.creator,
'op_number': this.op_number
};
};
Operation.prototype.execute = function() {
var l, _i, _len;
for (_i = 0, _len = execution_listener.length; _i < _len; _i++) {
l = execution_listener[_i];
l(this.toJson());
}
return this;
};
Operation.prototype.saveOperation = function(name, op) {
if ((op != null ? op.execute : void 0) != null) {
return this[name] = op;
} else if (op != null) {
if (this.unchecked == null) {
this.unchecked = {};
}
return this.unchecked[name] = op;
}
};
Operation.prototype.validateSavedOperations = function() {
var name, op, op_uid, success, uninstantiated, _ref;
uninstantiated = {};
success = this;
_ref = this.unchecked;
for (name in _ref) {
op_uid = _ref[name];
op = HB.getOperation(op_uid);
if (op) {
this[name] = op;
} else {
uninstantiated[name] = op;
success = false;
}
}
delete this.unchecked;
if (!success) {
this.unchecked = uninstantiated;
}
return success;
};
return Operation;
})();
Delete = (function(_super) {
__extends(Delete, _super);
function Delete(uid, deletes) {
this.saveOperation('deletes', deletes);
Delete.__super__.constructor.call(this, uid);
}
Delete.prototype.toJson = function() {
return {
'type': "Delete",
'uid': this.getUid(),
'deletes': this.deletes.getUid()
};
};
Delete.prototype.execute = function() {
if (this.validateSavedOperations()) {
this.deletes.applyDelete(this);
Delete.__super__.execute.apply(this, arguments);
return this;
} else {
return false;
}
};
return Delete;
})(Operation);
parser['Delete'] = function(_arg) {
var deletes_uid, uid;
uid = _arg['uid'], deletes_uid = _arg['deletes'];
return new D(uid, deletes_uid);
};
Insert = (function(_super) {
__extends(Insert, _super);
function Insert(uid, prev_cl, next_cl, origin) {
this.saveOperation('prev_cl', prev_cl);
this.saveOperation('next_cl', next_cl);
if (origin != null) {
this.saveOperation('origin', origin);
} else {
this.saveOperation('origin', prev_cl);
}
Insert.__super__.constructor.call(this, uid);
}
Insert.prototype.applyDelete = function(o) {
if (this.deleted_by == null) {
this.deleted_by = [];
}
return this.deleted_by.push(o);
};
Insert.prototype.isDeleted = function() {
var _ref;
return ((_ref = this.deleted_by) != null ? _ref.length : void 0) > 0;
};
Insert.prototype.getDistanceToOrigin = function() {
var d, o;
d = 0;
o = this.prev_cl;
while (true) {
if (this.origin === o) {
break;
}
d++;
o = o.prev_cl;
}
return d;
};
Insert.prototype.update_sl = function() {
var o;
o = this.prev_cl;
({
update: function(dest_cl, dest_sl) {
var _results;
_results = [];
while (true) {
if (o.isDeleted()) {
_results.push(o = o[dest_cl]);
} else {
this[dest_sl] = o;
break;
}
}
return _results;
}
});
update("prev_cl", "prev_sl");
return update("next_cl", "prev_sl");
};
Insert.prototype.execute = function() {
var distance_to_origin, i, o;
if (!this.validateSavedOperations()) {
return false;
} else {
if ((this.prev_cl != null) && (this.next_cl != null)) {
distance_to_origin = 0;
o = this.prev_cl.next_cl;
i = 0;
while (true) {
if (o == null) {
console.log(JSON.stringify(this.prev_cl.getUid()));
console.log(JSON.stringify(this.next_cl.getUid()));
}
if (o !== this.next_cl) {
if (o.getDistanceToOrigin() === i) {
if (o.creator < this.creator) {
this.prev_cl = o;
distance_to_origin = i + 1;
} else {
}
} else if (o.getDistanceToOrigin() < i) {
if (i - distance_to_origin <= o.getDistanceToOrigin()) {
this.prev_cl = o;
distance_to_origin = i + 1;
} else {
}
} else {
break;
}
i++;
o = o.next_cl;
} else {
break;
}
}
this.next_cl = this.prev_cl.next_cl;
this.prev_cl.next_cl = this;
this.next_cl.prev_cl = this;
}
Insert.__super__.execute.apply(this, arguments);
return this;
}
};
Insert.prototype.val = function() {
throw new Error("Implement this function!");
};
return Insert;
})(Operation);
Delimiter = (function(_super) {
__extends(Delimiter, _super);
function Delimiter() {
return Delimiter.__super__.constructor.apply(this, arguments);
}
Delimiter.prototype.isDeleted = function() {
return false;
};
Delimiter.prototype.getDistanceToOrigin = function() {
return 0;
};
Delimiter.prototype.execute = function() {
var a, l, _i, _len;
a = this.validateSavedOperations();
for (_i = 0, _len = execution_listener.length; _i < _len; _i++) {
l = execution_listener[_i];
l(this.toJson());
}
return a;
};
Delimiter.prototype.toJson = function() {
return {
'type': "Delimiter",
'uid': this.getUid(),
'prev': this.prev_cl.getUid(),
'next': this.next_cl.getUid()
};
};
return Delimiter;
})(Insert);
parser['Delimiter'] = function(json) {
var next, prev, uid;
uid = json['uid'], prev = json['prev'], next = json['next'];
return new Delimiter(uid, prev, next);
};
return {
'types': {
'Delete': Delete,
'Insert': Insert,
'Delimiter': Delimiter,
'Operation': Operation
},
'parser': parser,
'execution_listener': execution_listener
};
};
//# sourceMappingURL=BasicTypes.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,197 @@
var basic_types_uninitialized, _,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
_ = require("underscore");
basic_types_uninitialized = require("./BasicTypes.coffee");
module.exports = function(HB) {
var ListManager, MapManager, ReplaceManager, Replaceable, basic_types, parser, types;
basic_types = basic_types_uninitialized(HB);
types = basic_types.types;
parser = basic_types.parser;
MapManager = (function() {
function MapManager() {
this.map = {};
}
MapManager.prototype.set = function(name, content) {
if (this.map[name] == null) {
return this.map[name] = new Replaceable(HB, this.map[name].replace(content));
}
};
return MapManager;
})();
ListManager = (function(_super) {
__extends(ListManager, _super);
function ListManager(uid, beginning, end, prev, next, origin) {
if ((beginning != null) && (end != null)) {
saveOperation("beginning", beginning);
saveOperation("end", end);
} else {
this.beginning = HB.addOperation(new types.Delimiter(HB.getNextOperationIdentifier(), void 0, void 0));
this.end = HB.addOperation(new types.Delimiter(HB.getNextOperationIdentifier(), this.beginning, void 0));
this.beginning.next_cl = this.end;
}
ListManager.__super__.constructor.call(this, uid, prev, next, origin);
}
ListManager.prototype.getLastOperation = function() {
return this.end.prev_cl;
};
ListManager.prototype.getFirstOperation = function() {
return this.beginning.next_cl;
};
ListManager.prototype.toArray = function() {
var o, result;
o = this.beginning.next_cl;
result = [];
while (o !== this.end) {
result.push(o);
o = o.next_cl;
}
return result;
};
ListManager.prototype.getOperationByPosition = function(position) {
var o;
o = this.beginning.next_cl;
if (position > 0) {
while (true) {
o = o.next_cl;
if (!o.isDeleted()) {
position -= 1;
}
if (position === 0) {
break;
}
if (o instanceof types.Delimiter) {
throw new Error("position parameter exceeded the length of the document!");
}
}
}
return o;
};
return ListManager;
})(types.Insert);
ReplaceManager = (function(_super) {
__extends(ReplaceManager, _super);
function ReplaceManager(initial_content, uid, beginning, end, prev, next, origin) {
ReplaceManager.__super__.constructor.call(this, uid, beginning, end, prev, next, origin);
if (initial_content != null) {
this.replace(initial_content);
}
}
ReplaceManager.prototype.replace = function(content) {
var o, op;
o = this.getLastOperation();
op = new Replaceable(content, this, HB.getNextOperationIdentifier(), o, o.next_cl);
return HB.addOperation(op).execute();
};
ReplaceManager.prototype.val = function() {
var o;
o = this.getLastOperation();
if (o instanceof types.Delimiter) {
throw new Error("dtrn");
}
return o.val();
};
ReplaceManager.prototype.toJson = function() {
var json;
json = {
'type': "ReplaceManager",
'uid': this.getUid(),
'beginning': this.beginning,
'end': this.end
};
if ((this.prev_cl != null) && (this.next_cl != null)) {
json['prev'] = this.prev_cl.getUid();
json['next'] = this.next_cl.getUid();
}
if ((this.origin != null) && this.origin !== this.prev_cl) {
json["origin"] = this.origin.getUid();
}
return json;
};
return ReplaceManager;
})(ListManager);
parser["ReplaceManager"] = function(json) {
var beginning, content, end, next, origin, prev, uid;
content = json['content'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'], beginning = json['beginning'], end = json['end'];
return new ReplaceManager(content, uid, beginning, end, prev, next, origin);
};
Replaceable = (function(_super) {
__extends(Replaceable, _super);
function Replaceable(content, parent, uid, prev, next, origin) {
this.saveOperation('content', content);
this.saveOperation('parent', parent);
if (!((prev != null) && (next != null))) {
throw new Error("You must define prev, and next for Replaceable-types!");
}
Replaceable.__super__.constructor.call(this, uid, prev, next, origin);
}
Replaceable.prototype.val = function() {
return this.content;
};
Replaceable.prototype.replace = function(content) {
return this.parent.replace(content);
};
Replaceable.prototype.execute = function() {
var _base;
Replaceable.__super__.execute.apply(this, arguments);
if (typeof (_base = this.content).setReplaceManager === "function") {
_base.setReplaceManager(this.parent);
}
return this;
};
Replaceable.prototype.toJson = function() {
var json;
json = {
'type': "Replaceable",
'content': this.content.getUid(),
'ReplaceManager': this.parent,
'prev': this.prev_cl.getUid(),
'next': this.next_cl.getUid(),
'uid': this.getUid()
};
if ((this.origin != null) && this.origin !== this.prev_cl) {
json["origin"] = this.origin.getUid();
}
return json;
};
return Replaceable;
})(types.Insert);
parser["Replaceable"] = function(json) {
var content, next, origin, parent, prev, uid;
content = json['content'], parent = json['ReplaceManager'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'];
return new Replaceable(content, parent, uid, prev, next, origin);
};
types['ListManager'] = ListManager;
types['MapManager'] = MapManager;
types['ReplaceManager'] = ReplaceManager;
types['Replaceable'] = Replaceable;
return basic_types;
};
//# sourceMappingURL=StructuredTypes.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,180 @@
var structured_types_uninitialized, _,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
_ = require("underscore");
structured_types_uninitialized = require("./StructuredTypes.coffee");
module.exports = function(HB) {
var TextDelete, TextInsert, Word, parser, structured_types, types;
structured_types = structured_types_uninitialized(HB);
types = structured_types.types;
parser = structured_types.parser;
TextDelete = (function(_super) {
__extends(TextDelete, _super);
function TextDelete() {
return TextDelete.__super__.constructor.apply(this, arguments);
}
return TextDelete;
})(types.Delete);
parser["TextDelete"] = parser["Delete"];
TextInsert = (function(_super) {
__extends(TextInsert, _super);
function TextInsert(content, uid, prev, next, origin) {
this.content = content;
if (!((prev != null) && (next != null))) {
throw new Error("You must define prev, and next for TextInsert-types!");
}
TextInsert.__super__.constructor.call(this, uid, prev, next, origin);
}
TextInsert.prototype.getLength = function() {
if (this.isDeleted()) {
return 0;
} else {
return this.content.length;
}
};
TextInsert.prototype.val = function(current_position) {
if (this.isDeleted()) {
return "";
} else {
return this.content;
}
};
TextInsert.prototype.toJson = function() {
var json;
json = {
'type': "TextInsert",
'content': this.content,
'uid': this.getUid(),
'prev': this.prev_cl.getUid(),
'next': this.next_cl.getUid()
};
if ((this.origin != null) && this.origin !== this.prev_cl) {
json["origin"] = this.origin.getUid();
}
return json;
};
return TextInsert;
})(types.Insert);
parser["TextInsert"] = function(json) {
var content, next, origin, prev, uid;
content = json['content'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'];
return new TextInsert(content, uid, prev, next, origin);
};
Word = (function(_super) {
__extends(Word, _super);
function Word(uid, prev, next, origin) {
Word.__super__.constructor.call(this, uid, prev, next, origin);
}
Word.prototype.insertText = function(position, content) {
var c, o, op, _i, _len, _results;
o = this.getOperationByPosition(position);
_results = [];
for (_i = 0, _len = content.length; _i < _len; _i++) {
c = content[_i];
op = new TextInsert(c, HB.getNextOperationIdentifier(), o.prev_cl, o);
_results.push(HB.addOperation(op).execute());
}
return _results;
};
Word.prototype.deleteText = function(position, length) {
var d, i, o, _i, _results;
o = this.getOperationByPosition(position);
_results = [];
for (i = _i = 0; 0 <= length ? _i < length : _i > length; i = 0 <= length ? ++_i : --_i) {
d = HB.addOperation(new TextDelete(HB.getNextOperationIdentifier(), o)).execute();
o = o.next_cl;
while (o.isDeleted()) {
if (o instanceof types.Delimiter) {
throw new Error("You can't delete more than there is..");
}
o = o.next_cl;
}
_results.push(d.toJson());
}
return _results;
};
Word.prototype.replaceText = function(text) {
var word;
if (this.replace_manager != null) {
word = HB.addOperation(new Word(HB.getNextOperationIdentifier())).execute();
word.insertText(0, text);
return this.replace_manager.replace(word);
} else {
throw new Error("This type is currently not maintained by a ReplaceManager!");
}
};
Word.prototype.val = function() {
var c, o;
c = (function() {
var _i, _len, _ref, _results;
_ref = this.toArray();
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
o = _ref[_i];
if (o.val != null) {
_results.push(o.val());
} else {
_results.push("");
}
}
return _results;
}).call(this);
return c.join('');
};
Word.prototype.setReplaceManager = function(op) {
this.saveOperation('replace_manager', op);
return this.validateSavedOperations;
};
Word.prototype.toJson = function() {
var json;
json = {
'type': "TextInsert",
'content': this.content,
'uid': this.getUid()
};
if (this.prev_cl != null) {
json['prev'] = this.prev_cl.getUid();
}
if (this.next_cl != null) {
json['next'] = this.next_cl.getUid();
}
if ((this.origin != null) && this.origin !== this.prev_cl) {
json["origin"] = this.origin.getUid();
}
return json;
};
return Word;
})(types.ListManager);
parser['Word'] = function(json) {
var content, next, origin, prev, uid;
content = json['content'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'];
return new Word(uid, prev, next, origin);
};
types['TextInsert'] = TextInsert;
types['TextDelete'] = TextDelete;
types['Word'] = Word;
return structured_types;
};
//# sourceMappingURL=TextTypes.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "TextTypes.js",
"sourceRoot": "../../../../lib/Types/",
"sources": [
"TextTypes.coffee"
],
"names": [],
"mappings": "AAAA,IAAA,iCAAA;EAAA;iSAAA;;AAAA,CAAA,GAAI,OAAA,CAAQ,YAAR,CAAJ,CAAA;;AAAA,8BACA,GAAiC,OAAA,CAAQ,0BAAR,CADjC,CAAA;;AAAA,MAGM,CAAC,OAAP,GAAiB,SAAC,EAAD,GAAA;AACf,MAAA,6DAAA;AAAA,EAAA,gBAAA,GAAmB,8BAAA,CAA+B,EAA/B,CAAnB,CAAA;AAAA,EACA,KAAA,GAAQ,gBAAgB,CAAC,KADzB,CAAA;AAAA,EAEA,MAAA,GAAS,gBAAgB,CAAC,MAF1B,CAAA;AAAA,EAQM;AAAN,iCAAA,CAAA;;;;KAAA;;sBAAA;;KAAyB,KAAK,CAAC,OAR/B,CAAA;AAAA,EASA,MAAO,CAAA,YAAA,CAAP,GAAuB,MAAO,CAAA,QAAA,CAT9B,CAAA;AAAA,EAcM;AACJ,iCAAA,CAAA;;AAAa,IAAA,oBAAE,OAAF,EAAW,GAAX,EAAgB,IAAhB,EAAsB,IAAtB,EAA4B,MAA5B,GAAA;AACX,MADY,IAAC,CAAA,UAAA,OACb,CAAA;AAAA,MAAA,IAAG,CAAA,CAAK,cAAA,IAAU,cAAX,CAAP;AACE,cAAU,IAAA,KAAA,CAAM,sDAAN,CAAV,CADF;OAAA;AAAA,MAEA,4CAAM,GAAN,EAAW,IAAX,EAAiB,IAAjB,EAAuB,MAAvB,CAFA,CADW;IAAA,CAAb;;AAAA,yBAOA,SAAA,GAAW,SAAA,GAAA;AACT,MAAA,IAAG,IAAC,CAAA,SAAD,CAAA,CAAH;eACE,EADF;OAAA,MAAA;eAGE,IAAC,CAAA,OAAO,CAAC,OAHX;OADS;IAAA,CAPX,CAAA;;AAAA,yBAkBA,GAAA,GAAK,SAAC,gBAAD,GAAA;AACH,MAAA,IAAG,IAAC,CAAA,SAAD,CAAA,CAAH;eACE,GADF;OAAA,MAAA;eAGE,IAAC,CAAA,QAHH;OADG;IAAA,CAlBL,CAAA;;AAAA,yBA4BA,MAAA,GAAQ,SAAA,GAAA;AACN,UAAA,IAAA;AAAA,MAAA,IAAA,GACE;AAAA,QACE,MAAA,EAAQ,YADV;AAAA,QAEE,SAAA,EAAW,IAAC,CAAA,OAFd;AAAA,QAGE,KAAA,EAAQ,IAAC,CAAA,MAAD,CAAA,CAHV;AAAA,QAIE,MAAA,EAAQ,IAAC,CAAA,OAAO,CAAC,MAAT,CAAA,CAJV;AAAA,QAKE,MAAA,EAAQ,IAAC,CAAA,OAAO,CAAC,MAAT,CAAA,CALV;OADF,CAAA;AAQA,MAAA,IAAG,qBAAA,IAAa,IAAC,CAAA,MAAD,KAAa,IAAC,CAAA,OAA9B;AACE,QAAA,IAAK,CAAA,QAAA,CAAL,GAAiB,IAAC,CAAA,MAAM,CAAC,MAAR,CAAA,CAAjB,CADF;OARA;aAUA,KAXM;IAAA,CA5BR,CAAA;;sBAAA;;KADuB,KAAK,CAAC,OAd/B,CAAA;AAAA,EAwDA,MAAO,CAAA,YAAA,CAAP,GAAuB,SAAC,IAAD,GAAA;AACrB,QAAA,gCAAA;AAAA,IACc,eAAZ,UADF,EAEU,WAAR,MAFF,EAGU,YAAR,OAHF,EAIU,YAAR,OAJF,EAKa,cAAX,SALF,CAAA;WAOI,IAAA,UAAA,CAAW,OAAX,EAAoB,GAApB,EAAyB,IAAzB,EAA+B,IAA/B,EAAqC,MAArC,EARiB;EAAA,CAxDvB,CAAA;AAAA,EAkEM;AACJ,2BAAA,CAAA;;AAAa,IAAA,cAAC,GAAD,EAAM,IAAN,EAAY,IAAZ,EAAkB,MAAlB,GAAA;AACX,MAAA,sCAAM,GAAN,EAAW,IAAX,EAAiB,IAAjB,EAAuB,MAAvB,CAAA,CADW;IAAA,CAAb;;AAAA,mBAIA,UAAA,GAAY,SAAC,QAAD,EAAW,OAAX,GAAA;AACV,UAAA,4BAAA;AAAA,MAAA,CAAA,GAAI,IAAC,CAAA,sBAAD,CAAwB,QAAxB,CAAJ,CAAA;AACA;WAAA,8CAAA;wBAAA;AACE,QAAA,EAAA,GAAS,IAAA,UAAA,CAAW,CAAX,EAAc,EAAE,CAAC,0BAAH,CAAA,CAAd,EAA+C,CAAC,CAAC,OAAjD,EAA0D,CAA1D,CAAT,CAAA;AAAA,sBACA,EAAE,CAAC,YAAH,CAAgB,EAAhB,CAAmB,CAAC,OAApB,CAAA,EADA,CADF;AAAA;sBAFU;IAAA,CAJZ,CAAA;;AAAA,mBAWA,UAAA,GAAY,SAAC,QAAD,EAAW,MAAX,GAAA;AACV,UAAA,qBAAA;AAAA,MAAA,CAAA,GAAI,IAAC,CAAA,sBAAD,CAAwB,QAAxB,CAAJ,CAAA;AAEA;WAAS,kFAAT,GAAA;AACE,QAAA,CAAA,GAAI,EAAE,CAAC,YAAH,CAAoB,IAAA,UAAA,CAAW,EAAE,CAAC,0BAAH,CAAA,CAAX,EAA4C,CAA5C,CAApB,CAAkE,CAAC,OAAnE,CAAA,CAAJ,CAAA;AAAA,QACA,CAAA,GAAI,CAAC,CAAC,OADN,CAAA;AAEA,eAAM,CAAC,CAAC,SAAF,CAAA,CAAN,GAAA;AACE,UAAA,IAAG,CAAA,YAAa,KAAK,CAAC,SAAtB;AACE,kBAAU,IAAA,KAAA,CAAM,uCAAN,CAAV,CADF;WAAA;AAAA,UAEA,CAAA,GAAI,CAAC,CAAC,OAFN,CADF;QAAA,CAFA;AAAA,sBAMA,CAAC,CAAC,MAAF,CAAA,EANA,CADF;AAAA;sBAHU;IAAA,CAXZ,CAAA;;AAAA,mBAuBA,WAAA,GAAa,SAAC,IAAD,GAAA;AACX,UAAA,IAAA;AAAA,MAAA,IAAG,4BAAH;AACE,QAAA,IAAA,GAAO,EAAE,CAAC,YAAH,CAAoB,IAAA,IAAA,CAAK,EAAE,CAAC,0BAAH,CAAA,CAAL,CAApB,CAAyD,CAAC,OAA1D,CAAA,CAAP,CAAA;AAAA,QACA,IAAI,CAAC,UAAL,CAAgB,CAAhB,EAAmB,IAAnB,CADA,CAAA;eAEA,IAAC,CAAA,eAAe,CAAC,OAAjB,CAAyB,IAAzB,EAHF;OAAA,MAAA;AAKE,cAAU,IAAA,KAAA,CAAM,4DAAN,CAAV,CALF;OADW;IAAA,CAvBb,CAAA;;AAAA,mBA+BA,GAAA,GAAK,SAAA,GAAA;AACH,UAAA,IAAA;AAAA,MAAA,CAAA;;AAAI;AAAA;aAAA,2CAAA;uBAAA;AACF,UAAA,IAAG,aAAH;0BACE,CAAC,CAAC,GAAF,CAAA,GADF;WAAA,MAAA;0BAGE,IAHF;WADE;AAAA;;mBAAJ,CAAA;aAKA,CAAC,CAAC,IAAF,CAAO,EAAP,EANG;IAAA,CA/BL,CAAA;;AAAA,mBAuCA,iBAAA,GAAmB,SAAC,EAAD,GAAA;AACjB,MAAA,IAAC,CAAA,aAAD,CAAe,iBAAf,EAAkC,EAAlC,CAAA,CAAA;aACA,IAAC,CAAA,wBAFgB;IAAA,CAvCnB,CAAA;;AAAA,mBA2CA,MAAA,GAAQ,SAAA,GAAA;AACN,UAAA,IAAA;AAAA,MAAA,IAAA,GAAO;AAAA,QACL,MAAA,EAAQ,YADH;AAAA,QAEL,SAAA,EAAW,IAAC,CAAA,OAFP;AAAA,QAGL,KAAA,EAAQ,IAAC,CAAA,MAAD,CAAA,CAHH;OAAP,CAAA;AAKA,MAAA,IAAG,oBAAH;AACE,QAAA,IAAK,CAAA,MAAA,CAAL,GAAe,IAAC,CAAA,OAAO,CAAC,MAAT,CAAA,CAAf,CADF;OALA;AAOA,MAAA,IAAG,oBAAH;AACE,QAAA,IAAK,CAAA,MAAA,CAAL,GAAe,IAAC,CAAA,OAAO,CAAC,MAAT,CAAA,CAAf,CADF;OAPA;AASA,MAAA,IAAG,qBAAA,IAAa,IAAC,CAAA,MAAD,KAAa,IAAC,CAAA,OAA9B;AACE,QAAA,IAAK,CAAA,QAAA,CAAL,GAAiB,IAAC,CAAA,MAAM,CAAC,MAAR,CAAA,CAAjB,CADF;OATA;aAWA,KAZM;IAAA,CA3CR,CAAA;;gBAAA;;KADiB,KAAK,CAAC,YAlEzB,CAAA;AAAA,EA4HA,MAAO,CAAA,MAAA,CAAP,GAAiB,SAAC,IAAD,GAAA;AACf,QAAA,gCAAA;AAAA,IACc,eAAZ,UADF,EAEU,WAAR,MAFF,EAGU,YAAR,OAHF,EAIU,YAAR,OAJF,EAKa,cAAX,SALF,CAAA;WAOI,IAAA,IAAA,CAAK,GAAL,EAAU,IAAV,EAAgB,IAAhB,EAAsB,MAAtB,EARW;EAAA,CA5HjB,CAAA;AAAA,EAsIA,KAAM,CAAA,YAAA,CAAN,GAAsB,UAtItB,CAAA;AAAA,EAuIA,KAAM,CAAA,YAAA,CAAN,GAAsB,UAvItB,CAAA;AAAA,EAwIA,KAAM,CAAA,MAAA,CAAN,GAAgB,IAxIhB,CAAA;SA0IA,iBA3Ie;AAAA,CAHjB,CAAA"
}

View File

@ -0,0 +1,5 @@
var _;
_ = require("underscore");
//# sourceMappingURL=XmlTypes.js.map

View File

@ -0,0 +1,10 @@
{
"version": 3,
"file": "XmlTypes.js",
"sourceRoot": "../../../../lib/Types/",
"sources": [
"XmlTypes.coffee"
],
"names": [],
"mappings": "AAAA,IAAA,CAAA;;AAAA,CAAA,GAAI,OAAA,CAAQ,YAAR,CAAJ,CAAA"
}

View File

@ -0,0 +1,177 @@
(function() {
var Connector_uninitialized, Yatta, chai, expect, should, sinon, sinonChai, _;
chai = require('chai');
expect = chai.expect;
should = chai.should();
sinon = require('sinon');
sinonChai = require('sinon-chai');
_ = require("underscore");
chai.use(sinonChai);
Yatta = require("../lib/Frameworks/TextYatta.coffee");
Connector_uninitialized = require("../lib/Connectors/TestConnector.coffee");
describe("TextYatta", function() {
beforeEach(function(done) {
var i, _i, _ref;
this.last_user = 10;
this.users = [];
this.Connector = Connector_uninitialized(this.users);
for (i = _i = 0, _ref = this.last_user + 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
this.users.push(new Yatta(i, this.Connector));
}
return done();
});
return it("can handle many engines, many operations, concurrently (random)", function() {
var Connector, applyRandomOp, doSomething, doSomething_amount, found_error, generateDeleteOp, generateInsertOp, generateRandomOp, generateReplaceOp, i, j, maximum_ops_per_engine, number_of_created_operations, number_of_engines, number_of_test_cases_multiplier, ops, ops_per_msek, printOpsInExecutionOrder, repeat_this, time_now, times, u, user, user_number, users, _i, _j, _k, _l, _len, _m, _ref, _results;
number_of_test_cases_multiplier = 1;
repeat_this = 1000 * number_of_test_cases_multiplier;
doSomething_amount = 1000 * number_of_test_cases_multiplier;
number_of_engines = 300 + number_of_test_cases_multiplier - 1;
maximum_ops_per_engine = 20 * number_of_test_cases_multiplier;
this.time = 0;
this.ops = 0;
generateInsertOp = function(user_num) {
var chars, length, nextchar, pos, text;
chars = "1234567890";
pos = _.random(0, users[user_num].val().length - 1);
length = 1;
nextchar = chars[_.random(0, chars.length - 1)];
text = "";
_(length).times(function() {
return text += nextchar;
});
users[user_num].insertText(pos, text);
return null;
};
generateReplaceOp = function(user_num) {
var chars, length, nextchar, text;
chars = "abcdefghijklmnopqrstuvwxyz";
length = _.random(0, 10);
nextchar = chars[_.random(0, chars.length - 1)];
text = "";
_(length).times(function() {
return text += nextchar;
});
return users[user_num].replaceText(text);
};
generateDeleteOp = function(user_num) {
var length, ops1, pos;
if (users[user_num].val().length > 0) {
pos = _.random(0, users[user_num].val().length - 1);
length = 1;
ops1 = users[user_num].deleteText(pos, length);
}
return void 0;
};
generateRandomOp = function(user_num) {
var i, op, op_gen;
op_gen = [generateDeleteOp, generateInsertOp, generateReplaceOp];
i = _.random(op_gen.length - 1);
return op = op_gen[i](user_num);
};
applyRandomOp = function(user_num) {
var user;
user = users[user_num];
return user.getConnector().flushOneRandom();
};
doSomething = (function() {
return function() {
var choice, choices, user_num;
user_num = _.random(number_of_engines - 1);
choices = [applyRandomOp, generateRandomOp];
choice = _.random(choices.length - 1);
return choices[choice](user_num);
};
})();
console.log("");
_results = [];
for (times = _i = 1; 1 <= repeat_this ? _i <= repeat_this : _i >= repeat_this; times = 1 <= repeat_this ? ++_i : --_i) {
users = [];
Connector = Connector_uninitialized(users);
for (i = _j = 0; 0 <= number_of_engines ? _j < number_of_engines : _j > number_of_engines; i = 0 <= number_of_engines ? ++_j : --_j) {
users.push(new Yatta(i, Connector));
}
found_error = false;
time_now = (new Date).getTime();
for (i = _k = 1; 1 <= doSomething_amount ? _k <= doSomething_amount : _k >= doSomething_amount; i = 1 <= doSomething_amount ? ++_k : --_k) {
doSomething();
}
for (user_number = _l = 0, _len = users.length; _l < _len; user_number = ++_l) {
user = users[user_number];
user.getConnector().flushAll();
}
this.time += (new Date()).getTime() - time_now;
/*catch error
found_error = true
console.log "Just found some error!!! :-)"
console.log error
*/
number_of_created_operations = 0;
for (i = _m = 0, _ref = users.length; 0 <= _ref ? _m < _ref : _m > _ref; i = 0 <= _ref ? ++_m : --_m) {
number_of_created_operations += users[i].getConnector().getOpsInExecutionOrder().length;
}
this.ops += number_of_created_operations * users.length;
ops_per_msek = Math.floor(this.ops / this.time);
console.log(("" + times + "/" + repeat_this + ": Every collaborator (" + users.length + ") applied " + number_of_created_operations + " ops in a different order.") + (" Over all we consumed " + this.ops + " operations in " + (this.time / 1000) + " seconds (" + ops_per_msek + " ops/msek)."));
console.log(users[0].val());
_results.push((function() {
var _len1, _n, _o, _ref1, _results1;
_results1 = [];
for (i = _n = 0, _ref1 = users.length - 1; 0 <= _ref1 ? _n < _ref1 : _n > _ref1; i = 0 <= _ref1 ? ++_n : --_n) {
if (users[i].val() !== users[i + 1].val()) {
printOpsInExecutionOrder = function(otnumber, otherotnumber) {
var j, o, ops, s, _len1, _len2, _o, _p;
ops = users[otnumber].getConnector().getOpsInExecutionOrder();
for (_o = 0, _len1 = ops.length; _o < _len1; _o++) {
s = ops[_o];
console.log(JSON.stringify(s));
}
console.log("");
s = "ops = [";
for (j = _p = 0, _len2 = ops.length; _p < _len2; j = ++_p) {
o = ops[j];
if (j !== 0) {
s += ", ";
}
s += "op" + j;
}
s += "]";
console.log(s);
console.log("@users[@last_user].ot.applyOps ops");
console.log("expect(@users[@last_user].ot.val()).to.equal(\"" + (users[otherotnumber].val()) + "\")");
return ops;
};
console.log("");
console.log("Found an OT Puzzle!");
console.log("OT states:");
for (j = _o = 0, _len1 = users.length; _o < _len1; j = ++_o) {
u = users[j];
console.log(("OT" + j + ": ") + u.val());
}
console.log("\nOT execution order (" + i + "," + (i + 1) + "):");
printOpsInExecutionOrder(i, i + 1);
console.log("");
ops = printOpsInExecutionOrder(i + 1, i);
_results1.push(console.log(""));
} else {
_results1.push(void 0);
}
}
return _results1;
})());
}
return _results;
});
});
}).call(this);

307
doc/alphabetical_index.html Normal file
View File

@ -0,0 +1,307 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path=''></div>
<div id='header'>
<div id='menu'>
</div>
</div>
<div id='content'>
<h1 class='noborder title'></h1>
<div id='listing'>
<h1 class='alphaindex'>Alphabetical Index</h1>
<h2>Extra File Listing</h2>
<ul id='files'>
<li>
<a href='extra/README.md.html' title='README.md'>
README.md
</a>
</li>
<li>
<a href='extra/LICENSE-LGPL.html' title='LICENSE-LGPL'>
LICENSE-LGPL
</a>
</li>
</ul>
<h2>Class Listing A-Z</h2>
<div class='index'>
<ul>
<li class='letter'>e</li>
<ul>
<li>
<a href='class/Engine.html'>
Engine
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>h</li>
<ul>
<li>
<a href='class/HistoryBuffer.html'>
HistoryBuffer
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>l</li>
<ul>
<li>
<a href='class/ListManager.html'>
ListManager
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>m</li>
<ul>
<li>
<a href='class/MapManager.html'>
MapManager
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>o</li>
<ul>
<li>
<a href='class/Operation.html'>
Operation
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>r</li>
<ul>
<li>
<a href='class/ReplaceManager.html'>
ReplaceManager
</a>
</li>
<li>
<a href='class/Replaceable.html'>
Replaceable
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>t</li>
<ul>
<li>
<a href='class/TestConnector.html'>
TestConnector
</a>
</li>
<li>
<a href='class/TextYatta.html'>
TextYatta
</a>
</li>
<li>
<a href='class/TextDelete.html'>
TextDelete
</a>
</li>
<li>
<a href='class/TextInsert.html'>
TextInsert
</a>
</li>
</ul>
</ul>
<ul>
<li class='letter'>w</li>
<ul>
<li>
<a href='class/Word.html'>
Word
</a>
</li>
</ul>
</ul>
</div>
<h2>File Listing A-Z</h2>
<div class='index'>
<ul>
<li class='letter'>b</li>
<ul>
<li>
<a href='file/lib/Types/BasicTypes.coffee.html'>
BasicTypes.coffee
</a>
<small>
(lib&#47;Types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>e</li>
<ul>
<li>
<a href='file/lib/Engine.coffee.html'>
Engine.coffee
</a>
<small>
(lib)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>h</li>
<ul>
<li>
<a href='file/lib/HistoryBuffer.coffee.html'>
HistoryBuffer.coffee
</a>
<small>
(lib)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>s</li>
<ul>
<li>
<a href='file/lib/Types/StructuredTypes.coffee.html'>
StructuredTypes.coffee
</a>
<small>
(lib&#47;Types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>t</li>
<ul>
<li>
<a href='file/lib/Connectors/TestConnector.coffee.html'>
TestConnector.coffee
</a>
<small>
(lib&#47;Connectors)
</small>
</li>
<li>
<a href='file/lib/Frameworks/TextYatta.coffee.html'>
TextYatta.coffee
</a>
<small>
(lib&#47;Frameworks)
</small>
</li>
<li>
<a href='file/lib/Types/TextTypes.coffee.html'>
TextTypes.coffee
</a>
<small>
(lib&#47;Types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>x</li>
<ul>
<li>
<a href='file/lib/Types/XmlTypes.coffee.html'>
XmlTypes.coffee
</a>
<small>
(lib&#47;Types)
</small>
</li>
</ul>
</ul>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

196
doc/class/D.html Normal file
View File

@ -0,0 +1,196 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>D</span>
</div>
</div>
<div id='content'>
<h1>
Class:
D
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/Operation.html'>Operation</a>
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>A simple delete-type operation.</p>
</div>
<div class='tags'>
</div>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
</a>
</span>
<span class='desc'>
Convert all relevant information of this operation into the json-format.
</span>
</li>
<li>
<span class='signature'>
<a href='#IT-dynamic'>
#
(void)
<b>IT</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../class/Operation.html'>Operation</a>
</h3>
<p class='inherited'>
<a href='../class/Operation.html#getUid-dynamic'>#getUid</a>
<a href='../class/Operation.html#execute-dynamic'>#execute</a>
</p>
</h2>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(creator, op_number, delete_op)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Convert all relevant information of this operation into the json-format.
This result can be send to other clients.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='IT-dynamic'>
#
(void)
<b>IT</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 02:21:01 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

160
doc/class/DUC.html Normal file
View File

@ -0,0 +1,160 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>DUC</span>
</div>
</div>
<div id='content'>
<h1>
Class:
DUC
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>The Document Under Collaboration (abbrev. DUC) is an interface from the
abstract data structure that the engine maintains to an actual data structure.
TODO</p>
</div>
<div class='tags'>
</div>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
</a>
</span>
<span class='desc'>
get the length of the content.
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(content)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>get the length of the content.</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 01:28:06 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

186
doc/class/Delimiter.html Normal file
View File

@ -0,0 +1,186 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Delimiter</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Delimiter
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/I.html'>I</a>
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>A delimiter is placed at the end and at the beginning of the associative lists.
This is necessary in order to have a beginning and an end even if the content
of the Engine is empty.</p>
</div>
<div class='tags'>
</div>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getDistanceToOrigin-dynamic'>
#
(void)
<b>getDistanceToOrigin</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../class/I.html'>I</a>
</h3>
<p class='inherited'>
<a href='../class/I.html#getLength-dynamic'>#getLength</a>
<a href='../class/I.html#isDeleted-dynamic'>#isDeleted</a>
<a href='../class/I.html#getDistanceToOrigin-dynamic'>#getDistanceToOrigin</a>
<a href='../class/I.html#update_sl-dynamic'>#update_sl</a>
<a href='../class/I.html#toJson-dynamic'>#toJson</a>
<a href='../class/I.html#execute-dynamic'>#execute</a>
<a href='../class/I.html#IT-dynamic'>#IT</a>
<a href='../class/Operation.html#getUid-dynamic'>#getUid</a>
</p>
</h2>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getDistanceToOrigin-dynamic'>
#
(void)
<b>getDistanceToOrigin</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 02:21:01 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

192
doc/class/Engine.html Normal file
View File

@ -0,0 +1,192 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Engine</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Engine
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#parseOperation-dynamic'>
#
(void)
<b>parseOperation</b><span>(json)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#applyOps-dynamic'>
#
(void)
<b>applyOps</b><span>(ops)</span>
</a>
</span>
<span class='desc'>
TODO:
</span>
</li>
<li>
<span class='signature'>
<a href='#applyOp-dynamic'>
#
(void)
<b>applyOp</b><span>(op_json)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(HB, parser)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='parseOperation-dynamic'>
#
(void)
<b>parseOperation</b><span>(json)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='applyOps-dynamic'>
#
(void)
<b>applyOps</b><span>(ops)</span>
<br>
</p>
<div class='docstring'>
<p>TODO:</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='applyOp-dynamic'>
#
(void)
<b>applyOp</b><span>(op_json)</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,339 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>HistoryBuffer</span>
</div>
</div>
<div id='content'>
<h1>
Class:
HistoryBuffer
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;HistoryBuffer.coffee</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<div class='note'>
<strong>Note:</strong>
The HistoryBuffer is commonly abbreviated to HB.
</div>
<p>An object that holds all applied operations.</p>
</div>
<div class='tags'>
</div>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getUserId-dynamic'>
#
(void)
<b>getUserId</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getOperationCounter-dynamic'>
#
(void)
<b>getOperationCounter</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getNextOperationIdentifier-dynamic'>
#
(void)
<b>getNextOperationIdentifier</b><span>(user_id)</span>
</a>
</span>
<span class='desc'>
Get the number of operations that were created by a user.
</span>
</li>
<li>
<span class='signature'>
<a href='#getOperation-dynamic'>
#
(void)
<b>getOperation</b><span>(uid)</span>
</a>
</span>
<span class='desc'>
Retrieve an operation from a unique id.
</span>
</li>
<li>
<span class='signature'>
<a href='#addOperation-dynamic'>
#
(void)
<b>addOperation</b><span>(o)</span>
</a>
</span>
<span class='desc'>
Add an operation to the HB.
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
~
(void)
<b>new HistoryBuffer</b><span>()</span>
<br>
~
(void)
<b>new HistoryBuffer</b><span>(initial_content)</span>
<br>
</p>
<div class='tags'>
<div class='overloads'>
<h3>Overloads:</h3>
<div class='overload'>
<p class='signature'>
~
(void)
<b>new HistoryBuffer</b><span>()</span>
</p>
<div class='docstring'>
<p>Creates an empty HB.</p>
</div>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>user_id</span>
<span class='type'>
(
<tt>Object</tt>
)
</span>
&mdash;
<span class='desc'>Creator of the HB. </span>
</li>
</ul>
</div>
</div>
<div class='overload'>
<p class='signature'>
~
(void)
<b>new HistoryBuffer</b><span>(initial_content)</span>
</p>
<div class='docstring'>
<p>Creates an HB with initial operations that represent the initial_value.</p>
</div>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>initial_content</span>
<span class='type'>
(
<tt>Array&lt;Object&gt;</tt>
)
</span>
&mdash;
<span class='desc'>Initial content of the DUC </span>
</li>
</ul>
<h3>See also:</h3>
<ul class='see'>
<li>
<a href='DUC'>DUC - Document Under Collaboration</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getUserId-dynamic'>
#
(void)
<b>getUserId</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getOperationCounter-dynamic'>
#
(void)
<b>getOperationCounter</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getNextOperationIdentifier-dynamic'>
#
(void)
<b>getNextOperationIdentifier</b><span>(user_id)</span>
<br>
</p>
<div class='docstring'>
<p>Get the number of operations that were created by a user.
Accordingly you will get the next operation number that is expected from that user.
You&#39;ll get new results only if you added the operation with $addOperation.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='getOperation-dynamic'>
#
(void)
<b>getOperation</b><span>(uid)</span>
<br>
</p>
<div class='docstring'>
<p>Retrieve an operation from a unique id.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='addOperation-dynamic'>
#
(void)
<b>addOperation</b><span>(o)</span>
<br>
</p>
<div class='docstring'>
<p>Add an operation to the HB. Note that this will not link it against
other operations (it wont be executable)</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

402
doc/class/I.html Normal file
View File

@ -0,0 +1,402 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>I</span>
</div>
</div>
<div id='content'>
<h1>
Class:
I
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/Operation.html'>Operation</a>
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>A simple insert-type operation.</p><p>An insert operation is always positioned between two other insert operations.
Internally this is realized as associative lists, whereby each insert operation has a predecessor and a successor.
For the sake of efficiency we maintain two lists: - The short-list (abbrev. sl) maintains only the operations that are not deleted - The complete-list (abbrev. cl) maintains all operations</p>
</div>
<div class='tags'>
</div>
<h2>Direct Known Subclasses</h2>
<p class='children'>
<a href='../class/Delimiter.html'>Delimiter</a>
</p>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
</a>
</span>
<span class='desc'>
Retrieve the effective length of the $content of this operation.
</span>
</li>
<li>
<span class='signature'>
<a href='#isDeleted-dynamic'>
#
(void)
<b>isDeleted</b><span>()</span>
</a>
</span>
<span class='desc'>
If isDeleted() is true this operation won&#39;t be maintained in the sl
</span>
</li>
<li>
<span class='signature'>
<a href='#getDistanceToOrigin-dynamic'>
#
(void)
<b>getDistanceToOrigin</b><span>()</span>
</a>
</span>
<span class='desc'>
The amount of positions that this operation was moved to the right.
</span>
</li>
<li>
<span class='signature'>
<a href='#update_sl-dynamic'>
#
(void)
<b>update_sl</b><span>()</span>
</a>
</span>
<span class='desc'>
Update the short list TODO
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
</a>
</span>
<span class='desc'>
Convert all relevant information of this operation into the json-format.
</span>
</li>
<li>
<span class='signature'>
<a href='#execute-dynamic'>
#
(void)
<b>execute</b><span>(current_position)</span>
</a>
</span>
<span class='desc'>
The result will be concatenated with the results from the other insert operations in order to retrieve the content of the engine.
</span>
</li>
<li>
<span class='signature'>
<a href='#IT-dynamic'>
#
(void)
<b>IT</b><span>()</span>
</a>
</span>
<span class='desc'>
Include this operation in the associative lists.
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../class/Operation.html'>Operation</a>
</h3>
<p class='inherited'>
<a href='../class/Operation.html#getUid-dynamic'>#getUid</a>
<a href='../class/Operation.html#execute-dynamic'>#execute</a>
</p>
</h2>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(content, creator, op_number, prev_cl, next_cl)</span>
<br>
</p>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>content</span>
<span class='type'>
(
<tt>Value</tt>
)
</span>
&mdash;
<span class='desc'>The value of the insert operation. E.g. for strings content is a char. </span>
</li>
<li>
<span class='name'>creator</span>
<span class='type'>
(
<tt>Object</tt>
)
</span>
&mdash;
<span class='desc'>A unique user identifier </span>
</li>
<li>
<span class='name'>op_number</span>
<span class='type'>
(
<tt>Integer</tt>
)
</span>
&mdash;
<span class='desc'>This Number was assigned via getOperationCounter(). </span>
</li>
<li>
<span class='name'>prev_cl</span>
<span class='type'>
(
<tt><a href='../class/Operation.html'>Operation</a></tt>
)
</span>
&mdash;
<span class='desc'>The predecessor of this operation in the complete-list (cl) </span>
</li>
<li>
<span class='name'>next_cl</span>
<span class='type'>
(
<tt><a href='../class/Operation.html'>Operation</a></tt>
)
</span>
&mdash;
<span class='desc'>The successor of this operation in the complete-list (cl) </span>
</li>
</ul>
<h3>See also:</h3>
<ul class='see'>
<li>
<a href='HistoryBuffer.getOperationCounter'>HistoryBuffer.getOperationCounter</a>
</li>
</ul>
</div>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Retrieve the effective length of the $content of this operation.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='isDeleted-dynamic'>
#
(void)
<b>isDeleted</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>If isDeleted() is true this operation won&#39;t be maintained in the sl</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='getDistanceToOrigin-dynamic'>
#
(void)
<b>getDistanceToOrigin</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>The amount of positions that this operation was moved to the right.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='update_sl-dynamic'>
#
(void)
<b>update_sl</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Update the short list
TODO</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Convert all relevant information of this operation into the json-format.
This result can be send to other clients.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='execute-dynamic'>
#
(void)
<b>execute</b><span>(current_position)</span>
<br>
</p>
<div class='docstring'>
<p>The result will be concatenated with the results from the other insert operations
in order to retrieve the content of the engine.</p>
</div>
<div class='tags'>
<h3>See also:</h3>
<ul class='see'>
<li>
<a href='HistoryBuffer.toExecutedArray'>HistoryBuffer.toExecutedArray</a>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='IT-dynamic'>
#
(void)
<b>IT</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Include this operation in the associative lists. (For historical reasons IT - Inclusion Transformation)</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 02:21:01 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

239
doc/class/ListManager.html Normal file
View File

@ -0,0 +1,239 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>ListManager</span>
</div>
</div>
<div id='content'>
<h1>
Class:
ListManager
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;StructuredTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
types.Insert
</td>
</tr>
</table>
<h2>Direct Known Subclasses</h2>
<p class='children'>
<a href='../class/ReplaceManager.html'>ReplaceManager</a>
</p>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getLastOperation-dynamic'>
#
(void)
<b>getLastOperation</b><span>()</span>
</a>
</span>
<span class='desc'>
Get the element previous to the delemiter at the end
</span>
</li>
<li>
<span class='signature'>
<a href='#getFirstOperation-dynamic'>
#
(void)
<b>getFirstOperation</b><span>()</span>
</a>
</span>
<span class='desc'>
similar to the above
</span>
</li>
<li>
<span class='signature'>
<a href='#toArray-dynamic'>
#
(void)
<b>toArray</b><span>()</span>
</a>
</span>
<span class='desc'>
Transforms the the list to an array Doesn&#39;t return left-right delimiter.
</span>
</li>
<li>
<span class='signature'>
<a href='#getOperationByPosition-dynamic'>
#
(void)
<b>getOperationByPosition</b><span>(position)</span>
</a>
</span>
<span class='desc'>
Retrieves the x-th not deleted element.
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(uid, beginning, end, prev, next, origin)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getLastOperation-dynamic'>
#
(void)
<b>getLastOperation</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Get the element previous to the delemiter at the end</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='getFirstOperation-dynamic'>
#
(void)
<b>getFirstOperation</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>similar to the above</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='toArray-dynamic'>
#
(void)
<b>toArray</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Transforms the the list to an array
Doesn&#39;t return left-right delimiter.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='getOperationByPosition-dynamic'>
#
(void)
<b>getOperationByPosition</b><span>(position)</span>
<br>
</p>
<div class='docstring'>
<p>Retrieves the x-th not deleted element.</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

147
doc/class/MapManager.html Normal file
View File

@ -0,0 +1,147 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>MapManager</span>
</div>
</div>
<div id='content'>
<h1>
Class:
MapManager
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;StructuredTypes.coffee</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#set-dynamic'>
#
(void)
<b>set</b><span>(name, content)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>()</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='set-dynamic'>
#
(void)
<b>set</b><span>(name, content)</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

115
doc/class/Operation.html Normal file
View File

@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Operation</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Operation
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;BasicTypes.coffee</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>A generic interface to operations.</p>
</div>
<div class='tags'>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

164
doc/class/Replacable.html Normal file
View File

@ -0,0 +1,164 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Replacable</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Replacable
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/Operation.html'>Operation</a>
</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#execute-dynamic'>
#
(void)
<b>execute</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../class/Operation.html'>Operation</a>
</h3>
<p class='inherited'>
<a href='../class/Operation.html#getUid-dynamic'>#getUid</a>
<a href='../class/Operation.html#execute-dynamic'>#execute</a>
</p>
</h2>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(content, creator, op_number, previous)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='execute-dynamic'>
#
(void)
<b>execute</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 01:28:06 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,206 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>ReplaceManager</span>
</div>
</div>
<div id='content'>
<h1>
Class:
ReplaceManager
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;StructuredTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/ListManager.html'>ListManager</a>
</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#replace-dynamic'>
#
(void)
<b>replace</b><span>(content)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#val-dynamic'>
#
(void)
<b>val</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../class/ListManager.html'>ListManager</a>
</h3>
<p class='inherited'>
<a href='../class/ListManager.html#getLastOperation-dynamic'>#getLastOperation</a>
<a href='../class/ListManager.html#getFirstOperation-dynamic'>#getFirstOperation</a>
<a href='../class/ListManager.html#toArray-dynamic'>#toArray</a>
<a href='../class/ListManager.html#getOperationByPosition-dynamic'>#getOperationByPosition</a>
</p>
</h2>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(initial_content, uid, beginning, end, prev, next, origin)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='replace-dynamic'>
#
(void)
<b>replace</b><span>(content)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
#
(void)
<b>val</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

204
doc/class/ReplaceType.html Normal file
View File

@ -0,0 +1,204 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>ReplaceType</span>
</div>
</div>
<div id='content'>
<h1>
Class:
ReplaceType
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/Operation.html'>Operation</a>
</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#replace-dynamic'>
#
(void)
<b>replace</b><span>(content, creator, op_number)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#replaceBy-dynamic'>
#
(void)
<b>replaceBy</b><span>(op)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#execute-dynamic'>
#
(void)
<b>execute</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../class/Operation.html'>Operation</a>
</h3>
<p class='inherited'>
<a href='../class/Operation.html#getUid-dynamic'>#getUid</a>
<a href='../class/Operation.html#execute-dynamic'>#execute</a>
</p>
</h2>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(content, creator, op_number)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='replace-dynamic'>
#
(void)
<b>replace</b><span>(content, creator, op_number)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='replaceBy-dynamic'>
#
(void)
<b>replaceBy</b><span>(op)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='execute-dynamic'>
#
(void)
<b>execute</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 01:28:06 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

133
doc/class/Replaceable.html Normal file
View File

@ -0,0 +1,133 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Replaceable</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Replaceable
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;StructuredTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
types.Insert
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>Extends the basic Insert type.</p>
</div>
<div class='tags'>
</div>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(content, parent, uid, prev, next, origin)</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,287 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>TestConnector</span>
</div>
</div>
<div id='content'>
<h1>
Class:
TestConnector
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Connectors&#47;TestConnector.coffee</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getOpsInExecutionOrder-dynamic'>
#
(void)
<b>getOpsInExecutionOrder</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getRootElement-dynamic'>
#
(void)
<b>getRootElement</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#send-dynamic'>
#
(void)
<b>send</b><span>(o)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#receive-dynamic'>
#
(void)
<b>receive</b><span>(o)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#flushOne-dynamic'>
#
(void)
<b>flushOne</b><span>(user)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#flushOneRandom-dynamic'>
#
(void)
<b>flushOneRandom</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#flushAll-dynamic'>
#
(void)
<b>flushAll</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#sync-dynamic'>
#
(void)
<b>sync</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(engine, HB, execution_listener)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getOpsInExecutionOrder-dynamic'>
#
(void)
<b>getOpsInExecutionOrder</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getRootElement-dynamic'>
#
(void)
<b>getRootElement</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='send-dynamic'>
#
(void)
<b>send</b><span>(o)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='receive-dynamic'>
#
(void)
<b>receive</b><span>(o)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='flushOne-dynamic'>
#
(void)
<b>flushOne</b><span>(user)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='flushOneRandom-dynamic'>
#
(void)
<b>flushOneRandom</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='flushAll-dynamic'>
#
(void)
<b>flushAll</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='sync-dynamic'>
#
(void)
<b>sync</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

127
doc/class/TextDelete.html Normal file
View File

@ -0,0 +1,127 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>TextDelete</span>
</div>
</div>
<div id='content'>
<h1>
Class:
TextDelete
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;TextTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
types.Delete
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>At the moment TextDelete type equals the Delete type in BasicTypes.</p>
</div>
<div class='tags'>
<h3>See also:</h3>
<ul class='see'>
<li>
<a href='BasicTypes.Delete'>BasicTypes.Delete</a>
</li>
</ul>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

223
doc/class/TextInsert.html Normal file
View File

@ -0,0 +1,223 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>TextInsert</span>
</div>
</div>
<div id='content'>
<h1>
Class:
TextInsert
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;TextTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
types.Insert
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>Extends the basic Insert type.</p>
</div>
<div class='tags'>
</div>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
</a>
</span>
<span class='desc'>
Retrieve the effective length of the $content of this operation.
</span>
</li>
<li>
<span class='signature'>
<a href='#val-dynamic'>
#
(void)
<b>val</b><span>(current_position)</span>
</a>
</span>
<span class='desc'>
The result will be concatenated with the results from the other insert operations in order to retrieve the content of the engine.
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
</a>
</span>
<span class='desc'>
Convert all relevant information of this operation to the json-format.
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(content, uid, prev, next, origin)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getLength-dynamic'>
#
(void)
<b>getLength</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Retrieve the effective length of the $content of this operation.</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
#
(void)
<b>val</b><span>(current_position)</span>
<br>
</p>
<div class='docstring'>
<p>The result will be concatenated with the results from the other insert operations
in order to retrieve the content of the engine.</p>
</div>
<div class='tags'>
<h3>See also:</h3>
<ul class='see'>
<li>
<a href='HistoryBuffer.toExecutedArray'>HistoryBuffer.toExecutedArray</a>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Convert all relevant information of this operation to the json-format.
This result can be send to other clients.</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

307
doc/class/TextYatta.html Normal file
View File

@ -0,0 +1,307 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>TextYatta</span>
</div>
</div>
<div id='content'>
<h1>
Class:
TextYatta
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Frameworks&#47;TextYatta.coffee</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getRootElement-dynamic'>
#
(void)
<b>getRootElement</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getEngine-dynamic'>
#
(void)
<b>getEngine</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getConnector-dynamic'>
#
(void)
<b>getConnector</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getHistoryBuffer-dynamic'>
#
(void)
<b>getHistoryBuffer</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#getUserId-dynamic'>
#
(void)
<b>getUserId</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#val-dynamic'>
#
(void)
<b>val</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#insertText-dynamic'>
#
(void)
<b>insertText</b><span>(pos, content)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#deleteText-dynamic'>
#
(void)
<b>deleteText</b><span>(pos, length)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#replaceText-dynamic'>
#
(void)
<b>replaceText</b><span>(text)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(user_id, Connector)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getRootElement-dynamic'>
#
(void)
<b>getRootElement</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getEngine-dynamic'>
#
(void)
<b>getEngine</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getConnector-dynamic'>
#
(void)
<b>getConnector</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getHistoryBuffer-dynamic'>
#
(void)
<b>getHistoryBuffer</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='getUserId-dynamic'>
#
(void)
<b>getUserId</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
#
(void)
<b>val</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='insertText-dynamic'>
#
(void)
<b>insertText</b><span>(pos, content)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='deleteText-dynamic'>
#
(void)
<b>deleteText</b><span>(pos, length)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='replaceText-dynamic'>
#
(void)
<b>replaceText</b><span>(text)</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

263
doc/class/Word.html Normal file
View File

@ -0,0 +1,263 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Word</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Word
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;TextTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
types.ListManager
</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#insertText-dynamic'>
#
(void)
<b>insertText</b><span>(position, content)</span>
</a>
</span>
<span class='desc'>
inserts a
</span>
</li>
<li>
<span class='signature'>
<a href='#deleteText-dynamic'>
#
(void)
<b>deleteText</b><span>(position, length)</span>
</a>
</span>
<span class='desc'>
Creates a set of delete operations
</span>
</li>
<li>
<span class='signature'>
<a href='#replaceText-dynamic'>
#
(void)
<b>replaceText</b><span>(text)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#val-dynamic'>
#
(void)
<b>val</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#setReplaceManager-dynamic'>
#
(void)
<b>setReplaceManager</b><span>(op)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(uid, prev, next, origin)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='insertText-dynamic'>
#
(void)
<b>insertText</b><span>(position, content)</span>
<br>
</p>
<div class='docstring'>
<p>inserts a</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='deleteText-dynamic'>
#
(void)
<b>deleteText</b><span>(position, length)</span>
<br>
</p>
<div class='docstring'>
<p>Creates a set of delete operations</p>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='replaceText-dynamic'>
#
(void)
<b>replaceText</b><span>(text)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
#
(void)
<b>val</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='setReplaceManager-dynamic'>
#
(void)
<b>setReplaceManager</b><span>(op)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

153
doc/class/Yatta.html Normal file
View File

@ -0,0 +1,153 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>Yatta</span>
</div>
</div>
<div id='content'>
<h1>
Class:
Yatta
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Engine.coffee</td>
</tr>
</table>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getOperationCounter-dynamic'>
#
(void)
<b>getOperationCounter</b><span>(user_id)</span>
</a>
</span>
<span class='desc'>
Get the number of operations that were created by a user.
</span>
</li>
</ul>
<h2>Constructor Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='constructor-dynamic'>
#
(void)
<b>constructor</b><span>(user_id)</span>
<br>
</p>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getOperationCounter-dynamic'>
#
(void)
<b>getOperationCounter</b><span>(user_id)</span>
<br>
</p>
<div class='docstring'>
<p>Get the number of operations that were created by a user.
Accordingly you will get the next operation number that is expected from that user.</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
July 18, 14 02:21:01 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

156
doc/class_list.html Normal file
View File

@ -0,0 +1,156 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<body class='list'>
<div class='list tree' id='content'>
<h1 class='full_list_header'>Class List</h1>
<nav>
<a target='_self' href='class_list.html'>
Classes
</a>
<a target='_self' href='file_list.html'>
Files
</a>
<a target='_self' href='method_list.html'>
Methods
</a>
<a target='_self' href='extra_list.html'>
Extras
</a>
</nav>
<div id='search'>
Search:
<input type='text'>
</div>
<ul>
<li>
<a href='class/TestConnector.html' target='main'>
TestConnector
</a>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/Engine.html' target='main'>
Engine
</a>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/TextYatta.html' target='main'>
TextYatta
</a>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/HistoryBuffer.html' target='main'>
HistoryBuffer
</a>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/Operation.html' target='main'>
Operation
</a>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/MapManager.html' target='main'>
MapManager
</a>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/ListManager.html' target='main'>
ListManager
</a>
<small class='parent'>
<
types.Insert
</small>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/ReplaceManager.html' target='main'>
ReplaceManager
</a>
<small class='parent'>
<
ListManager
</small>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/Replaceable.html' target='main'>
Replaceable
</a>
<small class='parent'>
<
types.Insert
</small>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/TextDelete.html' target='main'>
TextDelete
</a>
<small class='parent'>
<
types.Delete
</small>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/TextInsert.html' target='main'>
TextInsert
</a>
<small class='parent'>
<
types.Insert
</small>
<small class='namespace'>
</small>
</li>
<li>
<a href='class/Word.html' target='main'>
Word
</a>
<small class='parent'>
<
types.ListManager
</small>
<small class='namespace'>
</small>
</li>
</ul>
</div>
</body>
</html>

112
doc/extra/LICENSE-LGPL.html Normal file

File diff suppressed because one or more lines are too long

112
doc/extra/README.md.html Normal file
View File

@ -0,0 +1,112 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../javascript/application.js'></script>
<script src='../javascript/search.js'></script>
<link rel='stylesheet' href='../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../'></div>
<div id='header'>
<div id='menu'>
<a href='../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>README.md</span>
</div>
</div>
<div id='content'>
<nav class='toc'>
<p class='title'>
<a class='hide_toc' href='#'>
<strong>Table of Contents</strong>
</a>
<small>
(<a class='float_toc' href='#'>left</a>)
</small>
</p>
</nav>
<div id='filecontents'>
<h1 id="yatta-">Yatta!</h1><p>A Collaboration Framework that is not based on the Operational Transformation. </p>
</div>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

46
doc/extra_list.html Normal file
View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<body class='list'>
<div class='list tree' id='content'>
<h1 class='full_list_header'>File List</h1>
<nav>
<a target='_self' href='class_list.html'>
Classes
</a>
<a target='_self' href='file_list.html'>
Files
</a>
<a target='_self' href='method_list.html'>
Methods
</a>
<a target='_self' href='extra_list.html'>
Extras
</a>
</nav>
<div id='search'>
Search:
<input type='text'>
</div>
<ul>
<li>
<a href='extra/README.md.html' target='main'>
README.md
</a>
</li>
<li>
<a href='extra/LICENSE-LGPL.html' target='main'>
LICENSE-LGPL
</a>
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../../javascript/application.js'></script>
<script src='../../../javascript/search.js'></script>
<link rel='stylesheet' href='../../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Connectors</span>
&raquo;
<span class='title'>TestConnector.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
TestConnector.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Connectors</td>
</tr>
</table>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../javascript/application.js'></script>
<script src='../../javascript/search.js'></script>
<link rel='stylesheet' href='../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Engine.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
Engine.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib</td>
</tr>
<tr>
<td>
Classes:
</td>
<td>
<a href='../../class/Engine.html'>
Engine
</a>
</td>
</tr>
</table>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='module.exports-variable'>
module.exports
=
</dt>
<dd>
<pre><code class='coffeescript'>Engine</code></pre>
</dd>
</dl>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,134 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../../javascript/application.js'></script>
<script src='../../../javascript/search.js'></script>
<link rel='stylesheet' href='../../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Frameworks</span>
&raquo;
<span class='title'>TextYatta.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
TextYatta.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Frameworks</td>
</tr>
<tr>
<td>
Classes:
</td>
<td>
<a href='../../../class/TextYatta.html'>
TextYatta
</a>
</td>
</tr>
</table>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='module.exports-variable'>
module.exports
=
</dt>
<dd>
<pre><code class='coffeescript'>TextYatta</code></pre>
</dd>
</dl>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../javascript/application.js'></script>
<script src='../../javascript/search.js'></script>
<link rel='stylesheet' href='../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>HistoryBuffer.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
HistoryBuffer.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib</td>
</tr>
<tr>
<td>
Classes:
</td>
<td>
<a href='../../class/HistoryBuffer.html'>
HistoryBuffer
</a>
</td>
</tr>
</table>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='module.exports-variable'>
module.exports
=
</dt>
<dd>
<pre><code class='coffeescript'>HistoryBuffer</code></pre>
</dd>
</dl>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,121 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../javascript/application.js'></script>
<script src='../../javascript/search.js'></script>
<link rel='stylesheet' href='../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>ReplaceType.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
ReplaceType.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib</td>
</tr>
<tr>
<td>
Classes:
</td>
<td>
<a href='../../class/Replaceable.html'>
Replaceable
</a>
</td>
</tr>
</table>
</div>
<div id='footer'>
July 18, 14 02:21:01 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../../javascript/application.js'></script>
<script src='../../../javascript/search.js'></script>
<link rel='stylesheet' href='../../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Types</span>
&raquo;
<span class='title'>BasicTypes.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
BasicTypes.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types</td>
</tr>
</table>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../../javascript/application.js'></script>
<script src='../../../javascript/search.js'></script>
<link rel='stylesheet' href='../../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Types</span>
&raquo;
<span class='title'>StructuredTypes.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
StructuredTypes.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types</td>
</tr>
</table>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../../javascript/application.js'></script>
<script src='../../../javascript/search.js'></script>
<link rel='stylesheet' href='../../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Types</span>
&raquo;
<span class='title'>TextTypes.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
TextTypes.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types</td>
</tr>
</table>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='../../../javascript/application.js'></script>
<script src='../../../javascript/search.js'></script>
<link rel='stylesheet' href='../../../stylesheets/application.css' type='text/css'>
</head>
<body>
<div id='base' data-path='../../../'></div>
<div id='header'>
<div id='menu'>
<a href='../../../extra/README.md.html' title='Yatta!'>
Yatta!
</a>
&raquo;
<a href='../../../alphabetical_index.html' title='Index'>
Index
</a>
&raquo;
<span class='title'>lib</span>
&raquo;
<span class='title'>Types</span>
&raquo;
<span class='title'>XmlTypes.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
XmlTypes.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types</td>
</tr>
</table>
</div>
<div id='footer'>
July 29, 14 20:52:59 by
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
Codo
</a>
2.0.9
&#10034;
Press H to see the keyboard shortcuts
&#10034;
<a href='http://twitter.com/netzpirat' target='_parent'>@netzpirat</a>
&#10034;
<a href='http://twitter.com/_inossidabile' target='_parent'>@_inossidabile</a>
</div>
<iframe id='search_frame'></iframe>
<div id='fuzzySearch'>
<input type='text'>
<ol></ol>
</div>
<div id='help'>
<p>
Quickly fuzzy find classes, mixins, methods, file:
</p>
<ul>
<li>
<span>T</span>
Open fuzzy finder dialog
</li>
</ul>
<p>
Control the navigation frame:
</p>
<ul>
<li>
<span>L</span>
Toggle list view
</li>
<li>
<span>C</span>
Show class list
</li>
<li>
<span>I</span>
Show mixin list
</li>
<li>
<span>F</span>
Show file list
</li>
<li>
<span>M</span>
Show method list
</li>
<li>
<span>E</span>
Show extras list
</li>
</ul>
<p>
You can focus and blur the search input:
</p>
<ul>
<li>
<span>S</span>
Focus search input
</li>
<li>
<span>Esc</span>
Blur search input
</li>
</ul>
</div>
</body>
</html>

132
doc/file_list.html Normal file
View File

@ -0,0 +1,132 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<body class='list'>
<div class='list tree' id='content'>
<h1 class='full_list_header'>File List</h1>
<nav>
<a target='_self' href='class_list.html'>
Classes
</a>
<a target='_self' href='file_list.html'>
Files
</a>
<a target='_self' href='method_list.html'>
Methods
</a>
<a target='_self' href='extra_list.html'>
Extras
</a>
</nav>
<div id='search'>
Search:
<input type='text'>
</div>
<ul>
<li>
<span>
lib
</span>
</li>
<ul>
<li>
<span>
Connectors
</span>
</li>
<ul>
<li>
<a href='file/lib/Connectors/TestConnector.coffee.html' target='main'>
TestConnector.coffee
</a>
<small class='namespace'>
lib&#47;Connectors
</small>
</li>
</ul>
<li>
<a href='file/lib/Engine.coffee.html' target='main'>
Engine.coffee
</a>
<small class='namespace'>
lib
</small>
</li>
<li>
<span>
Frameworks
</span>
</li>
<ul>
<li>
<a href='file/lib/Frameworks/TextYatta.coffee.html' target='main'>
TextYatta.coffee
</a>
<small class='namespace'>
lib&#47;Frameworks
</small>
</li>
</ul>
<li>
<a href='file/lib/HistoryBuffer.coffee.html' target='main'>
HistoryBuffer.coffee
</a>
<small class='namespace'>
lib
</small>
</li>
<li>
<span>
Types
</span>
</li>
<ul>
<li>
<a href='file/lib/Types/BasicTypes.coffee.html' target='main'>
BasicTypes.coffee
</a>
<small class='namespace'>
lib&#47;Types
</small>
</li>
<li>
<a href='file/lib/Types/StructuredTypes.coffee.html' target='main'>
StructuredTypes.coffee
</a>
<small class='namespace'>
lib&#47;Types
</small>
</li>
<li>
<a href='file/lib/Types/TextTypes.coffee.html' target='main'>
TextTypes.coffee
</a>
<small class='namespace'>
lib&#47;Types
</small>
</li>
<li>
<a href='file/lib/Types/XmlTypes.coffee.html' target='main'>
XmlTypes.coffee
</a>
<small class='namespace'>
lib&#47;Types
</small>
</li>
</ul>
</ul>
</ul>
</div>
</body>
</html>

14
doc/index.html Normal file
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<frameset cols='25%, *'>
<frame name='list' src='class_list.html'></frame>
<frame name='main' src='extra/README.md.html'></frame>
</frameset>
</html>

11728
doc/javascript/application.js Normal file

File diff suppressed because it is too large Load Diff

1
doc/javascript/search.js Normal file

File diff suppressed because one or more lines are too long

459
doc/method_list.html Normal file
View File

@ -0,0 +1,459 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<body class='list'>
<div class='list' id='content'>
<h1 class='full_list_header'>Method List</h1>
<nav>
<a target='_self' href='class_list.html'>
Classes
</a>
<a target='_self' href='file_list.html'>
Files
</a>
<a target='_self' href='method_list.html'>
Methods
</a>
<a target='_self' href='extra_list.html'>
Extras
</a>
</nav>
<div id='search'>
Search:
<input type='text'>
</div>
<ul>
<li>
<a href='class/HistoryBuffer.html#addOperation-dynamic' target='main' title='addOperation'>
#addOperation
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/Engine.html#applyOp-dynamic' target='main' title='applyOp'>
#applyOp
</a>
<small>
(Engine)
</small>
</li>
<li>
<a href='class/Engine.html#applyOps-dynamic' target='main' title='applyOps'>
#applyOps
</a>
<small>
(Engine)
</small>
</li>
<li>
<a href='class/HistoryBuffer.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/Replaceable.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(Replaceable)
</small>
</li>
<li>
<a href='class/ReplaceManager.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(ReplaceManager)
</small>
</li>
<li>
<a href='class/ListManager.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(ListManager)
</small>
</li>
<li>
<a href='class/MapManager.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(MapManager)
</small>
</li>
<li>
<a href='class/Engine.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(Engine)
</small>
</li>
<li>
<a href='class/TestConnector.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/Word.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/TextInsert.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(TextInsert)
</small>
</li>
<li>
<a href='class/TextYatta.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/Word.html#deleteText-dynamic' target='main' title='deleteText'>
#deleteText
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/TextYatta.html#deleteText-dynamic' target='main' title='deleteText'>
#deleteText
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/TestConnector.html#flushAll-dynamic' target='main' title='flushAll'>
#flushAll
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/TestConnector.html#flushOne-dynamic' target='main' title='flushOne'>
#flushOne
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/TestConnector.html#flushOneRandom-dynamic' target='main' title='flushOneRandom'>
#flushOneRandom
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/TextYatta.html#getConnector-dynamic' target='main' title='getConnector'>
#getConnector
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/TextYatta.html#getEngine-dynamic' target='main' title='getEngine'>
#getEngine
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/ListManager.html#getFirstOperation-dynamic' target='main' title='getFirstOperation'>
#getFirstOperation
</a>
<small>
(ListManager)
</small>
</li>
<li>
<a href='class/TextYatta.html#getHistoryBuffer-dynamic' target='main' title='getHistoryBuffer'>
#getHistoryBuffer
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/ListManager.html#getLastOperation-dynamic' target='main' title='getLastOperation'>
#getLastOperation
</a>
<small>
(ListManager)
</small>
</li>
<li>
<a href='class/TextInsert.html#getLength-dynamic' target='main' title='getLength'>
#getLength
</a>
<small>
(TextInsert)
</small>
</li>
<li>
<a href='class/HistoryBuffer.html#getNextOperationIdentifier-dynamic' target='main' title='getNextOperationIdentifier'>
#getNextOperationIdentifier
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/HistoryBuffer.html#getOperation-dynamic' target='main' title='getOperation'>
#getOperation
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/ListManager.html#getOperationByPosition-dynamic' target='main' title='getOperationByPosition'>
#getOperationByPosition
</a>
<small>
(ListManager)
</small>
</li>
<li>
<a href='class/HistoryBuffer.html#getOperationCounter-dynamic' target='main' title='getOperationCounter'>
#getOperationCounter
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/TestConnector.html#getOpsInExecutionOrder-dynamic' target='main' title='getOpsInExecutionOrder'>
#getOpsInExecutionOrder
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/TestConnector.html#getRootElement-dynamic' target='main' title='getRootElement'>
#getRootElement
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/TextYatta.html#getRootElement-dynamic' target='main' title='getRootElement'>
#getRootElement
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/HistoryBuffer.html#getUserId-dynamic' target='main' title='getUserId'>
#getUserId
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/TextYatta.html#getUserId-dynamic' target='main' title='getUserId'>
#getUserId
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/TextYatta.html#insertText-dynamic' target='main' title='insertText'>
#insertText
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/Word.html#insertText-dynamic' target='main' title='insertText'>
#insertText
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/Engine.html#parseOperation-dynamic' target='main' title='parseOperation'>
#parseOperation
</a>
<small>
(Engine)
</small>
</li>
<li>
<a href='class/TestConnector.html#receive-dynamic' target='main' title='receive'>
#receive
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/ReplaceManager.html#replace-dynamic' target='main' title='replace'>
#replace
</a>
<small>
(ReplaceManager)
</small>
</li>
<li>
<a href='class/Word.html#replaceText-dynamic' target='main' title='replaceText'>
#replaceText
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/TextYatta.html#replaceText-dynamic' target='main' title='replaceText'>
#replaceText
</a>
<small>
(TextYatta)
</small>
</li>
<li>
<a href='class/TestConnector.html#send-dynamic' target='main' title='send'>
#send
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/MapManager.html#set-dynamic' target='main' title='set'>
#set
</a>
<small>
(MapManager)
</small>
</li>
<li>
<a href='class/Word.html#setReplaceManager-dynamic' target='main' title='setReplaceManager'>
#setReplaceManager
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/TestConnector.html#sync-dynamic' target='main' title='sync'>
#sync
</a>
<small>
(TestConnector)
</small>
</li>
<li>
<a href='class/ListManager.html#toArray-dynamic' target='main' title='toArray'>
#toArray
</a>
<small>
(ListManager)
</small>
</li>
<li>
<a href='class/TextInsert.html#toJson-dynamic' target='main' title='toJson'>
#toJson
</a>
<small>
(TextInsert)
</small>
</li>
<li>
<a href='class/Word.html#toJson-dynamic' target='main' title='toJson'>
#toJson
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/ReplaceManager.html#toJson-dynamic' target='main' title='toJson'>
#toJson
</a>
<small>
(ReplaceManager)
</small>
</li>
<li>
<a href='class/HistoryBuffer.html#toJson-dynamic' target='main' title='toJson'>
#toJson
</a>
<small>
(HistoryBuffer)
</small>
</li>
<li>
<a href='class/TextInsert.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(TextInsert)
</small>
</li>
<li>
<a href='class/ReplaceManager.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(ReplaceManager)
</small>
</li>
<li>
<a href='class/Word.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(Word)
</small>
</li>
<li>
<a href='class/TextYatta.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(TextYatta)
</small>
</li>
</ul>
</div>
</body>
</html>

36
doc/mixin_list.html Normal file
View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! Documentation</title>
<script src='javascript/application.js'></script>
<script src='javascript/search.js'></script>
<link rel='stylesheet' href='stylesheets/application.css' type='text/css'>
</head>
<body class='list'>
<div class='list tree' id='content'>
<h1 class='full_list_header'>Mixin List</h1>
<nav>
<a target='_self' href='class_list.html'>
Classes
</a>
<a target='_self' href='file_list.html'>
Files
</a>
<a target='_self' href='method_list.html'>
Methods
</a>
<a target='_self' href='extra_list.html'>
Extras
</a>
</nav>
<div id='search'>
Search:
<input type='text'>
</div>
<ul>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,745 @@
pre code{display:block;padding:.5em;background:#f0f0f0}pre code,pre .subst,pre .tag .title,pre .lisp .title,pre .clojure .built_in,pre .nginx .title{color:black}pre .string,pre .title,pre .constant,pre .parent,pre .tag .value,pre .rules .value,pre .rules .value .number,pre .preprocessor,pre .haml .symbol,pre .ruby .symbol,pre .ruby .symbol .string,pre .aggregate,pre .template_tag,pre .django .variable,pre .smalltalk .class,pre .addition,pre .flow,pre .stream,pre .bash .variable,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .tex .special,pre .erlang_repl .function_or_atom,pre .asciidoc .header,pre .markdown .header,pre .coffeescript .attribute{color:#800}pre .comment,pre .annotation,pre .template_comment,pre .diff .header,pre .chunk,pre .asciidoc .blockquote,pre .markdown .blockquote{color:#888}pre .number,pre .date,pre .regexp,pre .literal,pre .hexcolor,pre .smalltalk .symbol,pre .smalltalk .char,pre .go .constant,pre .change,pre .lasso .variable,pre .asciidoc .bullet,pre .markdown .bullet,pre .asciidoc .link_url,pre .markdown .link_url{color:#080}pre .label,pre .javadoc,pre .ruby .string,pre .decorator,pre .filter .argument,pre .localvars,pre .array,pre .attr_selector,pre .important,pre .pseudo,pre .pi,pre .haml .bullet,pre .doctype,pre .deletion,pre .envvar,pre .shebang,pre .apache .sqbracket,pre .nginx .built_in,pre .tex .formula,pre .erlang_repl .reserved,pre .prompt,pre .asciidoc .link_label,pre .markdown .link_label,pre .vhdl .attribute,pre .clojure .attribute,pre .asciidoc .attribute,pre .lasso .attribute,pre .coffeescript .property{color:#88F}pre .keyword,pre .id,pre .title,pre .built_in,pre .aggregate,pre .css .tag,pre .javadoctag,pre .phpdoc,pre .yardoctag,pre .smalltalk .class,pre .winutils,pre .bash .variable,pre .apache .tag,pre .go .typename,pre .tex .command,pre .asciidoc .strong,pre .markdown .strong,pre .request,pre .status{font-weight:bold}pre .asciidoc .emphasis,pre .markdown .emphasis{font-style:italic}pre .nginx .built_in{font-weight:normal}pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:.5}
body {
padding: 0 5px;
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
font-size: 13px;
}
h1 {
font-size: 25px;
margin: 0.8em 0 0.5em;
padding-top: 4px;
border-top: 1px dotted #d5d5d5;
}
h2 {
padding: 0;
padding-bottom: 3px;
border-bottom: 1px #aaa solid;
font-size: 1.4em;
margin: 1.8em 0 0.5em;
}
#base {
display: none;
}
#fuzzySearch {
-webkit-box-shadow: rgba(0,0,0,0.5) 0px 10px 30px 10px;
box-shadow: rgba(0,0,0,0.5) 0px 10px 30px 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
position: fixed;
z-index: 8000;
left: 0;
right: 0;
top: 25px;
width: 80%;
height: 45px;
margin: 0 auto;
display: none;
background-color: #fff;
padding-top: 25px;
padding-bottom: 25px;
}
#fuzzySearch input {
margin-left: 10%;
-webkit-border-radius: 5px;
border-radius: 5px;
width: 80%;
border: 2px solid #05a;
font-size: 20px;
padding: 5px;
}
#fuzzySearch ol {
list-style-type: none;
margin: 10px 0 0 0;
padding: 0;
}
#fuzzySearch ol li {
padding: 3px;
}
#fuzzySearch ol li.stripe {
background: #f0f0f0;
}
#fuzzySearch ol li.selected {
background: #05a;
}
#fuzzySearch ol li.selected a {
color: #fff;
}
#fuzzySearch ol li.selected a:visited {
color: #fff;
}
#fuzzySearch ol li.selected a:hover {
color: #05a;
}
#fuzzySearch ol li.selected a span {
color: #05a;
}
#fuzzySearch ol li a {
color: #05a;
font-size: 18px;
text-decoration: none;
}
#fuzzySearch ol li a:visited {
color: #05a;
}
#fuzzySearch ol li a:hover {
background: #ffffa5;
}
#fuzzySearch ol li a span {
background-color: #ff0;
}
#fuzzySearch ol li small {
font-size: 14px;
padding-left: 10px;
color: #888;
}
#help {
-webkit-box-shadow: rgba(0,0,0,0.5) 0px 10px 30px 10px;
box-shadow: rgba(0,0,0,0.5) 0px 10px 30px 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
position: fixed;
z-index: 8000;
left: 0;
right: 0;
top: 50%;
width: 500px;
height: 460px;
margin: 0 auto;
margin-top: -265px;
display: none;
padding: 25px;
background-color: #fff;
}
#help ul {
list-style-type: none;
margin: 0;
padding: 0;
}
#help ul li {
height: 35px;
font-weight: bold;
}
#help ul li span {
-webkit-box-shadow: rgba(0,0,0,0.5) 1px 1px 2px;
box-shadow: rgba(0,0,0,0.5) 1px 1px 2px;
-webkit-border-radius: 3px;
border-radius: 3px;
display: block;
float: left;
width: 50px;
padding: 5px;
margin-right: 20px;
background: #eee;
text-align: center;
}
#content a:link,
#content a:visited {
text-decoration: none;
color: #05a;
}
#content a:hover {
background: #ffffa5;
}
#content #filecontents img {
border: 0;
}
#content #filecontents li {
line-height: 25px;
}
#content #filecontents table {
padding: 0;
border-collapse: collapse;
border-spacing: 0;
}
#content #filecontents table tr {
border-top: 1px solid #ccc;
background-color: #fff;
margin: 0;
padding: 0;
}
#content #filecontents table tr td {
border: 1px solid #ccc;
text-align: left;
margin: 0;
padding: 6px 13px;
}
#content table.box {
font-size: 1em;
line-height: 2;
border-spacing: 0;
border-collapse: collapse;
}
#content table.box tr {
background-color: #fff;
}
#content table.box tr:first-child {
background-color: #eee;
}
#content table.box tr td {
border: 1px solid #aaa;
}
#content table.box tr td:first-child {
width: 100px;
padding-right: 10px;
text-align: right;
font-weight: bold;
}
#content table.box tr td:last-child {
min-width: 420px;
padding-left: 10px;
padding-right: 10px;
}
#content h1 .note,
#content li .note,
#content .properties .note,
#content .method_details .signature .note {
font-weight: normal;
padding: 3px 5px;
position: relative;
top: -3px;
text-transform: capitalize;
display: inline;
}
#content .method_details .signature .note {
font-size: 0.6em;
top: -1px;
}
#content h1 .note {
font-size: 0.5em;
}
#content li .note {
top: 0px;
font-size: 0.9em;
}
#content .properties .note {
top: 0px;
font-size: 0.85em;
}
#content ul.summary,
#content .properties {
list-style: none;
font-family: monospace;
font-size: 1em;
line-height: 1.5em;
}
#content ul.summary li,
#content .properties li {
margin-bottom: 5px;
}
#content ul.summary .signature,
#content .properties .signature {
-webkit-border-radius: 3px;
border-radius: 3px;
padding: 1px 10px;
color: #05a;
background: #eaeaff;
border: 1px solid #dfdfe5;
}
#content ul.summary .signature a:hover,
#content .properties .signature a:hover {
background: transparent;
}
#content ul.summary li[deprecated] .signature,
#content .properties li[deprecated] .signature {
text-decoration: line-through;
}
#content ul.summary .signature + .note.title,
#content .properties .signature + .note.title {
margin-left: 7px;
}
#content ul.summary .desc,
#content .properties .desc {
margin-left: 32px;
display: block;
font-family: sans-serif;
}
#content ul.summary .desc p,
#content .properties .desc p {
padding: 0;
margin: 0;
}
#content dl.constants dt {
font-weight: bold;
}
#content dl.constants,
#content dl.properties {
margin-left: 40px;
}
#content dl.constants dt,
#content dl.properties dt {
font-size: 1.1em;
margin-bottom: 5px;
}
#content dl.constants dt .docstring,
#content dl.properties dt .docstring {
margin-left: 32px;
font-size: 0.9em;
font-weight: normal;
}
#content dl.constants dd,
#content dl.properties dd {
margin-bottom: 18px;
}
#content .method_details {
border-top: 1px dotted #aaa;
margin-top: 15px;
padding-top: 0;
}
#content .method_details:first-child {
border: none;
}
#content .method_details p.signature {
-webkit-border-radius: 3px;
border-radius: 3px;
font-size: 1.1em;
font-weight: normal;
font-family: Monaco, Consolas, Courier, monospace;
padding: 6px 10px;
margin-top: 18px;
background: #e5e8ff;
border: 1px solid #d8d8e5;
}
#content .tags {
font-size: 13px;
}
#content .tags h3 {
font-size: 1em;
margin-bottom: 3px;
}
#content .tags ul {
margin-top: 0px;
padding-left: 30px;
list-style: square;
}
#content .tags ul .name {
font-family: monospace;
font-weight: bold;
}
#content .tags .overloads h3 {
margin-bottom: 0px;
}
#content .tags .overloads .overload {
margin-left: 20px;
}
#content .tags .overloads .overload p.signature {
padding-top: 2px;
padding-bottom: 2px;
}
#content .tags .events h3 {
margin-bottom: 0px;
}
#content .tags .events .event {
margin-left: 20px;
}
#content .tags .events .event p.signature {
padding-top: 2px;
padding-bottom: 2px;
}
#content .note {
-webkit-border-radius: 3px;
border-radius: 3px;
margin-top: 10px;
color: #222;
background: #e3e4e3;
border: 1px solid #d5d5d5;
padding: 7px 10px;
display: block;
}
#content .deprecated {
background: #ffe5e5;
border-color: #e9dada;
}
#content .writeonly {
background: #d3ff97;
border-color: #c3eb8b;
}
#content .readonly {
background: #ffe5e5;
border-color: #e9dada;
}
#content .bound {
background: #d3ff97;
border-color: #c3eb8b;
}
#content .todo {
background: #ffffc5;
border-color: #ececaa;
}
#content .private {
background: #d5d5d5;
border-color: #c5c5c5;
}
#content .constructor {
color: #fff;
background: #6a98d6;
border-color: #6689d6;
}
#content h3.inherited,
#content h3.included,
#content h3.extended {
font-style: italic;
font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
font-weight: normal;
padding: 0;
margin: 0;
margin-top: 12px;
margin-bottom: 3px;
font-size: 13px;
}
#content p.inherited,
#content p.included,
#content p.extended {
word-spacing: 5px;
font-size: 1.2em;
padding: 0;
margin: 0;
margin-left: 25px;
}
#content p.inherited a,
#content p.included a,
#content p.extended a {
font-family: monospace;
font-size: 0.9em;
}
#footer {
margin-top: 15px;
border-top: 1px solid #ccc;
text-align: center;
padding: 7px 0;
font-size: 12px;
color: #999;
}
#footer a:link,
#footer a:visited {
color: #999;
text-decoration: none;
border-bottom: 1px dotted #bbd;
}
#footer a:hover {
color: #05a;
}
#menu {
font-size: 1.3em;
color: #bbb;
top: -5px;
position: relative;
}
#menu .title,
#menu a {
font-size: 0.7em;
}
#menu .title a {
font-size: 1em;
}
#menu .title {
color: #555;
}
#menu a:link,
#menu a:visited {
color: #333;
text-decoration: none;
border-bottom: 1px dotted #bbd;
}
#menu a:hover {
color: #05a;
}
#header nav {
float: right;
color: #000;
font-size: 0.7em;
}
#header nav ul {
list-style-type: none;
margin: 4px !important;
}
#header nav ul,
#header nav ul li {
margin: 0px;
padding: 0px;
display: inline;
}
#header nav a {
font-size: 1em;
}
#header #search {
float: right;
margin-top: -3px;
}
#header #search a:link,
#header #search a:visited {
-webkit-box-shadow: #ddd -1px 1px 3px;
box-shadow: #ddd -1px 1px 3px;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
display: block;
float: left;
margin-right: 4px;
padding: 8px 10px;
color: #05a;
background: #eaf0ff;
text-decoration: none;
border: 1px solid #d8d8e5;
}
#header #search a:hover {
background: #f5faff;
color: #06b;
}
#header #search a.active {
border-top-left-radius: 5px;
border-top-right-radius: 5px;
padding-bottom: 20px;
color: #fff;
background: #568;
border: 1px solid #457;
}
#header #search a.inactive {
color: #999;
}
#search_frame {
-webkit-box-shadow: #aaa -7px 5px 25px;
box-shadow: #aaa -7px 5px 25px;
display: none;
position: absolute;
overflow-y: scroll;
z-index: 9999;
top: 36px;
right: 18px;
width: 500px;
height: 80%;
background: #fff;
border: 1px solid #999;
border-collapse: collapse;
}
.alphaindex {
margin-top: 0;
font-size: 22px;
}
.noborder {
border-top: 0px;
margin-top: 0;
padding-top: 4px;
}
.title {
margin-bottom: 10px;
}
#files {
padding: 0;
font-size: 1.1em;
}
#files li {
list-style: none;
display: inline;
padding: 7px 12px;
line-height: 35px;
background: #f0f0f0;
margin-right: 5px;
}
.index {
-webkit-column-count: 3;
-moz-column-count: 3;
column-count: 3;
-webkit-column-width: 33%;
-moz-column-width: 33%;
column-width: 33%;
}
.index > ul {
margin: 0;
padding: 0;
padding-bottom: 10px;
font-size: 1.1em;
list-style: none;
}
.index > ul > li.letter {
-webkit-column-break-after: avoid;
font-size: 1.4em;
padding-bottom: 10px;
text-transform: uppercase;
}
.index > ul > ul {
margin: 0;
padding-left: 20px;
}
.index > ul > ul small {
color: #666;
font-size: 0.7em;
}
body.list {
padding: 0;
margin: 0;
}
body #content.list #search {
position: relative;
margin-top: 5px;
margin-left: 10px;
}
#content.list.tree > ul {
margin-top: 13px !important;
}
#content.list.tree ul {
font-size: 16px;
margin: 0;
padding: 0;
}
#content.list.tree ul li {
margin: 0;
padding: 5px;
color: #000;
font-size: 1em;
list-style: none;
white-space: nowrap;
overflow: hidden;
cursor: pointer;
}
#content.list.tree ul li.namespace {
overflow: visible;
}
#content.list.tree ul li > a.toggle {
display: block;
float: left;
width: 10px;
height: 10px;
margin-top: 5px;
margin-left: 5px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC");
background-repeat: no-repeat;
background-position: 0px -10px;
}
#content.list.tree ul li > a.toggle.collapsed {
background-position: 0px 0px;
}
#content.list.tree ul li > span,
#content.list.tree ul li a {
margin-left: 20px;
text-decoration: none;
}
#content.list.tree ul li > a.toggle + span,
#content.list.tree ul li a.toggle + a {
margin-left: 5px;
}
#content.list.tree ul li small {
color: #888;
white-space: nowrap;
}
#content.list.tree ul li small.namespace {
display: none;
}
#content.list.tree ul li.result a.toggle {
visibility: hidden;
}
#content.list.tree ul li.result small.namespace {
display: inline;
}
#content.list.tree ul li.result small.parent {
display: none;
}
#content.list {
padding: 0;
margin: 0;
}
#content.list h1 {
padding: 12px 10px;
padding-bottom: 10px;
margin: 0;
font-size: 1.4em;
}
#content.list a:hover {
background: transparent;
}
#content.list nav {
margin-left: 10px;
}
#content.list #search {
color: #888;
}
#content.list #search input {
-webkit-border-radius: 3px;
border-radius: 3px;
border: 1px solid #bbb;
}
#content.list a {
color: #05a;
cursor: pointer;
text-decoration: none;
}
#content.list a:hover {
text-decoration: underline;
}
#content.list ul {
padding: 0;
list-style: none;
margin-left: 0;
}
#content.list ul li[deprecated] {
text-decoration: line-through;
}
#content.list ul li {
padding: 5px;
padding-left: 12px;
margin: 0;
font-size: 1.1em;
list-style: none;
color: #888;
cursor: pointer;
}
#content.list ul li.stripe {
background: #f0f0f0;
}
#content.list ul li:hover {
background: #ddd;
}
nav.toc {
-webkit-box-shadow: #bbb -2px 2px 6px;
box-shadow: #bbb -2px 2px 6px;
overflow: hidden;
float: right;
z-index: 500;
right: 0px;
max-width: 300px;
padding: 20px;
padding-right: 30px;
margin-left: 20px;
margin-bottom: 20px;
background: #fff;
border: 1px solid #ddd;
}
nav.toc p.title {
margin-top: 5px;
}
nav.toc ol {
padding-left: 1.8em;
}
nav.toc li {
font-size: 1.1em;
line-height: 1.7em;
}
nav.toc > ol > li {
font-size: 1.1em;
font-weight: bold;
}
nav.toc ol > ol {
font-size: 0.9em;
}
nav.toc.inline {
-webkit-box-shadow: #fff 0px 0px 0px;
box-shadow: #fff 0px 0px 0px;
position: relative;
float: none;
padding: 0;
margin: 5px 0 0 0;
border: 0px;
}
nav.toc.inline.hidden {
background: none;
padding: 0;
text-align: left;
}
nav.toc.hidden {
height: 26px;
width: 140px;
padding: 5px;
background: #f6f6f6;
text-align: center;
}
nav.toc.hidden p.title small {
display: none;
}

View File

@ -0,0 +1,51 @@
_ = require "underscore"
module.exports = (user_list)->
class TestConnector
constructor: (@engine, @HB, @execution_listener)->
send_ = (o)=>
@send o
@execution_listener.push send_
if not (user_list?.length is 0)
@engine.applyOps user_list[0].getHistoryBuffer().toJson()
@unexecuted = {}
@applied_operations = []
appliedOperationsListener = (o)=>
@applied_operations.push o
@execution_listener.push appliedOperationsListener
getOpsInExecutionOrder: ()->
@applied_operations
getRootElement: ()->
if user_list.length > 0
user_list[0].getRootElement()
send: (o)->
if o.creator is @HB.getUserId()
for user in user_list
if not user.getUserId() is @HB.getUserId()
user.getConnector().receive(o)
receive: (o)->
@unexecuted[o.creator] ?= []
@unexecuted[o.creator].push o
flushOne: (user)->
if @unexecuted[user]?.length > 0
@engine.applyOp @unexecuted[user].shift()
flushOneRandom: ()->
@flushOne (_.random 0, (user_list.length-1))
flushAll: ()->
for ops of @unexecuted
@engine.applyOps ops
@unexecuted = {}
sync: ()->
throw new Error "Can't use this a.t.m."

44
lib/Engine.coffee Normal file
View File

@ -0,0 +1,44 @@
_ = require "underscore"
class Engine
constructor: (@HB, @parser)->
@unprocessed_ops = []
parseOperation: (json)->
typeParser = @parser[json.type]
if typeParser?
typeParser json
else
throw new Error "You forgot to specify a parser for type #{json.type}. The message is #{JSON.stringify json}."
# TODO:
applyOps: (ops)->
for o in ops
@applyOp o
applyOp: (op_json)->
# $parse_and_execute will return false if $o_json was parsed and executed, otherwise the parsed operadion
o = @parseOperation o_json
@HB.addOperation o
if not o.execute()
@unprocessed_ops.push o
unprocessed = []
for op in @unprocessed_ops
if not op.execute()
unprocessed.push op
@unprocessed_ops = unprocessed
module.exports = Engine

View File

@ -0,0 +1,47 @@
text_types_uninitialized = require "../Types/TextTypes.coffee"
HistoryBuffer = require "../HistoryBuffer.coffee"
Engine = require "../Engine.coffee"
class TextYatta
constructor: (user_id, Connector)->
@HB = new HistoryBuffer user_id
text_types = text_types_uninitialized @HB
@engine = new Engine @HB, text_types.parser
@connector = new Connector @engine, @HB, text_types.execution_listener
@root_element = @connector.getRootElement()
if not @root_element?
first_word = new text_types.types.Word @HB.getNextOperationIdentifier()
@HB.addOperation(first_word)
first_word.execute()
@root_element = @HB.addOperation(new text_types.types.ReplaceManager first_word, @HB.getNextOperationIdentifier()).execute()
getRootElement: ()->
@root_element
getEngine: ()->
@engine
getConnector: ()->
@connector
getHistoryBuffer: ()->
@HB
getUserId: ()->
@HB.getUserId()
val: ()->
@root_element.val().val()
insertText: (pos, content)->
@root_element.val().insertText pos, content
deleteText: (pos, length)->
@root_element.val().deleteText pos, length
replaceText: (text)->
@root_element.val().replaceText text
module.exports = TextYatta

75
lib/HistoryBuffer.coffee Normal file
View File

@ -0,0 +1,75 @@
_ = require "underscore"
#
# An object that holds all applied operations.
#
# @note The HistoryBuffer is commonly abbreviated to HB.
#
class HistoryBuffer
# @overload new HistoryBuffer()
# Creates an empty HB.
# @param {Object} user_id Creator of the HB.
# @overload new HistoryBuffer(initial_content)
# Creates an HB with initial operations that represent the initial_value.
# @param {Array<Object>} initial_content Initial content of the DUC
# @see DUC DUC - Document Under Collaboration
constructor: (@user_id)->
@operation_counter = {}
@buffer = {}
@change_listeners = []
getUserId: ()->
@user_id
getOperationCounter: ()->
_.clone @operation_counter
toJson: ()->
json = []
for user in @buffer
for o of user
json.push o.toJson()
json
# Get the number of operations that were created by a user.
# Accordingly you will get the next operation number that is expected from that user.
# You'll get new results only if you added the operation with $addOperation.
#
getNextOperationIdentifier: (user_id)->
if not user_id?
user_id = @user_id
if not @operation_counter[user_id]?
@operation_counter[user_id] = 0
uid = {
'creator' : user_id
'op_number' : @operation_counter[user_id]
}
@operation_counter[user_id]++
uid
# Retrieve an operation from a unique id.
getOperation: (uid)->
if uid instanceof Object
@buffer[uid.creator]?[uid.op_number]
else
throw new Error "This type of uid is not defined!"
# Add an operation to the HB. Note that this will not link it against
# other operations (it wont be executable)
addOperation: (o)->
if not @buffer[o.creator]?
@buffer[o.creator] = {}
if not @operation_counter[o.creator]?
@operation_counter[o.creator] = 0
#if @operation_counter[o.creator] isnt o.op_number and typeof o.op_number is 'number'
# throw new Error "You don't receive operations in the proper order. Try counting like this 0,1,2,3,4,.. ;)"
if @buffer[o.creator][o.op_number]?
throw new Error "You must not overwrite operations!"
@buffer[o.creator][o.op_number] = o
if typeof o.op_number is 'number' and o.creator isnt @getUserId()
@operation_counter[o.creator]++
o
module.exports = HistoryBuffer

284
lib/Types/BasicTypes.coffee Normal file
View File

@ -0,0 +1,284 @@
module.exports = (HB)->
# @see Engine.parse
parser = {}
execution_listener = []
#
# A generic interface to operations.
#
class Operation
# @param {Object} uid A unique identifier
# @see HistoryBuffer.getNextOperationIdentifier
constructor: ({'creator': @creator, 'op_number' : @op_number})->
# Computes a unique identifier (uid).
getUid: ()->
{ 'creator': @creator, 'op_number': @op_number }
execute: ()->
for l in execution_listener
l @toJson()
@
#
# Operations may depend on other operations (linked lists, etc.). The saveOperation and validateSavedOperations methods provide
# an easy way to refer to these operations via an uid or object reference.
#
# For example: We can create a new Delete operation that deletes the operation $o like this
# - var d = new Delete(uid, $o); or
# - var d = new Delete(uid, $o.getUid());
# Either way we want to access $o via d.deletes. This is possible after calling validateSavedOperations.
#
# @overload saveOperation(name, op_uid)
# @param {String} name The name of the operation. After validating (with validateSavedOperations) the instantiated operation will be accessible via this[name].
# @param {Object} op_uid A uid that refers to an operation
# @overload saveOperation(name, op)
# @param {String} name The name of the operation. After calling this function op is accessible via this[name].
# @param {Operation} op An Operation object
#
saveOperation: (name, op)->
# Every instance of $Operation must have an $execute function.
# We use duck-typing to check if op is instantiated since there
# could exist multiple classes of $Operation
if op?.execute?
# is instantiated
@[name] = op
else if op?
# not initialized. Do it when calling $validateSavedOperations()
@unchecked ?= {}
@unchecked[name] = op
#
# After calling this function all not instantiated operations will be accessible.
# @see Operation.saveOperation
#
# @return [Boolean] Whether it was possible to instantiate all operations.
#
validateSavedOperations: ()->
uninstantiated = {}
success = @
for name, op_uid of @unchecked
op = HB.getOperation op_uid
if op
@[name] = op
else
uninstantiated[name] = op
success = false
delete @unchecked
if not success
@unchecked = uninstantiated
success
#
# A simple delete-type operation.
#
class Delete extends Operation
constructor: (uid, deletes)->
@saveOperation 'deletes', deletes
super uid
#
# Convert all relevant information of this operation to the json-format.
# This result can be sent to other clients.
#
toJson: ()->
{
'type': "Delete"
'uid': @getUid()
'deletes': @deletes.getUid()
}
execute: ()->
if @validateSavedOperations()
@deletes.applyDelete @
super
@
else
false
#
# Define how to parse $Delete operations.
#
parser['Delete'] = ({'uid' : uid, 'deletes': deletes_uid})->
new D uid, deletes_uid
#
# A simple insert-type operation.
#
# An insert operation is always positioned between two other insert operations.
# Internally this is realized as associative lists, whereby each insert operation has a predecessor and a successor.
# For the sake of efficiency we maintain two lists:
# - The short-list (abbrev. sl) maintains only the operations that are not deleted
# - The complete-list (abbrev. cl) maintains all operations
#
class Insert extends Operation
# @param {Value} content The value of the insert operation. E.g. for strings content is a char.
# @param {Object} creator A unique user identifier
# @param {Integer} op_number This Number was assigned via getNextOperationIdentifier().
# @param {Operation} prev_cl The predecessor of this operation in the complete-list (cl)
# @param {Operation} next_cl The successor of this operation in the complete-list (cl)
#
# @see HistoryBuffer.getNextOperationIdentifier
constructor: (uid, prev_cl, next_cl, origin)->
@saveOperation 'prev_cl', prev_cl
@saveOperation 'next_cl', next_cl
if origin?
@saveOperation 'origin', origin
else
@saveOperation 'origin', prev_cl
super uid
applyDelete: (o)->
@deleted_by ?= []
@deleted_by.push o
#
# If isDeleted() is true this operation won't be maintained in the sl
#
isDeleted: ()->
@deleted_by?.length > 0
#
# The amount of positions that $this operation was moved to the right.
#
getDistanceToOrigin: ()->
d = 0
o = @prev_cl
while true
if @origin is o
break
d++
o = o.prev_cl
d
#
# Update the short list
# TODO (Unused)
update_sl: ()->
o = @prev_cl
update: (dest_cl,dest_sl)->
while true
if o.isDeleted()
o = o[dest_cl]
else
@[dest_sl] = o
break
update "prev_cl", "prev_sl"
update "next_cl", "prev_sl"
#
# Include this operation in the associative lists.
#
execute: ()->
if not @validateSavedOperations()
return false
else
if @prev_cl? and @next_cl?
distance_to_origin = 0
o = @prev_cl.next_cl
i = 0
# $this has to find a unique position between origin and the next known character
# case 1: $origin equals $o.origin: the $creator parameter decides if left or right
# let $OL= [o1,o2,o3,o4], whereby $this is to be inserted between o1 and o4
# o2,o3 and o4 origin is 1 (the position of o2)
# there is the case that $this.creator < o2.creator, but o3.creator < $this.creator
# then o2 knows o3. Since on another client $OL could be [o1,o3,o4] the problem is complex
# therefore $this would be always to the right of o3
# case 2: $origin < $o.origin
# if current $this insert_position > $o origin: $this ins
# else $insert_position will not change (maybe we encounter case 1 later, then this will be to the right of $o)
# case 3: $origin > $o.origin
# $this insert_position is to the left of $o (forever!)
while true
if not o?
# TODO: Debugging
console.log JSON.stringify @prev_cl.getUid()
console.log JSON.stringify @next_cl.getUid()
if o isnt @next_cl
# $o happened concurrently
if o.getDistanceToOrigin() is i
# case 1
if o.creator < @creator
@prev_cl = o
distance_to_origin = i + 1
else
# nop
else if o.getDistanceToOrigin() < i
# case 2
if i - distance_to_origin <= o.getDistanceToOrigin()
@prev_cl = o
distance_to_origin = i + 1
else
#nop
else
# case 3
break
i++
o = o.next_cl
else
# $this knows that $o exists,
break
# now reconnect everything
@next_cl = @prev_cl.next_cl
@prev_cl.next_cl = @
@next_cl.prev_cl = @
super # notify the execution_listeners
@
val: ()->
throw new Error "Implement this function!"
#
# A delimiter is placed at the end and at the beginning of the associative lists.
# This is necessary in order to have a beginning and an end even if the content
# of the Engine is empty.
#
class Delimiter extends Insert
isDeleted: ()->
false
getDistanceToOrigin: ()->
0
execute: ()->
a = @validateSavedOperations()
for l in execution_listener
l @toJson()
a
toJson: ()->
{
'type' : "Delimiter"
'uid' : @getUid()
'prev' : @prev_cl.getUid()
'next' : @next_cl.getUid()
}
parser['Delimiter'] = (json)->
{
'uid' : uid
'prev' : prev
'next' : next
} = json
new Delimiter uid, prev, next
# This is what this module exports after initializing it with the HistoryBuffer
{
'types' :
'Delete' : Delete
'Insert' : Insert
'Delimiter': Delimiter
'Operation': Operation
'parser' : parser
'execution_listener' : execution_listener
}

View File

@ -0,0 +1,175 @@
_ = require "underscore"
basic_types_uninitialized = require "./BasicTypes.coffee"
module.exports = (HB)->
basic_types = basic_types_uninitialized HB
types = basic_types.types
parser = basic_types.parser
class MapManager
constructor: ()->
@map = {}
set: (name, content)->
if not @map[name]?
@map[name] = new Replaceable HB,
@map[name].replace content
class ListManager extends types.Insert
constructor: (uid, beginning, end, prev, next, origin)->
if beginning? and end?
saveOperation "beginning", beginning
saveOperation "end", end
else
@beginning = HB.addOperation new types.Delimiter HB.getNextOperationIdentifier(), undefined, undefined
@end = HB.addOperation new types.Delimiter HB.getNextOperationIdentifier(), @beginning, undefined
@beginning.next_cl = @end
super uid, prev, next, origin
# Get the element previous to the delemiter at the end
getLastOperation: ()->
@end.prev_cl
# similar to the above
getFirstOperation: ()->
@beginning.next_cl
# Transforms the the list to an array
# Doesn't return left-right delimiter.
toArray: ()->
o = @beginning.next_cl
result = []
while o isnt @end
result.push o
o = o.next_cl
result
#
# Retrieves the x-th not deleted element.
#
getOperationByPosition: (position)->
o = @beginning.next_cl
if position > 0
while true
o = o.next_cl
if not o.isDeleted()
position -= 1
if position is 0
break
if o instanceof types.Delimiter
throw new Error "position parameter exceeded the length of the document!"
o
class ReplaceManager extends ListManager
constructor: (initial_content, uid, beginning, end, prev, next, origin)->
super uid, beginning, end, prev, next, origin
if initial_content?
@replace initial_content
replace: (content)->
o = @getLastOperation()
op = new Replaceable content, @, HB.getNextOperationIdentifier(), o, o.next_cl
HB.addOperation(op).execute()
val: ()->
o = @getLastOperation()
if o instanceof types.Delimiter
throw new Error "dtrn"
o.val()
toJson: ()->
json =
{
'type': "ReplaceManager"
'uid' : @getUid()
'beginning' : @beginning
'end' : @end
}
if @prev_cl? and @next_cl?
json['prev'] = @prev_cl.getUid()
json['next'] = @next_cl.getUid()
if @origin? and @origin isnt @prev_cl
json["origin"] = @origin.getUid()
json
parser["ReplaceManager"] = (json)->
{
'content' : content
'uid' : uid
'prev': prev
'next': next
'origin' : origin
'beginning' : beginning
'end' : end
} = json
new ReplaceManager content, uid, beginning, end, prev, next, origin
#
# Extends the basic Insert type.
#
class Replaceable extends types.Insert
constructor: (content, parent, uid, prev, next, origin)->
@saveOperation 'content', content
@saveOperation 'parent', parent
if not (prev? and next?)
throw new Error "You must define prev, and next for Replaceable-types!"
super uid, prev, next, origin
#
#
val: ()->
@content
replace: (content)->
@parent.replace content
execute: ()->
super
@content.setReplaceManager?(@parent)
@
#
# Convert all relevant information of this operation to the json-format.
# This result can be send to other clients.
#
toJson: ()->
json =
{
'type': "Replaceable"
'content': @content.getUid()
'ReplaceManager' : @parent
'prev': @prev_cl.getUid()
'next': @next_cl.getUid()
'uid' : @getUid()
}
if @origin? and @origin isnt @prev_cl
json["origin"] = @origin.getUid()
json
parser["Replaceable"] = (json)->
{
'content' : content
'ReplaceManager' : parent
'uid' : uid
'prev': prev
'next': next
'origin' : origin
} = json
new Replaceable content, parent, uid, prev, next, origin
types['ListManager'] = ListManager
types['MapManager'] = MapManager
types['ReplaceManager'] = ReplaceManager
types['Replaceable'] = Replaceable
basic_types

145
lib/Types/TextTypes.coffee Normal file
View File

@ -0,0 +1,145 @@
_ = require "underscore"
structured_types_uninitialized = require "./StructuredTypes.coffee"
module.exports = (HB)->
structured_types = structured_types_uninitialized HB
types = structured_types.types
parser = structured_types.parser
#
# At the moment TextDelete type equals the Delete type in BasicTypes.
# @see BasicTypes.Delete
#
class TextDelete extends types.Delete
parser["TextDelete"] = parser["Delete"]
#
# Extends the basic Insert type.
#
class TextInsert extends types.Insert
constructor: (@content, uid, prev, next, origin)->
if not (prev? and next?)
throw new Error "You must define prev, and next for TextInsert-types!"
super uid, prev, next, origin
#
# Retrieve the effective length of the $content of this operation.
#
getLength: ()->
if @isDeleted()
0
else
@content.length
#
# The result will be concatenated with the results from the other insert operations
# in order to retrieve the content of the engine.
# @see HistoryBuffer.toExecutedArray
#
val: (current_position)->
if @isDeleted()
""
else
@content
#
# Convert all relevant information of this operation to the json-format.
# This result can be send to other clients.
#
toJson: ()->
json =
{
'type': "TextInsert"
'content': @content
'uid' : @getUid()
'prev': @prev_cl.getUid()
'next': @next_cl.getUid()
}
if @origin? and @origin isnt @prev_cl
json["origin"] = @origin.getUid()
json
parser["TextInsert"] = (json)->
{
'content' : content
'uid' : uid
'prev': prev
'next': next
'origin' : origin
} = json
new TextInsert content, uid, prev, next, origin
class Word extends types.ListManager
constructor: (uid, prev, next, origin)->
super uid, prev, next, origin
# inserts a
insertText: (position, content)->
o = @getOperationByPosition position
for c in content
op = new TextInsert c, HB.getNextOperationIdentifier(), o.prev_cl, o
HB.addOperation(op).execute()
# Creates a set of delete operations
deleteText: (position, length)->
o = @getOperationByPosition position
for i in [0...length]
d = HB.addOperation(new TextDelete HB.getNextOperationIdentifier(), o).execute()
o = o.next_cl
while o.isDeleted()
if o instanceof types.Delimiter
throw new Error "You can't delete more than there is.."
o = o.next_cl
d.toJson()
replaceText: (text)->
if @replace_manager?
word = HB.addOperation(new Word HB.getNextOperationIdentifier()).execute()
word.insertText 0, text
@replace_manager.replace(word)
else
throw new Error "This type is currently not maintained by a ReplaceManager!"
val: ()->
c = for o in @toArray()
if o.val?
o.val()
else
""
c.join('')
setReplaceManager: (op)->
@saveOperation 'replace_manager', op
@validateSavedOperations
toJson: ()->
json = {
'type': "TextInsert"
'content': @content
'uid' : @getUid()
}
if @prev_cl?
json['prev'] = @prev_cl.getUid()
if @next_cl?
json['next'] = @next_cl.getUid()
if @origin? and @origin isnt @prev_cl
json["origin"] = @origin.getUid()
json
parser['Word'] = (json)->
{
'content' : content
'uid' : uid
'prev': prev
'next': next
'origin' : origin
} = json
new Word uid, prev, next, origin
types['TextInsert'] = TextInsert
types['TextDelete'] = TextDelete
types['Word'] = Word
structured_types

View File

@ -0,0 +1 @@
_ = require "underscore"

45
package.json Normal file
View File

@ -0,0 +1,45 @@
{
"name": "JACK",
"version": "0.0.0",
"description": "Just Another Collaboration frameworK",
"main": "lib/index.js",
"scripts": {
"test": "grunt test"
},
"repository": {
"type": "git",
"url": "https://github.com/DadaMonad/JACK"
},
"keywords": [
"OT",
"Complex",
"Data",
"Structures",
"XML",
"collaboration"
],
"author": "Kevin Jahns",
"license": "GPLv3",
"bugs": {
"url": "https://github.com/DadaMonad/JACK/issues"
},
"homepage": "https://github.com/DadaMonad/JACK",
"dependencies": {
"underscore": "^1.6.0"
},
"devDependencies": {
"grunt-contrib-coffee": "^0.10.1",
"grunt": "^0.4.5",
"sinon-chai": "^2.5.0",
"grunt-simple-mocha": "^0.4.0",
"grunt-contrib-watch": "^0.6.1",
"chai": "^1.9.1",
"coffeeify": "^0.6.0",
"sinon": "^1.10.2",
"grunt-browserify": "^2.1.3",
"grunt-coffeelint": "0.0.10",
"mocha": "^1.20.1",
"browserify": "^4.2.0",
"grunt-codo": "^0.2.0"
}
}

149
test/TextYatta_test.coffee Normal file
View File

@ -0,0 +1,149 @@
chai = require('chai')
expect = chai.expect
should = chai.should()
sinon = require('sinon')
sinonChai = require('sinon-chai')
_ = require "underscore"
chai.use(sinonChai)
Yatta = require "../lib/Frameworks/TextYatta.coffee"
Connector_uninitialized = require "../lib/Connectors/TestConnector.coffee"
describe "TextYatta", ->
beforeEach (done)->
@last_user = 10
@users = []
@Connector = Connector_uninitialized @users
for i in [0..(@last_user+1)]
@users.push(new Yatta i, @Connector)
done()
it "can handle many engines, many operations, concurrently (random)", ->
number_of_test_cases_multiplier = 1
repeat_this = 1000 * number_of_test_cases_multiplier
doSomething_amount = 1000 * number_of_test_cases_multiplier
number_of_engines = 300 + number_of_test_cases_multiplier - 1
maximum_ops_per_engine = 20 * number_of_test_cases_multiplier
@time = 0
@ops = 0
generateInsertOp = (user_num)->
chars = "1234567890"
pos = _.random 0, (users[user_num].val().length-1)
length = 1 #_.random 0, 10
nextchar = chars[(_.random 0, (chars.length-1))]
text = ""
_(length).times ()-> text += nextchar
users[user_num].insertText pos, text
null
generateReplaceOp = (user_num)->
chars = "abcdefghijklmnopqrstuvwxyz"
length = _.random 0, 10
nextchar = chars[(_.random 0, (chars.length-1))]
text = ""
_(length).times ()-> text += nextchar
users[user_num].replaceText text
generateDeleteOp = (user_num)->
if users[user_num].val().length > 0
pos = _.random 0, (users[user_num].val().length-1)
length = 1 # _.random 0, ot.val().length - pos
ops1 = users[user_num].deleteText pos, length
undefined
generateRandomOp = (user_num)->
op_gen = [generateDeleteOp, generateInsertOp, generateReplaceOp]
i = _.random (op_gen.length - 1)
op = op_gen[i](user_num)
applyRandomOp = (user_num)->
user = users[user_num]
user.getConnector().flushOneRandom()
doSomething = do ()->
()->
user_num = _.random (number_of_engines-1)
choices = [applyRandomOp, generateRandomOp]
#if (users[user_num].buffer[user_num].length < maximum_ops_per_engine)
# choices = choices.concat generateRandomOp
choice = _.random (choices.length-1)
choices[choice](user_num)
console.log ""
for times in [1..repeat_this]
#console.log "repeated_this x #{times} times"
users = []
Connector = Connector_uninitialized users
for i in [0...number_of_engines]
users.push(new Yatta i, Connector)
found_error = false
#try
time_now = (new Date).getTime()
for i in [1..doSomething_amount]
doSomething()
for user,user_number in users
user.getConnector().flushAll()
@time += (new Date()).getTime() - time_now
###catch error
found_error = true
console.log "Just found some error!!! :-)"
console.log error
###
number_of_created_operations = 0
for i in [0...(users.length)]
number_of_created_operations += users[i].getConnector().getOpsInExecutionOrder().length
@ops += number_of_created_operations*users.length
ops_per_msek = Math.floor(@ops/@time)
console.log "#{times}/#{repeat_this}: Every collaborator (#{users.length}) applied #{number_of_created_operations} ops in a different order." + " Over all we consumed #{@ops} operations in #{@time/1000} seconds (#{ops_per_msek} ops/msek)."
console.log users[0].val()
for i in [0...(users.length-1)]
if ((users[i].val() isnt users[i+1].val()) )# and (number_of_created_operations <= 6 or true)) or found_error
printOpsInExecutionOrder = (otnumber, otherotnumber)->
ops = users[otnumber].getConnector().getOpsInExecutionOrder()
for s in ops
console.log JSON.stringify s
console.log ""
s = "ops = ["
for o,j in ops
if j isnt 0
s += ", "
s += "op#{j}"
s += "]"
console.log s
console.log "@users[@last_user].ot.applyOps ops"
console.log "expect(@users[@last_user].ot.val()).to.equal(\"#{users[otherotnumber].val()}\")"
ops
console.log ""
console.log "Found an OT Puzzle!"
console.log "OT states:"
for u,j in users
console.log "OT#{j}: "+u.val()
console.log "\nOT execution order (#{i},#{i+1}):"
printOpsInExecutionOrder i, i+1
console.log ""
ops = printOpsInExecutionOrder i+1, i
console.log ""
# expect(users[i].ot.val()).to.equal(users[i+1].ot.val())