added lineMarkerAttribute + more comments
parent
9f02972af4
commit
093b7ab4bf
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
Loading…
Reference in New Issue