@instructure/quiz-interactions
Version:
A React UI component Library for quiz interaction types.
68 lines (58 loc) • 2.33 kB
JavaScript
import escapeRegExp from 'lodash/escapeRegExp'
import {formatPlain} from '@instructure/quiz-i18n/util/numberFormats'
import {isScientificNotation, parseScientificNotation} from '@instructure/quiz-scientific-notation'
import additionalFunctions from './additional_functions'
const openingQuote = '`'
const closingQuote = '`'
function formatNumber(value, locale, mathquill, opts = {}) {
return isScientificNotation(value)
? formatScientificNotation(value, mathquill)
: formatPlain(value, locale, opts)
}
function formatScientificNotation(value, mathquill) {
if (!mathquill) return value
const [mantissa, exponent] = parseScientificNotation(value)
return `${mantissa}*10^{${exponent}}`
}
export function substituteVars(input, vars, locale) {
return vars.reduce((text, v) => {
const fractionDigits = v.value.toString().split('.')[1]
const numFractionDigits = fractionDigits && fractionDigits.length
return (
text
// Replace mathquill variables first so that we can apply special
// formatting for numbers in scientific notation:
.replace(
new RegExp(
// eslint-disable-next-line no-useless-escape
`(\\\(.*?)${openingQuote}${escapeRegExp(v.name)}${closingQuote}(.*?\\\))`,
'g',
),
`$1${formatNumber(v.value, locale, true, {minimumFractionDigits: numFractionDigits})}$2`,
)
// Then substitute non-mathquill variables:
.replace(
new RegExp(`${openingQuote}${escapeRegExp(v.name)}${closingQuote}`, 'g'),
formatNumber(v.value, locale, false, {
minimumFractionDigits: numFractionDigits,
useGrouping: true,
}),
)
)
}, input)
}
let promiseToGetMathjs
export const mathjsLoadingWrapper = {mathjs: null}
export const loadMathjs = function () {
if (!promiseToGetMathjs) {
promiseToGetMathjs = import(/* webpackChunkName: "mathjs" */ 'mathjs').then(_mathjs => {
// import all our additional factory functions
_mathjs.import(additionalFunctions, {override: true})
_mathjs.config({angles: 'deg'})
mathjsLoadingWrapper.mathjs = _mathjs
return mathjsLoadingWrapper.mathjs
})
}
return promiseToGetMathjs
}
export const mathjsIsLoaded = () => mathjsLoadingWrapper.mathjs !== null