added lineMarkerAttribute + more comments

pull/599/head
Matthias Bartelmeß 2012-04-05 15:20:48 +02:00
parent 9f02972af4
commit 093b7ab4bf
2 changed files with 38 additions and 5 deletions

View File

@ -2,6 +2,23 @@ var Changeset = require('./Changeset');
var ChangesetUtils = require('./ChangesetUtils'); var ChangesetUtils = require('./ChangesetUtils');
var _ = require('./underscore'); var _ = require('./underscore');
var lineMarkerAttribute = 'lmkr';
// If one of these attributes are set to the first character of a
// line it is considered as a line attribute marker i.e. attributes
// set on this marker are applied to the whole line.
// The list attribute is only maintained for compatibility reasons
var lineAttributes = [lineMarkerAttribute,'list'];
/*
The Attribute manager builds changesets based on a SkipList
for setting and removing range or line-based Attributes.
@param rep the SkipList to be used
@param applyChangesetCallback this callback will be called
once a changeset has been built.
*/
var AttributeManager = function(rep, applyChangesetCallback) var AttributeManager = function(rep, applyChangesetCallback)
{ {
this.rep = rep; this.rep = rep;
@ -10,30 +27,39 @@ var AttributeManager = function(rep, applyChangesetCallback)
// If the first char in a line has one of the following attributes // If the first char in a line has one of the following attributes
// it will be considered as a line marker // it will be considered as a line marker
this.lineAttributes = ['list'];
}; };
AttributeManager.prototype = _(AttributeManager.prototype).extend({ AttributeManager.prototype = _(AttributeManager.prototype).extend({
applyChangeset: function(changeset){ applyChangeset: function(changeset){
if(!this.applyChangesetCallback) return changeset;
var cs = changeset.toString(); var cs = changeset.toString();
if (!Changeset.isIdentity(cs)) if (!Changeset.isIdentity(cs))
{ {
this.applyChangesetCallback(cs); this.applyChangesetCallback(cs);
} }
return changeset;
}, },
/*
Returns if the line already has a line marker
@param lineNum: the number of the line
*/
lineHasMarker: function(lineNum){ lineHasMarker: function(lineNum){
// get "list" attribute of first char of line
var that = this; var that = this;
return _.find(this.lineAttributes, function(attribute){ return _.find(lineAttributes, function(attribute){
return that.getAttributeOnLine(lineNum, attribute) != ''; return that.getAttributeOnLine(lineNum, attribute) != '';
}) !== undefined; }) !== undefined;
}, },
/*
Gets a specified attribute on a line
@param lineNum: the number of the line to set the attribute for
@param attributeKey: the name of the attribute to get, e.g. list
*/
getAttributeOnLine: function(lineNum, attributeName){ getAttributeOnLine: function(lineNum, attributeName){
// get `attributeName` attribute of first char of line // get `attributeName` attribute of first char of line
var aline = this.rep.alines[lineNum]; var aline = this.rep.alines[lineNum];
@ -71,6 +97,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
builder.insert('*', [ builder.insert('*', [
['author', this.author], ['author', this.author],
['insertorder', 'first'], ['insertorder', 'first'],
[lineMarkerAttribute, '1'],
[attributeName, attributeValue] [attributeName, attributeValue]
], this.rep.apool); ], this.rep.apool);
} }

View File

@ -22,6 +22,12 @@
* limitations under the License. * limitations under the License.
*/ */
/*
An AttributePool maintains a mapping from [key,value] Pairs called
Attributes to Numbers (unsigened integers) and vice versa. These numbers are
used to reference Attributes in Changesets.
*/
var AttributePool = function () { var AttributePool = function () {
this.numToAttrib = {}; // e.g. {0: ['foo','bar']} this.numToAttrib = {}; // e.g. {0: ['foo','bar']}
this.attribToNum = {}; // e.g. {'foo,bar': 0} this.attribToNum = {}; // e.g. {'foo,bar': 0}