motion
Version:
motion - moving development forward
147 lines (128 loc) • 4.29 kB
JavaScript
;
'use babel';
Object.defineProperty(exports, "__esModule", {
value: true
});
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');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const STYLE_VALUE_REGEX = /['"]?(\S+)['"]?: *(['"]?([^,"]*))$/;
const VIEW_NAME_REGEX = /^\s*(\$[a-zA-Z0-9]*)$/;
const PREFIX_REGEX = /['"]?([a-zA-Z0-9]+)$/;
class Autocomplete {
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);
}
}
completeStyle(text, position) {
const lineText = (0, _helpers.getRowFromText)(text, position.row).slice(0, position.column);
const value = STYLE_VALUE_REGEX.exec(lineText);
if (value !== null) {
return this.completeStyleValue(value[1], value[2], value[3]);
} else {
return this.completeStyleKey(lineText);
}
}
completeStyleKey(lineText) {
const suggestions = _autocompleteStyles2.default.slice();
suggestions.sort(function (a, b) {
return b.strength - a.strength;
});
let 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/' + (0, _humps.decamelize)(suggestion.name, { separator: '-' });
suggestion.type = 'css-key';
});
if (prefix === '') {
return suggestions;
}
suggestions.forEach(function (suggestion) {
suggestion.matchScore = (0, _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;
});
}
completeStyleValue(name, prefix, scoreBase) {
let suggestion = null;
for (const entry of _autocompleteStyles2.default) {
if (entry.name === name) {
suggestion = entry;
break;
}
}
if (suggestion === null) {
return [];
}
if (!Array.isArray(suggestion.options)) {
return [];
}
return suggestion.options.map(function (option) {
const name = String(option);
return {
name: name,
auto: option,
description: '',
type: 'css-value',
replacementPrefix: prefix,
matchScore: (0, _sbString_score2.default)(name, scoreBase)
};
}).sort(function (a, b) {
return b.matchScore - a.matchScore;
});
}
completeViewNames(view, text, position) {
const lineText = (0, _helpers.getRowFromText)(text, position.row).slice(0, position.column);
let prefix = VIEW_NAME_REGEX.exec(lineText);
if (prefix === null) {
// Not a view name scenario
return [];
}
prefix = prefix[1];
let suggestions = [];
for (const key in view.els) {
const name = '$' + key;
suggestions.push({
name: name,
description: '',
type: 'view-name',
replacementPrefix: prefix,
matchScore: (0, _sbString_score2.default)(name, prefix)
});
}
suggestions = suggestions.sort(function (a, b) {
return b.matchScore - a.matchScore;
}).filter(function (suggestion) {
const key = suggestion.name.substr(1);
return !(key in view.styles);
});
if (prefix !== '') {
suggestions = suggestions.filter(function (item) {
return item.matchScore !== 0;
});
}
return suggestions;
}
}
exports.default = Autocomplete;
//# sourceMappingURL=autocomplete.js.map