UNPKG

motion

Version:

motion - moving development forward

147 lines (128 loc) 4.29 kB
'use strict'; '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