added XMPP example, fixed bug in TextType binding to textfield
This commit is contained in:
parent
877365d00c
commit
e73829f73b
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -210,14 +210,7 @@
|
|||||||
}
|
}
|
||||||
Insert.__super__.applyDelete.call(this, garbagecollect);
|
Insert.__super__.applyDelete.call(this, garbagecollect);
|
||||||
if (callLater) {
|
if (callLater) {
|
||||||
this.parent.callEvent([
|
this.callOperationSpecificDeleteEvents(o);
|
||||||
{
|
|
||||||
type: "insert",
|
|
||||||
position: this.getPosition(),
|
|
||||||
object: this.parent,
|
|
||||||
changed_by: o.uid.creator
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
if ((_ref = this.next_cl) != null ? _ref.isDeleted() : void 0) {
|
if ((_ref = this.next_cl) != null ? _ref.isDeleted() : void 0) {
|
||||||
return this.next_cl.applyDelete();
|
return this.next_cl.applyDelete();
|
||||||
@ -299,24 +292,36 @@
|
|||||||
}
|
}
|
||||||
this.setParent(this.prev_cl.getParent());
|
this.setParent(this.prev_cl.getParent());
|
||||||
Insert.__super__.execute.apply(this, arguments);
|
Insert.__super__.execute.apply(this, arguments);
|
||||||
this.callOperationSpecificEvents();
|
this.callOperationSpecificInsertEvents();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Insert.prototype.callOperationSpecificEvents = function() {
|
Insert.prototype.callOperationSpecificInsertEvents = function() {
|
||||||
var _ref;
|
var _ref;
|
||||||
return (_ref = this.parent) != null ? _ref.callEvent([
|
return (_ref = this.parent) != null ? _ref.callEvent([
|
||||||
{
|
{
|
||||||
type: "insert",
|
type: "insert",
|
||||||
position: this.getPosition(),
|
position: this.getPosition(),
|
||||||
object: this.parent,
|
object: this.parent,
|
||||||
changed_by: this.uid.creator,
|
changedBy: this.uid.creator,
|
||||||
value: this.content
|
value: this.content
|
||||||
}
|
}
|
||||||
]) : void 0;
|
]) : void 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Insert.prototype.callOperationSpecificDeleteEvents = function(o) {
|
||||||
|
return this.parent.callEvent([
|
||||||
|
{
|
||||||
|
type: "delete",
|
||||||
|
position: this.getPosition(),
|
||||||
|
object: this.parent,
|
||||||
|
length: 1,
|
||||||
|
changedBy: o.uid.creator
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
Insert.prototype.getPosition = function() {
|
Insert.prototype.getPosition = function() {
|
||||||
var position, prev;
|
var position, prev;
|
||||||
position = 0;
|
position = 0;
|
||||||
|
File diff suppressed because one or more lines are too long
@ -103,7 +103,7 @@
|
|||||||
_results = [];
|
_results = [];
|
||||||
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
||||||
event = events[_i];
|
event = events[_i];
|
||||||
if ((event.changed_by == null) && (event.type === "add" || (event.type = "update"))) {
|
if ((event.changedBy == null) && (event.type === "add" || (event.type = "update"))) {
|
||||||
_results.push(that.val(event.name, event.object[event.name]));
|
_results.push(that.val(event.name, event.object[event.name]));
|
||||||
} else {
|
} else {
|
||||||
_results.push(void 0);
|
_results.push(void 0);
|
||||||
@ -128,7 +128,7 @@
|
|||||||
type: 'update',
|
type: 'update',
|
||||||
name: event.name,
|
name: event.name,
|
||||||
oldValue: oldVal,
|
oldValue: oldVal,
|
||||||
changed_by: event.changed_by
|
changedBy: event.changedBy
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
notifier.performChange('add', function() {
|
notifier.performChange('add', function() {
|
||||||
@ -139,7 +139,7 @@
|
|||||||
type: 'add',
|
type: 'add',
|
||||||
name: event.name,
|
name: event.name,
|
||||||
oldValue: oldVal,
|
oldValue: oldVal,
|
||||||
changed_by: event.changed_by
|
changedBy: event.changedBy
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
File diff suppressed because one or more lines are too long
@ -35,40 +35,50 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
MapManager.prototype.val = function(name, content) {
|
MapManager.prototype.val = function(name, content) {
|
||||||
var o, obj, qqq, result, x, _ref, _ref1;
|
var o, obj, prop, result, _ref;
|
||||||
if (content != null) {
|
if (content != null) {
|
||||||
if (this.map[name] == null) {
|
if (this.map[name] == null) {
|
||||||
(new AddName(void 0, this, name)).execute();
|
(new AddName(void 0, this, name)).execute();
|
||||||
}
|
}
|
||||||
if (this.map[name] === null) {
|
|
||||||
qqq = this;
|
|
||||||
x = new AddName(void 0, this, name);
|
|
||||||
x.execute();
|
|
||||||
}
|
|
||||||
this.map[name].replace(content);
|
this.map[name].replace(content);
|
||||||
return this;
|
return this;
|
||||||
} else if (name != null) {
|
} else if (name != null) {
|
||||||
obj = (_ref = this.map[name]) != null ? _ref.val() : void 0;
|
prop = this.map[name];
|
||||||
if (obj instanceof types.ImmutableObject) {
|
if ((prop != null) && !prop.isContentDeleted()) {
|
||||||
return obj.val();
|
obj = prop.val();
|
||||||
|
if (obj instanceof types.ImmutableObject) {
|
||||||
|
return obj.val();
|
||||||
|
} else {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return obj;
|
return void 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result = {};
|
result = {};
|
||||||
_ref1 = this.map;
|
_ref = this.map;
|
||||||
for (name in _ref1) {
|
for (name in _ref) {
|
||||||
o = _ref1[name];
|
o = _ref[name];
|
||||||
obj = o.val();
|
if (!o.isContentDeleted()) {
|
||||||
if (obj instanceof types.ImmutableObject || obj instanceof MapManager) {
|
obj = o.val();
|
||||||
obj = obj.val();
|
if (obj instanceof types.ImmutableObject) {
|
||||||
|
obj = obj.val();
|
||||||
|
}
|
||||||
|
result[name] = obj;
|
||||||
}
|
}
|
||||||
result[name] = obj;
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MapManager.prototype["delete"] = function(name) {
|
||||||
|
var _ref;
|
||||||
|
if ((_ref = this.map[name]) != null) {
|
||||||
|
_ref.deleteContent();
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
return MapManager;
|
return MapManager;
|
||||||
|
|
||||||
})(types.Operation);
|
})(types.Operation);
|
||||||
@ -221,9 +231,12 @@
|
|||||||
ReplaceManager = (function(_super) {
|
ReplaceManager = (function(_super) {
|
||||||
__extends(ReplaceManager, _super);
|
__extends(ReplaceManager, _super);
|
||||||
|
|
||||||
function ReplaceManager(event_porperties, event_this, uid, beginning, end, prev, next, origin) {
|
function ReplaceManager(event_properties, event_this, uid, beginning, end, prev, next, origin) {
|
||||||
this.event_porperties = event_porperties;
|
this.event_properties = event_properties;
|
||||||
this.event_this = event_this;
|
this.event_this = event_this;
|
||||||
|
if (this.event_properties['object'] == null) {
|
||||||
|
this.event_properties['object'] = this.event_this;
|
||||||
|
}
|
||||||
ReplaceManager.__super__.constructor.call(this, uid, beginning, end, prev, next, origin);
|
ReplaceManager.__super__.constructor.call(this, uid, beginning, end, prev, next, origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,11 +266,11 @@
|
|||||||
ReplaceManager.prototype.callEventDecorator = function(events) {
|
ReplaceManager.prototype.callEventDecorator = function(events) {
|
||||||
var event, name, prop, _i, _len, _ref;
|
var event, name, prop, _i, _len, _ref;
|
||||||
if (!this.isDeleted()) {
|
if (!this.isDeleted()) {
|
||||||
_ref = this.event_porperties;
|
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
||||||
for (name in _ref) {
|
event = events[_i];
|
||||||
prop = _ref[name];
|
_ref = this.event_properties;
|
||||||
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
for (name in _ref) {
|
||||||
event = events[_i];
|
prop = _ref[name];
|
||||||
event[name] = prop;
|
event[name] = prop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,9 +280,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
ReplaceManager.prototype.replace = function(content, replaceable_uid) {
|
ReplaceManager.prototype.replace = function(content, replaceable_uid) {
|
||||||
var o;
|
var o, relp;
|
||||||
o = this.getLastOperation();
|
o = this.getLastOperation();
|
||||||
(new Replaceable(content, this, replaceable_uid, o, o.next_cl)).execute();
|
relp = (new Replaceable(content, this, replaceable_uid, o, o.next_cl)).execute();
|
||||||
|
return void 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
ReplaceManager.prototype.isContentDeleted = function() {
|
||||||
|
return this.getLastOperation().isDeleted();
|
||||||
|
};
|
||||||
|
|
||||||
|
ReplaceManager.prototype.deleteContent = function() {
|
||||||
|
(new types.Delete(void 0, this.getLastOperation().uid)).execute();
|
||||||
return void 0;
|
return void 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -324,6 +346,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Replaceable.prototype.applyDelete = function() {
|
Replaceable.prototype.applyDelete = function() {
|
||||||
|
var res;
|
||||||
|
res = Replaceable.__super__.applyDelete.apply(this, arguments);
|
||||||
if (this.content != null) {
|
if (this.content != null) {
|
||||||
if (this.next_cl.type !== "Delimiter") {
|
if (this.next_cl.type !== "Delimiter") {
|
||||||
this.content.deleteAllObservers();
|
this.content.deleteAllObservers();
|
||||||
@ -332,38 +356,50 @@
|
|||||||
this.content.dontSync();
|
this.content.dontSync();
|
||||||
}
|
}
|
||||||
this.content = null;
|
this.content = null;
|
||||||
return Replaceable.__super__.applyDelete.apply(this, arguments);
|
return res;
|
||||||
};
|
};
|
||||||
|
|
||||||
Replaceable.prototype.cleanup = function() {
|
Replaceable.prototype.cleanup = function() {
|
||||||
return Replaceable.__super__.cleanup.apply(this, arguments);
|
return Replaceable.__super__.cleanup.apply(this, arguments);
|
||||||
};
|
};
|
||||||
|
|
||||||
Replaceable.prototype.callOperationSpecificEvents = function() {
|
Replaceable.prototype.callOperationSpecificInsertEvents = function() {
|
||||||
var old_value;
|
var old_value;
|
||||||
if (this.next_cl.type === "Delimiter" && this.prev_cl.type !== "Delimiter") {
|
if (this.next_cl.type === "Delimiter" && this.prev_cl.type !== "Delimiter") {
|
||||||
old_value = this.prev_cl.content;
|
old_value = this.prev_cl.content;
|
||||||
this.prev_cl.applyDelete();
|
|
||||||
this.parent.callEventDecorator([
|
this.parent.callEventDecorator([
|
||||||
{
|
{
|
||||||
type: "update",
|
type: "update",
|
||||||
changed_by: this.uid.creator,
|
changedBy: this.uid.creator,
|
||||||
oldValue: old_value
|
oldValue: old_value
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
this.prev_cl.applyDelete();
|
||||||
} else if (this.next_cl.type !== "Delimiter") {
|
} else if (this.next_cl.type !== "Delimiter") {
|
||||||
this.applyDelete();
|
this.applyDelete();
|
||||||
} else {
|
} else {
|
||||||
this.parent.callEventDecorator([
|
this.parent.callEventDecorator([
|
||||||
{
|
{
|
||||||
type: "add",
|
type: "add",
|
||||||
changed_by: this.uid.creator
|
changedBy: this.uid.creator
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
return void 0;
|
return void 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Replaceable.prototype.callOperationSpecificDeleteEvents = function(o) {
|
||||||
|
if (this.next_cl.type === "Delimiter") {
|
||||||
|
return this.parent.callEventDecorator([
|
||||||
|
{
|
||||||
|
type: "delete",
|
||||||
|
changedBy: o.uid.creator,
|
||||||
|
oldValue: this.content
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Replaceable.prototype._encode = function() {
|
Replaceable.prototype._encode = function() {
|
||||||
var json, _ref;
|
var json, _ref;
|
||||||
json = {
|
json = {
|
||||||
|
File diff suppressed because one or more lines are too long
@ -197,37 +197,44 @@
|
|||||||
var word;
|
var word;
|
||||||
word = this;
|
word = this;
|
||||||
textfield.value = this.val();
|
textfield.value = this.val();
|
||||||
this.on("insert", function(event, op) {
|
this.observe(function(events) {
|
||||||
var fix, left, o_pos, right;
|
var event, fix, left, o_pos, right, _i, _len, _results;
|
||||||
o_pos = op.getPosition();
|
_results = [];
|
||||||
fix = function(cursor) {
|
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
||||||
if (cursor <= o_pos) {
|
event = events[_i];
|
||||||
return cursor;
|
if (event.type === "insert") {
|
||||||
|
o_pos = event.position;
|
||||||
|
fix = function(cursor) {
|
||||||
|
if (cursor <= o_pos) {
|
||||||
|
return cursor;
|
||||||
|
} else {
|
||||||
|
cursor += 1;
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
left = fix(textfield.selectionStart);
|
||||||
|
right = fix(textfield.selectionEnd);
|
||||||
|
textfield.value = word.val();
|
||||||
|
_results.push(textfield.setSelectionRange(left, right));
|
||||||
|
} else if (event.type === "delete") {
|
||||||
|
o_pos = event.position;
|
||||||
|
fix = function(cursor) {
|
||||||
|
if (cursor < o_pos) {
|
||||||
|
return cursor;
|
||||||
|
} else {
|
||||||
|
cursor -= 1;
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
left = fix(textfield.selectionStart);
|
||||||
|
right = fix(textfield.selectionEnd);
|
||||||
|
textfield.value = word.val();
|
||||||
|
_results.push(textfield.setSelectionRange(left, right));
|
||||||
} else {
|
} else {
|
||||||
cursor += 1;
|
_results.push(void 0);
|
||||||
return cursor;
|
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
left = fix(textfield.selectionStart);
|
return _results;
|
||||||
right = fix(textfield.selectionEnd);
|
|
||||||
textfield.value = word.val();
|
|
||||||
return textfield.setSelectionRange(left, right);
|
|
||||||
});
|
|
||||||
this.on("delete", function(event, op) {
|
|
||||||
var fix, left, o_pos, right;
|
|
||||||
o_pos = op.getPosition();
|
|
||||||
fix = function(cursor) {
|
|
||||||
if (cursor < o_pos) {
|
|
||||||
return cursor;
|
|
||||||
} else {
|
|
||||||
cursor -= 1;
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
left = fix(textfield.selectionStart);
|
|
||||||
right = fix(textfield.selectionEnd);
|
|
||||||
textfield.value = word.val();
|
|
||||||
return textfield.setSelectionRange(left, right);
|
|
||||||
});
|
});
|
||||||
textfield.onkeypress = function(event) {
|
textfield.onkeypress = function(event) {
|
||||||
var char, diff, new_pos, pos;
|
var char, diff, new_pos, pos;
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -57,16 +57,6 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
|
||||||
<li class='letter'>y</li>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href='class/Yatta.html'>
|
|
||||||
Yatta
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
<h2>File Listing A-Z</h2>
|
<h2>File Listing A-Z</h2>
|
||||||
<div class='index'>
|
<div class='index'>
|
||||||
@ -161,24 +151,11 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
|
||||||
<li class='letter'>y</li>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href='file/lib/Yatta.coffee.html'>
|
|
||||||
Yatta.coffee
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(lib)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -359,7 +359,7 @@ E.g.: let x = {a:[]}. Then x.a.push 1 wouldn't change anything</p>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -139,7 +139,7 @@ console.log(w.newProperty == "Awesome") # true!</code></pre>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -389,7 +389,7 @@ yatta.bind(textbox);</code></pre>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -59,18 +59,6 @@
|
|||||||
</small>
|
</small>
|
||||||
<small class='namespace'>
|
<small class='namespace'>
|
||||||
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href='class/Yatta.html' target='main'>
|
|
||||||
Yatta
|
|
||||||
</a>
|
|
||||||
<small class='parent'>
|
|
||||||
<
|
|
||||||
types.JsonType
|
|
||||||
</small>
|
|
||||||
<small class='namespace'>
|
|
||||||
|
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -34,9 +34,9 @@
|
|||||||
</p>
|
</p>
|
||||||
</nav>
|
</nav>
|
||||||
<div id='filecontents'>
|
<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 Real-Time web framework that manages concurrency control for arbitrary data structures.
|
<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 Real-Time web framework that manages concurrency control for arbitrary data types.
|
||||||
Yatta! provides similar functionality as <a href="https://github.com/share/ShareJS">ShareJs</a> and <a href="https://github.com/opencoweb/coweb">OpenCoweb</a>,
|
Yatta! provides similar functionality as <a href="https://github.com/share/ShareJS">ShareJs</a> and <a href="https://github.com/opencoweb/coweb">OpenCoweb</a>,
|
||||||
but does not require you to understand how the internals work. The predefined data structures provide a simple API to access your shared data structures.</p><p>Predefined data structures:</p><ul>
|
but does not require you to understand how the internals work. The predefined data types provide a simple API to access your shared data types.</p><p>Predefined data types:</p><ul>
|
||||||
<li>Text - <a href="http://dadamonad.github.io/Yatta/examples/TextEditing/">Collaborative Text Editing Example</a></li>
|
<li>Text - <a href="http://dadamonad.github.io/Yatta/examples/TextEditing/">Collaborative Text Editing Example</a></li>
|
||||||
<li>Json - <a href="http://dadamonad.github.io/Yatta/examples/PeerJs-Json/">Tutorial</a></li>
|
<li>Json - <a href="http://dadamonad.github.io/Yatta/examples/PeerJs-Json/">Tutorial</a></li>
|
||||||
<li>XML - <a href="http://dadamonad.github.io/Yatta/examples/XmlExample/">XML Example</a> Collaboratively manipulate the dom with native dom-features and jQuery.</li>
|
<li>XML - <a href="http://dadamonad.github.io/Yatta/examples/XmlExample/">XML Example</a> Collaboratively manipulate the dom with native dom-features and jQuery.</li>
|
||||||
@ -47,11 +47,10 @@ but does not require you to understand how the internals work. The predefined da
|
|||||||
</ul>
|
</ul>
|
||||||
<h2 id="use-it-">Use it!</h2><p>The <a href="./examples/">examples</a> provide an excellent starting point for beginners. Also the <a href="http://dadamonad.github.io/Yatta/doc/">API Documentation</a> could prove to be very helpful.</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>
|
<h2 id="use-it-">Use it!</h2><p>The <a href="./examples/">examples</a> provide an excellent starting point for beginners. Also the <a href="http://dadamonad.github.io/Yatta/doc/">API Documentation</a> could prove to be very helpful.</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
|
<pre><code>bower install Yatta
|
||||||
</code></pre><p>Then you include the libraries directly from the installation folder.</p><h3 id="npm">Npm</h3>
|
</code></pre><p>Then you include the libraries directly from the installation folder.</p><pre><code><script src="./bower_components/yatta.js"></script>
|
||||||
|
</code></pre><h3 id="npm">Npm</h3>
|
||||||
<pre><code>npm install yatta --save
|
<pre><code>npm install yatta --save
|
||||||
</code></pre><p>And use it like this with <em>npm</em>:</p><pre><code>Y = require("yatta");
|
</code></pre><p>And use it like this with <em>npm</em>:</p><pre><code>Yatta = require("yatta");
|
||||||
Y.createPeerJsConnector({key: 'xxx'}, function(Connector, user_id){
|
|
||||||
yatta = new Y.JsonFramework(user_id, Connector);
|
|
||||||
</code></pre><h2 id="about">About</h2><p>Find out more about the concurrent editing problem here
|
</code></pre><h2 id="about">About</h2><p>Find out more about the concurrent editing problem here
|
||||||
<a href="http://opencoweb.org/ocwdocs/intro/openg.html">Cooperation, Concurrency, Conflicts, and Convergence</a> and here
|
<a href="http://opencoweb.org/ocwdocs/intro/openg.html">Cooperation, Concurrency, Conflicts, and Convergence</a> and here
|
||||||
<a href="http://en.wikipedia.org/wiki/Operational_transformation">Operational Transformation (OT)</a></p><p>My Bachelor Thesis project aim was to develop a P2P OT Framework that enables collaboration on XML documents and supports
|
<a href="http://en.wikipedia.org/wiki/Operational_transformation">Operational Transformation (OT)</a></p><p>My Bachelor Thesis project aim was to develop a P2P OT Framework that enables collaboration on XML documents and supports
|
||||||
@ -76,7 +75,7 @@ But I would become really motivated if you gave me some feedback :) (<a href="ht
|
|||||||
</ul>
|
</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>!
|
<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 gave 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,
|
I would appreciate if developers gave 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't support.</p><h2 id="license">License</h2><p>Yatta! is licensed under the <a href="./LICENSE.txt">MIT License</a>.</p><a href="mailto:kevin.jahns@rwth-aachen.de">kevin.jahns@rwth-aachen.de</a>
|
please state function name, and sample parameters. However, there are browser-specific features, that Yatta won't support.</p><h2 id="license">License</h2><p>Yatta! is licensed under the <a href="./LICENSE.txt">MIT License</a>.</p><a href="mailto:kevin.jahns@rwth-aachen.de">kevin.jahns@rwth-aachen.de</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -85,7 +84,7 @@ please state function name, and sample parameters. However, there are browser-sp
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -106,7 +106,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -72,7 +72,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div id='footer'>
|
<div id='footer'>
|
||||||
December 23, 14 11:09:09 by
|
January 02, 15 22:41:24 by
|
||||||
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
<a href='https://github.com/coffeedoc/codo' title='CoffeeScript API documentation generator'>
|
||||||
Codo
|
Codo
|
||||||
</a>
|
</a>
|
||||||
|
@ -99,14 +99,6 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<li>
|
|
||||||
<a href='file/lib/Yatta.coffee.html' target='main'>
|
|
||||||
Yatta.coffee
|
|
||||||
</a>
|
|
||||||
<small class='namespace'>
|
|
||||||
lib
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1 +1 @@
|
|||||||
window.searchData = [{"t":"JsonTypeWrapper","p":"class/JsonTypeWrapper.html"},{"t":"JsonType","p":"class/JsonType.html"},{"t":"WordType","p":"class/WordType.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.coffee","p":"file/lib/Yatta.coffee.html"},{"t":"README.md","p":"extra/README.md.html"},{"t":"LICENSE.txt","p":"extra/LICENSE.txt.html"},{"t":"WordType#_encode","p":"class/WordType.html#_encode-dynamic"},{"t":"JsonType#_encode","p":"class/JsonType.html#_encode-dynamic"},{"t":"lib/ConnectorAdapter.coffee~adaptConnector","p":"file/lib/ConnectorAdapter.coffee.html#adaptConnector-"},{"t":"JsonType#applyDelete","p":"class/JsonType.html#applyDelete-dynamic"},{"t":"WordType#applyDelete","p":"class/WordType.html#applyDelete-dynamic"},{"t":"WordType#bind","p":"class/WordType.html#bind-dynamic"},{"t":"JsonType#cleanup","p":"class/JsonType.html#cleanup-dynamic"},{"t":"WordType#cleanup","p":"class/WordType.html#cleanup-dynamic"},{"t":"Yatta#constructor","p":"class/Yatta.html#constructor-dynamic"},{"t":"JsonTypeWrapper#constructor","p":"class/JsonTypeWrapper.html#constructor-dynamic"},{"t":"WordType#constructor","p":"class/WordType.html#constructor-dynamic"},{"t":"lib/Yatta.coffee~createYatta","p":"file/lib/Yatta.coffee.html#createYatta-"},{"t":"WordType#deleteText","p":"class/WordType.html#deleteText-dynamic"},{"t":"Yatta#getConnector","p":"class/Yatta.html#getConnector-dynamic"},{"t":"WordType#insertAfter","p":"class/WordType.html#insertAfter-dynamic"},{"t":"WordType#insertText","p":"class/WordType.html#insertText-dynamic"},{"t":"WordType#push","p":"class/WordType.html#push-dynamic"},{"t":"JsonType#setMutableDefault","p":"class/JsonType.html#setMutableDefault-dynamic"},{"t":"JsonType#toJson","p":"class/JsonType.html#toJson-dynamic"},{"t":"WordType#toString","p":"class/WordType.html#toString-dynamic"},{"t":"WordType#val","p":"class/WordType.html#val-dynamic"},{"t":"JsonType#val","p":"class/JsonType.html#val-dynamic"}]
|
window.searchData = [{"t":"JsonTypeWrapper","p":"class/JsonTypeWrapper.html"},{"t":"JsonType","p":"class/JsonType.html"},{"t":"WordType","p":"class/WordType.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":"README.md","p":"extra/README.md.html"},{"t":"LICENSE.txt","p":"extra/LICENSE.txt.html"},{"t":"WordType#_encode","p":"class/WordType.html#_encode-dynamic"},{"t":"JsonType#_encode","p":"class/JsonType.html#_encode-dynamic"},{"t":"lib/ConnectorAdapter.coffee~adaptConnector","p":"file/lib/ConnectorAdapter.coffee.html#adaptConnector-"},{"t":"WordType#applyDelete","p":"class/WordType.html#applyDelete-dynamic"},{"t":"JsonType#applyDelete","p":"class/JsonType.html#applyDelete-dynamic"},{"t":"WordType#bind","p":"class/WordType.html#bind-dynamic"},{"t":"WordType#cleanup","p":"class/WordType.html#cleanup-dynamic"},{"t":"JsonType#cleanup","p":"class/JsonType.html#cleanup-dynamic"},{"t":"WordType#constructor","p":"class/WordType.html#constructor-dynamic"},{"t":"JsonTypeWrapper#constructor","p":"class/JsonTypeWrapper.html#constructor-dynamic"},{"t":"WordType#deleteText","p":"class/WordType.html#deleteText-dynamic"},{"t":"WordType#insertAfter","p":"class/WordType.html#insertAfter-dynamic"},{"t":"WordType#insertText","p":"class/WordType.html#insertText-dynamic"},{"t":"WordType#push","p":"class/WordType.html#push-dynamic"},{"t":"JsonType#setMutableDefault","p":"class/JsonType.html#setMutableDefault-dynamic"},{"t":"JsonType#toJson","p":"class/JsonType.html#toJson-dynamic"},{"t":"WordType#toString","p":"class/WordType.html#toString-dynamic"},{"t":"JsonType#val","p":"class/JsonType.html#val-dynamic"},{"t":"WordType#val","p":"class/WordType.html#val-dynamic"}]
|
@ -53,14 +53,6 @@
|
|||||||
(lib/ConnectorAdapter.coffee)
|
(lib/ConnectorAdapter.coffee)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href='class/JsonType.html#applyDelete-dynamic' target='main' title='applyDelete'>
|
|
||||||
#applyDelete
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(JsonType)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href='class/WordType.html#applyDelete-dynamic' target='main' title='applyDelete'>
|
<a href='class/WordType.html#applyDelete-dynamic' target='main' title='applyDelete'>
|
||||||
#applyDelete
|
#applyDelete
|
||||||
@ -69,6 +61,14 @@
|
|||||||
(WordType)
|
(WordType)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href='class/JsonType.html#applyDelete-dynamic' target='main' title='applyDelete'>
|
||||||
|
#applyDelete
|
||||||
|
</a>
|
||||||
|
<small>
|
||||||
|
(JsonType)
|
||||||
|
</small>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href='class/WordType.html#bind-dynamic' target='main' title='bind'>
|
<a href='class/WordType.html#bind-dynamic' target='main' title='bind'>
|
||||||
#bind
|
#bind
|
||||||
@ -77,6 +77,14 @@
|
|||||||
(WordType)
|
(WordType)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href='class/WordType.html#cleanup-dynamic' target='main' title='cleanup'>
|
||||||
|
#cleanup
|
||||||
|
</a>
|
||||||
|
<small>
|
||||||
|
(WordType)
|
||||||
|
</small>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href='class/JsonType.html#cleanup-dynamic' target='main' title='cleanup'>
|
<a href='class/JsonType.html#cleanup-dynamic' target='main' title='cleanup'>
|
||||||
#cleanup
|
#cleanup
|
||||||
@ -86,19 +94,11 @@
|
|||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href='class/WordType.html#cleanup-dynamic' target='main' title='cleanup'>
|
<a href='class/WordType.html#constructor-dynamic' target='main' title='constructor'>
|
||||||
#cleanup
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(WordType)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href='class/Yatta.html#constructor-dynamic' target='main' title='constructor'>
|
|
||||||
#constructor
|
#constructor
|
||||||
</a>
|
</a>
|
||||||
<small>
|
<small>
|
||||||
(Yatta)
|
(WordType)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -109,22 +109,6 @@
|
|||||||
(JsonTypeWrapper)
|
(JsonTypeWrapper)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href='class/WordType.html#constructor-dynamic' target='main' title='constructor'>
|
|
||||||
#constructor
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(WordType)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href='file/lib/Yatta.coffee.html#createYatta-' target='main' title='createYatta'>
|
|
||||||
~createYatta
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(lib/Yatta.coffee)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href='class/WordType.html#deleteText-dynamic' target='main' title='deleteText'>
|
<a href='class/WordType.html#deleteText-dynamic' target='main' title='deleteText'>
|
||||||
#deleteText
|
#deleteText
|
||||||
@ -133,14 +117,6 @@
|
|||||||
(WordType)
|
(WordType)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href='class/Yatta.html#getConnector-dynamic' target='main' title='getConnector'>
|
|
||||||
#getConnector
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(Yatta)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href='class/WordType.html#insertAfter-dynamic' target='main' title='insertAfter'>
|
<a href='class/WordType.html#insertAfter-dynamic' target='main' title='insertAfter'>
|
||||||
#insertAfter
|
#insertAfter
|
||||||
@ -189,14 +165,6 @@
|
|||||||
(WordType)
|
(WordType)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href='class/WordType.html#val-dynamic' target='main' title='val'>
|
|
||||||
#val
|
|
||||||
</a>
|
|
||||||
<small>
|
|
||||||
(WordType)
|
|
||||||
</small>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href='class/JsonType.html#val-dynamic' target='main' title='val'>
|
<a href='class/JsonType.html#val-dynamic' target='main' title='val'>
|
||||||
#val
|
#val
|
||||||
@ -205,6 +173,14 @@
|
|||||||
(JsonType)
|
(JsonType)
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href='class/WordType.html#val-dynamic' target='main' title='val'>
|
||||||
|
#val
|
||||||
|
</a>
|
||||||
|
<small>
|
||||||
|
(WordType)
|
||||||
|
</small>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
23
examples/XMPP-Json/index.html
Normal file
23
examples/XMPP-Json/index.html
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset=utf-8 />
|
||||||
|
<title>PeerJs Json Example</title>
|
||||||
|
<script src="../../../Connector/xmpp-connector/strophe.js"></script>
|
||||||
|
<script src="../../../Connector/bower_components/strophejs-plugins/muc/strophe.muc.js"></script>
|
||||||
|
<script src="../../../Connector/xmpp-connector/xmpp-connector.js"></script>
|
||||||
|
<script src="../../build/browser/yatta.js"></script>
|
||||||
|
<script src="./index.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1> PeerJs + Json Tutorial</h1>
|
||||||
|
<p> Collaborative Json editing with <a href="https://github.com/DadaMonad/Yatta/">Yatta</a>
|
||||||
|
and <a href="http://peerjs.com/">PeerJs</a> (WebRTC). </p>
|
||||||
|
|
||||||
|
<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.
|
||||||
|
You can find the code for this example <a href="https://github.com/DadaMonad/Yatta/tree/master/examples/PeerJs-Json">here</a>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
53
examples/XMPP-Json/index.js
Normal file
53
examples/XMPP-Json/index.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
## 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
|
||||||
|
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();
|
||||||
|
|
||||||
|
/**
|
||||||
|
### Yatta
|
||||||
|
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(){
|
||||||
|
var textbox = document.getElementById("textfield");
|
||||||
|
yatta.observe(function(events){
|
||||||
|
for(var i=0; i<events.length; i++){
|
||||||
|
var event = events[i];
|
||||||
|
if(event.name === "textfield" && event.type !== "delete"){
|
||||||
|
yatta.val("textfield").bind(textbox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
yatta.val("textfield","");
|
||||||
|
};
|
@ -20,7 +20,7 @@ cache = require 'gulp-cached'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
gulp.task 'default', ['deploy']
|
gulp.task 'default', ['build_browser']
|
||||||
|
|
||||||
files =
|
files =
|
||||||
lib : ['./lib/**/*.coffee']
|
lib : ['./lib/**/*.coffee']
|
||||||
|
@ -22,6 +22,15 @@ class HistoryBuffer
|
|||||||
@reserved_identifier_counter = 0
|
@reserved_identifier_counter = 0
|
||||||
setTimeout @emptyGarbage, @garbageCollectTimeout
|
setTimeout @emptyGarbage, @garbageCollectTimeout
|
||||||
|
|
||||||
|
resetUserId: (id)->
|
||||||
|
own = @buffer[@user_id]
|
||||||
|
if own?
|
||||||
|
for o in own
|
||||||
|
o.uid.creator = id
|
||||||
|
@operation_counter[id] = @operation_counter[@user_id]
|
||||||
|
delete @operation_counter[@user_id]
|
||||||
|
@user_id = id
|
||||||
|
|
||||||
emptyGarbage: ()=>
|
emptyGarbage: ()=>
|
||||||
for o in @garbage
|
for o in @garbage
|
||||||
#if @getOperationCounter(o.uid.creator) > o.uid.op_number
|
#if @getOperationCounter(o.uid.creator) > o.uid.op_number
|
||||||
|
@ -108,6 +108,7 @@ module.exports = (HB)->
|
|||||||
# @param {Object} uid A unique identifier. If uid is undefined, a new uid will be created.
|
# @param {Object} uid A unique identifier. If uid is undefined, a new uid will be created.
|
||||||
#
|
#
|
||||||
constructor: (uid, beginning, end, prev, next, origin)->
|
constructor: (uid, beginning, end, prev, next, origin)->
|
||||||
|
@textfields = []
|
||||||
super uid, beginning, end, prev, next, origin
|
super uid, beginning, end, prev, next, origin
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -123,6 +124,10 @@ module.exports = (HB)->
|
|||||||
type: "WordType"
|
type: "WordType"
|
||||||
|
|
||||||
applyDelete: ()->
|
applyDelete: ()->
|
||||||
|
for textfield in @textfields
|
||||||
|
textfield.onkeypress = null
|
||||||
|
textfield.onpaste = null
|
||||||
|
textfield.oncut = null
|
||||||
o = @beginning
|
o = @beginning
|
||||||
while o?
|
while o?
|
||||||
o.applyDelete()
|
o.applyDelete()
|
||||||
@ -205,6 +210,7 @@ module.exports = (HB)->
|
|||||||
bind: (textfield)->
|
bind: (textfield)->
|
||||||
word = @
|
word = @
|
||||||
textfield.value = @val()
|
textfield.value = @val()
|
||||||
|
@textfields.push textfield
|
||||||
|
|
||||||
@observe (events)->
|
@observe (events)->
|
||||||
for event in events
|
for event in events
|
||||||
|
@ -5,7 +5,14 @@ Engine = require "./Engine"
|
|||||||
adaptConnector = require "./ConnectorAdapter"
|
adaptConnector = require "./ConnectorAdapter"
|
||||||
|
|
||||||
createYatta = (connector)->
|
createYatta = (connector)->
|
||||||
user_id = connector.id # TODO: change to getUniqueId()
|
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
|
HB = new HistoryBuffer user_id
|
||||||
type_manager = json_types_uninitialized HB
|
type_manager = json_types_uninitialized HB
|
||||||
types = type_manager.types
|
types = type_manager.types
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user