@oat-sa/tao-core-ui 1.64.1 → 1.64.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +339 -339
- package/README.md +22 -22
- package/dist/actionbar.js +92 -92
- package/dist/adder.js +109 -109
- package/dist/animable/absorbable/absorbable.js +29 -29
- package/dist/animable/absorbable/css/absorb.css +7 -7
- package/dist/animable/absorbable/css/absorb.css.map +1 -1
- package/dist/animable/pulsable/css/pulse.css +7 -7
- package/dist/animable/pulsable/css/pulse.css.map +1 -1
- package/dist/animable/pulsable/pulsable.js +23 -23
- package/dist/areaBroker.js +51 -51
- package/dist/autocomplete/css/autocomplete.css +7 -7
- package/dist/autocomplete/css/autocomplete.css.map +1 -1
- package/dist/autocomplete.js +384 -384
- package/dist/autoscroll.js +22 -22
- package/dist/badge/badge.js +35 -35
- package/dist/badge/css/badge.css +7 -7
- package/dist/badge/css/badge.css.map +1 -1
- package/dist/breadcrumbs/css/breadcrumbs.css +7 -7
- package/dist/breadcrumbs/css/breadcrumbs.css.map +1 -1
- package/dist/breadcrumbs.js +57 -57
- package/dist/btngrouper.js +64 -64
- package/dist/bulkActionPopup/css/bulkActionPopup.css +7 -7
- package/dist/bulkActionPopup/css/bulkActionPopup.css.map +1 -1
- package/dist/bulkActionPopup.js +91 -91
- package/dist/button.js +89 -89
- package/dist/calculator/css/calculator.css +10 -10
- package/dist/calculator/css/calculator.css.map +1 -1
- package/dist/calculator.js +51 -51
- package/dist/cascadingComboBox.js +34 -34
- package/dist/ckeditor/ckConfigurator.js +49 -49
- package/dist/ckeditor/dtdHandler.js +110 -110
- package/dist/class/css/selector.css +7 -7
- package/dist/class/css/selector.css.map +1 -1
- package/dist/class/selector.js +98 -98
- package/dist/component/alignable.js +81 -81
- package/dist/component/containable.js +37 -37
- package/dist/component/css/components.css +7 -7
- package/dist/component/css/components.css.map +1 -1
- package/dist/component/css/windowComponent.css +7 -7
- package/dist/component/css/windowComponent.css.map +1 -1
- package/dist/component/draggable.js +25 -25
- package/dist/component/placeable.js +70 -70
- package/dist/component/resizable.js +61 -61
- package/dist/component/stackable.js +20 -20
- package/dist/component/windowed.js +46 -46
- package/dist/component.js +140 -140
- package/dist/container.js +76 -76
- package/dist/contextualPopup/css/contextualPopup.css +7 -7
- package/dist/contextualPopup/css/contextualPopup.css.map +1 -1
- package/dist/contextualPopup.js +100 -100
- package/dist/dashboard/css/dashboard.css +7 -7
- package/dist/dashboard/css/dashboard.css.map +1 -1
- package/dist/dashboard.js +62 -62
- package/dist/datalist/css/datalist.css +7 -7
- package/dist/datalist/css/datalist.css.map +1 -1
- package/dist/datalist.js +147 -147
- package/dist/datatable/css/datatable.css +7 -7
- package/dist/datatable/css/datatable.css.map +1 -1
- package/dist/datatable/filterStrategy/filterStrategy.js +27 -27
- package/dist/datatable/filterStrategy/multiple.js +25 -25
- package/dist/datatable/filterStrategy/single.js +25 -25
- package/dist/datatable.js +377 -377
- package/dist/dateRange/css/dateRange.css +7 -7
- package/dist/dateRange/css/dateRange.css.map +1 -1
- package/dist/dateRange/dateRange.js +97 -97
- package/dist/datetime/css/picker.css +7 -7
- package/dist/datetime/css/picker.css.map +1 -1
- package/dist/datetime/picker.js +161 -161
- package/dist/deleter.js +79 -79
- package/dist/destination/css/selector.css +7 -7
- package/dist/destination/css/selector.css.map +1 -1
- package/dist/destination/selector.js +52 -52
- package/dist/dialog/alert.js +26 -26
- package/dist/dialog/confirm.js +27 -27
- package/dist/dialog/confirmDelete.js +31 -31
- package/dist/dialog.js +141 -141
- package/dist/disabler.js +90 -90
- package/dist/documentViewer/css/documentViewer.css +7 -7
- package/dist/documentViewer/css/documentViewer.css.map +1 -1
- package/dist/documentViewer/providers/pdfViewer/fallback/viewer.js +30 -30
- package/dist/documentViewer/providers/pdfViewer/pdfjs/areaBroker.js +25 -25
- package/dist/documentViewer/providers/pdfViewer/pdfjs/findBar.js +120 -120
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pageView.js +89 -89
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pagesManager.js +52 -52
- package/dist/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +112 -112
- package/dist/documentViewer/providers/pdfViewer/pdfjs/textManager.js +67 -67
- package/dist/documentViewer/providers/pdfViewer/pdfjs/viewer.js +81 -81
- package/dist/documentViewer/providers/pdfViewer/pdfjs/wrapper.js +111 -111
- package/dist/documentViewer/providers/pdfViewer.js +29 -29
- package/dist/documentViewer/viewerFactory.js +71 -71
- package/dist/documentViewer.js +86 -86
- package/dist/dropdown/css/dropdown.css +7 -7
- package/dist/dropdown/css/dropdown.css.map +1 -1
- package/dist/dropdown.js +84 -84
- package/dist/durationer.js +58 -58
- package/dist/dynamicComponent/css/dynamicComponent.css +7 -7
- package/dist/dynamicComponent/css/dynamicComponent.css.map +1 -1
- package/dist/dynamicComponent.js +103 -103
- package/dist/feedback.js +84 -84
- package/dist/figure/FigureStateActive.js +111 -111
- package/dist/filesender.js +26 -26
- package/dist/filter.js +34 -34
- package/dist/form/css/dropdownForm.css +7 -7
- package/dist/form/css/dropdownForm.css.map +1 -1
- package/dist/form/css/form.css +7 -7
- package/dist/form/css/form.css.map +1 -1
- package/dist/form/dropdownForm.js +99 -99
- package/dist/form/form.js +248 -248
- package/dist/form/simpleForm.js +71 -71
- package/dist/form/validator/css/validator.css +7 -7
- package/dist/form/validator/css/validator.css.map +1 -1
- package/dist/form/validator/renderer.js +52 -52
- package/dist/form/validator/validator.js +103 -103
- package/dist/form/widget/css/widget.css +7 -7
- package/dist/form/widget/css/widget.css.map +1 -1
- package/dist/form/widget/definitions.js +24 -24
- package/dist/form/widget/loader.js +16 -16
- package/dist/form/widget/providers/checkBox.js +62 -62
- package/dist/form/widget/providers/comboBox.js +46 -46
- package/dist/form/widget/providers/default.js +35 -35
- package/dist/form/widget/providers/hidden.js +37 -37
- package/dist/form/widget/providers/hiddenBox.js +58 -58
- package/dist/form/widget/providers/radioBox.js +57 -57
- package/dist/form/widget/providers/textArea.js +35 -35
- package/dist/form/widget/providers/textBox.js +34 -34
- package/dist/form/widget/widget.js +141 -141
- package/dist/form.js +10 -10
- package/dist/formValidator/formValidator.js +61 -61
- package/dist/formValidator/highlighters/highlighter.js +41 -41
- package/dist/formValidator/highlighters/message.js +29 -29
- package/dist/formValidator/highlighters/tooltip.js +32 -32
- package/dist/generis/form/css/form.css +7 -7
- package/dist/generis/form/css/form.css.map +1 -1
- package/dist/generis/form/form.js +73 -73
- package/dist/generis/validator/css/validator.css +7 -7
- package/dist/generis/validator/css/validator.css.map +1 -1
- package/dist/generis/validator/validator.js +38 -38
- package/dist/generis/widget/checkBox/checkBox.js +39 -39
- package/dist/generis/widget/comboBox/comboBox.js +32 -32
- package/dist/generis/widget/css/widget.css +7 -7
- package/dist/generis/widget/css/widget.css.map +1 -1
- package/dist/generis/widget/hiddenBox/hiddenBox.js +40 -40
- package/dist/generis/widget/loader.js +20 -20
- package/dist/generis/widget/textBox/textBox.js +27 -27
- package/dist/generis/widget/widget.js +47 -47
- package/dist/groupedComboBox.js +36 -36
- package/dist/groupvalidator.js +19 -19
- package/dist/hider.js +41 -41
- package/dist/highlighter.js +278 -278
- package/dist/image/ImgStateActive/extractLabel.js +20 -20
- package/dist/image/ImgStateActive/helper.js +16 -16
- package/dist/image/ImgStateActive/initHelper.js +85 -85
- package/dist/image/ImgStateActive/initMediaEditor.js +48 -48
- package/dist/image/ImgStateActive/mediaSizer.js +32 -32
- package/dist/image/ImgStateActive.js +104 -104
- package/dist/incrementer.js +58 -58
- package/dist/inplacer.js +87 -87
- package/dist/interactUtils.js +42 -42
- package/dist/itemButtonList/css/item-button-list.css +23 -23
- package/dist/itemButtonList/css/item-button-list.css.map +1 -1
- package/dist/itemButtonList.js +102 -102
- package/dist/keyNavigation/navigableDomElement.js +76 -76
- package/dist/keyNavigation/navigator.js +158 -158
- package/dist/listbox/css/listbox.css +7 -7
- package/dist/listbox/css/listbox.css.map +1 -1
- package/dist/listbox.js +84 -84
- package/dist/liststyler.js +57 -57
- package/dist/loadingButton/css/button.css +7 -7
- package/dist/loadingButton/css/button.css.map +1 -1
- package/dist/loadingButton/loadingButton.js +35 -35
- package/dist/lock.js +112 -112
- package/dist/login/login.js +87 -87
- package/dist/maths/calculator/basicCalculator.js +50 -50
- package/dist/maths/calculator/calculatorComponent.js +29 -29
- package/dist/maths/calculator/core/areaBroker.js +25 -25
- package/dist/maths/calculator/core/board.js +300 -300
- package/dist/maths/calculator/core/expression.js +98 -98
- package/dist/maths/calculator/core/labels.js +16 -16
- package/dist/maths/calculator/core/plugin.js +19 -19
- package/dist/maths/calculator/core/terms.js +26 -26
- package/dist/maths/calculator/core/tokenizer.js +98 -98
- package/dist/maths/calculator/core/tokens.js +75 -75
- package/dist/maths/calculator/css/calculator.css +7 -7
- package/dist/maths/calculator/css/calculator.css.map +1 -1
- package/dist/maths/calculator/defaultCalculator.js +23 -23
- package/dist/maths/calculator/plugins/core/degrad.js +22 -22
- package/dist/maths/calculator/plugins/core/history.js +45 -45
- package/dist/maths/calculator/plugins/core/remind.js +22 -22
- package/dist/maths/calculator/plugins/core/stepNavigation.js +31 -31
- package/dist/maths/calculator/plugins/keyboard/templateKeyboard/templateKeyboard.js +48 -48
- package/dist/maths/calculator/plugins/modifiers/pow10.js +35 -35
- package/dist/maths/calculator/plugins/modifiers/sign.js +90 -90
- package/dist/maths/calculator/plugins/screen/simpleScreen/simpleScreen.js +47 -47
- package/dist/maths/calculator/pluginsLoader.js +21 -21
- package/dist/maths/calculator/scientificCalculator.js +78 -78
- package/dist/mediaEditor/mediaEditorComponent.js +51 -51
- package/dist/mediaEditor/plugins/mediaAlignment/helper.js +16 -16
- package/dist/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +47 -47
- package/dist/mediaEditor/plugins/mediaAlignment/style.css +7 -7
- package/dist/mediaEditor/plugins/mediaDimension/helper.js +70 -70
- package/dist/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +140 -140
- package/dist/mediaEditor/plugins/mediaDimension/style.css +141 -141
- package/dist/mediaplayer/css/player.css +7 -7
- package/dist/mediaplayer/css/player.css.map +1 -1
- package/dist/mediaplayer/players/html5.js +52 -52
- package/dist/mediaplayer/players/youtube.js +39 -39
- package/dist/mediaplayer/players.js +18 -18
- package/dist/mediaplayer/support.js +55 -55
- package/dist/mediaplayer/utils/reminder.js +100 -100
- package/dist/mediaplayer/utils/timeObserver.js +92 -92
- package/dist/mediaplayer/youtubeManager.js +51 -51
- package/dist/mediaplayer.js +447 -447
- package/dist/mediasizer.js +122 -122
- package/dist/modal.js +87 -87
- package/dist/movableComponent.js +35 -35
- package/dist/pageSizeSelector.js +31 -31
- package/dist/pageStatus.js +33 -33
- package/dist/pagination/css/pagination.css +7 -7
- package/dist/pagination/css/pagination.css.map +1 -1
- package/dist/pagination/paginationStrategy.js +23 -23
- package/dist/pagination/providers/pages.js +24 -24
- package/dist/pagination/providers/simple.js +22 -22
- package/dist/pagination.js +45 -45
- package/dist/previewer.js +67 -67
- package/dist/progressbar.js +58 -58
- package/dist/propertySelector/css/propertySelector.css +7 -7
- package/dist/propertySelector/css/propertySelector.css.map +1 -1
- package/dist/propertySelector/propertySelector.js +86 -86
- package/dist/report.js +73 -73
- package/dist/resource/css/selector.css +7 -7
- package/dist/resource/css/selector.css.map +1 -1
- package/dist/resource/filters.js +60 -60
- package/dist/resource/list.js +53 -53
- package/dist/resource/selectable.js +92 -92
- package/dist/resource/selector.js +182 -182
- package/dist/resource/tree.js +91 -91
- package/dist/resourcemgr/css/resourcemgr.css +7 -7
- package/dist/resourcemgr/css/resourcemgr.css.map +1 -1
- package/dist/resourcemgr/fileBrowser.js +75 -75
- package/dist/resourcemgr/fileSelector.js +45 -45
- package/dist/resourcemgr/util/updatePermissions.js +4 -4
- package/dist/resourcemgr.js +49 -49
- package/dist/scroller.js +26 -26
- package/dist/searchModal/advancedSearch.js +155 -155
- package/dist/searchModal/css/advancedSearch.css +7 -7
- package/dist/searchModal/css/advancedSearch.css.map +1 -1
- package/dist/searchModal/css/searchModal.css +7 -7
- package/dist/searchModal/css/searchModal.css.map +1 -1
- package/dist/searchModal.js +134 -134
- package/dist/selecter.js +6 -6
- package/dist/stacker.js +43 -43
- package/dist/switch/css/switch.css +7 -7
- package/dist/switch/css/switch.css.map +1 -1
- package/dist/switch/switch.js +62 -62
- package/dist/tableModel.js +33 -33
- package/dist/tabs/css/tabs.css +12 -12
- package/dist/tabs/css/tabs.css.map +1 -1
- package/dist/tabs.js +220 -220
- package/dist/taskQueue/css/taskQueue.css +7 -7
- package/dist/taskQueue/css/taskQueue.css.map +1 -1
- package/dist/taskQueue/status.js +59 -59
- package/dist/taskQueue/table.js +54 -54
- package/dist/taskQueue/taskQueue.js +18 -18
- package/dist/taskQueue/taskQueueModel.js +102 -102
- package/dist/taskQueue.js +47 -47
- package/dist/taskQueueButton/css/taskable.css +7 -7
- package/dist/taskQueueButton/css/taskable.css.map +1 -1
- package/dist/taskQueueButton/css/treeButton.css +7 -7
- package/dist/taskQueueButton/css/treeButton.css.map +1 -1
- package/dist/taskQueueButton/standardButton.js +39 -39
- package/dist/taskQueueButton/taskable.js +41 -41
- package/dist/taskQueueButton/treeButton.js +43 -43
- package/dist/themeLoader.js +75 -75
- package/dist/themes.js +84 -84
- package/dist/toggler.js +57 -57
- package/dist/tooltip.js +41 -41
- package/dist/tooltipster.js +17 -17
- package/dist/transformer.js +117 -117
- package/dist/tristateCheckboxGroup/css/tristateCheckboxGroup.css +7 -7
- package/dist/tristateCheckboxGroup/css/tristateCheckboxGroup.css.map +1 -1
- package/dist/tristateCheckboxGroup.js +62 -62
- package/dist/uploader.js +145 -145
- package/dist/validator/validators.js +48 -48
- package/dist/validator.js +23 -23
- package/dist/waitForMedia.js +33 -33
- package/dist/waitingDialog/css/waitingDialog.css +7 -7
- package/dist/waitingDialog/css/waitingDialog.css.map +1 -1
- package/dist/waitingDialog/waitingDialog.js +54 -54
- package/package.json +110 -110
- package/scss/basic.scss +16 -16
- package/scss/ckeditor/skins/tao/scss/inc/_ck-icons.scss +60 -60
- package/scss/ckeditor/skins/tao/scss/inc/_tao.scss +59 -59
- package/scss/font/tao/tao.svg +235 -235
- package/scss/inc/_base.scss +495 -495
- package/scss/inc/_bootstrap.scss +6 -6
- package/scss/inc/_buttons.scss +114 -114
- package/scss/inc/_colors.scss +93 -93
- package/scss/inc/_feedback.scss +154 -154
- package/scss/inc/_flex-grid.scss +15 -15
- package/scss/inc/_fonts.scss +4 -4
- package/scss/inc/_forms.scss +832 -832
- package/scss/inc/_functions.scss +283 -283
- package/scss/inc/_jquery.nouislider.scss +254 -254
- package/scss/inc/_normalize.scss +528 -528
- package/scss/inc/_report.scss +67 -67
- package/scss/inc/_secondary-properties.scss +89 -89
- package/scss/inc/_select2.scss +634 -634
- package/scss/inc/_toolbars.scss +155 -155
- package/scss/inc/_tooltip.scss +312 -312
- package/scss/inc/_variables.scss +21 -21
- package/scss/inc/base/_highlight.scss +5 -5
- package/scss/inc/base/_list-style.scss +58 -58
- package/scss/inc/base/_svg.scss +3 -3
- package/scss/inc/base/_table.scss +62 -62
- package/scss/inc/fonts/_source-sans-pro.scss +29 -29
- package/scss/inc/fonts/_tao-icon-classes.scss +227 -227
- package/scss/inc/fonts/_tao-icon-def.scss +12 -12
- package/scss/inc/fonts/_tao-icon-vars.scss +241 -241
- package/src/actionbar/tpl/main.tpl +8 -8
- package/src/actionbar.js +251 -251
- package/src/adder.js +250 -250
- package/src/animable/absorbable/absorbable.js +134 -134
- package/src/animable/absorbable/css/absorb.css +7 -7
- package/src/animable/absorbable/css/absorb.css.map +1 -1
- package/src/animable/absorbable/scss/absorb.scss +37 -37
- package/src/animable/pulsable/css/pulse.css +7 -7
- package/src/animable/pulsable/css/pulse.css.map +1 -1
- package/src/animable/pulsable/pulsable.js +90 -90
- package/src/animable/pulsable/scss/pulse.scss +22 -22
- package/src/areaBroker.js +160 -160
- package/src/autocomplete/css/autocomplete.css +7 -7
- package/src/autocomplete/css/autocomplete.css.map +1 -1
- package/src/autocomplete/scss/autocomplete.scss +37 -37
- package/src/autocomplete.js +1027 -1027
- package/src/autoscroll.js +57 -57
- package/src/badge/badge.js +119 -119
- package/src/badge/css/badge.css +7 -7
- package/src/badge/css/badge.css.map +1 -1
- package/src/badge/scss/badge.scss +92 -92
- package/src/badge/tpl/badge.tpl +4 -4
- package/src/breadcrumbs/css/breadcrumbs.css +7 -7
- package/src/breadcrumbs/css/breadcrumbs.css.map +1 -1
- package/src/breadcrumbs/scss/breadcrumbs.scss +52 -52
- package/src/breadcrumbs/tpl/breadcrumbs.tpl +20 -20
- package/src/breadcrumbs.js +99 -99
- package/src/btngrouper.js +213 -213
- package/src/bulkActionPopup/css/bulkActionPopup.css +7 -7
- package/src/bulkActionPopup/css/bulkActionPopup.css.map +1 -1
- package/src/bulkActionPopup/scss/bulkActionPopup.scss +63 -63
- package/src/bulkActionPopup/tpl/layout.tpl +76 -76
- package/src/bulkActionPopup/tpl/select.tpl +8 -8
- package/src/bulkActionPopup.js +274 -274
- package/src/button/tpl/button.tpl +4 -4
- package/src/button.js +135 -135
- package/src/calculator/css/calculator.css +10 -10
- package/src/calculator/css/calculator.css.map +1 -1
- package/src/calculator/scss/calculator.scss +139 -139
- package/src/calculator.js +188 -188
- package/src/cascadingComboBox.js +126 -126
- package/src/ckeditor/ckConfigurator.js +742 -742
- package/src/ckeditor/dtdHandler.js +1030 -1030
- package/src/class/css/selector.css +7 -7
- package/src/class/css/selector.css.map +1 -1
- package/src/class/scss/selector.scss +101 -101
- package/src/class/selector.js +329 -329
- package/src/class/tpl/listItem.tpl +9 -9
- package/src/class/tpl/selector.tpl +10 -10
- package/src/component/alignable.js +274 -274
- package/src/component/containable.js +122 -122
- package/src/component/css/components.css +7 -7
- package/src/component/css/components.css.map +1 -1
- package/src/component/css/windowComponent.css +7 -7
- package/src/component/css/windowComponent.css.map +1 -1
- package/src/component/draggable.js +104 -104
- package/src/component/placeable.js +233 -233
- package/src/component/resizable.js +195 -195
- package/src/component/scss/components.scss +507 -507
- package/src/component/scss/windowComponent.scss +62 -62
- package/src/component/stackable.js +67 -67
- package/src/component/tpl/window.tpl +7 -7
- package/src/component/windowed.js +206 -206
- package/src/component.js +401 -401
- package/src/container.js +200 -200
- package/src/contextualPopup/css/contextualPopup.css +7 -7
- package/src/contextualPopup/css/contextualPopup.css.map +1 -1
- package/src/contextualPopup/scss/contextualPopup.scss +78 -78
- package/src/contextualPopup/tpl/popup.tpl +10 -10
- package/src/contextualPopup.js +294 -294
- package/src/css/basic.css +104 -104
- package/src/css/basic.css.map +1 -1
- package/src/dashboard/css/dashboard.css +7 -7
- package/src/dashboard/css/dashboard.css.map +1 -1
- package/src/dashboard/scss/dashboard.scss +93 -93
- package/src/dashboard/tpl/dashboard.tpl +16 -16
- package/src/dashboard/tpl/dashboardMetricsList.tpl +15 -15
- package/src/dashboard.js +179 -179
- package/src/datalist/css/datalist.css +7 -7
- package/src/datalist/css/datalist.css.map +1 -1
- package/src/datalist/scss/datalist.scss +116 -116
- package/src/datalist/tpl/list.tpl +24 -24
- package/src/datalist/tpl/main.tpl +44 -44
- package/src/datalist.js +500 -500
- package/src/datatable/css/datatable.css +7 -7
- package/src/datatable/css/datatable.css.map +1 -1
- package/src/datatable/filterStrategy/filterStrategy.js +70 -70
- package/src/datatable/filterStrategy/multiple.js +126 -126
- package/src/datatable/filterStrategy/single.js +108 -108
- package/src/datatable/scss/datatable.scss +149 -149
- package/src/datatable/tpl/button.tpl +6 -6
- package/src/datatable/tpl/layout.tpl +158 -158
- package/src/datatable.js +1056 -1056
- package/src/dateRange/css/dateRange.css +7 -7
- package/src/dateRange/css/dateRange.css.map +1 -1
- package/src/dateRange/dateRange.js +341 -341
- package/src/dateRange/scss/dateRange.scss +7 -7
- package/src/dateRange/tpl/select.tpl +18 -18
- package/src/datetime/css/picker.css +7 -7
- package/src/datetime/css/picker.css.map +1 -1
- package/src/datetime/picker.js +576 -576
- package/src/datetime/scss/picker.scss +192 -192
- package/src/datetime/tpl/picker.tpl +18 -18
- package/src/deleter/undo.tpl +6 -6
- package/src/deleter.js +296 -296
- package/src/destination/css/selector.css +7 -7
- package/src/destination/css/selector.css.map +1 -1
- package/src/destination/scss/selector.scss +36 -36
- package/src/destination/selector.js +195 -195
- package/src/destination/tpl/selector.tpl +13 -13
- package/src/dialog/alert.js +70 -70
- package/src/dialog/confirm.js +85 -85
- package/src/dialog/confirmDelete.js +95 -95
- package/src/dialog/tpl/body.tpl +24 -24
- package/src/dialog/tpl/buttons.tpl +6 -6
- package/src/dialog/tpl/checkbox.tpl +5 -5
- package/src/dialog.js +517 -517
- package/src/disabler.js +230 -230
- package/src/documentViewer/css/documentViewer.css +7 -7
- package/src/documentViewer/css/documentViewer.css.map +1 -1
- package/src/documentViewer/providers/pdfViewer/fallback/viewer.js +69 -69
- package/src/documentViewer/providers/pdfViewer/pdfjs/areaBroker.js +41 -41
- package/src/documentViewer/providers/pdfViewer/pdfjs/findBar.js +475 -475
- package/src/documentViewer/providers/pdfViewer/pdfjs/findBar.tpl +20 -20
- package/src/documentViewer/providers/pdfViewer/pdfjs/match.tpl +1 -1
- package/src/documentViewer/providers/pdfViewer/pdfjs/page.tpl +4 -4
- package/src/documentViewer/providers/pdfViewer/pdfjs/pageView.js +318 -318
- package/src/documentViewer/providers/pdfViewer/pdfjs/pagesManager.js +167 -167
- package/src/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +451 -451
- package/src/documentViewer/providers/pdfViewer/pdfjs/textManager.js +252 -252
- package/src/documentViewer/providers/pdfViewer/pdfjs/viewer.js +299 -299
- package/src/documentViewer/providers/pdfViewer/pdfjs/viewer.tpl +16 -16
- package/src/documentViewer/providers/pdfViewer/pdfjs/wrapper.js +351 -351
- package/src/documentViewer/providers/pdfViewer.js +93 -93
- package/src/documentViewer/scss/documentViewer.scss +184 -184
- package/src/documentViewer/viewerFactory.js +191 -191
- package/src/documentViewer.js +238 -238
- package/src/dropdown/css/dropdown.css +7 -7
- package/src/dropdown/css/dropdown.css.map +1 -1
- package/src/dropdown/scss/dropdown.scss +99 -99
- package/src/dropdown/tpl/dropdown.tpl +8 -8
- package/src/dropdown/tpl/list-item.tpl +4 -4
- package/src/dropdown.js +255 -255
- package/src/durationer.js +220 -220
- package/src/dynamicComponent/css/dynamicComponent.css +7 -7
- package/src/dynamicComponent/css/dynamicComponent.css.map +1 -1
- package/src/dynamicComponent/scss/dynamicComponent.scss +98 -98
- package/src/dynamicComponent/tpl/layout.tpl +17 -17
- package/src/dynamicComponent.js +553 -553
- package/src/feedback/feedback.tpl +7 -7
- package/src/feedback.js +295 -295
- package/src/figure/FigureStateActive.js +184 -184
- package/src/filesender.js +112 -112
- package/src/filter/template.tpl +5 -5
- package/src/filter.js +129 -129
- package/src/form/css/dropdownForm.css +7 -7
- package/src/form/css/dropdownForm.css.map +1 -1
- package/src/form/css/form.css +7 -7
- package/src/form/css/form.css.map +1 -1
- package/src/form/dropdownForm.js +281 -281
- package/src/form/form.js +688 -688
- package/src/form/scss/dropdownForm.scss +60 -60
- package/src/form/scss/form.scss +25 -25
- package/src/form/simpleForm.js +125 -125
- package/src/form/tpl/dropdownForm.tpl +4 -4
- package/src/form/tpl/form.tpl +7 -7
- package/src/form/validator/css/validator.css +7 -7
- package/src/form/validator/css/validator.css.map +1 -1
- package/src/form/validator/renderer.js +118 -118
- package/src/form/validator/scss/validator.scss +14 -14
- package/src/form/validator/tpl/message.tpl +1 -1
- package/src/form/validator/tpl/validator.tpl +1 -1
- package/src/form/validator/validator.js +220 -220
- package/src/form/widget/css/widget.css +7 -7
- package/src/form/widget/css/widget.css.map +1 -1
- package/src/form/widget/definitions.js +51 -51
- package/src/form/widget/loader.js +40 -40
- package/src/form/widget/providers/checkBox.js +138 -138
- package/src/form/widget/providers/comboBox.js +63 -63
- package/src/form/widget/providers/default.js +90 -90
- package/src/form/widget/providers/hidden.js +62 -62
- package/src/form/widget/providers/hiddenBox.js +152 -152
- package/src/form/widget/providers/radioBox.js +99 -99
- package/src/form/widget/providers/textArea.js +52 -52
- package/src/form/widget/providers/textBox.js +48 -48
- package/src/form/widget/scss/widget.scss +55 -55
- package/src/form/widget/tpl/checkBox.tpl +25 -25
- package/src/form/widget/tpl/comboBox.tpl +13 -13
- package/src/form/widget/tpl/hidden.tpl +1 -1
- package/src/form/widget/tpl/hiddenBox.tpl +17 -17
- package/src/form/widget/tpl/label.tpl +6 -6
- package/src/form/widget/tpl/radioBox.tpl +25 -25
- package/src/form/widget/tpl/textArea.tpl +8 -8
- package/src/form/widget/tpl/widget.tpl +8 -8
- package/src/form/widget/widget.js +372 -372
- package/src/form.js +47 -47
- package/src/formValidator/formValidator.js +253 -253
- package/src/formValidator/highlighters/highlighter.js +103 -103
- package/src/formValidator/highlighters/message.js +68 -68
- package/src/formValidator/highlighters/tooltip.js +78 -78
- package/src/generis/form/css/form.css +7 -7
- package/src/generis/form/css/form.css.map +1 -1
- package/src/generis/form/form.js +239 -239
- package/src/generis/form/readme.md +70 -70
- package/src/generis/form/scss/form.scss +23 -23
- package/src/generis/form/tpl/form.tpl +16 -16
- package/src/generis/validator/css/validator.css +7 -7
- package/src/generis/validator/css/validator.css.map +1 -1
- package/src/generis/validator/readme.md +46 -46
- package/src/generis/validator/scss/validator.scss +13 -13
- package/src/generis/validator/validator.js +128 -128
- package/src/generis/widget/checkBox/checkBox.js +112 -112
- package/src/generis/widget/checkBox/checkBox.tpl +18 -18
- package/src/generis/widget/comboBox/comboBox.js +66 -66
- package/src/generis/widget/comboBox/comboBox.tpl +12 -12
- package/src/generis/widget/css/widget.css +7 -7
- package/src/generis/widget/css/widget.css.map +1 -1
- package/src/generis/widget/hiddenBox/hiddenBox.js +131 -131
- package/src/generis/widget/hiddenBox/hiddenBox.tpl +16 -16
- package/src/generis/widget/loader.js +49 -49
- package/src/generis/widget/readme.md +59 -59
- package/src/generis/widget/scss/widget.scss +61 -61
- package/src/generis/widget/textBox/textBox.js +64 -64
- package/src/generis/widget/textBox/textBox.tpl +7 -7
- package/src/generis/widget/widget.js +164 -164
- package/src/generis/widget/widget.tpl +5 -5
- package/src/groupedComboBox.js +99 -99
- package/src/groupvalidator.js +84 -84
- package/src/hider.js +88 -88
- package/src/highlighter.js +1192 -1192
- package/src/image/ImgStateActive/extractLabel.js +29 -29
- package/src/image/ImgStateActive/helper.js +36 -36
- package/src/image/ImgStateActive/initHelper.js +137 -137
- package/src/image/ImgStateActive/initMediaEditor.js +92 -92
- package/src/image/ImgStateActive/mediaSizer.js +63 -63
- package/src/image/ImgStateActive.js +115 -115
- package/src/incrementer.js +309 -309
- package/src/inplacer.js +315 -315
- package/src/interactUtils.js +140 -140
- package/src/itemButtonList/css/item-button-list.css +23 -23
- package/src/itemButtonList/css/item-button-list.css.map +1 -1
- package/src/itemButtonList/scss/item-button-list.scss +236 -236
- package/src/itemButtonList/tpl/itemButtonList.tpl +21 -21
- package/src/itemButtonList.js +274 -274
- package/src/keyNavigation/navigableDomElement.js +285 -285
- package/src/keyNavigation/navigator.js +535 -535
- package/src/listbox/css/listbox.css +7 -7
- package/src/listbox/css/listbox.css.map +1 -1
- package/src/listbox/scss/listbox.scss +116 -116
- package/src/listbox/tpl/list.tpl +14 -14
- package/src/listbox/tpl/main.tpl +9 -9
- package/src/listbox.js +252 -252
- package/src/liststyler.js +155 -155
- package/src/loadingButton/css/button.css +7 -7
- package/src/loadingButton/css/button.css.map +1 -1
- package/src/loadingButton/loadingButton.js +110 -110
- package/src/loadingButton/scss/button.scss +41 -41
- package/src/loadingButton/tpl/button.tpl +5 -5
- package/src/lock/lock.tpl +16 -16
- package/src/lock.js +393 -393
- package/src/login/login.js +317 -317
- package/src/login/tpl/login.tpl +29 -29
- package/src/login/tpl/passwordReveal.tpl +7 -7
- package/src/maths/calculator/basicCalculator.js +55 -55
- package/src/maths/calculator/calculatorComponent.js +128 -128
- package/src/maths/calculator/core/areaBroker.js +38 -38
- package/src/maths/calculator/core/board.js +841 -841
- package/src/maths/calculator/core/expression.js +430 -430
- package/src/maths/calculator/core/labels.js +116 -116
- package/src/maths/calculator/core/plugin.js +40 -40
- package/src/maths/calculator/core/terms.js +459 -459
- package/src/maths/calculator/core/tokenizer.js +245 -245
- package/src/maths/calculator/core/tokens.js +178 -178
- package/src/maths/calculator/core/tpl/board.tpl +4 -4
- package/src/maths/calculator/css/calculator.css +7 -7
- package/src/maths/calculator/css/calculator.css.map +1 -1
- package/src/maths/calculator/defaultCalculator.js +66 -66
- package/src/maths/calculator/plugins/core/degrad.js +90 -90
- package/src/maths/calculator/plugins/core/history.js +166 -166
- package/src/maths/calculator/plugins/core/remind.js +96 -96
- package/src/maths/calculator/plugins/core/stepNavigation.js +175 -175
- package/src/maths/calculator/plugins/keyboard/templateKeyboard/defaultTemplate.tpl +36 -36
- package/src/maths/calculator/plugins/keyboard/templateKeyboard/templateKeyboard.js +91 -91
- package/src/maths/calculator/plugins/modifiers/pow10.js +143 -143
- package/src/maths/calculator/plugins/modifiers/sign.js +339 -339
- package/src/maths/calculator/plugins/screen/simpleScreen/defaultTemplate.tpl +3 -3
- package/src/maths/calculator/plugins/screen/simpleScreen/history.tpl +3 -3
- package/src/maths/calculator/plugins/screen/simpleScreen/simpleScreen.js +190 -190
- package/src/maths/calculator/pluginsLoader.js +46 -46
- package/src/maths/calculator/scientificCalculator.js +74 -74
- package/src/maths/calculator/scss/calculator.scss +396 -396
- package/src/maths/calculator/tpl/basicKeyboard.tpl +37 -37
- package/src/maths/calculator/tpl/basicScreen.tpl +2 -2
- package/src/maths/calculator/tpl/scientificKeyboard.tpl +61 -61
- package/src/maths/calculator/tpl/scientificScreen.tpl +3 -3
- package/src/mediaEditor/mediaEditorComponent.js +141 -141
- package/src/mediaEditor/plugins/mediaAlignment/helper.js +110 -110
- package/src/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +99 -99
- package/src/mediaEditor/plugins/mediaAlignment/style.css +7 -7
- package/src/mediaEditor/plugins/mediaAlignment/tpl/mediaAlignment.tpl +25 -25
- package/src/mediaEditor/plugins/mediaDimension/helper.js +190 -190
- package/src/mediaEditor/plugins/mediaDimension/mediaDimensionComponent.js +561 -561
- package/src/mediaEditor/plugins/mediaDimension/style.css +141 -141
- package/src/mediaEditor/plugins/mediaDimension/tpl/mediaDimension.tpl +55 -55
- package/src/mediaEditor/tpl/editor.tpl +4 -4
- package/src/mediaplayer/css/player.css +7 -7
- package/src/mediaplayer/css/player.css.map +1 -1
- package/src/mediaplayer/players/html5.js +564 -564
- package/src/mediaplayer/players/youtube.js +323 -323
- package/src/mediaplayer/players.js +29 -29
- package/src/mediaplayer/readme.md +305 -305
- package/src/mediaplayer/scss/player.scss +569 -569
- package/src/mediaplayer/support.js +126 -126
- package/src/mediaplayer/tpl/audio.tpl +6 -6
- package/src/mediaplayer/tpl/player.tpl +37 -37
- package/src/mediaplayer/tpl/source.tpl +1 -1
- package/src/mediaplayer/tpl/video.tpl +6 -6
- package/src/mediaplayer/tpl/youtube.tpl +1 -1
- package/src/mediaplayer/utils/reminder.js +184 -184
- package/src/mediaplayer/utils/timeObserver.js +143 -143
- package/src/mediaplayer/youtubeManager.js +161 -161
- package/src/mediaplayer.js +1606 -1606
- package/src/mediasizer/mediasizer.tpl +55 -55
- package/src/mediasizer.js +635 -635
- package/src/modal.js +365 -365
- package/src/movableComponent.js +78 -78
- package/src/pageSizeSelector/tpl/pageSizeSelector.tpl +9 -9
- package/src/pageSizeSelector.js +106 -106
- package/src/pageStatus.js +147 -147
- package/src/pagination/css/pagination.css +7 -7
- package/src/pagination/css/pagination.css.map +1 -1
- package/src/pagination/paginationStrategy.js +53 -53
- package/src/pagination/providers/pages.js +161 -161
- package/src/pagination/providers/simple.js +74 -74
- package/src/pagination/providers/tpl/pages/page.tpl +1 -1
- package/src/pagination/providers/tpl/pages.tpl +8 -8
- package/src/pagination/providers/tpl/simple.tpl +7 -7
- package/src/pagination/scss/pagination.scss +111 -111
- package/src/pagination.js +237 -237
- package/src/previewer.js +300 -300
- package/src/progressbar.js +165 -165
- package/src/propertySelector/css/propertySelector.css +7 -7
- package/src/propertySelector/css/propertySelector.css.map +1 -1
- package/src/propertySelector/propertySelector.js +286 -286
- package/src/propertySelector/scss/propertySelector.scss +66 -66
- package/src/propertySelector/tpl/property-description.tpl +12 -12
- package/src/propertySelector/tpl/property-selector.tpl +6 -6
- package/src/report/feedback.tpl +11 -11
- package/src/report/layout.tpl +10 -10
- package/src/report.js +184 -184
- package/src/resource/css/selector.css +7 -7
- package/src/resource/css/selector.css.map +1 -1
- package/src/resource/filters.js +208 -208
- package/src/resource/list.js +200 -200
- package/src/resource/scss/_filters.scss +26 -26
- package/src/resource/scss/_resource-list.scss +107 -107
- package/src/resource/scss/_resource-tree.scss +205 -205
- package/src/resource/scss/selector.scss +187 -187
- package/src/resource/selectable.js +322 -322
- package/src/resource/selector.js +871 -871
- package/src/resource/tpl/filters.tpl +2 -2
- package/src/resource/tpl/list.tpl +7 -7
- package/src/resource/tpl/listNode.tpl +4 -4
- package/src/resource/tpl/selector.tpl +46 -46
- package/src/resource/tpl/tree.tpl +4 -4
- package/src/resource/tpl/treeNode.tpl +30 -30
- package/src/resource/tree.js +398 -398
- package/src/resourcemgr/css/resourcemgr.css +7 -7
- package/src/resourcemgr/css/resourcemgr.css.map +1 -1
- package/src/resourcemgr/fileBrowser.js +381 -381
- package/src/resourcemgr/filePreview.js +73 -73
- package/src/resourcemgr/fileSelector.js +322 -322
- package/src/resourcemgr/scss/resourcemgr.scss +254 -254
- package/src/resourcemgr/tpl/fileSelect.tpl +39 -39
- package/src/resourcemgr/tpl/folder.tpl +11 -11
- package/src/resourcemgr/tpl/layout.tpl +84 -84
- package/src/resourcemgr/tpl/rootFolder.tpl +13 -13
- package/src/resourcemgr/util/updatePermissions.js +53 -53
- package/src/resourcemgr.js +216 -216
- package/src/scroller.js +94 -94
- package/src/scss/basic.scss +16 -16
- package/src/searchModal/advancedSearch.js +638 -638
- package/src/searchModal/css/advancedSearch.css +7 -7
- package/src/searchModal/css/advancedSearch.css.map +1 -1
- package/src/searchModal/css/searchModal.css +7 -7
- package/src/searchModal/css/searchModal.css.map +1 -1
- package/src/searchModal/scss/advancedSearch.scss +171 -171
- package/src/searchModal/scss/searchModal.scss +393 -393
- package/src/searchModal/tpl/advanced-search.tpl +9 -9
- package/src/searchModal/tpl/info-message.tpl +3 -3
- package/src/searchModal/tpl/invalid-criteria-warning.tpl +10 -10
- package/src/searchModal/tpl/layout.tpl +27 -27
- package/src/searchModal/tpl/list-checkbox-criterion.tpl +17 -17
- package/src/searchModal/tpl/list-select-criterion.tpl +12 -12
- package/src/searchModal/tpl/text-criterion.tpl +11 -11
- package/src/searchModal.js +760 -760
- package/src/selecter.js +43 -43
- package/src/stacker.js +133 -133
- package/src/switch/css/switch.css +7 -7
- package/src/switch/css/switch.css.map +1 -1
- package/src/switch/scss/switch.scss +83 -83
- package/src/switch/switch.js +195 -195
- package/src/switch/tpl/switch.tpl +7 -7
- package/src/tableModel.js +112 -112
- package/src/tabs/css/tabs.css +12 -12
- package/src/tabs/css/tabs.css.map +1 -1
- package/src/tabs/scss/tabs.scss +50 -50
- package/src/tabs/tpl/panel.tpl +3 -3
- package/src/tabs/tpl/tabs.tpl +10 -10
- package/src/tabs.js +528 -528
- package/src/taskQueue/css/taskQueue.css +7 -7
- package/src/taskQueue/css/taskQueue.css.map +1 -1
- package/src/taskQueue/scss/taskQueue.scss +47 -47
- package/src/taskQueue/status.js +228 -228
- package/src/taskQueue/table.js +350 -350
- package/src/taskQueue/taskQueue.js +33 -33
- package/src/taskQueue/taskQueueModel.js +548 -548
- package/src/taskQueue/tpl/statusMessage.tpl +7 -7
- package/src/taskQueue.js +216 -216
- package/src/taskQueueButton/css/taskable.css +7 -7
- package/src/taskQueueButton/css/taskable.css.map +1 -1
- package/src/taskQueueButton/css/treeButton.css +7 -7
- package/src/taskQueueButton/css/treeButton.css.map +1 -1
- package/src/taskQueueButton/scss/taskable.scss +4 -4
- package/src/taskQueueButton/scss/treeButton.scss +34 -34
- package/src/taskQueueButton/standardButton.js +108 -108
- package/src/taskQueueButton/taskable.js +202 -202
- package/src/taskQueueButton/tpl/report.tpl +5 -5
- package/src/taskQueueButton/tpl/treeButton.tpl +6 -6
- package/src/taskQueueButton/treeButton.js +108 -108
- package/src/themeLoader.js +252 -252
- package/src/themes.js +162 -162
- package/src/toggler.js +200 -200
- package/src/tooltip/default.tpl +3 -3
- package/src/tooltip.js +160 -160
- package/src/tooltipster.js +25 -25
- package/src/transformer.js +327 -327
- package/src/tristateCheckboxGroup/css/tristateCheckboxGroup.css +7 -7
- package/src/tristateCheckboxGroup/css/tristateCheckboxGroup.css.map +1 -1
- package/src/tristateCheckboxGroup/scss/tristateCheckboxGroup.scss +15 -15
- package/src/tristateCheckboxGroup/tpl/li.tpl +6 -6
- package/src/tristateCheckboxGroup.js +207 -207
- package/src/uploader/fileEntry.tpl +6 -6
- package/src/uploader/uploader.tpl +32 -32
- package/src/uploader.js +594 -594
- package/src/validator/Report.js +10 -10
- package/src/validator/Validator.js +108 -108
- package/src/validator/validators.js +217 -217
- package/src/validator.js +262 -262
- package/src/waitForMedia.js +82 -82
- package/src/waitingDialog/css/waitingDialog.css +7 -7
- package/src/waitingDialog/css/waitingDialog.css.map +1 -1
- package/src/waitingDialog/scss/waitingDialog.scss +34 -34
- package/src/waitingDialog/waitingDialog.js +240 -240
|
@@ -1,430 +1,430 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This program is free software; you can redistribute it and/or
|
|
3
|
-
* modify it under the terms of the GNU General Public License
|
|
4
|
-
* as published by the Free Software Foundation; under version 2
|
|
5
|
-
* of the License (non-upgradable).
|
|
6
|
-
*
|
|
7
|
-
* This program is distributed in the hope that it will be useful,
|
|
8
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10
|
-
* GNU General Public License for more details.
|
|
11
|
-
*
|
|
12
|
-
* You should have received a copy of the GNU General Public License
|
|
13
|
-
* along with this program; if not, write to the Free Software
|
|
14
|
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
15
|
-
*
|
|
16
|
-
* Copyright (c) 2019 Open Assessment Technologies SA ;
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Helper that takes care of expressions
|
|
20
|
-
* @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>
|
|
21
|
-
*/
|
|
22
|
-
import _ from 'lodash';
|
|
23
|
-
import registeredTerms from 'ui/maths/calculator/core/terms';
|
|
24
|
-
import tokensHelper from 'ui/maths/calculator/core/tokens';
|
|
25
|
-
import tokenizerFactory from 'ui/maths/calculator/core/tokenizer';
|
|
26
|
-
import termsTpl from 'ui/maths/calculator/core/tpl/terms';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @typedef {term} renderTerm - Represents a renderable tokenizable term
|
|
30
|
-
* @property {Array} startExponent - List of exponent starts (will produce exponent notation for the term)
|
|
31
|
-
* @property {Array} endExponent - List of exponent ends (will finish exponent notation for the term)
|
|
32
|
-
* @property {Boolean} prefixed - Tells if the term is prefixed (i.e. function treated as binary operator)
|
|
33
|
-
* @property {Boolean} elide - Allows to hide the term when operands exist on each side
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Name of the variable that contains the last result
|
|
38
|
-
* @type {String}
|
|
39
|
-
*/
|
|
40
|
-
var lastResultVariableName = registeredTerms.ANS.value;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Regex that matches the prefixed function operators
|
|
44
|
-
* @type {RegExp}
|
|
45
|
-
*/
|
|
46
|
-
var rePrefixedTerm = /^@[a-zA-Z_]\w*$/;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Regex that matches the usual error tokens in a result
|
|
50
|
-
* @type {RegExp}
|
|
51
|
-
*/
|
|
52
|
-
var reErrorValue = /(NaN|[+-]?Infinity)/;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Regex that matches the last result variable
|
|
56
|
-
* @type {RegExp}
|
|
57
|
-
*/
|
|
58
|
-
var reAnsVar = new RegExp('\\b' + lastResultVariableName + '\\b', 'g');
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* List of tokens representing sign or sum
|
|
62
|
-
* @type {String[]}
|
|
63
|
-
*/
|
|
64
|
-
var signOperators = ['NEG', 'POS', 'SUB', 'ADD'];
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* List of tokens representing sub exponent parts to continue
|
|
68
|
-
* @type {String[]}
|
|
69
|
-
*/
|
|
70
|
-
var continueExponent = ['POW', 'NTHRT'];
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Default number of significant digits used to round displayed variables
|
|
74
|
-
* @type {Number}
|
|
75
|
-
*/
|
|
76
|
-
var defaultDecimalDigits = 5;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* List of helpers that apply on expression
|
|
80
|
-
* @type {Object}
|
|
81
|
-
*/
|
|
82
|
-
var expressionHelper = {
|
|
83
|
-
/**
|
|
84
|
-
* Checks if an expression contains an error token
|
|
85
|
-
* @param {String|Number|Object} expression
|
|
86
|
-
* @returns {Boolean}
|
|
87
|
-
*/
|
|
88
|
-
containsError: function containsError(expression) {
|
|
89
|
-
return reErrorValue.test(tokensHelper.stringValue(expression));
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Replace the last result variable by a particular value in an expression
|
|
94
|
-
* @param {String|Number|Object} expression
|
|
95
|
-
* @param {String|Number|Object} value
|
|
96
|
-
* @returns {String}
|
|
97
|
-
*/
|
|
98
|
-
replaceLastResult: function replaceLastResult(expression, value) {
|
|
99
|
-
return tokensHelper.stringValue(expression).replace(reAnsVar, tokensHelper.stringValue(value || '0'));
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Rounds the value of a variable
|
|
104
|
-
* @param {Object} variable
|
|
105
|
-
* @param {Number} [decimalDigits=5]
|
|
106
|
-
* @returns {String}
|
|
107
|
-
*/
|
|
108
|
-
roundVariable: function roundVariable(variable, decimalDigits) {
|
|
109
|
-
var resultString = tokensHelper.stringValue(variable);
|
|
110
|
-
var fullString = resultString;
|
|
111
|
-
var value = variable && variable.result;
|
|
112
|
-
|
|
113
|
-
decimalDigits = decimalDigits || defaultDecimalDigits;
|
|
114
|
-
|
|
115
|
-
if ('undefined' !== typeof value) {
|
|
116
|
-
if (value.toExponential && resultString.indexOf(registeredTerms.EXP10.value) > 0) {
|
|
117
|
-
resultString = value.toExponential(decimalDigits).toString();
|
|
118
|
-
} else if (value.toDecimalPlaces && resultString.indexOf(registeredTerms.DOT.value) > 0) {
|
|
119
|
-
resultString = value.toDecimalPlaces(decimalDigits).toString();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (resultString.length < fullString.length) {
|
|
123
|
-
resultString += registeredTerms.ELLIPSIS.value;
|
|
124
|
-
} else {
|
|
125
|
-
resultString = fullString;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return resultString;
|
|
129
|
-
},
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Rounds the value of the last result variable
|
|
133
|
-
* @param {Object} variables
|
|
134
|
-
* @param {Number} [decimalDigits=5]
|
|
135
|
-
* @returns {Object}
|
|
136
|
-
*/
|
|
137
|
-
roundLastResultVariable: function roundLastResultVariable(variables, decimalDigits) {
|
|
138
|
-
if (variables && 'undefined' !== typeof variables[lastResultVariableName]) {
|
|
139
|
-
variables[lastResultVariableName] = expressionHelper.roundVariable(
|
|
140
|
-
variables[lastResultVariableName],
|
|
141
|
-
decimalDigits
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
return variables;
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Replace sign operators by a proper symbol
|
|
149
|
-
* @param {String|Number|Object} expression
|
|
150
|
-
* @returns {String}
|
|
151
|
-
*/
|
|
152
|
-
renderSign: function renderSign(expression) {
|
|
153
|
-
return tokensHelper
|
|
154
|
-
.stringValue(expression)
|
|
155
|
-
.replace(registeredTerms.SUB.value, registeredTerms.NEG.label)
|
|
156
|
-
.replace(registeredTerms.ADD.value, registeredTerms.POS.label);
|
|
157
|
-
},
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Renders an expression into a HTML string, using the display label of each extracted token .
|
|
161
|
-
* @param {String|Number|Object|token[]} expression
|
|
162
|
-
* @param {Object} [variables]
|
|
163
|
-
* @param {calculatorTokenizer} [tokenizer]
|
|
164
|
-
* @returns {String}
|
|
165
|
-
*/
|
|
166
|
-
render: function render(expression, variables, tokenizer) {
|
|
167
|
-
var tokens = expression;
|
|
168
|
-
var exponents = [];
|
|
169
|
-
var terms = [];
|
|
170
|
-
var previous;
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Transform an operator to a sign
|
|
174
|
-
* @param {renderTerm} term
|
|
175
|
-
* @param {String} token
|
|
176
|
-
*/
|
|
177
|
-
function toSignOperator(term, token) {
|
|
178
|
-
if (
|
|
179
|
-
!previous ||
|
|
180
|
-
tokensHelper.isModifier(previous.type) ||
|
|
181
|
-
previous.token === 'LPAR' ||
|
|
182
|
-
previous.token === 'EXP10'
|
|
183
|
-
) {
|
|
184
|
-
term.label = registeredTerms[token].label;
|
|
185
|
-
term.token = token;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// the expression might be already tokenized, if not we need to tokenize it
|
|
190
|
-
if (!_.isArray(expression)) {
|
|
191
|
-
// we need a valid tokenizer, so if none is provided we must build one
|
|
192
|
-
if (!tokenizer || !tokenizer.tokenize) {
|
|
193
|
-
tokenizer = tokenizerFactory();
|
|
194
|
-
}
|
|
195
|
-
tokens = tokenizer.tokenize(expression);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
variables = variables || {};
|
|
199
|
-
|
|
200
|
-
// each token needs to be translated into a displayable term
|
|
201
|
-
_.forEach(tokens, function(token, index) {
|
|
202
|
-
var registeredTerm = registeredTerms[token.type];
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* @type {renderTerm}
|
|
206
|
-
*/
|
|
207
|
-
var term = {
|
|
208
|
-
type: token.type,
|
|
209
|
-
token: token.type,
|
|
210
|
-
value: token.value,
|
|
211
|
-
label: token.value,
|
|
212
|
-
description: token.value,
|
|
213
|
-
exponent: null,
|
|
214
|
-
startExponent: [],
|
|
215
|
-
endExponent: [],
|
|
216
|
-
prefixed: rePrefixedTerm.test(token.value),
|
|
217
|
-
elide: false
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
if (registeredTerm) {
|
|
221
|
-
_.merge(term, registeredTerm);
|
|
222
|
-
|
|
223
|
-
// always display the actual value of the last result variable
|
|
224
|
-
// also takes care of the value's sign
|
|
225
|
-
if (term.value === lastResultVariableName && 'undefined' !== typeof variables[term.value]) {
|
|
226
|
-
term.label = expressionHelper.render(variables[term.value], variables, tokenizer);
|
|
227
|
-
}
|
|
228
|
-
} else if (term.token === 'term') {
|
|
229
|
-
// unspecified token can be a variable
|
|
230
|
-
if ('undefined' !== typeof variables[term.value]) {
|
|
231
|
-
term.type = 'variable';
|
|
232
|
-
} else {
|
|
233
|
-
term.type = 'unknown';
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// take care of the value's sign
|
|
238
|
-
if (term.token === 'SUB') {
|
|
239
|
-
toSignOperator(term, 'NEG');
|
|
240
|
-
} else if (term.token === 'ADD') {
|
|
241
|
-
toSignOperator(term, 'POS');
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
terms.push(term);
|
|
245
|
-
|
|
246
|
-
// exponents will be processed in a second pass
|
|
247
|
-
// for now we just need to keep track of the position
|
|
248
|
-
if (term.exponent) {
|
|
249
|
-
exponents.push(index);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
previous = term;
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
// if any exponent has been discovered, we need to process them now
|
|
256
|
-
_.forEach(exponents, function(index) {
|
|
257
|
-
var term = terms[index];
|
|
258
|
-
if (term.exponent === 'left' && index > 0) {
|
|
259
|
-
exponentOnTheLeft(index, terms);
|
|
260
|
-
} else if (term.exponent === 'right' && index < terms.length - 1) {
|
|
261
|
-
exponentOnTheRight(index, terms);
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
return termsTpl(terms);
|
|
266
|
-
}
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Search for the full operand on the left, then tag the edges with exponent flags
|
|
271
|
-
* @param {Number} index
|
|
272
|
-
* @param {renderTerm[]} terms
|
|
273
|
-
*/
|
|
274
|
-
function exponentOnTheLeft(index, terms) {
|
|
275
|
-
var parenthesis = 0;
|
|
276
|
-
var next = terms[index];
|
|
277
|
-
var term = terms[--index];
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Simply moves the cursor to the next term to examine.
|
|
281
|
-
* Here the move is made from the right to the left.
|
|
282
|
-
*/
|
|
283
|
-
function nextTerm() {
|
|
284
|
-
next = term;
|
|
285
|
-
term = terms[--index];
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// only take care of actual operand value or sub expression (starting from the right)
|
|
289
|
-
if (term && (tokensHelper.isOperand(term.type) || term.token === 'RPAR')) {
|
|
290
|
-
term.endExponent.push(term.endExponent.length);
|
|
291
|
-
|
|
292
|
-
if (term.token === 'RPAR') {
|
|
293
|
-
// closing parenthesis, we need to find the opening parenthesis
|
|
294
|
-
parenthesis++;
|
|
295
|
-
while (index > 0 && parenthesis > 0) {
|
|
296
|
-
nextTerm();
|
|
297
|
-
|
|
298
|
-
if (term.token === 'RPAR') {
|
|
299
|
-
parenthesis++;
|
|
300
|
-
} else if (term.token === 'LPAR') {
|
|
301
|
-
parenthesis--;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// a function could be attached to the sub expression, if so we must keep the link
|
|
306
|
-
// however, the prefixed functions are particular as they act as a binary operators,
|
|
307
|
-
// and therefore are not considered as function here
|
|
308
|
-
if (index > 0 && tokensHelper.isFunction(terms[index - 1]) && !terms[index - 1].prefixed) {
|
|
309
|
-
nextTerm();
|
|
310
|
-
}
|
|
311
|
-
} else if (tokensHelper.isDigit(term.type)) {
|
|
312
|
-
// chain of digits should be treated as a single operand
|
|
313
|
-
while (index && tokensHelper.isDigit(term.type)) {
|
|
314
|
-
nextTerm();
|
|
315
|
-
}
|
|
316
|
-
// if the end of the chain has been overflown, we must step back one token
|
|
317
|
-
if (!tokensHelper.isDigit(term.type)) {
|
|
318
|
-
term = next;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
term.startExponent.push(term.startExponent.length);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Search for the full operand on the right, then tag the edges with exponent flags
|
|
327
|
-
* @param {Number} index
|
|
328
|
-
* @param {renderTerm[]} terms
|
|
329
|
-
*/
|
|
330
|
-
function exponentOnTheRight(index, terms) {
|
|
331
|
-
var last = terms.length - 1;
|
|
332
|
-
var parenthesis = 0;
|
|
333
|
-
var startAt = index;
|
|
334
|
-
var previous = terms[index];
|
|
335
|
-
var term = terms[++index];
|
|
336
|
-
var shouldContinue;
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Simply moves the cursor to the next term to examine.
|
|
340
|
-
* Here the move is made from the left to the right.
|
|
341
|
-
*/
|
|
342
|
-
function nextTerm() {
|
|
343
|
-
previous = term;
|
|
344
|
-
term = terms[++index];
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Simply moves back the cursor to the previous term.
|
|
349
|
-
* Here the move is made from the right to the left.
|
|
350
|
-
*/
|
|
351
|
-
function previousTerm() {
|
|
352
|
-
term = previous;
|
|
353
|
-
previous = terms[--index];
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
// only take care of actual operand value or sub expression (starting from the left)
|
|
357
|
-
if (
|
|
358
|
-
term &&
|
|
359
|
-
(tokensHelper.isOperand(term.type) || term.token === 'LPAR' || signOperators.indexOf(term.token) >= 0)
|
|
360
|
-
) {
|
|
361
|
-
term.startExponent.push(term.startExponent.length);
|
|
362
|
-
|
|
363
|
-
// we use an internal loop as exponents could be chained
|
|
364
|
-
do {
|
|
365
|
-
shouldContinue = false;
|
|
366
|
-
|
|
367
|
-
// functions are attached to an operand, and this link should be kept
|
|
368
|
-
while (index < last && (tokensHelper.isFunction(term.type) || signOperators.indexOf(term.token) >= 0)) {
|
|
369
|
-
nextTerm();
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
// if the end has been reached, step back one token
|
|
373
|
-
if (!term) {
|
|
374
|
-
previousTerm();
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
if (term.token === 'LPAR') {
|
|
378
|
-
// opening parenthesis, we need to find the closing parenthesis
|
|
379
|
-
parenthesis++;
|
|
380
|
-
while (index < last && parenthesis > 0) {
|
|
381
|
-
nextTerm();
|
|
382
|
-
|
|
383
|
-
if (term.token === 'LPAR') {
|
|
384
|
-
parenthesis++;
|
|
385
|
-
} else if (term.token === 'RPAR') {
|
|
386
|
-
parenthesis--;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
} else if (tokensHelper.isDigit(term.type)) {
|
|
390
|
-
// chain of digits should be treated as a single operand
|
|
391
|
-
while (index < last && tokensHelper.isDigit(term.type)) {
|
|
392
|
-
nextTerm();
|
|
393
|
-
}
|
|
394
|
-
// if the end of the chain has been overflown, we must step back one token
|
|
395
|
-
if (!term || !tokensHelper.isDigit(term.type)) {
|
|
396
|
-
previousTerm();
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// factorial is a special case, as the operator can be placed either on the right or on the left
|
|
401
|
-
// in any case it should be attached to its operand
|
|
402
|
-
while (index < last && terms[index + 1].token === 'FAC') {
|
|
403
|
-
nextTerm();
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// sometimes a sub exponent continues the chain and should be part of the expression to put in exponent
|
|
407
|
-
if (index < last && continueExponent.indexOf(terms[index + 1].token) >= 0) {
|
|
408
|
-
// the next term should be ignored as we already know it is an exponent operator
|
|
409
|
-
// then the term after have to be set as the current one
|
|
410
|
-
nextTerm();
|
|
411
|
-
nextTerm();
|
|
412
|
-
shouldContinue = true;
|
|
413
|
-
}
|
|
414
|
-
} while (shouldContinue);
|
|
415
|
-
|
|
416
|
-
term.endExponent.push(term.endExponent.length);
|
|
417
|
-
|
|
418
|
-
// elide the operator if operands are complete
|
|
419
|
-
if (
|
|
420
|
-
startAt > 0 &&
|
|
421
|
-
startAt < last &&
|
|
422
|
-
terms[startAt].token === 'POW' &&
|
|
423
|
-
terms[startAt + 1].startExponent.length
|
|
424
|
-
) {
|
|
425
|
-
terms[startAt].elide = true;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
export default expressionHelper;
|
|
1
|
+
/**
|
|
2
|
+
* This program is free software; you can redistribute it and/or
|
|
3
|
+
* modify it under the terms of the GNU General Public License
|
|
4
|
+
* as published by the Free Software Foundation; under version 2
|
|
5
|
+
* of the License (non-upgradable).
|
|
6
|
+
*
|
|
7
|
+
* This program is distributed in the hope that it will be useful,
|
|
8
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10
|
+
* GNU General Public License for more details.
|
|
11
|
+
*
|
|
12
|
+
* You should have received a copy of the GNU General Public License
|
|
13
|
+
* along with this program; if not, write to the Free Software
|
|
14
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
15
|
+
*
|
|
16
|
+
* Copyright (c) 2019 Open Assessment Technologies SA ;
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Helper that takes care of expressions
|
|
20
|
+
* @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>
|
|
21
|
+
*/
|
|
22
|
+
import _ from 'lodash';
|
|
23
|
+
import registeredTerms from 'ui/maths/calculator/core/terms';
|
|
24
|
+
import tokensHelper from 'ui/maths/calculator/core/tokens';
|
|
25
|
+
import tokenizerFactory from 'ui/maths/calculator/core/tokenizer';
|
|
26
|
+
import termsTpl from 'ui/maths/calculator/core/tpl/terms';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @typedef {term} renderTerm - Represents a renderable tokenizable term
|
|
30
|
+
* @property {Array} startExponent - List of exponent starts (will produce exponent notation for the term)
|
|
31
|
+
* @property {Array} endExponent - List of exponent ends (will finish exponent notation for the term)
|
|
32
|
+
* @property {Boolean} prefixed - Tells if the term is prefixed (i.e. function treated as binary operator)
|
|
33
|
+
* @property {Boolean} elide - Allows to hide the term when operands exist on each side
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Name of the variable that contains the last result
|
|
38
|
+
* @type {String}
|
|
39
|
+
*/
|
|
40
|
+
var lastResultVariableName = registeredTerms.ANS.value;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Regex that matches the prefixed function operators
|
|
44
|
+
* @type {RegExp}
|
|
45
|
+
*/
|
|
46
|
+
var rePrefixedTerm = /^@[a-zA-Z_]\w*$/;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Regex that matches the usual error tokens in a result
|
|
50
|
+
* @type {RegExp}
|
|
51
|
+
*/
|
|
52
|
+
var reErrorValue = /(NaN|[+-]?Infinity)/;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Regex that matches the last result variable
|
|
56
|
+
* @type {RegExp}
|
|
57
|
+
*/
|
|
58
|
+
var reAnsVar = new RegExp('\\b' + lastResultVariableName + '\\b', 'g');
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* List of tokens representing sign or sum
|
|
62
|
+
* @type {String[]}
|
|
63
|
+
*/
|
|
64
|
+
var signOperators = ['NEG', 'POS', 'SUB', 'ADD'];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* List of tokens representing sub exponent parts to continue
|
|
68
|
+
* @type {String[]}
|
|
69
|
+
*/
|
|
70
|
+
var continueExponent = ['POW', 'NTHRT'];
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Default number of significant digits used to round displayed variables
|
|
74
|
+
* @type {Number}
|
|
75
|
+
*/
|
|
76
|
+
var defaultDecimalDigits = 5;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* List of helpers that apply on expression
|
|
80
|
+
* @type {Object}
|
|
81
|
+
*/
|
|
82
|
+
var expressionHelper = {
|
|
83
|
+
/**
|
|
84
|
+
* Checks if an expression contains an error token
|
|
85
|
+
* @param {String|Number|Object} expression
|
|
86
|
+
* @returns {Boolean}
|
|
87
|
+
*/
|
|
88
|
+
containsError: function containsError(expression) {
|
|
89
|
+
return reErrorValue.test(tokensHelper.stringValue(expression));
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Replace the last result variable by a particular value in an expression
|
|
94
|
+
* @param {String|Number|Object} expression
|
|
95
|
+
* @param {String|Number|Object} value
|
|
96
|
+
* @returns {String}
|
|
97
|
+
*/
|
|
98
|
+
replaceLastResult: function replaceLastResult(expression, value) {
|
|
99
|
+
return tokensHelper.stringValue(expression).replace(reAnsVar, tokensHelper.stringValue(value || '0'));
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Rounds the value of a variable
|
|
104
|
+
* @param {Object} variable
|
|
105
|
+
* @param {Number} [decimalDigits=5]
|
|
106
|
+
* @returns {String}
|
|
107
|
+
*/
|
|
108
|
+
roundVariable: function roundVariable(variable, decimalDigits) {
|
|
109
|
+
var resultString = tokensHelper.stringValue(variable);
|
|
110
|
+
var fullString = resultString;
|
|
111
|
+
var value = variable && variable.result;
|
|
112
|
+
|
|
113
|
+
decimalDigits = decimalDigits || defaultDecimalDigits;
|
|
114
|
+
|
|
115
|
+
if ('undefined' !== typeof value) {
|
|
116
|
+
if (value.toExponential && resultString.indexOf(registeredTerms.EXP10.value) > 0) {
|
|
117
|
+
resultString = value.toExponential(decimalDigits).toString();
|
|
118
|
+
} else if (value.toDecimalPlaces && resultString.indexOf(registeredTerms.DOT.value) > 0) {
|
|
119
|
+
resultString = value.toDecimalPlaces(decimalDigits).toString();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (resultString.length < fullString.length) {
|
|
123
|
+
resultString += registeredTerms.ELLIPSIS.value;
|
|
124
|
+
} else {
|
|
125
|
+
resultString = fullString;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return resultString;
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Rounds the value of the last result variable
|
|
133
|
+
* @param {Object} variables
|
|
134
|
+
* @param {Number} [decimalDigits=5]
|
|
135
|
+
* @returns {Object}
|
|
136
|
+
*/
|
|
137
|
+
roundLastResultVariable: function roundLastResultVariable(variables, decimalDigits) {
|
|
138
|
+
if (variables && 'undefined' !== typeof variables[lastResultVariableName]) {
|
|
139
|
+
variables[lastResultVariableName] = expressionHelper.roundVariable(
|
|
140
|
+
variables[lastResultVariableName],
|
|
141
|
+
decimalDigits
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
return variables;
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Replace sign operators by a proper symbol
|
|
149
|
+
* @param {String|Number|Object} expression
|
|
150
|
+
* @returns {String}
|
|
151
|
+
*/
|
|
152
|
+
renderSign: function renderSign(expression) {
|
|
153
|
+
return tokensHelper
|
|
154
|
+
.stringValue(expression)
|
|
155
|
+
.replace(registeredTerms.SUB.value, registeredTerms.NEG.label)
|
|
156
|
+
.replace(registeredTerms.ADD.value, registeredTerms.POS.label);
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Renders an expression into a HTML string, using the display label of each extracted token .
|
|
161
|
+
* @param {String|Number|Object|token[]} expression
|
|
162
|
+
* @param {Object} [variables]
|
|
163
|
+
* @param {calculatorTokenizer} [tokenizer]
|
|
164
|
+
* @returns {String}
|
|
165
|
+
*/
|
|
166
|
+
render: function render(expression, variables, tokenizer) {
|
|
167
|
+
var tokens = expression;
|
|
168
|
+
var exponents = [];
|
|
169
|
+
var terms = [];
|
|
170
|
+
var previous;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Transform an operator to a sign
|
|
174
|
+
* @param {renderTerm} term
|
|
175
|
+
* @param {String} token
|
|
176
|
+
*/
|
|
177
|
+
function toSignOperator(term, token) {
|
|
178
|
+
if (
|
|
179
|
+
!previous ||
|
|
180
|
+
tokensHelper.isModifier(previous.type) ||
|
|
181
|
+
previous.token === 'LPAR' ||
|
|
182
|
+
previous.token === 'EXP10'
|
|
183
|
+
) {
|
|
184
|
+
term.label = registeredTerms[token].label;
|
|
185
|
+
term.token = token;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// the expression might be already tokenized, if not we need to tokenize it
|
|
190
|
+
if (!_.isArray(expression)) {
|
|
191
|
+
// we need a valid tokenizer, so if none is provided we must build one
|
|
192
|
+
if (!tokenizer || !tokenizer.tokenize) {
|
|
193
|
+
tokenizer = tokenizerFactory();
|
|
194
|
+
}
|
|
195
|
+
tokens = tokenizer.tokenize(expression);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
variables = variables || {};
|
|
199
|
+
|
|
200
|
+
// each token needs to be translated into a displayable term
|
|
201
|
+
_.forEach(tokens, function(token, index) {
|
|
202
|
+
var registeredTerm = registeredTerms[token.type];
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* @type {renderTerm}
|
|
206
|
+
*/
|
|
207
|
+
var term = {
|
|
208
|
+
type: token.type,
|
|
209
|
+
token: token.type,
|
|
210
|
+
value: token.value,
|
|
211
|
+
label: token.value,
|
|
212
|
+
description: token.value,
|
|
213
|
+
exponent: null,
|
|
214
|
+
startExponent: [],
|
|
215
|
+
endExponent: [],
|
|
216
|
+
prefixed: rePrefixedTerm.test(token.value),
|
|
217
|
+
elide: false
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
if (registeredTerm) {
|
|
221
|
+
_.merge(term, registeredTerm);
|
|
222
|
+
|
|
223
|
+
// always display the actual value of the last result variable
|
|
224
|
+
// also takes care of the value's sign
|
|
225
|
+
if (term.value === lastResultVariableName && 'undefined' !== typeof variables[term.value]) {
|
|
226
|
+
term.label = expressionHelper.render(variables[term.value], variables, tokenizer);
|
|
227
|
+
}
|
|
228
|
+
} else if (term.token === 'term') {
|
|
229
|
+
// unspecified token can be a variable
|
|
230
|
+
if ('undefined' !== typeof variables[term.value]) {
|
|
231
|
+
term.type = 'variable';
|
|
232
|
+
} else {
|
|
233
|
+
term.type = 'unknown';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// take care of the value's sign
|
|
238
|
+
if (term.token === 'SUB') {
|
|
239
|
+
toSignOperator(term, 'NEG');
|
|
240
|
+
} else if (term.token === 'ADD') {
|
|
241
|
+
toSignOperator(term, 'POS');
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
terms.push(term);
|
|
245
|
+
|
|
246
|
+
// exponents will be processed in a second pass
|
|
247
|
+
// for now we just need to keep track of the position
|
|
248
|
+
if (term.exponent) {
|
|
249
|
+
exponents.push(index);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
previous = term;
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// if any exponent has been discovered, we need to process them now
|
|
256
|
+
_.forEach(exponents, function(index) {
|
|
257
|
+
var term = terms[index];
|
|
258
|
+
if (term.exponent === 'left' && index > 0) {
|
|
259
|
+
exponentOnTheLeft(index, terms);
|
|
260
|
+
} else if (term.exponent === 'right' && index < terms.length - 1) {
|
|
261
|
+
exponentOnTheRight(index, terms);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
return termsTpl(terms);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Search for the full operand on the left, then tag the edges with exponent flags
|
|
271
|
+
* @param {Number} index
|
|
272
|
+
* @param {renderTerm[]} terms
|
|
273
|
+
*/
|
|
274
|
+
function exponentOnTheLeft(index, terms) {
|
|
275
|
+
var parenthesis = 0;
|
|
276
|
+
var next = terms[index];
|
|
277
|
+
var term = terms[--index];
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Simply moves the cursor to the next term to examine.
|
|
281
|
+
* Here the move is made from the right to the left.
|
|
282
|
+
*/
|
|
283
|
+
function nextTerm() {
|
|
284
|
+
next = term;
|
|
285
|
+
term = terms[--index];
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// only take care of actual operand value or sub expression (starting from the right)
|
|
289
|
+
if (term && (tokensHelper.isOperand(term.type) || term.token === 'RPAR')) {
|
|
290
|
+
term.endExponent.push(term.endExponent.length);
|
|
291
|
+
|
|
292
|
+
if (term.token === 'RPAR') {
|
|
293
|
+
// closing parenthesis, we need to find the opening parenthesis
|
|
294
|
+
parenthesis++;
|
|
295
|
+
while (index > 0 && parenthesis > 0) {
|
|
296
|
+
nextTerm();
|
|
297
|
+
|
|
298
|
+
if (term.token === 'RPAR') {
|
|
299
|
+
parenthesis++;
|
|
300
|
+
} else if (term.token === 'LPAR') {
|
|
301
|
+
parenthesis--;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// a function could be attached to the sub expression, if so we must keep the link
|
|
306
|
+
// however, the prefixed functions are particular as they act as a binary operators,
|
|
307
|
+
// and therefore are not considered as function here
|
|
308
|
+
if (index > 0 && tokensHelper.isFunction(terms[index - 1]) && !terms[index - 1].prefixed) {
|
|
309
|
+
nextTerm();
|
|
310
|
+
}
|
|
311
|
+
} else if (tokensHelper.isDigit(term.type)) {
|
|
312
|
+
// chain of digits should be treated as a single operand
|
|
313
|
+
while (index && tokensHelper.isDigit(term.type)) {
|
|
314
|
+
nextTerm();
|
|
315
|
+
}
|
|
316
|
+
// if the end of the chain has been overflown, we must step back one token
|
|
317
|
+
if (!tokensHelper.isDigit(term.type)) {
|
|
318
|
+
term = next;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
term.startExponent.push(term.startExponent.length);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Search for the full operand on the right, then tag the edges with exponent flags
|
|
327
|
+
* @param {Number} index
|
|
328
|
+
* @param {renderTerm[]} terms
|
|
329
|
+
*/
|
|
330
|
+
function exponentOnTheRight(index, terms) {
|
|
331
|
+
var last = terms.length - 1;
|
|
332
|
+
var parenthesis = 0;
|
|
333
|
+
var startAt = index;
|
|
334
|
+
var previous = terms[index];
|
|
335
|
+
var term = terms[++index];
|
|
336
|
+
var shouldContinue;
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Simply moves the cursor to the next term to examine.
|
|
340
|
+
* Here the move is made from the left to the right.
|
|
341
|
+
*/
|
|
342
|
+
function nextTerm() {
|
|
343
|
+
previous = term;
|
|
344
|
+
term = terms[++index];
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Simply moves back the cursor to the previous term.
|
|
349
|
+
* Here the move is made from the right to the left.
|
|
350
|
+
*/
|
|
351
|
+
function previousTerm() {
|
|
352
|
+
term = previous;
|
|
353
|
+
previous = terms[--index];
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// only take care of actual operand value or sub expression (starting from the left)
|
|
357
|
+
if (
|
|
358
|
+
term &&
|
|
359
|
+
(tokensHelper.isOperand(term.type) || term.token === 'LPAR' || signOperators.indexOf(term.token) >= 0)
|
|
360
|
+
) {
|
|
361
|
+
term.startExponent.push(term.startExponent.length);
|
|
362
|
+
|
|
363
|
+
// we use an internal loop as exponents could be chained
|
|
364
|
+
do {
|
|
365
|
+
shouldContinue = false;
|
|
366
|
+
|
|
367
|
+
// functions are attached to an operand, and this link should be kept
|
|
368
|
+
while (index < last && (tokensHelper.isFunction(term.type) || signOperators.indexOf(term.token) >= 0)) {
|
|
369
|
+
nextTerm();
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// if the end has been reached, step back one token
|
|
373
|
+
if (!term) {
|
|
374
|
+
previousTerm();
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (term.token === 'LPAR') {
|
|
378
|
+
// opening parenthesis, we need to find the closing parenthesis
|
|
379
|
+
parenthesis++;
|
|
380
|
+
while (index < last && parenthesis > 0) {
|
|
381
|
+
nextTerm();
|
|
382
|
+
|
|
383
|
+
if (term.token === 'LPAR') {
|
|
384
|
+
parenthesis++;
|
|
385
|
+
} else if (term.token === 'RPAR') {
|
|
386
|
+
parenthesis--;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
} else if (tokensHelper.isDigit(term.type)) {
|
|
390
|
+
// chain of digits should be treated as a single operand
|
|
391
|
+
while (index < last && tokensHelper.isDigit(term.type)) {
|
|
392
|
+
nextTerm();
|
|
393
|
+
}
|
|
394
|
+
// if the end of the chain has been overflown, we must step back one token
|
|
395
|
+
if (!term || !tokensHelper.isDigit(term.type)) {
|
|
396
|
+
previousTerm();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// factorial is a special case, as the operator can be placed either on the right or on the left
|
|
401
|
+
// in any case it should be attached to its operand
|
|
402
|
+
while (index < last && terms[index + 1].token === 'FAC') {
|
|
403
|
+
nextTerm();
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// sometimes a sub exponent continues the chain and should be part of the expression to put in exponent
|
|
407
|
+
if (index < last && continueExponent.indexOf(terms[index + 1].token) >= 0) {
|
|
408
|
+
// the next term should be ignored as we already know it is an exponent operator
|
|
409
|
+
// then the term after have to be set as the current one
|
|
410
|
+
nextTerm();
|
|
411
|
+
nextTerm();
|
|
412
|
+
shouldContinue = true;
|
|
413
|
+
}
|
|
414
|
+
} while (shouldContinue);
|
|
415
|
+
|
|
416
|
+
term.endExponent.push(term.endExponent.length);
|
|
417
|
+
|
|
418
|
+
// elide the operator if operands are complete
|
|
419
|
+
if (
|
|
420
|
+
startAt > 0 &&
|
|
421
|
+
startAt < last &&
|
|
422
|
+
terms[startAt].token === 'POW' &&
|
|
423
|
+
terms[startAt + 1].startExponent.length
|
|
424
|
+
) {
|
|
425
|
+
terms[startAt].elide = true;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export default expressionHelper;
|