UNPKG

@instructure/quiz-interactions

Version:

A React UI component Library for quiz interaction types.

68 lines (58 loc) 2.33 kB
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