renamed to yjs

This commit is contained in:
DadaMonad 2015-01-26 23:24:50 +00:00
parent d5c7d51dc4
commit 978203d73e
57 changed files with 83 additions and 54177 deletions

View File

@ -1,23 +1,23 @@
# ![Yatta!](https://dadamonad.github.io/files/layout/Yatta_logo.png) # ![Yatta!](https://dadamonad.github.io/files/layout/y_logo.png)
[![Build Status](http://layers.dbis.rwth-aachen.de/jenkins/job/Yatta/badge/icon)](http://layers.dbis.rwth-aachen.de/jenkins/job/Yatta/) [![Build Status](http://layers.dbis.rwth-aachen.de/jenkins/job/Yatta/badge/icon)](http://layers.dbis.rwth-aachen.de/jenkins/job/Yatta/)
Yatta is a framework for optimistic concurrency control and automatic conflict resolution on arbitrary data types. The framework implements a new OT-like concurrency algorithm and provides similar functionality as [ShareJs] and [OpenCoweb]. Yatta was designed to take away the pain from concurrently editing complex data types like Text, Json, and XML. For more information you should check out the [website](https://dadamonad.github.io/Yatta/)! Y is a framework for optimistic concurrency control and automatic conflict resolution on arbitrary data types. The framework implements a new OT-like concurrency algorithm and provides similar functionality as [ShareJs] and [OpenCoweb]. Y was designed to take away the pain from concurrently editing complex data types like Text, Json, and XML. For more information you should check out the [website](https://dadamonad.github.io/yjs/)!
In the future, we want to enable users to implement their own collaborative types. Currently we provide data types for In the future, we want to enable users to implement their own collaborative types. Currently we provide data types for
* Text * Text
* Json * Json
* XML * XML
Unlike other frameworks, Yatta supports P2P message propagation and is not bound to a specific communication protocol. Therefore, Yatta is extremely scalable and can be used in a wide range of application scenarios. Unlike other frameworks, Y supports P2P message propagation and is not bound to a specific communication protocol. Therefore, Y is extremely scalable and can be used in a wide range of application scenarios.
We support several communication protocols as so called *Connectors*. You find a bunch of Connectors in the [Yatta-Connectors](https://github.com/rwth-acis/Yatta-Connectors) repository. Currently supported communication protocols: We support several communication protocols as so called *Connectors*. You find a bunch of Connectors in the [Y-Connectors](https://github.com/rwth-acis/y-connectors) repository. Currently supported communication protocols:
* [XMPP-Connector](http://xmpp.org) - Propagates updates in a XMPP multi-user-chat room * [XMPP-Connector](http://xmpp.org) - Propagates updates in a XMPP multi-user-chat room
* [WebRTC-Connector](http://peerjs.com/) - Propagate updates directly with WebRTC * [WebRTC-Connector](http://peerjs.com/) - Propagate updates directly with WebRTC
* [IWC-Connector](http://dbis.rwth-aachen.de/cms/projects/the-xmpp-experience#interwidget-communication) - Inter-widget Communication * [IWC-Connector](http://dbis.rwth-aachen.de/cms/projects/the-xmpp-experience#interwidget-communication) - Inter-widget Communication
You can use Yatta client-, and server- side. You can get it as via npm, and bower. We even provide a polymer element for Yatta! You can use Y client-, and server- side. You can get it as via npm, and bower. We even provide a polymer element for Y!
The theoretical advantages over similar frameworks are support for The theoretical advantages over similar frameworks are support for
* .. P2P message propagation and arbitrary communication protocols * .. P2P message propagation and arbitrary communication protocols
@ -27,32 +27,32 @@ The theoretical advantages over similar frameworks are support for
* .. Intention Preservation: When working on Text, the intention of your changes are preserved. This is particularily important when working offline. * .. Intention Preservation: When working on Text, the intention of your changes are preserved. This is particularily important when working offline.
## Use it! ## Use it!
You find a tutorial, examples, and documentation on the [website](https://dadamonad.github.io/Yatta/). You find a tutorial, examples, and documentation on the [website](https://dadamonad.github.io/yjs/).
Either clone this git repository, install it with [bower](http://bower.io/), or install it with [npm](https://www.npmjs.org/package/yatta). Either clone this git repository, install it with [bower](http://bower.io/), or install it with [npm](https://www.npmjs.org/package/yjs).
### Bower ### Bower
``` ```
bower install Yatta bower install yjs
``` ```
Then you include the libraries directly from the installation folder. Then you include the libraries directly from the installation folder.
``` ```
<script src="./bower_components/yatta/yatta.js"></script> <script src="./bower_components/yjs/y.js"></script>
``` ```
### Npm ### Npm
``` ```
npm install yatta --save npm install yjs --save
``` ```
And use it like this with *npm*: And use it like this with *npm*:
``` ```
Yatta = require("yatta"); Y = require("yjs");
``` ```
## Status ## Status
Yatta! is still in an early development phase. Don't expect that everything is working fine. yjs is still in an early development phase. Don't expect that everything is working fine.
But I would become really motivated if you gave me some feedback :) ([github](https://github.com/DadaMonad/Yatta/issues)). But I would become really motivated if you gave me some feedback :) ([github](https://github.com/rwth-acis/yjs/issues)).
### Current Issues ### Current Issues
* The History Buffer should be able to store operations in a database * The History Buffer should be able to store operations in a database
@ -61,11 +61,11 @@ But I would become really motivated if you gave me some feedback :) ([github](ht
* Custom data types * Custom data types
## Support ## Support
Please report _any_ issues to the [Github issue page](https://github.com/DadaMonad/Yatta/issues)! Please report _any_ issues to the [Github issue page](https://github.com/rwth-acis/yjs/issues)!
I would appreciate if developers give me feedback on how _convenient_ the framework is, and if it is easy to use. Particularly the XML-support may not support every DOM-methods - if you encounter a method that does not cause any change on other peers, please state function name, and sample parameters. However, there are browser-specific features, that Yatta won't support. I would appreciate if developers give me feedback on how _convenient_ the framework is, and if it is easy to use. Particularly the XML-support may not support every DOM-methods - if you encounter a method that does not cause any change on other peers, please state function name, and sample parameters. However, there are browser-specific features, that Y won't support.
## License ## License
Yatta! is licensed under the [MIT License](./LICENSE.txt). yjs is licensed under the [MIT License](./LICENSE.txt).
[ShareJs]: https://github.com/share/ShareJS [ShareJs]: https://github.com/share/ShareJS
[OpenCoweb]: https://github.com/opencoweb/coweb [OpenCoweb]: https://github.com/opencoweb/coweb

View File

@ -1,15 +1,15 @@
{ {
"name": "Y", "name": "yjs",
"version": "0.2.3", "version": "0.3.0",
"homepage": "https://github.com/DadaMonad/Yatta", "homepage": "https://github.com/DadaMonad/yjs",
"authors": [ "authors": [
"Kevin Jahns <kevin.jahns@rwth-aachen.de>" "Kevin Jahns <kevin.jahns@rwth-aachen.de>"
], ],
"description": "A Framework that enables Real-Time collaboration on arbitrary data structures.", "description": "A Framework that enables Real-Time collaboration on arbitrary data structures.",
"main": [ "main": [
"./yatta.js", "./y.js",
"./yatta-element.html", "./y-object.html",
"./build/node/yatta.js" "./build/node/y.js"
], ],
"keywords": [ "keywords": [
"OT", "OT",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -60,8 +60,8 @@ adaptConnector = function(connector, engine, HB, execution_listener) {
return engine.applyOp(op); return engine.applyOp(op);
} }
}); });
if (connector._whenBoundToYatta != null) { if (connector._whenBoundToY != null) {
return connector._whenBoundToYatta(); return connector._whenBoundToY();
} }
}; };

View File

@ -116,7 +116,7 @@ module.exports = function(HB) {
o = type.create.apply(null, args); o = type.create.apply(null, args);
return Object.__super__.val.call(this, name, o); return Object.__super__.val.call(this, name, o);
} else { } else {
throw new Error("The " + content.constructor.name + "-type is not (yet) supported in Yatta."); throw new Error("The " + content.constructor.name + "-type is not (yet) supported in Y.");
} }
} else { } else {
return Object.__super__.val.call(this, name, content); return Object.__super__.val.call(this, name, content);

View File

@ -164,7 +164,7 @@ module.exports = function(HB) {
if ((type != null) && (type.create != null)) { if ((type != null) && (type.create != null)) {
return type.create(content, options); return type.create(content, options);
} else { } else {
throw new Error("The " + content.constructor.name + "-type is not (yet) supported in Yatta."); throw new Error("The " + content.constructor.name + "-type is not (yet) supported in Y.");
} }
} else { } else {
return content; return content;

View File

@ -1,92 +0,0 @@
var Yatta, bindToChildren;
Yatta = require('./yatta');
bindToChildren = function(that) {
var attr, i, _i, _ref;
for (i = _i = 0, _ref = that.children.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
attr = that.children.item(i);
if (attr.name != null) {
attr.val = that.val.val(attr.name);
}
}
return that.val.observe(function(events) {
var event, newVal, _j, _len, _results;
_results = [];
for (_j = 0, _len = events.length; _j < _len; _j++) {
event = events[_j];
if (event.name != null) {
_results.push((function() {
var _k, _ref1, _results1;
_results1 = [];
for (i = _k = 0, _ref1 = that.children.length; 0 <= _ref1 ? _k < _ref1 : _k > _ref1; i = 0 <= _ref1 ? ++_k : --_k) {
attr = that.children.item(i);
if ((attr.name != null) && attr.name === event.name) {
newVal = that.val.val(attr.name);
if (attr.val !== newVal) {
_results1.push(attr.val = newVal);
} else {
_results1.push(void 0);
}
} else {
_results1.push(void 0);
}
}
return _results1;
})());
} else {
_results.push(void 0);
}
}
return _results;
});
};
Polymer("yatta-element", {
ready: function() {
if (this.connector != null) {
this.val = new Yatta(this.connector);
return bindToChildren(this);
} else if (this.val != null) {
return bindToChildren(this);
}
},
valChanged: function() {
if ((this.val != null) && this.val.type === "Object") {
return bindToChildren(this);
}
},
connectorChanged: function() {
if (this.val == null) {
this.val = new Yatta(this.connector);
return bindToChildren(this);
}
}
});
Polymer("yatta-property", {
ready: function() {
if ((this.val != null) && (this.name != null)) {
if (this.val.constructor === Object) {
this.val = this.parentElement.val(this.name, this.val).val(this.name);
} else if (typeof this.val === "string") {
this.parentElement.val(this.name, this.val);
}
if (this.val.type === "Object") {
return bindToChildren(this);
}
}
},
valChanged: function() {
var _ref;
if ((this.val != null) && (this.name != null)) {
if (this.val.constructor === Object) {
return this.val = this.parentElement.val.val(this.name, this.val).val(this.name);
} else if (this.val.type === "Object") {
return bindToChildren(this);
} else if ((((_ref = this.parentElement.val) != null ? _ref.val : void 0) != null) && this.val !== this.parentElement.val.val(this.name)) {
return this.parentElement.val.val(this.name, this.val);
}
}
}
});

View File

@ -1,54 +0,0 @@
var Engine, HistoryBuffer, adaptConnector, createYatta, json_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; };
json_types_uninitialized = require("./Types/JsonTypes");
HistoryBuffer = require("./HistoryBuffer");
Engine = require("./Engine");
adaptConnector = require("./ConnectorAdapter");
createYatta = function(connector) {
var HB, Yatta, type_manager, types, user_id;
user_id = null;
if (connector.id != null) {
user_id = connector.id;
} else {
user_id = "_temp";
connector.whenUserIdSet(function(id) {
user_id = id;
return HB.resetUserId(id);
});
}
HB = new HistoryBuffer(user_id);
type_manager = json_types_uninitialized(HB);
types = type_manager.types;
Yatta = (function(_super) {
__extends(Yatta, _super);
function Yatta() {
this.connector = connector;
this.HB = HB;
this.types = types;
this.engine = new Engine(this.HB, type_manager.types);
adaptConnector(this.connector, this.engine, this.HB, type_manager.execution_listener);
Yatta.__super__.constructor.apply(this, arguments);
}
Yatta.prototype.getConnector = function() {
return this.connector;
};
return Yatta;
})(types.Object);
return new Yatta(HB.getReservedUniqueIdentifier()).execute();
};
module.exports = createYatta;
if ((typeof window !== "undefined" && window !== null) && (window.Yatta == null)) {
window.Yatta = createYatta;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,274 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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.txt.html' title='LICENSE.txt'>
LICENSE.txt
</a>
</li>
</ul>
<h2>Class Listing A-Z</h2>
<div class='index'>
<ul>
<li class='letter'>a</li>
<ul>
<li>
<a href='class/types/Array.html'>
Array
</a>
<small>
(types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>o</li>
<ul>
<li>
<a href='class/types/Object.html'>
Object
</a>
<small>
(types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>s</li>
<ul>
<li>
<a href='class/types/String.html'>
String
</a>
<small>
(types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>y</li>
<ul>
<li>
<a href='class/Yatta.html'>
Yatta
</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'>c</li>
<ul>
<li>
<a href='file/lib/ConnectorAdapter.coffee.html'>
ConnectorAdapter.coffee
</a>
<small>
(lib)
</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'>j</li>
<ul>
<li>
<a href='file/lib/Types/JsonTypes.coffee.html'>
JsonTypes.coffee
</a>
<small>
(lib&#47;Types)
</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/Types/TextTypes.coffee.html'>
TextTypes.coffee
</a>
<small>
(lib&#47;Types)
</small>
</li>
</ul>
</ul>
<ul>
<li class='letter'>y</li>
<ul>
<li>
<a href='file/lib/yatta-element.coffee.html'>
yatta-element.coffee
</a>
<small>
(lib)
</small>
</li>
<li>
<a href='file/lib/yatta.coffee.html'>
yatta.coffee
</a>
<small>
(lib)
</small>
</li>
</ul>
</ul>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,212 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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;yatta.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../class/types/Object.html'>types.Object</a>
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>Framework for Json data-structures.
Known values that are supported:</p><ul>
<li>String</li>
<li>Integer</li>
<li>Array</li>
</ul>
</div>
<div class='tags'>
</div>
<h2>Variables Summary</h2>
<h3 class='inherited'>
Variable inherited from
<a href='../class/types/Object.html'>types.Object</a>
</h3>
<p class='inherited'>
<a href='../class/types/Object.html#type-variable'>type</a>
</p>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#getConnector-dynamic'>
#
(void)
<b>getConnector</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/types/Object.html'>types.Object</a>
</h3>
<p class='inherited'>
<a href='../class/types/Object.html#applyDelete-dynamic'>#applyDelete</a>
<a href='../class/types/Object.html#cleanup-dynamic'>#cleanup</a>
<a href='../class/types/Object.html#toJson-dynamic'>#toJson</a>
<a href='../class/types/Object.html#val-dynamic'>#val</a>
<a href='../class/types/Object.html#_encode-dynamic'>#_encode</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>()</span>
<br>
</p>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>user_id</span>
<span class='type'>
(
<tt>String</tt>
)
</span>
&mdash;
<span class='desc'>Unique id of the peer. </span>
</li>
<li>
<span class='name'>Connector</span>
<span class='type'>
(
<tt>Connector</tt>
)
</span>
&mdash;
<span class='desc'>the connector class. </span>
</li>
</ul>
</div>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='getConnector-dynamic'>
#
(void)
<b>getConnector</b><span>()</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,357 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>types</span>
&raquo;
<span class='title'>Array</span>
</div>
</div>
<div id='content'>
<h1>
Class:
types.Array
</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>Direct Known Subclasses</h2>
<p class='children'>
<a href='../../class/types/String.html'>types.String</a>
</p>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='type-variable'>
type
=
</dt>
<dd>
<pre><code class='coffeescript'>&quot;Array&quot;</code></pre>
</dd>
</dl>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#applyDelete-dynamic'>
#
(void)
<b>applyDelete</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#cleanup-dynamic'>
#
(void)
<b>cleanup</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(void)
<b>toJson</b><span>(transform_to_value = false)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#val-dynamic'>
#
(void)
<b>val</b><span>(pos)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#push-dynamic'>
#
(void)
<b>push</b><span>(content)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#insertAfter-dynamic'>
#
(void)
<b>insertAfter</b><span>(left, content, options)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#insert-dynamic'>
#
(Array Type)
<b>insert</b><span>(position, content, options)</span>
</a>
</span>
<span class='desc'>
Inserts a string into the word.
</span>
</li>
<li>
<span class='signature'>
<a href='#delete-dynamic'>
#
(Array Type)
<b>delete</b><span>(position, length)</span>
</a>
</span>
<span class='desc'>
Deletes a part of the word.
</span>
</li>
<li>
<span class='signature'>
<a href='#_encode-dynamic'>
#
(void)
<b>_encode</b><span>()</span>
</a>
</span>
<span class='note private title'>Private</span>
<span class='desc'>
Encode this operation in such a way that it can be parsed by remote peers.
</span>
</li>
</ul>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='applyDelete-dynamic'>
#
(void)
<b>applyDelete</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='cleanup-dynamic'>
#
(void)
<b>cleanup</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(void)
<b>toJson</b><span>(transform_to_value = false)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
#
(void)
<b>val</b><span>(pos)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='push-dynamic'>
#
(void)
<b>push</b><span>(content)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='insertAfter-dynamic'>
#
(void)
<b>insertAfter</b><span>(left, content, options)</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='insert-dynamic'>
#
(Array Type)
<b>insert</b><span>(position, content, options)</span>
<br>
</p>
<div class='docstring'>
<p>Inserts a string into the word.</p>
</div>
<div class='tags'>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
(
<tt>Array Type</tt>
)
&mdash;
<span class='desc'>This String object. </span>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='delete-dynamic'>
#
(Array Type)
<b>delete</b><span>(position, length)</span>
<br>
</p>
<div class='docstring'>
<p>Deletes a part of the word.</p>
</div>
<div class='tags'>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
(
<tt>Array Type</tt>
)
&mdash;
<span class='desc'>This String object </span>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='_encode-dynamic'>
#
(void)
<b>_encode</b><span>()</span>
<span class='note private'>Private</span>
<br>
</p>
<div class='docstring'>
<p>Encode this operation in such a way that it can be parsed by remote peers.</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,389 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>types</span>
&raquo;
<span class='title'>Object</span>
</div>
</div>
<div id='content'>
<h1>
Class:
types.Object
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;JsonTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
types.MapManager
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<p>Manages Object-like values.</p>
</div>
<div class='tags'>
</div>
<h2>Direct Known Subclasses</h2>
<p class='children'>
<a href='../../class/Yatta.html'>Yatta</a>
</p>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='type-variable'>
type
=
</dt>
<dd>
<pre><code class='coffeescript'>&quot;Object&quot;</code></pre>
<div class='docstring'>
<p>Identifies this class.
Use it to check whether this is a json-type or something else.</p>
<div class='examples'>
<h3>Examples:</h3>
<h4>
</h4>
<pre><code class='coffeescript'>var x = yatta.val(&#39;unknown&#39;)
if (x.type === &quot;Object&quot;) {
console.log JSON.stringify(x.toJson())
}</code></pre>
</div>
</div>
<div class='tags'>
</div>
</dd>
</dl>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#applyDelete-dynamic'>
#
(void)
<b>applyDelete</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#cleanup-dynamic'>
#
(void)
<b>cleanup</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#toJson-dynamic'>
#
(Json)
<b>toJson</b><span>(transform_to_value = false)</span>
</a>
</span>
<span class='desc'>
Transform this to a Json.
</span>
</li>
<li>
<span class='signature'>
<a href='#val-dynamic'>
~
(Json)
<b>val</b><span>()</span>
</a>
</span>
<span class='desc'>
</span>
</li>
<li>
<span class='signature'>
<a href='#_encode-dynamic'>
#
(void)
<b>_encode</b><span>()</span>
</a>
</span>
<span class='note private title'>Private</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='applyDelete-dynamic'>
#
(void)
<b>applyDelete</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='cleanup-dynamic'>
#
(void)
<b>cleanup</b><span>()</span>
<br>
</p>
</div>
<div class='method_details'>
<p class='signature' id='toJson-dynamic'>
#
(Json)
<b>toJson</b><span>(transform_to_value = false)</span>
<br>
</p>
<div class='docstring'>
<p>Transform this to a Json. If your browser supports Object.observe it will be transformed automatically when a change arrives.
Otherwise you will loose all the sharing-abilities (the new object will be a deep clone)!</p><p>TODO: at the moment you don&#39;t consider changing of properties.
E.g.: let x = {a:[]}. Then x.a.push 1 wouldn&#39;t change anything</p>
</div>
<div class='tags'>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
<tt>Json</tt>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
~
(Json)
<b>val</b><span>()</span>
<br>
~
(Object Type||String|Object)
<b>val</b><span>(name)</span>
<br>
~
(Object Type)
<b>val</b><span>(name, content)</span>
<br>
</p>
<div class='tags'>
<div class='overloads'>
<h3>Overloads:</h3>
<div class='overload'>
<p class='signature'>
~
(Json)
<b>val</b><span>()</span>
</p>
<div class='docstring'>
<p>Get this as a Json object.</p>
</div>
<div class='tags'>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
<tt>Json</tt>
</li>
</ul>
</div>
</div>
<div class='overload'>
<p class='signature'>
~
(Object Type||String|Object)
<b>val</b><span>(name)</span>
</p>
<div class='docstring'>
<p>Get value of a property.</p>
</div>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>name</span>
<span class='type'>
(
<tt>String</tt>
)
</span>
&mdash;
<span class='desc'>Name of the object property. </span>
</li>
</ul>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
(
<tt>Object Type||String|Object</tt>
)
&mdash;
<span class='desc'>Depending on the value of the property. If mutable it will return a Operation-type object, if immutable it will return String/Object. </span>
</li>
</ul>
</div>
</div>
<div class='overload'>
<p class='signature'>
~
(Object Type)
<b>val</b><span>(name, content)</span>
</p>
<div class='docstring'>
<p>Set a new property.</p>
</div>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>name</span>
<span class='type'>
(
<tt>String</tt>
)
</span>
&mdash;
<span class='desc'>Name of the object property. </span>
</li>
<li>
<span class='name'>content</span>
<span class='type'>
(
<tt>Object|String</tt>
)
</span>
&mdash;
<span class='desc'>Content of the object property. </span>
</li>
</ul>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
(
<tt>Object Type</tt>
)
&mdash;
<span class='desc'>This object. (supports chaining) </span>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class='method_details'>
<p class='signature' id='_encode-dynamic'>
#
(void)
<b>_encode</b><span>()</span>
<span class='note private'>Private</span>
<br>
</p>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,374 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>types</span>
&raquo;
<span class='title'>String</span>
</div>
</div>
<div id='content'>
<h1>
Class:
types.String
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types&#47;TextTypes.coffee</td>
</tr>
<tr>
<td>Inherits:</td>
<td>
<a href='../../class/types/Array.html'>types.Array</a>
</td>
</tr>
</table>
<h2>Overview</h2>
<div class='docstring'>
<div class='note'>
<strong>Note:</strong>
Currently, only Text is supported!
</div>
<p>Handles a String-like data structures with support for insert/delete at a word-position.</p>
</div>
<div class='tags'>
</div>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='type-variable'>
type
=
</dt>
<dd>
<pre><code class='coffeescript'>&quot;String&quot;</code></pre>
<div class='docstring'>
<p>Identifies this class.
Use it to check whether this is a word-type or something else.</p>
<div class='examples'>
<h3>Examples:</h3>
<h4>
</h4>
<pre><code class='coffeescript'>var x = yatta.val(&#39;unknown&#39;)
if (x.type === &quot;String&quot;) {
console.log JSON.stringify(x.toJson())
}</code></pre>
</div>
</div>
<div class='tags'>
</div>
</dd>
</dl>
<h3 class='inherited'>
Variable inherited from
<a href='../../class/types/Array.html'>types.Array</a>
</h3>
<p class='inherited'>
<a href='../../class/types/Array.html#type-variable'>type</a>
</p>
<h2>Instance Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#val-dynamic'>
#
(String)
<b>val</b><span>()</span>
</a>
</span>
<span class='desc'>
Get the String-representation of this word.
</span>
</li>
<li>
<span class='signature'>
<a href='#toString-dynamic'>
#
(void)
<b>toString</b><span>()</span>
</a>
</span>
<span class='desc'>
Same as String.val
</span>
</li>
<li>
<span class='signature'>
<a href='#insert-dynamic'>
#
(Array Type)
<b>insert</b><span>(position, content, options)</span>
</a>
</span>
<span class='desc'>
Inserts a string into the word.
</span>
</li>
<li>
<span class='signature'>
<a href='#bind-dynamic'>
#
(void)
<b>bind</b><span>(textfield, dom_root)</span>
</a>
</span>
<span class='desc'>
Bind this String to a textfield or input field.
</span>
</li>
<li>
<span class='signature'>
<a href='#_encode-dynamic'>
#
(void)
<b>_encode</b><span>()</span>
</a>
</span>
<span class='note private title'>Private</span>
<span class='desc'>
Encode this operation in such a way that it can be parsed by remote peers.
</span>
</li>
</ul>
<h2>
<small>Inherited Method Summary</small>
<h3 class='inherited'>
Methods inherited from
<a href='../../class/types/Array.html'>types.Array</a>
</h3>
<p class='inherited'>
<a href='../../class/types/Array.html#applyDelete-dynamic'>#applyDelete</a>
<a href='../../class/types/Array.html#cleanup-dynamic'>#cleanup</a>
<a href='../../class/types/Array.html#toJson-dynamic'>#toJson</a>
<a href='../../class/types/Array.html#val-dynamic'>#val</a>
<a href='../../class/types/Array.html#push-dynamic'>#push</a>
<a href='../../class/types/Array.html#insertAfter-dynamic'>#insertAfter</a>
<a href='../../class/types/Array.html#insert-dynamic'>#insert</a>
<a href='../../class/types/Array.html#delete-dynamic'>#delete</a>
<a href='../../class/types/Array.html#_encode-dynamic'>#_encode</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>(uid)</span>
<span class='note private'>Private</span>
<br>
</p>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>uid</span>
<span class='type'>
(
<tt>Object</tt>
)
</span>
&mdash;
<span class='desc'>A unique identifier. If uid is undefined, a new uid will be created. </span>
</li>
</ul>
</div>
</div>
</div>
<h2>Instance Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='val-dynamic'>
#
(String)
<b>val</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Get the String-representation of this word.</p>
</div>
<div class='tags'>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
(
<tt>String</tt>
)
&mdash;
<span class='desc'>The String-representation of this object. </span>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='toString-dynamic'>
#
(void)
<b>toString</b><span>()</span>
<br>
</p>
<div class='docstring'>
<p>Same as String.val</p>
</div>
<div class='tags'>
<h3>See also:</h3>
<ul class='see'>
<li>
<a href='String.val'>String.val</a>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='insert-dynamic'>
#
(Array Type)
<b>insert</b><span>(position, content, options)</span>
<br>
</p>
<div class='docstring'>
<p>Inserts a string into the word.</p>
</div>
<div class='tags'>
<h3>Returns:</h3>
<ul class='return'>
<li>
<span class='type'></span>
(
<tt>Array Type</tt>
)
&mdash;
<span class='desc'>This String object. </span>
</li>
</ul>
</div>
</div>
<div class='method_details'>
<p class='signature' id='bind-dynamic'>
#
(void)
<b>bind</b><span>(textfield, dom_root)</span>
<br>
</p>
<div class='docstring'>
<p>Bind this String to a textfield or input field.</p>
<div class='examples'>
<h3>Examples:</h3>
<h4>
</h4>
<pre><code class='coffeescript'>var textbox = document.getElementById(&quot;textfield&quot;);
yatta.bind(textbox);</code></pre>
</div>
</div>
<div class='tags'>
</div>
</div>
<div class='method_details'>
<p class='signature' id='_encode-dynamic'>
#
(void)
<b>_encode</b><span>()</span>
<span class='note private'>Private</span>
<br>
</p>
<div class='docstring'>
<p>Encode this operation in such a way that it can be parsed by remote peers.</p>
</div>
<div class='tags'>
</div>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,92 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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>
<span>
types
</span>
</li>
<ul>
<li>
<a href='class/types/Object.html' target='main'>
Object
</a>
<small class='parent'>
<
types.MapManager
</small>
<small class='namespace'>
types
</small>
</li>
<li>
<a href='class/types/Array.html' target='main'>
Array
</a>
<small class='parent'>
<
types.ListManager
</small>
<small class='namespace'>
types
</small>
</li>
<li>
<a href='class/types/String.html' target='main'>
String
</a>
<small class='parent'>
<
types.Array
</small>
<small class='namespace'>
types
</small>
</li>
</ul>
<li>
<a href='class/Yatta.html' target='main'>
Yatta
</a>
<small class='parent'>
<
types.Object
</small>
<small class='namespace'>
</small>
</li>
</ul>
</div>
</body>
</html>

View File

@ -1,112 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>LICENSE.txt</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'>
<p>The MIT License (MIT)<br/><br/>Copyright (c) 2014 Kevin Jahns <kevin.jahns@rwth-aachen.de>.<br/><br/>Permission is hereby granted, free of charge, to any person obtaining a copy<br/>of this software and associated documentation files (the "Software"), to deal<br/>in the Software without restriction, including without limitation the rights<br/>to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br/>copies of the Software, and to permit persons to whom the Software is<br/>furnished to do so, subject to the following conditions:<br/><br/>The above copyright notice and this permission notice shall be included in all<br/>copies or substantial portions of the Software.<br/><br/>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br/>IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br/>FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br/>AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br/>LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br/>OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/>SOFTWARE.<br/></p>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,147 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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-https-dadamonad-github-io-files-layout-yatta_logo-png-"><img src="https://dadamonad.github.io/files/layout/Yatta_logo.png" alt="Yatta!"></h1><p><a href="http://layers.dbis.rwth-aachen.de/jenkins/job/Yatta/"><img src="http://layers.dbis.rwth-aachen.de/jenkins/job/Yatta/badge/icon" alt="Build Status"></a></p><p>Yatta is a framework for optimistic concurrency control and automatic conflict resolution on arbitrary data types. The framework implements a new OT-like concurrency algorithm and provides similar functionality as <a href="https://github.com/share/ShareJS">ShareJs</a> and <a href="https://github.com/opencoweb/coweb">OpenCoweb</a>. Yatta was designed to take away the pain from concurrently editing complex data types like Text, Json, and XML. For more information you should check out the <a href="https://dadamonad.github.io/Yatta/">website</a>!</p><p>In the future, we want to enable users to implement their own collaborative types. Currently we provide data types for</p><ul>
<li>Text</li>
<li>Json</li>
<li>XML</li>
</ul><p>Unlike other frameworks, Yatta supports P2P message propagation and is not bound to a specific communication protocol. Therefore, Yatta is extremely scalable and can be used in a wide range of application scenarios.</p><p>We support several communication protocols as so called <em>Connectors</em>. You find a bunch of Connectors in the <a href="https://github.com/rwth-acis/Yatta-Connectors">Yatta-Connectors</a> repository. Currently supported communication protocols:</p><ul>
<li><a href="http://xmpp.org">XMPP-Connector</a> - Propagates updates in a XMPP multi-user-chat room</li>
<li><a href="http://peerjs.com/">WebRTC-Connector</a> - Propagate updates directly with WebRTC</li>
<li><a href="http://dbis.rwth-aachen.de/cms/projects/the-xmpp-experience#interwidget-communication">IWC-Connector</a> - Inter-widget Communication</li>
</ul><p>You can use Yatta client-, and server- side. You can get it as via npm, and bower. We even provide a polymer element for Yatta!</p><p>The theoretical advantages over similar frameworks are support for</p><ul>
<li>.. P2P message propagation and arbitrary communication protocols</li>
<li>.. arbitrary complex data types</li>
<li>.. offline editing: Only relevant changes are propagated on rejoin (unimplemented)</li>
<li>.. AnyUndo: Undo <em>any</em> action that was executed in constant time (unimplemented)</li>
<li>.. Intention Preservation: When working on Text, the intention of your changes are preserved. This is particularily important when working offline.</li>
</ul>
<h2 id="use-it-">Use it!</h2><p>You find a tutorial, examples, and documentation on the <a href="https://dadamonad.github.io/Yatta/">website</a>.</p><p>Either clone this git repository, install it with <a href="http://bower.io/">bower</a>, or install it with <a href="https://www.npmjs.org/package/yatta">npm</a>.</p><h3 id="bower">Bower</h3>
<pre><code>bower install Yatta
</code></pre><p>Then you include the libraries directly from the installation folder.</p><pre><code>&lt;script src=&quot;./bower_components/yatta/yatta.js&quot;&gt;&lt;/script&gt;
</code></pre><h3 id="npm">Npm</h3>
<pre><code>npm install yatta --save
</code></pre><p>And use it like this with <em>npm</em>:</p><pre><code>Yatta = require(&quot;yatta&quot;);
</code></pre><h2 id="status">Status</h2><p>Yatta! is still in an early development phase. Don&#39;t expect that everything is working fine.
But I would become really motivated if you gave me some feedback :) (<a href="https://github.com/DadaMonad/Yatta/issues">github</a>).</p><h3 id="current-issues">Current Issues</h3>
<ul>
<li>The History Buffer should be able to store operations in a database</li>
<li>Documentation</li>
<li>Reimplement support for XML as a data type</li>
<li>Custom data types</li>
</ul>
<h2 id="support">Support</h2><p>Please report <em>any</em> issues to the <a href="https://github.com/DadaMonad/Yatta/issues">Github issue page</a>!
I would appreciate if developers give me feedback on how <em>convenient</em> the framework is, and if it is easy to use. Particularly the XML-support may not support every DOM-methods - if you encounter a method that does not cause any change on other peers, please state function name, and sample parameters. However, there are browser-specific features, that Yatta won&#39;t support.</p><h2 id="license">License</h2><p>Yatta! is licensed under the <a href="./LICENSE.txt">MIT License</a>.</p><a href="&#x6d;&#x61;&#105;&#108;&#x74;&#111;&#x3a;&#x6b;&#x65;&#118;&#x69;&#x6e;&#x2e;&#106;&#x61;&#104;&#x6e;&#115;&#64;&#x72;&#x77;&#116;&#x68;&#x2d;&#x61;&#97;&#99;&#104;&#101;&#x6e;&#46;&#x64;&#101;">&#x6b;&#x65;&#118;&#x69;&#x6e;&#x2e;&#106;&#x61;&#104;&#x6e;&#115;&#64;&#x72;&#x77;&#116;&#x68;&#x2d;&#x61;&#97;&#99;&#104;&#101;&#x6e;&#46;&#x64;&#101;</a>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,46 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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.txt.html' target='main'>
LICENSE.txt
</a>
</li>
</ul>
</div>
</body>
</html>

View File

@ -1,180 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>ConnectorAdapter.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
ConnectorAdapter.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib</td>
</tr>
</table>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='module.exports-variable'>
module.exports
=
</dt>
<dd>
<pre><code class='coffeescript'>adaptConnector</code></pre>
</dd>
</dl>
<h2>Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#adaptConnector-'>
~
(void)
<b>adaptConnector</b><span>(connector, engine, HB, execution_listener)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='adaptConnector-'>
~
(void)
<b>adaptConnector</b><span>(connector, engine, HB, execution_listener)</span>
<br>
</p>
<div class='tags'>
<h3>Parameters:</h3>
<ul class='param'>
<li>
<span class='name'>engine</span>
<span class='type'>
(
<tt>Engine</tt>
)
</span>
&mdash;
<span class='desc'>The transformation engine </span>
</li>
<li>
<span class='name'>HB</span>
<span class='type'>
(
<tt>HistoryBuffer</tt>
)
</span>
</li>
<li>
<span class='name'>execution_listener</span>
<span class='type'>
(
<tt>Array&lt;Function&gt;</tt>
)
</span>
&mdash;
<span class='desc'>You must ensure that whenever an operation is executed, every function in this Array is called. </span>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,146 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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>
</table>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='window.unprocessed_counter-variable'>
window.unprocessed_counter
=
</dt>
<dd>
<pre><code class='coffeescript'>0</code></pre>
</dd>
<dt id='window.unprocessed_exec_counter-variable'>
window.unprocessed_exec_counter
=
</dt>
<dd>
<pre><code class='coffeescript'>0</code></pre>
</dd>
<dt id='window.unprocessed_types-variable'>
window.unprocessed_types
=
</dt>
<dd>
<pre><code class='coffeescript'>[]</code></pre>
</dd>
<dt id='module.exports-variable'>
module.exports
=
</dt>
<dd>
<pre><code class='coffeescript'>Engine</code></pre>
</dd>
</dl>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,122 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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>
</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'>
January 23, 15 16:14:11 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

@ -1,113 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>
January 23, 15 16:14:11 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

@ -1,113 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>JsonTypes.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
JsonTypes.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib&#47;Types</td>
</tr>
</table>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,113 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>
January 23, 15 16:14:11 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

@ -1,113 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>
January 23, 15 16:14:11 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

@ -1,137 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>yatta-element.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
yatta-element.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib</td>
</tr>
</table>
<h2>Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#bindToChildren-'>
~
(void)
<b>bindToChildren</b><span>(that)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='bindToChildren-'>
~
(void)
<b>bindToChildren</b><span>(that)</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,148 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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'>yatta.coffee</span>
</div>
</div>
<div id='content'>
<h1>
File:
yatta.coffee
</h1>
<table class='box'>
<tr>
<td>Defined in:</td>
<td>lib</td>
</tr>
</table>
<h2>Variables Summary</h2>
<dl class='constants'>
<dt id='module.exports-variable'>
module.exports
=
</dt>
<dd>
<pre><code class='coffeescript'>createYatta</code></pre>
</dd>
</dl>
<h2>Method Summary</h2>
<ul class='summary'>
<li>
<span class='signature'>
<a href='#createYatta-'>
~
(void)
<b>createYatta</b><span>(connector)</span>
</a>
</span>
<span class='desc'>
</span>
</li>
</ul>
<h2>Method Details</h2>
<div class='methods'>
<div class='method_details'>
<p class='signature' id='createYatta-'>
~
(void)
<b>createYatta</b><span>(connector)</span>
<br>
</p>
</div>
</div>
</div>
<div id='footer'>
January 23, 15 16:14:11 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

@ -1,124 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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>
<a href='file/lib/ConnectorAdapter.coffee.html' target='main'>
ConnectorAdapter.coffee
</a>
<small class='namespace'>
lib
</small>
</li>
<li>
<a href='file/lib/Engine.coffee.html' target='main'>
Engine.coffee
</a>
<small class='namespace'>
lib
</small>
</li>
<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/JsonTypes.coffee.html' target='main'>
JsonTypes.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>
</ul>
<li>
<a href='file/lib/yatta-element.coffee.html' target='main'>
yatta-element.coffee
</a>
<small class='namespace'>
lib
</small>
</li>
<li>
<a href='file/lib/yatta.coffee.html' target='main'>
yatta.coffee
</a>
<small class='namespace'>
lib
</small>
</li>
</ul>
</ul>
</div>
</body>
</html>

View File

@ -1,14 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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>

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
window.searchData = [{"t":"types.Object","p":"class/types/Object.html"},{"t":"types.Array","p":"class/types/Array.html"},{"t":"types.String","p":"class/types/String.html"},{"t":"Yatta","p":"class/Yatta.html"},{"t":"lib/ConnectorAdapter.coffee","p":"file/lib/ConnectorAdapter.coffee.html"},{"t":"lib/Engine.coffee","p":"file/lib/Engine.coffee.html"},{"t":"lib/HistoryBuffer.coffee","p":"file/lib/HistoryBuffer.coffee.html"},{"t":"lib/Types/BasicTypes.coffee","p":"file/lib/Types/BasicTypes.coffee.html"},{"t":"lib/Types/JsonTypes.coffee","p":"file/lib/Types/JsonTypes.coffee.html"},{"t":"lib/Types/StructuredTypes.coffee","p":"file/lib/Types/StructuredTypes.coffee.html"},{"t":"lib/Types/TextTypes.coffee","p":"file/lib/Types/TextTypes.coffee.html"},{"t":"lib/yatta-element.coffee","p":"file/lib/yatta-element.coffee.html"},{"t":"lib/yatta.coffee","p":"file/lib/yatta.coffee.html"},{"t":"README.md","p":"extra/README.md.html"},{"t":"LICENSE.txt","p":"extra/LICENSE.txt.html"},{"t":"types.Array#_encode","p":"class/types/Array.html#_encode-dynamic"},{"t":"types.Object#_encode","p":"class/types/Object.html#_encode-dynamic"},{"t":"types.String#_encode","p":"class/types/String.html#_encode-dynamic"},{"t":"lib/ConnectorAdapter.coffee~adaptConnector","p":"file/lib/ConnectorAdapter.coffee.html#adaptConnector-"},{"t":"types.Object#applyDelete","p":"class/types/Object.html#applyDelete-dynamic"},{"t":"types.Array#applyDelete","p":"class/types/Array.html#applyDelete-dynamic"},{"t":"types.String#bind","p":"class/types/String.html#bind-dynamic"},{"t":"lib/yatta-element.coffee~bindToChildren","p":"file/lib/yatta-element.coffee.html#bindToChildren-"},{"t":"types.Array#cleanup","p":"class/types/Array.html#cleanup-dynamic"},{"t":"types.Object#cleanup","p":"class/types/Object.html#cleanup-dynamic"},{"t":"Yatta#constructor","p":"class/Yatta.html#constructor-dynamic"},{"t":"types.String#constructor","p":"class/types/String.html#constructor-dynamic"},{"t":"lib/yatta.coffee~createYatta","p":"file/lib/yatta.coffee.html#createYatta-"},{"t":"types.Array#delete","p":"class/types/Array.html#delete-dynamic"},{"t":"Yatta#getConnector","p":"class/Yatta.html#getConnector-dynamic"},{"t":"types.Array#insert","p":"class/types/Array.html#insert-dynamic"},{"t":"types.String#insert","p":"class/types/String.html#insert-dynamic"},{"t":"types.Array#insertAfter","p":"class/types/Array.html#insertAfter-dynamic"},{"t":"types.Array#push","p":"class/types/Array.html#push-dynamic"},{"t":"types.Array#toJson","p":"class/types/Array.html#toJson-dynamic"},{"t":"types.Object#toJson","p":"class/types/Object.html#toJson-dynamic"},{"t":"types.String#toString","p":"class/types/String.html#toString-dynamic"},{"t":"types.Array#val","p":"class/types/Array.html#val-dynamic"},{"t":"types.String#val","p":"class/types/String.html#val-dynamic"},{"t":"types.Object#val","p":"class/types/Object.html#val-dynamic"}]

View File

@ -1,235 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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/types/Array.html#_encode-dynamic' target='main' title='_encode'>
#_encode
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/Object.html#_encode-dynamic' target='main' title='_encode'>
#_encode
</a>
<small>
(types.Object)
</small>
</li>
<li>
<a href='class/types/String.html#_encode-dynamic' target='main' title='_encode'>
#_encode
</a>
<small>
(types.String)
</small>
</li>
<li>
<a href='file/lib/ConnectorAdapter.coffee.html#adaptConnector-' target='main' title='adaptConnector'>
~adaptConnector
</a>
<small>
(lib&#47;ConnectorAdapter.coffee)
</small>
</li>
<li>
<a href='class/types/Object.html#applyDelete-dynamic' target='main' title='applyDelete'>
#applyDelete
</a>
<small>
(types.Object)
</small>
</li>
<li>
<a href='class/types/Array.html#applyDelete-dynamic' target='main' title='applyDelete'>
#applyDelete
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/String.html#bind-dynamic' target='main' title='bind'>
#bind
</a>
<small>
(types.String)
</small>
</li>
<li>
<a href='file/lib/yatta-element.coffee.html#bindToChildren-' target='main' title='bindToChildren'>
~bindToChildren
</a>
<small>
(lib&#47;yatta-element.coffee)
</small>
</li>
<li>
<a href='class/types/Array.html#cleanup-dynamic' target='main' title='cleanup'>
#cleanup
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/Object.html#cleanup-dynamic' target='main' title='cleanup'>
#cleanup
</a>
<small>
(types.Object)
</small>
</li>
<li>
<a href='class/Yatta.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(Yatta)
</small>
</li>
<li>
<a href='class/types/String.html#constructor-dynamic' target='main' title='constructor'>
#constructor
</a>
<small>
(types.String)
</small>
</li>
<li>
<a href='file/lib/yatta.coffee.html#createYatta-' target='main' title='createYatta'>
~createYatta
</a>
<small>
(lib&#47;yatta.coffee)
</small>
</li>
<li>
<a href='class/types/Array.html#delete-dynamic' target='main' title='delete'>
#delete
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/Yatta.html#getConnector-dynamic' target='main' title='getConnector'>
#getConnector
</a>
<small>
(Yatta)
</small>
</li>
<li>
<a href='class/types/Array.html#insert-dynamic' target='main' title='insert'>
#insert
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/String.html#insert-dynamic' target='main' title='insert'>
#insert
</a>
<small>
(types.String)
</small>
</li>
<li>
<a href='class/types/Array.html#insertAfter-dynamic' target='main' title='insertAfter'>
#insertAfter
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/Array.html#push-dynamic' target='main' title='push'>
#push
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/Array.html#toJson-dynamic' target='main' title='toJson'>
#toJson
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/Object.html#toJson-dynamic' target='main' title='toJson'>
#toJson
</a>
<small>
(types.Object)
</small>
</li>
<li>
<a href='class/types/String.html#toString-dynamic' target='main' title='toString'>
#toString
</a>
<small>
(types.String)
</small>
</li>
<li>
<a href='class/types/Array.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(types.Array)
</small>
</li>
<li>
<a href='class/types/String.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(types.String)
</small>
</li>
<li>
<a href='class/types/Object.html#val-dynamic' target='main' title='val'>
#val
</a>
<small>
(types.Object)
</small>
</li>
</ul>
</div>
</body>
</html>

View File

@ -1,36 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Yatta! API</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

@ -1,745 +0,0 @@
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

@ -2,14 +2,14 @@
<html> <html>
<head> <head>
<meta charset=utf-8 /> <meta charset=utf-8 />
<title>Yatta+Polymer Example</title> <title>Y Example</title>
<script src="../../../webcomponentsjs/webcomponents.min.js"></script> <script src="../../../webcomponentsjs/webcomponents.min.js"></script>
<link rel="import" href="../../../polymer/polymer.html"> <link rel="import" href="../../../polymer/polymer.html">
<link rel="import" href="yatta-test.html"> <link rel="import" href="y-test.html">
</head> </head>
<body> <body>
<yatta-test></yatta-test> <y-test></y-test>
<script src="./index.js"></script> <script src="./index.js"></script>
</body> </body>
</html> </html>

View File

@ -1,16 +1,16 @@
setTimeout(function(){ setTimeout(function(){
window.x = document.querySelector("yatta-test"); window.y_test = document.querySelector("y-test");
// x.yatta.HB.stopGarbageCollection();
x.yatta.val("stuff",{otherstuff:{nostuff:"this is no stuff"}}) window.y_test.y.val("stuff",{otherstuff:{nostuff:"this is no stuff"}})
setTimeout(function(){ setTimeout(function(){
var res = x.yatta.val("stuff"); var res = y_test.y.val("stuff");
if(!(x.nostuff === "this is no stuff")){ if(!(y_test.nostuff === "this is no stuff")){
console.log("Deep inherit doesn't work!") console.log("Deep inherit doesn't work!")
} }
window.y_stuff_property.val = {nostuff: "this is also no stuff"}; window.y_stuff_property.val = {nostuff: "this is also no stuff"};
setTimeout(function(){ setTimeout(function(){
if(!(x.nostuff === "this is also no stuff")){ if(!(y_test.nostuff === "this is also no stuff")){
console.log("Element val overwrite doesn't work") console.log("Element val overwrite doesn't work")
} }
console.log("Everything is fine :)"); console.log("Everything is fine :)");

View File

@ -1,38 +0,0 @@
<link rel="import" href="../../yatta-element.html">
<link rel="import" href="../../../Yatta-Connectors/xmpp-connector/xmpp-connector.html">
<link rel="import" href="../../../paper-slider/paper-slider.html">
<polymer-element name="yatta-test" attributes="yatta connector stuff">
<template>
<h1 id="text" contentEditable> Check this out !</h1>
<xmpp-connector id="connector" connector={{connector}} room="testy-xmpp-polymer"></xmpp-connector>
<yatta-element connector={{connector}} val={{yatta}}>
<yatta-property name="slider" val={{slider}}>
</yatta-property>
<yatta-property name="stuff" val={{stuff}}>
<yatta-property id="otherstuff" name="otherstuff" val={{otherstuff}}>
</yatta-property>
</yatta-property>
</yatta-element>
<yatta-element val={{otherstuff}}>
<yatta-property name="nostuff" val={{nostuff}}>
</yatta-property>
</yatta-element>
<paper-slider min="0" max="200" immediateValue={{slider}}></paper-slider>
</template>
<script>
Polymer({
ready: function(){
window.y_stuff_property = this.$.otherstuff;
this.yatta.val("slider",50)
var that = this;
this.connector.whenSynced(function(){
if(that.yatta.val("text") == null){
that.yatta.val("text","stuff","mutable");
}
that.yatta.val("text").bind(that.$.text,that.shadowRoot)
})
}
})
</script>
</polymer-element>

View File

@ -2,20 +2,19 @@
<html> <html>
<head> <head>
<meta charset=utf-8 /> <meta charset=utf-8 />
<title>PeerJs Json Example</title> <title>Y Example</title>
<script src="../../../Yatta-Connectors/xmpp-connector/xmpp-connector.js"></script> <script src="../../build/browser/y.js"></script>
<script src="../../build/browser/yatta.js"></script> <script src="../../../y-connectors/y-xmpp/y-xmpp.js"></script>
<script src="./index.js"></script> <script src="./index.js"></script>
</head> </head>
<body> <body>
<h1 contentEditable> PeerJs + Json Tutorial</h1> <h1 contentEditable> yjs Tutorial</h1>
<p> Collaborative Json editing with <a href="https://github.com/DadaMonad/Yatta/">Yatta</a> <p> Collaborative Json editing with <a href="https://github.com/rwth-acis/yjs/">yjs</a>
and <a href="http://peerjs.com/">PeerJs</a> (WebRTC). </p> and XMPP Connector. </p>
<textarea style="width:80%;" rows=40 id="textfield"></textarea> <textarea style="width:80%;" rows=40 id="textfield"></textarea>
<p> <a href="https://github.com/DadaMonad/Yatta/">Yatta</a> is a Framework for Real-Time collaboration on arbitrary data structures. <p> <a href="https://github.com/rwth-acis/yjs/">yjs</a> is a Framework for Real-Time collaboration on arbitrary data types.
You can find the code for this example <a href="https://github.com/DadaMonad/Yatta/tree/master/examples/PeerJs-Json">here</a>.
</p> </p>
</body> </body>
</html> </html>

View File

@ -1,59 +1,25 @@
/**
## PeerJs + JSON Example
Here, I will give a short overview on how to enable collaborative json with the
[PeerJs](http://peerjs.com/) Connector and the Json Framework. Open
[index.html](http://dadamonad.github.io/Yatta/examples/PeerJs-Json/index.html) in your Browser and
use the console to explore Yatta!
[PeerJs](http://peerjs.com) is a Framework that enables you to connect to other peers. You just need the connector = new Y.XMPP("testy-xmpp-json2");
user-id of the peer (browser/client). And then you can connect to it.
First you have to include the following libraries in your html file:
```
<script src="http://cdn.peerjs.com/0.3/peer.js"></script>
<script src="../../build/browser/Frameworks/JsonFramework.js"></script>
<script src="../../build/browser/Connectors/PeerJsConnector.js"></script>
<script src="./index.js"></script>
```
### Create Connector
The PeerJs Framework requires an API key, or you need to set up your own PeerJs server.
Get an API key from the [Website](http://peerjs.com/peerserver).
The first parameter of `createPeerJsConnector` is forwarded as the options object in PeerJs.
Therefore, you may also specify the server/port here, if you have set up your own server.
*/
var yatta, yattaHandler;
/**
This will connect to the server owned by the peerjs team.
For now, you can use my API key.
*/
connector = new XMPPConnector("testy-xmpp-json2");
connector.debug = true connector.debug = true
/**
### Yatta y = new Y(connector);
yatta is the shared json object. If you change something on this object,
it will be instantly shared with all the other collaborators.
*/
yatta = new Yatta(connector);
window.onload = function(){ window.onload = function(){
var textbox = document.getElementById("textfield"); var textbox = document.getElementById("textfield");
yatta.observe(function(events){ y.observe(function(events){
for(var i=0; i<events.length; i++){ for(var i=0; i<events.length; i++){
var event = events[i]; var event = events[i];
if(event.name === "textfield" && event.type !== "delete"){ if(event.name === "textfield" && event.type !== "delete"){
yatta.val("textfield").bind(textbox); y.val("textfield").bind(textbox);
yatta.val("headline").bind(document.querySelector("h1")) y.val("headline").bind(document.querySelector("h1"))
} }
} }
}); });
connector.whenSynced(function(){ connector.whenSynced(function(){
if(yatta.val("textfield") == null){ if(y.val("textfield") == null){
yatta.val("headline","headline", "mutable"); y.val("headline","headline", "mutable");
yatta.val("textfield","stuff", "mutable") y.val("textfield","stuff", "mutable")
} }
}) })

View File

@ -23,9 +23,9 @@ gulp.task 'default', ['build_browser']
files = files =
lib : ['./lib/**/*.coffee'] lib : ['./lib/**/*.coffee']
browser : ['./lib/yatta.coffee','./lib/yatta-element.coffee'] browser : ['./lib/y.coffee','./lib/y-object.coffee']
#test : ['./test/**/*_test.coffee'] #test : ['./test/**/*_test.coffee']
test : ['./test/JsonYatta_test.coffee', './test/TextYatta_test.coffee'] test : ['./test/Json_test.coffee', './test/Text_test.coffee']
gulp : ['./gulpfile.coffee'] gulp : ['./gulpfile.coffee']
examples : ['./examples/**/*.js'] examples : ['./examples/**/*.js']
other: ['./lib/**/*'] other: ['./lib/**/*']
@ -107,7 +107,7 @@ gulp.task 'literate', ->
.pipe gulpif '!**/', git.add({args : "-A"}) .pipe gulpif '!**/', git.add({args : "-A"})
gulp.task 'codo', [], ()-> gulp.task 'codo', [], ()->
command = './node_modules/codo/bin/codo -o "./doc" --name "Yatta!" --readme "README.md" --undocumented false --private true --title "Yatta! API" ./lib - LICENSE.txt ' command = './node_modules/codo/bin/codo -o "./doc" --name "yjs" --readme "README.md" --undocumented false --private true --title "yjs API" ./lib - LICENSE.txt '
run(command).exec() run(command).exec()
gulp.task 'phantom_test', ['build_browser'], ()-> gulp.task 'phantom_test', ['build_browser'], ()->
@ -118,5 +118,5 @@ gulp.task 'clean', ->
gulp.src ['./build/{browser,test,node}/**/*.{js,map}','./doc/'], { read: false } gulp.src ['./build/{browser,test,node}/**/*.{js,map}','./doc/'], { read: false }
.pipe rimraf() .pipe rimraf()
gulp.task 'default', ['clean','build', 'codo'], -> gulp.task 'default', ['clean','build'], ->

View File

@ -50,7 +50,7 @@ adaptConnector = (connector, engine, HB, execution_listener)->
if op.uid.creator isnt HB.getUserId() if op.uid.creator isnt HB.getUserId()
engine.applyOp op engine.applyOp op
if connector._whenBoundToYatta? if connector._whenBoundToY?
connector._whenBoundToYatta() connector._whenBoundToY()
module.exports = adaptConnector module.exports = adaptConnector

View File

@ -14,7 +14,7 @@ module.exports = (HB)->
# Use it to check whether this is a json-type or something else. # Use it to check whether this is a json-type or something else.
# #
# @example # @example
# var x = yatta.val('unknown') # var x = y.val('unknown')
# if (x.type === "Object") { # if (x.type === "Object") {
# console.log JSON.stringify(x.toJson()) # console.log JSON.stringify(x.toJson())
# } # }
@ -55,7 +55,7 @@ module.exports = (HB)->
Object.observe @bound_json, (events)-> Object.observe @bound_json, (events)->
for event in events for event in events
if not event.changedBy? and (event.type is "add" or event.type = "update") if not event.changedBy? and (event.type is "add" or event.type = "update")
# this event is not created by Yatta. # this event is not created by Y.
that.val(event.name, event.object[event.name]) that.val(event.name, event.object[event.name])
@observe (events)-> @observe (events)->
for event in events for event in events
@ -111,7 +111,7 @@ module.exports = (HB)->
o = type.create.apply null, args o = type.create.apply null, args
super name, o super name, o
else else
throw new Error "The #{content.constructor.name}-type is not (yet) supported in Yatta." throw new Error "The #{content.constructor.name}-type is not (yet) supported in Y."
else else
super name, content super name, content
else # is this even necessary ? I have to define every type anyway.. (see Number type below) else # is this even necessary ? I have to define every type anyway.. (see Number type below)

View File

@ -142,7 +142,7 @@ module.exports = (HB)->
if type? and type.create? if type? and type.create?
type.create content, options type.create content, options
else else
throw new Error "The #{content.constructor.name}-type is not (yet) supported in Yatta." throw new Error "The #{content.constructor.name}-type is not (yet) supported in Y."
else else
content content
@ -236,7 +236,7 @@ module.exports = (HB)->
# Use it to check whether this is a word-type or something else. # Use it to check whether this is a word-type or something else.
# #
# @example # @example
# var x = yatta.val('unknown') # var x = y.val('unknown')
# if (x.type === "String") { # if (x.type === "String") {
# console.log JSON.stringify(x.toJson()) # console.log JSON.stringify(x.toJson())
# } # }
@ -278,7 +278,7 @@ module.exports = (HB)->
# #
# @example # @example
# var textbox = document.getElementById("textfield"); # var textbox = document.getElementById("textfield");
# yatta.bind(textbox); # y.bind(textbox);
# #
bind: (textfield, dom_root)-> bind: (textfield, dom_root)->
dom_root ?= window dom_root ?= window

View File

@ -3,7 +3,7 @@ json_types_uninitialized = require "./JsonTypes"
# some dom implementations may call another dom.method that simulates the behavior of another. # some dom implementations may call another dom.method that simulates the behavior of another.
# For example xml.insertChild(dom) , wich inserts an element at the end, and xml.insertAfter(dom,null) wich does the same # For example xml.insertChild(dom) , wich inserts an element at the end, and xml.insertAfter(dom,null) wich does the same
# But yatta's proxy may be called only once! # But Y's proxy may be called only once!
proxy_token = false proxy_token = false
dont_proxy = (f)-> dont_proxy = (f)->
proxy_token = true proxy_token = true
@ -18,7 +18,7 @@ _proxy = (f_name, f)->
old_f = @[f_name] old_f = @[f_name]
if old_f? if old_f?
@[f_name] = ()-> @[f_name] = ()->
if not proxy_token and not @_yatta?.isDeleted() if not proxy_token and not @_y?.isDeleted()
that = this that = this
args = arguments args = arguments
dont_proxy ()-> dont_proxy ()->
@ -59,10 +59,10 @@ module.exports = (HB)->
super(uid) super(uid)
if @xml?._yatta? if @xml?._y?
d = new types.Delete undefined, @xml._yatta d = new types.Delete undefined, @xml._y
HB.addOperation(d).execute() HB.addOperation(d).execute()
@xml._yatta = null @xml._y = null
if attributes? and elements? if attributes? and elements?
@saveOperation 'attributes', attributes @saveOperation 'attributes', attributes
@ -114,7 +114,7 @@ module.exports = (HB)->
super() super()
setXmlProxy: ()-> setXmlProxy: ()->
@xml._yatta = @ @xml._y = @
that = @ that = @
@elements.on 'insert', (event, op)-> @elements.on 'insert', (event, op)->
@ -160,7 +160,7 @@ module.exports = (HB)->
findNode = (child)-> findNode = (child)->
if not child? if not child?
throw new Error "you must specify a parameter!" throw new Error "you must specify a parameter!"
child = child._yatta child = child._y
elem = that.elements.beginning.next_cl elem = that.elements.beginning.next_cl
while elem.type isnt 'Delimiter' and elem.content isnt child while elem.type isnt 'Delimiter' and elem.content isnt child
elem = elem.next_cl elem = elem.next_cl
@ -177,7 +177,7 @@ module.exports = (HB)->
if next if next
prev = next.prev_cl prev = next.prev_cl
else else
prev = @_yatta.elements.end.prev_cl prev = @_y.elements.end.prev_cl
while prev.isDeleted() while prev.isDeleted()
prev = prev.prev_cl prev = prev.prev_cl
inserted_nodes = null inserted_nodes = null
@ -235,7 +235,7 @@ module.exports = (HB)->
throw new Error "You are only allowed to delete existing (direct) child elements!" throw new Error "You are only allowed to delete existing (direct) child elements!"
d = new types.Delete undefined, elem d = new types.Delete undefined, elem
HB.addOperation(d).execute() HB.addOperation(d).execute()
node._yatta = null node._y = null
@xml._proxy 'removeChild', removeChild @xml._proxy 'removeChild', removeChild
@xml._proxy 'replaceChild', (insertedNode, replacedNode)-> @xml._proxy 'replaceChild', (insertedNode, replacedNode)->
insertBefore.call this, insertedNode, replacedNode insertBefore.call this, insertedNode, replacedNode
@ -326,11 +326,11 @@ module.exports = (HB)->
# @param {Object} content # @param {Object} content
# #
constructor: (uid, content)-> constructor: (uid, content)->
if content._yatta? if content._y?
d = new types.Delete undefined, content._yatta d = new types.Delete undefined, content._y
HB.addOperation(d).execute() HB.addOperation(d).execute()
content._yatta = null content._y = null
content._yatta = @ content._y = @
super uid, content super uid, content
applyDelete: (op)-> applyDelete: (op)->

View File

@ -1,59 +0,0 @@
Yatta = require './yatta'
bindToChildren = (that)->
for i in [0...that.children.length]
attr = that.children.item(i)
if attr.name?
attr.val = that.val.val(attr.name)
that.val.observe (events)->
for event in events
if event.name?
for i in [0...that.children.length]
attr = that.children.item(i)
if attr.name? and attr.name is event.name
newVal = that.val.val(attr.name)
if attr.val isnt newVal
attr.val = newVal
Polymer "yatta-element",
ready: ()->
if @connector?
@val = new Yatta @connector
bindToChildren @
else if @val?
bindToChildren @
valChanged: ()->
if @val? and @val.type is "Object"
bindToChildren @
connectorChanged: ()->
if (not @val?)
@val = new Yatta @connector
bindToChildren @
Polymer "yatta-property",
ready: ()->
if @val? and @name?
if @val.constructor is Object
@val = @parentElement.val(@name,@val).val(@name)
# TODO: please use instanceof instead of .type,
# since it is more safe (consider someone putting a custom Object type here)
else if typeof @val is "string"
@parentElement.val(@name,@val)
if @val.type is "Object"
bindToChildren @
valChanged: ()->
if @val? and @name?
if @val.constructor is Object
@val = @parentElement.val.val(@name,@val).val(@name)
# TODO: please use instanceof instead of .type,
# since it is more safe (consider someone putting a custom Object type here)
else if @val.type is "Object"
bindToChildren @
else if @parentElement.val?.val? and @val isnt @parentElement.val.val(@name)
@parentElement.val.val @name, @val

View File

@ -1,48 +0,0 @@
json_types_uninitialized = require "./Types/JsonTypes"
HistoryBuffer = require "./HistoryBuffer"
Engine = require "./Engine"
adaptConnector = require "./ConnectorAdapter"
createYatta = (connector)->
user_id = null
if connector.id?
user_id = connector.id # TODO: change to getUniqueId()
else
user_id = "_temp"
connector.whenUserIdSet (id)->
user_id = id
HB.resetUserId id
HB = new HistoryBuffer user_id
type_manager = json_types_uninitialized HB
types = type_manager.types
#
# Framework for Json data-structures.
# Known values that are supported:
# * String
# * Integer
# * Array
#
class Yatta extends types.Object
#
# @param {String} user_id Unique id of the peer.
# @param {Connector} Connector the connector class.
#
constructor: ()->
@connector = connector
@HB = HB
@types = types
@engine = new Engine @HB, type_manager.types
adaptConnector @connector, @engine, @HB, type_manager.execution_listener
super
getConnector: ()->
@connector
return new Yatta(HB.getReservedUniqueIdentifier()).execute()
module.exports = createYatta
if window? and not window.Yatta?
window.Yatta = createYatta

View File

@ -1,26 +0,0 @@
0 info it worked if it ends with ok
1 verbose cli [ '/home/codio/.nvm/v0.10.33/bin/node',
1 verbose cli '/home/codio/.nvm/v0.10.33/bin/npm',
1 verbose cli 'adduser' ]
2 info using npm@1.4.28
3 info using node@v0.10.33
4 error Error: canceled
4 error at Interface.<anonymous> (/home/codio/.nvm/v0.10.33/lib/node_modules/npm/node_modules/read/lib/read.js:66:13)
4 error at Interface.emit (events.js:92:17)
4 error at Interface._ttyWrite (readline.js:620:16)
4 error at ReadStream.onkeypress (readline.js:99:10)
4 error at ReadStream.emit (events.js:98:17)
4 error at emitKey (readline.js:1095:12)
4 error at ReadStream.onData (readline.js:840:14)
4 error at ReadStream.emit (events.js:95:17)
4 error at ReadStream.<anonymous> (_stream_readable.js:764:14)
4 error at ReadStream.emit (events.js:92:17)
5 error If you need help, you may report this *entire* log,
5 error including the npm and node versions, at:
5 error <http://github.com/npm/npm/issues>
6 error System Linux 3.16.0-23-generic
7 error command "/home/codio/.nvm/v0.10.33/bin/node" "/home/codio/.nvm/v0.10.33/bin/npm" "adduser"
8 error cwd /home/codio/workspace/Yatta
9 error node -v v0.10.33
10 error npm -v 1.4.28
11 verbose exit [ 1, true ]

View File

@ -1,14 +1,14 @@
{ {
"name": "Y", "name": "yjs",
"version": "0.2.3", "version": "0.3.0",
"description": "A Framework that enables Real-Time Collaboration on arbitrary data structures.", "description": "A Framework that enables Real-Time Collaboration on arbitrary data structures.",
"main": "./build/node/yatta.js", "main": "./build/node/y.js",
"scripts": { "scripts": {
"test": "./node_modules/.bin/gulp test" "test": "./node_modules/.bin/gulp test"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/rwth-acis/Yatta" "url": "https://github.com/rwth-acis/yjs"
}, },
"keywords": [ "keywords": [
"OT", "OT",
@ -23,9 +23,9 @@
"email": "kevin.jahns@rwth-aachen.de", "email": "kevin.jahns@rwth-aachen.de",
"license": "MIT", "license": "MIT",
"bugs": { "bugs": {
"url": "https://github.com/DadaMonad/Yatta/issues" "url": "https://github.com/rwth-acis/yjs/issues"
}, },
"homepage": "https://dadamonad.github.io/Yatta/", "homepage": "https://dadamonad.github.io/yjs/",
"dependencies": { "dependencies": {
}, },
"devDependencies": { "devDependencies": {

View File

@ -1,274 +0,0 @@
chai = require('chai')
expect = chai.expect
should = chai.should()
sinon = require('sinon')
sinonChai = require('sinon-chai')
_ = require("underscore")
chai.use(sinonChai)
Connector = require "../../Yatta-Connectors/lib/test-connector/test-connector.coffee"
Yatta = require "../lib/yatta.coffee"
Test = require "./TestSuite"
class JsonTest extends Test
makeNewUser: (userId)->
conn = new Connector userId
super new Yatta conn
type: "JsonTest"
getRandomRoot: (user_num, root)->
root ?= @users[user_num]
types = @users[user_num].types
if _.random(0,1) is 1 # take root
root
else # take child
elems = null
if root.type is "Object"
elems =
for oname,val of root.val()
val
else if root.type is "Array"
elems = root.val()
else
return root
elems = elems.filter (elem)->
(elem.type is "Array") or (elem.type is "Object")
if elems.length is 0
root
else
p = elems[_.random(0, elems.length-1)]
@getRandomRoot user_num, p
getContent: (user_num)->
@users[user_num].toJson(true)
getGeneratingFunctions: (user_num)->
types = @users[user_num].types
super(user_num).concat [
f : (y)=> # SET PROPERTY
l = y.val().length
y.val(_.random(0, l-1), @getRandomText(), 'immutable')
null
types : [types.Array]
, f : (y)=> # Delete Array Element
list = y.val()
if list.length > 0
key = list[_random(0,list.length-1)]
y.delete(key)
types: [types.Array]
, f : (y)=> # insert TEXT mutable
l = y.val().length
y.val(_.random(0, l-1), @getRamdomObject())
types: [types.Array]
, f : (y)=> # insert string
l = y.val().length
y.val(_.random(0, l-1), @getRandomText(), 'immutable')
null
types : [types.Array]
, f : (y)=> # Delete Object Property
list = for name, o of y.val()
name
if list.length > 0
key = list[_random(0,list.length-1)]
y.delete(key)
types: [types.Object]
, f : (y)=> # SET Object Property
y.val(@getRandomKey(), @getRandomObject())
types: [types.Object]
,
f : (y)=> # SET PROPERTY TEXT
y.val(@getRandomKey(), @getRandomText(), 'mutable')
types: [types.Object]
]
describe "JsonFramework", ->
beforeEach (done)->
@timeout 50000
@yTest = new JsonTest()
@users = @yTest.users
@test_user = @yTest.makeNewUser "test_user"
done()
it "can handle many engines, many operations, concurrently (random)", ->
console.log "" # TODO
@yTest.run()
it "has a working test suite", ->
@yTest.compareAll()
it "handles double-late-join", ->
test = new JsonTest("double")
test.run()
@yTest.run()
u1 = test.users[0]
u2 = @yTest.users[1]
ops1 = u1.HB._encode()
ops2 = u2.HB._encode()
u1.HB.renewStateVector u2.HB.getOperationCounter()
u2.HB.renewStateVector u1.HB.getOperationCounter()
u1.engine.applyOps ops2
u2.engine.applyOps ops1
expect(test.getContent(0)).to.deep.equal(@yTest.getContent(1))
it "can handle creaton of complex json (1)", ->
@yTest.users[0].val('a', 'q', "mutable")
@yTest.users[1].val('a', 't', "mutable")
@yTest.compareAll()
q = @yTest.users[2].val('a')
q.insert(0,'A')
@yTest.compareAll()
expect(@yTest.getSomeUser().val("a").val()).to.equal("At")
it "can handle creaton of complex json (2)", ->
@yTest.getSomeUser().val('x', {'a':'b'})
@yTest.getSomeUser().val('a', {'a':{q:"dtrndtrtdrntdrnrtdnrtdnrtdnrtdnrdnrdt"}}, "mutable")
@yTest.getSomeUser().val('b', {'a':{}})
@yTest.getSomeUser().val('c', {'a':'c'})
@yTest.getSomeUser().val('c', {'a':'b'})
@yTest.compareAll()
q = @yTest.getSomeUser().val("a").val("a").val("q")
q.insert(0,'A')
@yTest.compareAll()
expect(@yTest.getSomeUser().val("a").val("a").val("q").val()).to.equal("Adtrndtrtdrntdrnrtdnrtdnrtdnrtdnrdnrdt")
it "can handle creaton of complex json (3)", ->
@yTest.users[0].val('l', [1,2,3], "mutable")
@yTest.users[1].val('l', [4,5,6], "mutable")
@yTest.compareAll()
@yTest.users[2].val('l').insert(0,'A')
w = @yTest.users[1].val('l').insert(0,'B', "mutable").val(0)
w.insert 1, "C"
expect(w.val()).to.equal("BC")
@yTest.compareAll()
it "handles immutables and primitive data types", ->
@yTest.getSomeUser().val('string', "text", "immutable")
@yTest.getSomeUser().val('number', 4, "immutable")
@yTest.getSomeUser().val('object', {q:"rr"}, "immutable")
@yTest.getSomeUser().val('null', null)
@yTest.compareAll()
expect(@yTest.getSomeUser().val('string')).to.equal "text"
expect(@yTest.getSomeUser().val('number')).to.equal 4
expect(@yTest.getSomeUser().val('object').val('q')).to.equal "rr"
expect(@yTest.getSomeUser().val('null') is null).to.be.ok
it "handles immutables and primitive data types (2)", ->
@yTest.users[0].val('string', "text", "immutable")
@yTest.users[1].val('number', 4, "immutable")
@yTest.users[2].val('object', {q:"rr"}, "immutable")
@yTest.users[0].val('null', null)
@yTest.compareAll()
expect(@yTest.getSomeUser().val('string')).to.equal "text"
expect(@yTest.getSomeUser().val('number')).to.equal 4
expect(@yTest.getSomeUser().val('object').val('q')).to.equal "rr"
expect(@yTest.getSomeUser().val('null') is null).to.be.ok
it "Observers work on JSON Types (add type observers, local and foreign)", ->
u = @yTest.users[0]
@yTest.flushAll()
last_task = null
observer1 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("add")
expect(change.object).to.equal(u)
expect(change.changedBy).to.equal('0')
expect(change.name).to.equal("newStuff")
last_task = "observer1"
u.observe observer1
u.val("newStuff","someStuff","mutable")
expect(last_task).to.equal("observer1")
u.unobserve observer1
observer2 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("add")
expect(change.object).to.equal(u)
expect(change.changedBy).to.equal('1')
expect(change.name).to.equal("moreStuff")
last_task = "observer2"
u.observe observer2
v = @yTest.users[1]
v.val("moreStuff","someMoreStuff")
@yTest.flushAll()
expect(last_task).to.equal("observer2")
u.unobserve observer2
it "Observers work on JSON Types (update type observers, local and foreign)", ->
u = @yTest.users[0].val("newStuff","oldStuff","mutable").val("moreStuff","moreOldStuff","mutable")
@yTest.flushAll()
last_task = null
observer1 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("update")
expect(change.object).to.equal(u)
expect(change.changedBy).to.equal('0')
expect(change.name).to.equal("newStuff")
expect(change.oldValue.val()).to.equal("oldStuff")
last_task = "observer1"
u.observe observer1
u.val("newStuff","someStuff")
expect(last_task).to.equal("observer1")
u.unobserve observer1
observer2 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("update")
expect(change.object).to.equal(u)
expect(change.changedBy).to.equal('1')
expect(change.name).to.equal("moreStuff")
expect(change.oldValue.val()).to.equal("moreOldStuff")
last_task = "observer2"
u.observe observer2
v = @yTest.users[1]
v.val("moreStuff","someMoreStuff")
@yTest.flushAll()
expect(last_task).to.equal("observer2")
u.unobserve observer2
it "Observers work on JSON Types (delete type observers, local and foreign)", ->
u = @yTest.users[0].val("newStuff","oldStuff","mutable").val("moreStuff","moreOldStuff","mutable")
@yTest.flushAll()
last_task = null
observer1 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("delete")
expect(change.object).to.equal(u)
expect(change.changedBy).to.equal('0')
expect(change.name).to.equal("newStuff")
expect(change.oldValue.val()).to.equal("oldStuff")
last_task = "observer1"
u.observe observer1
u.delete("newStuff")
expect(last_task).to.equal("observer1")
u.unobserve observer1
observer2 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("delete")
expect(change.object).to.equal(u)
expect(change.changedBy).to.equal('1')
expect(change.name).to.equal("moreStuff")
expect(change.oldValue.val()).to.equal("moreOldStuff")
last_task = "observer2"
u.observe observer2
v = @yTest.users[1]
v.delete("moreStuff")
@yTest.flushAll()
expect(last_task).to.equal("observer2")
u.unobserve observer2

View File

@ -7,7 +7,7 @@ _ = require("underscore")
chai.use(sinonChai) chai.use(sinonChai)
Connector = require "../../Yatta-Connectors/lib/test-connector/test-connector.coffee" Connector = require "../../y-connectors/lib/y-test/y-test.coffee"
module.exports = class Test module.exports = class Test
constructor: (@name_suffix = "")-> constructor: (@name_suffix = "")->

View File

@ -1,119 +0,0 @@
chai = require('chai')
expect = chai.expect
should = chai.should()
sinon = require('sinon')
sinonChai = require('sinon-chai')
_ = require("underscore")
chai.use(sinonChai)
Yatta = require "../lib/yatta"
Connector = require "../../Yatta-Connectors/lib/test-connector/test-connector.coffee"
Test = require "./TestSuite"
class TextTest extends Test
type: "TextTest"
makeNewUser: (userId)->
conn = new Connector userId
new Yatta conn
initUsers: (u)->
u.val("TextTest","","mutable")
getRandomRoot: (user_num)->
@users[user_num].val("TextTest")
getContent: (user_num)->
@users[user_num].val("TextTest").val()
describe "TextFramework", ->
beforeEach (done)->
@timeout 50000
@yTest = new TextTest()
done()
it "simple multi-char insert", ->
u = @yTest.users[0].val("TextTest")
u.insert 0, "abc"
u = @yTest.users[1].val("TextTest")
u.insert 0, "xyz"
@yTest.compareAll()
u.delete 0, 1
@yTest.compareAll()
expect(u.val()).to.equal("bcxyz")
it "Observers work on shared Text (insert type observers, local and foreign)", ->
u = @yTest.users[0].val("TextTest","my awesome Text","mutable").val("TextTest")
@yTest.flushAll()
last_task = null
observer1 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("insert")
expect(change.object).to.equal(u)
expect(change.value).to.equal("a")
expect(change.position).to.equal(1)
expect(change.changedBy).to.equal('0')
last_task = "observer1"
u.observe observer1
u.insert 1, "a"
expect(last_task).to.equal("observer1")
u.unobserve observer1
observer2 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("insert")
expect(change.object).to.equal(u)
expect(change.value).to.equal("x")
expect(change.position).to.equal(0)
expect(change.changedBy).to.equal('1')
last_task = "observer2"
u.observe observer2
v = @yTest.users[1].val("TextTest")
v.insert 0, "x"
@yTest.flushAll()
expect(last_task).to.equal("observer2")
u.unobserve observer2
it "Observers work on shared Text (delete type observers, local and foreign)", ->
u = @yTest.users[0].val("TextTest","my awesome Text","mutable").val("TextTest")
@yTest.flushAll()
last_task = null
observer1 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("delete")
expect(change.object).to.equal(u)
expect(change.position).to.equal(1)
expect(change.length).to.equal(1)
expect(change.changedBy).to.equal('0')
last_task = "observer1"
u.observe observer1
u.delete 1, 1
expect(last_task).to.equal("observer1")
u.unobserve observer1
observer2 = (changes)->
expect(changes.length).to.equal(1)
change = changes[0]
expect(change.type).to.equal("delete")
expect(change.object).to.equal(u)
expect(change.position).to.equal(0)
expect(change.length).to.equal(1)
expect(change.changedBy).to.equal('1')
last_task = "observer2"
u.observe observer2
v = @yTest.users[1].val("TextTest")
v.delete 0, 1
@yTest.flushAll()
expect(last_task).to.equal("observer2")
u.unobserve observer2
it "can handle many engines, many operations, concurrently (random)", ->
console.log("testiy deleted this TODO:dtrn")
@yTest.run()

View File

@ -1,196 +0,0 @@
chai = require('chai')
expect = chai.expect
should = chai.should()
sinon = require('sinon')
sinonChai = require('sinon-chai')
_ = require("underscore")
$ = require("jquery")
document?.$ = $ # for browser
require 'coffee-errors'
chai.use(sinonChai)
Y = require "../lib/index"
Connector = require "../../Yatta-Connectors/lib/test-connector/test-connector.coffee"
Test = require "./TestSuite"
class XmlTest extends Test
type: "XmlTest"
makeNewUser: (user, conn)->
super new Y.XmlFramework user, conn
getRandomRoot: (user_num)->
@users[user_num].getSharedObject()
getContent: (user_num)->
@users[user_num].val()
describe "XmlFramework", ->
beforeEach (done)->
@timeout 50000
@yTest = new XmlTest()
###
@users = @yTest.users
###
test_users = []
connector = (new Connector 0, test_users)
@test_user = @yTest.makeNewUser 0, connector
test_users.push @test_user
# test_user_listen listens to the actions of test_user. He will update his dom when he receives from test_user.
@test_user_listen = @yTest.makeNewUser 2, connector
test_users.push @test_user_listen
@test_user2 = @yTest.makeNewUser 1, (Connector_uninitialized [])
$("#test_dom").replaceWith('<div id="test_dom" test_attribute="the test" class="stuffy" style="color: blue"><p id="replaceme">replace me</p><p id="removeme">remove me</p><p>This is a test object for <b>XmlFramework</b></p><span class="span_element"><p>span</p></span></div>')
@$dom = $("#test_dom")
@dom = @$dom[0]
@test_user.val(@dom)
@test_user_listen.getConnector().flushAll()
@test_user_listen_dom = @test_user_listen.val()
@check = ()=>
dom_ = @dom.outerHTML
# now test if other collaborators can parse the HB and result in the same content
hb = @test_user.HB._encode()
@test_user2.engine.applyOps(hb)
dom2 = @test_user2.val()
expect(dom_).to.equal(dom2.outerHTML)
@test_user_listen.getConnector().flushAll()
expect(dom_).to.equal(@test_user_listen_dom.outerHTML)
done()
it "can transform to a new real Dom element", ->
dom_ = @test_user.val(true)
expect(dom_ isnt @dom).to.be.true
it "supports dom.insertBefore", ->
newdom = $("<p>dtrn</p>")[0]
newdom2 = $("<p>dtrn2</p>")[0]
n = $("#removeme")[0]
@dom.insertBefore(newdom, null)
@dom.insertBefore(newdom2, n)
@check()
it "supports dom.appendChild", ->
newdom = $("<p>dtrn</p>")[0]
@dom.appendChild(newdom)
@check()
it "supports dom.setAttribute", ->
@dom.setAttribute("test_attribute", "newVal")
@check()
it "supports dom.removeAttribute", ->
@dom.removeAttribute("test_attribute")
@check()
it "supports dom.removeChild", ->
@dom.removeChild($("#removeme")[0])
expect($("#removeme").length).to.equal(0)
@check()
it "supports dom.replaceChild", ->
newdom = $("<p>replaced</p>")[0]
replace = $("#replaceme")[0]
@dom.replaceChild(newdom,replace)
expect($("#replaceme").length).to.equal(0)
@check()
it "supports dom.classList.add", ->
@dom.classList.add "classy"
@check()
it "supports dom.textcontent", -> #TODO!!!!
@dom.classList.add "classy"
@check()
it "supports jquery.addClass", ->
@$dom.addClass("testy")
@check()
it "supports jquery.after", ->
d = $("#test_dom p")
d.after("<div class=\"inserted_after\">after</div>")
@check()
it "supports jquery.append", ->
d = $("#test_dom p")
d.after("<b>appended</b>")
@check()
it "supports jquery.appendTo", ->
$("<b>appendedTo</b>").appendTo("#test_dom p")
$("p").appendTo("#test_dom")
@check()
it "supports jquery.before", ->
d = $("#test_dom p")
d.before("<div>before</div>")
@check()
it "supports jquery.detach", ->
d = $(".inserted_after")
d.detach()
@check()
it "supports jquery.empty", ->
d = $("#test_dom p")
d.empty()
@check()
it "supports jquery.insertAfter", ->
$("<p>after span</p>").insertAfter(".span_element")
@check()
it "supports jquery.insertBefore", ->
$("<p>before span</p>").insertBefore(".span_element")
@check()
it "supports jquery.prepend", ->
d = $("#test_dom div")
d.prepend("<p>prepended</p>")
@check()
it "supports jquery.prependTo", ->
$("<p atone=false attwo=\"dtrn\" class=\"attr_node sudo su\">prepended to</p>").prependTo("#test_dom div")
@check()
it "supports jquery.remove", ->
d = $("#test_dom b")
d.remove()
@check()
it "supports jquery.removeAttr", ->
d = $(".attr_node")
d.removeAttr("attwo")
@check()
it "supports jquery.removeClass", ->
d = $(".attr_node")
d.removeClass("sudo")
@check()
it "supports jquery.attr", ->
d = $(".attr_node")
d.attr("atone", true)
@check()
it "supports jquery.replaceAll", ->
$("<span>New span content </span>").replaceAll("#test_dom div")
@check()
it "supports jquery.replaceWith", ->
d = $("#test_dom span")
d.replaceWith("<div>me is div again </div>")
@check()

View File

@ -1,8 +0,0 @@
<polymer-element name="yatta-element" hidden attributes="val connector">
</polymer-element>
<polymer-element name="yatta-property" hidden attributes="val name">
</polymer-element>
<script src="./build/browser/yatta-element.js"></script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long