elliptical-number
Version:
Elliptical phrases for numbers (Integer, Decimal, DigitString, Ordinal)
96 lines (75 loc) • 2.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _elliptical = require('elliptical');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/** @jsx createElement */
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
function isSignedDecimal(input) {
return (/^[\-\+]?(\d+(\.\d*)?|\.\d+)$/.test(input)
);
}
function parseDecimal(string) {
var parts = string.split('.');
var num = 0;
if (parts[0] !== '' && parts[0] !== '-' && parts[0] !== '+') {
num = parseInt(parts[0], 10);
}
if (parts.length > 1 && parts[1].length > 0) {
var frac = parseInt(parts[1], 10) / Math.pow(10, parts[1].length);
num += _lodash2.default.startsWith(parts[0], '-') ? -frac : frac;
}
return num;
}
function getValue(option) {
return _lodash2.default.assign({}, option, { result: parseDecimal(option.result) });
}
function _suppressWhen(input, props) {
if (input === '-' || input === '+' || input === '.' || input === '-.' || input === '+.') return true;
if (!isSignedDecimal(input)) return false;
var numValue = parseDecimal(input);
if (props.min >= 0) {
if (_lodash2.default.startsWith(input, '-')) return false;
if (numValue < 0) return false;
if (numValue > props.max) return false;
if (numValue < props.min) return true;
} else if (props.max <= 0) {
if (!_lodash2.default.startsWith(input, '-')) return false;
if (numValue > 0) return false;
if (numValue < props.min) return false;
if (numValue > props.max) return true;
}
return false;
}
var defaultProps = {
max: MAX_SAFE_INTEGER,
min: -MAX_SAFE_INTEGER,
argument: 'decimal',
limit: 1
};
function filterResult(result, _ref) {
var props = _ref.props;
return result <= props.max && result >= props.min;
}
function describe(_ref2) {
var props = _ref2.props;
return (0, _elliptical.createElement)(
'placeholder',
{
label: props.label,
arguments: props.phraseArguments || (props.phraseArguments ? [props.phraseArgument] : [props.label]),
suppressWhen: function suppressWhen(input) {
return _suppressWhen(input, props);
} },
(0, _elliptical.createElement)(
'map',
{ outbound: getValue },
(0, _elliptical.createElement)('freetext', { filter: isSignedDecimal, limit: props.limit,
splitOn: /[^\d\.]/, score: 1 })
)
);
}
exports.default = { defaultProps: defaultProps, describe: describe, filterResult: filterResult, id: 'elliptical-number:Decimal' };