101 lines
3.4 KiB
JavaScript
101 lines
3.4 KiB
JavaScript
define(['backbone', 'underscore'], function(Backbone, _) {
|
|
var LicenseModel = Backbone.Model.extend({
|
|
defaults: {
|
|
type: null,
|
|
options: {},
|
|
custom: false // either `false`, or a string
|
|
},
|
|
|
|
initialize: function(attributes) {
|
|
if (attributes && attributes.asString) {
|
|
this.setFromString(attributes.asString);
|
|
this.unset('asString');
|
|
}
|
|
},
|
|
|
|
toString: function() {
|
|
var custom = this.get('custom');
|
|
if (custom) {
|
|
return custom;
|
|
}
|
|
|
|
var type = this.get('type'),
|
|
options = this.get('options');
|
|
|
|
if (_.isEmpty(options)) {
|
|
return type || '';
|
|
}
|
|
|
|
// options are where it gets tricky
|
|
var optionStrings = _.map(options, function(value, key) {
|
|
if (_.isBoolean(value)) {
|
|
return value ? key : null;
|
|
} else {
|
|
return key + '=' + value;
|
|
}
|
|
});
|
|
// filter out nulls
|
|
optionStrings = _.filter(optionStrings, _.identity);
|
|
// build license string and return
|
|
return type + ': ' + optionStrings.join(' ');
|
|
},
|
|
|
|
setFromString: function(string, options) {
|
|
if (!string) {
|
|
// reset to defaults
|
|
return this.set(this.defaults, options);
|
|
}
|
|
|
|
var colonIndex = string.indexOf(':'),
|
|
spaceIndex = string.indexOf(' ');
|
|
|
|
// a string without a colon could be a custom license, or a license
|
|
// type without options
|
|
if (colonIndex == -1) {
|
|
if (spaceIndex == -1) {
|
|
// if there's no space, it's a license type without options
|
|
return this.set({
|
|
type: string,
|
|
options: {},
|
|
custom: false
|
|
}, options);
|
|
} else {
|
|
// if there is a space, it's a custom license
|
|
return this.set({
|
|
type: null,
|
|
options: {},
|
|
custom: string
|
|
}, options);
|
|
}
|
|
}
|
|
|
|
// there is a colon, which indicates a license type with options.
|
|
var type = string.substring(0, colonIndex),
|
|
optionsObj = {},
|
|
optionsString = string.substring(colonIndex + 1);
|
|
|
|
_.each(optionsString.split(' '), function(optionString) {
|
|
if (_.isEmpty(optionString)) {
|
|
return;
|
|
}
|
|
var eqIndex = optionString.indexOf('=');
|
|
if (eqIndex == -1) {
|
|
// this is a boolean flag
|
|
optionsObj[optionString] = true;
|
|
} else {
|
|
// this is a key-value pair
|
|
var optionKey = optionString.substring(0, eqIndex);
|
|
var optionVal = optionString.substring(eqIndex + 1);
|
|
optionsObj[optionKey] = optionVal;
|
|
}
|
|
});
|
|
|
|
return this.set({
|
|
type: type, options: optionsObj, custom: false
|
|
}, options);
|
|
}
|
|
});
|
|
|
|
return LicenseModel;
|
|
});
|