motion
Version:
motion - moving development forward
167 lines (141 loc) • 5.13 kB
JavaScript
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _sbString_score = require('sb-string_score');
var _sbString_score2 = _interopRequireDefault(_sbString_score);
var _humps = require('humps');
var _autocompleteStyles = require('./autocomplete-styles');
var _autocompleteStyles2 = _interopRequireDefault(_autocompleteStyles);
var _helpers = require('./helpers');
'use babel';
var STYLE_VALUE_REGEX = /['"]?(\S+)['"]?: *(['"]?([^,"]*))$/;
var VIEW_NAME_REGEX = /^\s*(\$[a-zA-Z0-9]*)$/;
var PREFIX_REGEX = /['"]?([a-zA-Z0-9]+)$/;
var Autocomplete = (function () {
function Autocomplete() {
_classCallCheck(this, Autocomplete);
}
Autocomplete.prototype.complete = function complete(text, position, positionInfo) {
if (positionInfo.active === null) {
return [];
}
if (positionInfo.position === _helpers.POSITION_TYPE.STYLE) {
return this.completeStyle(text, position);
}
if (positionInfo.position === _helpers.POSITION_TYPE.VIEW_JSX) {
// TODO: Autocomplete jsx tags maybe?
return [];
}
if (positionInfo.position === _helpers.POSITION_TYPE.VIEW_TOP) {
return this.completeViewNames(positionInfo.active, text, position);
}
};
Autocomplete.prototype.completeStyle = function completeStyle(text, position) {
var lineText = _helpers.getRowFromText(text, position.row).slice(0, position.column);
var value = STYLE_VALUE_REGEX.exec(lineText);
if (value !== null) {
return this.completeStyleValue(value[1], value[2], value[3]);
} else {
return this.completeStyleKey(lineText);
}
};
Autocomplete.prototype.completeStyleKey = function completeStyleKey(lineText) {
var suggestions = _autocompleteStyles2['default'].slice();
suggestions.sort(function (a, b) {
return b.strength - a.strength;
});
var prefix = PREFIX_REGEX.exec(lineText);
prefix = prefix ? prefix[1] : '';
suggestions.forEach(function (suggestion) {
suggestion.replacementPrefix = prefix;
suggestion.descriptionMoreURL = 'https://developer.mozilla.org/en/docs/Web/CSS/' + _humps.decamelize(suggestion.name, { separator: '-' });
suggestion.type = 'css-key';
});
if (prefix === '') {
return suggestions;
}
suggestions.forEach(function (suggestion) {
suggestion.matchScore = _sbString_score2['default'](suggestion.name, prefix);
});
suggestions.sort(function (a, b) {
return b.matchScore - a.matchScore;
});
return suggestions.filter(function (item) {
return item.matchScore !== 0;
});
};
Autocomplete.prototype.completeStyleValue = function completeStyleValue(name, prefix, scoreBase) {
var suggestion = null;
for (var _iterator = _autocompleteStyles2['default'], _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var entry = _ref;
if (entry.name === name) {
suggestion = entry;
break;
}
}
if (suggestion === null) {
return [];
}
if (!Array.isArray(suggestion.options)) {
return [];
}
return suggestion.options.map(function (option) {
var name = String(option);
return {
name: name,
auto: option,
description: '',
type: 'css-value',
replacementPrefix: prefix,
matchScore: _sbString_score2['default'](name, scoreBase)
};
}).sort(function (a, b) {
return b.matchScore - a.matchScore;
});
};
Autocomplete.prototype.completeViewNames = function completeViewNames(view, text, position) {
var lineText = _helpers.getRowFromText(text, position.row).slice(0, position.column);
var prefix = VIEW_NAME_REGEX.exec(lineText);
if (prefix === null) {
// Not a view name scenario
return [];
}
prefix = prefix[1];
var suggestions = [];
for (var key in view.els) {
var _name = '$' + key;
suggestions.push({
name: _name,
description: '',
type: 'view-name',
replacementPrefix: prefix,
matchScore: _sbString_score2['default'](_name, prefix)
});
}
suggestions = suggestions.sort(function (a, b) {
return b.matchScore - a.matchScore;
}).filter(function (suggestion) {
var key = suggestion.name.substr(1);
return !(key in view.styles);
});
if (prefix !== '') {
suggestions = suggestions.filter(function (item) {
return item.matchScore !== 0;
});
}
return suggestions;
};
return Autocomplete;
})();
exports['default'] = Autocomplete;
module.exports = exports['default'];
//# sourceMappingURL=autocomplete.js.map