@oat-sa/tao-core-ui 1.60.2 → 1.61.0
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 +23 -18
- package/dist/actionbar.js +105 -105
- package/dist/adder.js +109 -109
- package/dist/animable/absorbable/absorbable.js +42 -42
- 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 +36 -36
- 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 +400 -400
- package/dist/autoscroll.js +22 -22
- package/dist/badge/badge.js +48 -48
- 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 +70 -70
- 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 +104 -104
- package/dist/button.js +102 -102
- 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 +47 -47
- package/dist/ckeditor/ckConfigurator.js +48 -48
- 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 +111 -111
- 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 +59 -59
- package/dist/component.js +153 -153
- 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 +113 -113
- package/dist/dashboard/css/dashboard.css +7 -7
- package/dist/dashboard/css/dashboard.css.map +1 -1
- package/dist/dashboard.js +75 -75
- package/dist/datalist/css/datalist.css +7 -7
- package/dist/datalist/css/datalist.css.map +1 -1
- package/dist/datalist.js +160 -160
- package/dist/datatable/css/datatable.css +11 -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 +464 -431
- package/dist/dateRange/css/dateRange.css +7 -7
- package/dist/dateRange/css/dateRange.css.map +1 -1
- package/dist/dateRange/dateRange.js +110 -110
- package/dist/datetime/css/picker.css +7 -7
- package/dist/datetime/css/picker.css.map +1 -1
- package/dist/datetime/picker.js +174 -174
- package/dist/deleter.js +92 -92
- package/dist/destination/css/selector.css +7 -7
- package/dist/destination/css/selector.css.map +1 -1
- package/dist/destination/selector.js +65 -65
- package/dist/dialog/alert.js +26 -26
- package/dist/dialog/confirm.js +27 -27
- package/dist/dialog/confirmDelete.js +44 -44
- package/dist/dialog.js +156 -156
- 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 +43 -43
- package/dist/documentViewer/providers/pdfViewer/pdfjs/areaBroker.js +25 -25
- package/dist/documentViewer/providers/pdfViewer/pdfjs/findBar.js +133 -133
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pageView.js +102 -102
- package/dist/documentViewer/providers/pdfViewer/pdfjs/pagesManager.js +52 -52
- package/dist/documentViewer/providers/pdfViewer/pdfjs/searchEngine.js +125 -125
- package/dist/documentViewer/providers/pdfViewer/pdfjs/textManager.js +67 -67
- package/dist/documentViewer/providers/pdfViewer/pdfjs/viewer.js +94 -94
- package/dist/documentViewer/providers/pdfViewer/pdfjs/wrapper.js +111 -111
- package/dist/documentViewer/providers/pdfViewer.js +42 -42
- package/dist/documentViewer/viewerFactory.js +71 -71
- package/dist/documentViewer.js +99 -99
- package/dist/dropdown/css/dropdown.css +7 -7
- package/dist/dropdown/css/dropdown.css.map +1 -1
- package/dist/dropdown.js +97 -97
- 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 +116 -116
- package/dist/feedback.js +97 -97
- package/dist/figure/FigureStateActive.js +117 -117
- package/dist/filesender.js +26 -26
- package/dist/filter.js +47 -47
- 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 +112 -112
- package/dist/form/form.js +245 -245
- 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 +65 -65
- package/dist/form/validator/validator.js +87 -87
- 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 +75 -75
- package/dist/form/widget/providers/comboBox.js +59 -59
- package/dist/form/widget/providers/default.js +35 -35
- package/dist/form/widget/providers/hidden.js +50 -50
- package/dist/form/widget/providers/hiddenBox.js +71 -71
- package/dist/form/widget/providers/radioBox.js +70 -70
- package/dist/form/widget/providers/textArea.js +48 -48
- package/dist/form/widget/providers/textBox.js +34 -34
- package/dist/form/widget/widget.js +154 -154
- 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 +86 -86
- 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 +51 -51
- package/dist/generis/widget/checkBox/checkBox.js +52 -52
- package/dist/generis/widget/comboBox/comboBox.js +45 -45
- 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 +53 -53
- package/dist/generis/widget/loader.js +20 -20
- package/dist/generis/widget/textBox/textBox.js +40 -40
- package/dist/generis/widget/widget.js +60 -60
- package/dist/groupedComboBox.js +49 -49
- package/dist/groupvalidator.js +19 -19
- package/dist/hider.js +41 -41
- package/dist/highlighter.js +262 -262
- 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 +115 -115
- 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 +97 -97
- 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 +48 -48
- package/dist/lock.js +125 -125
- package/dist/login/login.js +100 -100
- package/dist/maths/calculator/basicCalculator.js +63 -63
- package/dist/maths/calculator/calculatorComponent.js +29 -29
- package/dist/maths/calculator/core/areaBroker.js +25 -25
- package/dist/maths/calculator/core/board.js +313 -313
- package/dist/maths/calculator/core/expression.js +111 -111
- package/dist/maths/calculator/core/labels.js +29 -29
- 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 +59 -59
- 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 +61 -61
- 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 +60 -60
- package/dist/maths/calculator/pluginsLoader.js +21 -21
- package/dist/maths/calculator/scientificCalculator.js +91 -91
- package/dist/mediaEditor/mediaEditorComponent.js +64 -64
- package/dist/mediaEditor/plugins/mediaAlignment/helper.js +16 -16
- package/dist/mediaEditor/plugins/mediaAlignment/mediaAlignmentComponent.js +60 -60
- 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 +153 -153
- 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 +65 -65
- package/dist/mediaplayer/players/youtube.js +52 -52
- 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 +35 -35
- package/dist/mediaplayer.js +460 -460
- package/dist/mediasizer.js +135 -135
- package/dist/modal.js +87 -87
- package/dist/movableComponent.js +35 -35
- package/dist/pageSizeSelector.js +44 -44
- 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 +37 -37
- package/dist/pagination/providers/simple.js +35 -35
- package/dist/pagination.js +45 -45
- package/dist/previewer.js +67 -67
- package/dist/progressbar.js +58 -58
- package/dist/propertySelector/css/propertySelector.css +74 -0
- package/dist/propertySelector/css/propertySelector.css.map +1 -0
- package/dist/propertySelector/propertySelector.js +533 -0
- package/dist/report.js +86 -86
- package/dist/resource/css/selector.css +7 -7
- package/dist/resource/css/selector.css.map +1 -1
- package/dist/resource/filters.js +73 -73
- package/dist/resource/list.js +66 -66
- package/dist/resource/selectable.js +92 -92
- package/dist/resource/selector.js +195 -195
- package/dist/resource/tree.js +104 -104
- package/dist/resourcemgr/css/resourcemgr.css +7 -7
- package/dist/resourcemgr/css/resourcemgr.css.map +1 -1
- package/dist/resourcemgr/fileBrowser.js +88 -88
- package/dist/resourcemgr/fileSelector.js +58 -58
- package/dist/resourcemgr/util/updatePermissions.js +4 -4
- package/dist/resourcemgr.js +62 -62
- package/dist/scroller.js +26 -26
- package/dist/searchModal/advancedSearch.js +355 -161
- package/dist/searchModal/css/advancedSearch.css +7 -14
- package/dist/searchModal/css/advancedSearch.css.map +1 -1
- package/dist/searchModal/css/searchModal.css +29 -8
- package/dist/searchModal/css/searchModal.css.map +1 -1
- package/dist/searchModal.js +574 -190
- 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 +75 -75
- 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 +217 -217
- package/dist/taskQueue/css/taskQueue.css +7 -7
- package/dist/taskQueue/css/taskQueue.css.map +1 -1
- package/dist/taskQueue/status.js +72 -72
- package/dist/taskQueue/table.js +67 -67
- package/dist/taskQueue/taskQueue.js +18 -18
- package/dist/taskQueue/taskQueueModel.js +86 -86
- 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 +54 -54
- package/dist/taskQueueButton/treeButton.js +56 -56
- package/dist/themeLoader.js +75 -75
- package/dist/themes.js +84 -84
- package/dist/toggler.js +57 -57
- package/dist/tooltip.js +54 -54
- 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 +75 -75
- package/dist/uploader.js +158 -158
- package/dist/validator/validators.js +48 -48
- package/dist/validator.js +24 -24
- 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 +108 -107
- package/scss/basic.scss +16 -16
- package/scss/ckeditor/skins/tao/scss/inc/_ck-icons.scss +59 -59
- package/scss/ckeditor/skins/tao/scss/inc/_tao.scss +59 -59
- package/scss/font/tao/tao.svg +234 -234
- 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 -88
- package/scss/inc/_feedback.scss +150 -150
- 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 +226 -226
- package/scss/inc/fonts/_tao-icon-def.scss +12 -12
- package/scss/inc/fonts/_tao-icon-vars.scss +240 -240
- 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 +1029 -1029
- 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 +736 -736
- 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 +297 -297
- package/src/css/basic.css +103 -103
- 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 +184 -184
- 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 +11 -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 -146
- 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 +222 -222
- 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 +554 -554
- package/src/feedback/feedback.tpl +7 -7
- package/src/feedback.js +295 -295
- package/src/figure/FigureStateActive.js +174 -174
- package/src/filesender.js +114 -114
- package/src/filter/template.tpl +5 -5
- package/src/filter.js +135 -135
- 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 +53 -53
- package/src/formValidator/formValidator.js +253 -253
- package/src/formValidator/highlighters/highlighter.js +102 -102
- package/src/formValidator/highlighters/message.js +70 -70
- 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 +67 -67
- 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 +132 -132
- 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 +65 -65
- 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 +1166 -1166
- 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 +319 -319
- package/src/inplacer.js +316 -316
- 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 +282 -282
- package/src/keyNavigation/navigator.js +543 -543
- 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 +251 -251
- 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 +395 -395
- package/src/login/login.js +322 -322
- 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 +191 -191
- 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 +62 -62
- 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 +189 -189
- 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 +107 -107
- 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 +74 -0
- package/src/propertySelector/css/propertySelector.css.map +1 -0
- package/src/propertySelector/propertySelector.js +286 -0
- package/src/propertySelector/scss/propertySelector.scss +66 -0
- package/src/propertySelector/tpl/highlighted-text.tpl +1 -0
- package/src/propertySelector/tpl/property-description.tpl +13 -0
- package/src/propertySelector/tpl/property-selector.tpl +7 -0
- 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 +400 -400
- 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 +348 -348
- 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 -601
- package/src/searchModal/css/advancedSearch.css +7 -14
- package/src/searchModal/css/advancedSearch.css.map +1 -1
- package/src/searchModal/css/searchModal.css +29 -8
- package/src/searchModal/css/searchModal.css.map +1 -1
- package/src/searchModal/scss/advancedSearch.scss +171 -177
- package/src/searchModal/scss/searchModal.scss +393 -375
- package/src/searchModal/tpl/advanced-search.tpl +9 -9
- package/src/searchModal/tpl/criteria-alias.tpl +1 -0
- package/src/searchModal/tpl/criteria-class-label.tpl +1 -0
- package/src/searchModal/tpl/criteria-label.tpl +1 -0
- package/src/searchModal/tpl/highlighted-text.tpl +1 -0
- 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 -25
- package/src/searchModal/tpl/list-checkbox-criterion.tpl +17 -12
- package/src/searchModal/tpl/list-select-criterion.tpl +12 -6
- package/src/searchModal/tpl/property-select-button.tpl +1 -0
- package/src/searchModal/tpl/results-container.tpl +1 -0
- package/src/searchModal/tpl/text-criterion.tpl +11 -6
- package/src/searchModal.js +761 -496
- 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 +218 -218
- 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 +109 -109
- 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 +220 -220
- package/src/validator.js +264 -264
- 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,451 +1,451 @@
|
|
|
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) 2016 (original work) Open Assessment Technologies SA ;
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>
|
|
20
|
-
*/
|
|
21
|
-
import _ from 'lodash';
|
|
22
|
-
import matchTpl from 'ui/documentViewer/providers/pdfViewer/pdfjs/match';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Map of special chars to normalize
|
|
26
|
-
* @type {Object}
|
|
27
|
-
*/
|
|
28
|
-
var charactersToNormalize = {
|
|
29
|
-
'\u2018': "'", // Left single quotation mark
|
|
30
|
-
'\u2019': "'", // Right single quotation mark
|
|
31
|
-
'\u201A': "'", // Single low-9 quotation mark
|
|
32
|
-
'\u201B': "'", // Single high-reversed-9 quotation mark
|
|
33
|
-
'\u201C': '"', // Left double quotation mark
|
|
34
|
-
'\u201D': '"', // Right double quotation mark
|
|
35
|
-
'\u201E': '"', // Double low-9 quotation mark
|
|
36
|
-
'\u201F': '"', // Double high-reversed-9 quotation mark
|
|
37
|
-
'\u00BC': '1/4', // Vulgar fraction one quarter
|
|
38
|
-
'\u00BD': '1/2', // Vulgar fraction one half
|
|
39
|
-
'\u00BE': '3/4' // Vulgar fraction three quarters
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* RegExp that will match special chars to normalize
|
|
44
|
-
* @type {RegExp}
|
|
45
|
-
*/
|
|
46
|
-
var normalizationRegex = new RegExp('[' + Object.keys(charactersToNormalize).join('') + ']', 'g');
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Replaces special chars by normalized equivalent
|
|
50
|
-
* @param {String} text
|
|
51
|
-
* @returns {String}
|
|
52
|
-
*/
|
|
53
|
-
function normalizeSpecialChars(text) {
|
|
54
|
-
return text.replace(normalizationRegex, function(ch) {
|
|
55
|
-
return charactersToNormalize[ch];
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Find terms in a text
|
|
61
|
-
* @param {String} query
|
|
62
|
-
* @param {String} text
|
|
63
|
-
* @returns {Array}
|
|
64
|
-
*/
|
|
65
|
-
function findInText(query, text) {
|
|
66
|
-
var queryLen = query.length;
|
|
67
|
-
var index,
|
|
68
|
-
end = 0;
|
|
69
|
-
var matches = [];
|
|
70
|
-
|
|
71
|
-
if (queryLen) {
|
|
72
|
-
do {
|
|
73
|
-
index = text.indexOf(query, end);
|
|
74
|
-
end = index + queryLen;
|
|
75
|
-
if (index !== -1) {
|
|
76
|
-
matches.push([index, end]);
|
|
77
|
-
}
|
|
78
|
-
} while (index !== -1);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return matches;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Find the query in the whole document
|
|
86
|
-
* @param {String} query
|
|
87
|
-
* @param {Array} contentText
|
|
88
|
-
* @param {Object} config
|
|
89
|
-
* @returns {Array}
|
|
90
|
-
*/
|
|
91
|
-
function findInDocument(query, contentText, config) {
|
|
92
|
-
var normalizedQuery = normalizeSpecialChars(query);
|
|
93
|
-
|
|
94
|
-
if (!config.caseSensitive) {
|
|
95
|
-
normalizedQuery = normalizedQuery.toLowerCase();
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return _.times(contentText.length, function(pageIndex) {
|
|
99
|
-
var pageContent = normalizeSpecialChars(contentText[pageIndex]);
|
|
100
|
-
|
|
101
|
-
if (!config.caseSensitive) {
|
|
102
|
-
pageContent = pageContent.toLowerCase();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return findInText(normalizedQuery, pageContent);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Wraps a text into a highlighting span
|
|
111
|
-
* @param {String} text - The text to highlight
|
|
112
|
-
* @param {Number} index - The match index
|
|
113
|
-
* @param {String} [cls] - An additional CSS class to set
|
|
114
|
-
* @returns {String}
|
|
115
|
-
*/
|
|
116
|
-
function highlight(text, index, cls) {
|
|
117
|
-
return matchTpl({
|
|
118
|
-
text: text,
|
|
119
|
-
index: index,
|
|
120
|
-
cls: cls
|
|
121
|
-
}).trim();
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Highlights a substring in a text
|
|
126
|
-
* @param {String} text - The text in which highlight the substring
|
|
127
|
-
* @param {Number} start - The start position of the substring in the text
|
|
128
|
-
* @param {Number} end - The end position of the substring in the text
|
|
129
|
-
* @param {Number} index - The match index
|
|
130
|
-
* @param {String} [cls] - An additional CSS class to set
|
|
131
|
-
* @returns {String}
|
|
132
|
-
*/
|
|
133
|
-
function highlightInText(text, start, end, index, cls) {
|
|
134
|
-
return text.substring(0, start) + highlight(text.substring(start, end), index, cls) + text.substring(end);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Refines the array of matches to provide positions inside the text layer per nodes basis
|
|
139
|
-
* @param {Array} matches
|
|
140
|
-
* @param {Object} pageContent
|
|
141
|
-
* @returns {Array}
|
|
142
|
-
*/
|
|
143
|
-
function refineMatches(matches, pageContent) {
|
|
144
|
-
var refinedMatches = [];
|
|
145
|
-
var textItems = pageContent.content.items;
|
|
146
|
-
var count = textItems.length;
|
|
147
|
-
var cursor = 0;
|
|
148
|
-
var strPos = 0;
|
|
149
|
-
|
|
150
|
-
_.forEach(matches, function(match, index) {
|
|
151
|
-
var matchStart = match[0];
|
|
152
|
-
var matchEnd = match[1];
|
|
153
|
-
var position = {
|
|
154
|
-
index: index
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
while (cursor < count && matchStart >= strPos + textItems[cursor].str.length) {
|
|
158
|
-
strPos += textItems[cursor].str.length;
|
|
159
|
-
cursor++;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
position.begin = {
|
|
163
|
-
node: cursor,
|
|
164
|
-
offset: matchStart - strPos
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
while (cursor < count && matchEnd > strPos + textItems[cursor].str.length) {
|
|
168
|
-
strPos += textItems[cursor].str.length;
|
|
169
|
-
cursor++;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
position.end = {
|
|
173
|
-
node: cursor,
|
|
174
|
-
offset: matchEnd - strPos
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
refinedMatches.push(position);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
return refinedMatches;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Renders the matches into the text layer
|
|
185
|
-
* @param {Array} matches
|
|
186
|
-
* @param {Object} pageContent
|
|
187
|
-
* @param {Number} [selectedMatch]
|
|
188
|
-
*/
|
|
189
|
-
function renderMatches(matches, pageContent, selectedMatch) {
|
|
190
|
-
var positions = refineMatches(matches, pageContent);
|
|
191
|
-
var matchIndex = positions.length - 1;
|
|
192
|
-
var nodes = pageContent.nodes;
|
|
193
|
-
var selected = matchIndex === selectedMatch;
|
|
194
|
-
|
|
195
|
-
_.forEachRight(nodes, function(node, nodeIndex) {
|
|
196
|
-
var nodeText = pageContent.content.items[nodeIndex].str;
|
|
197
|
-
var match, startInNode, endInNode, nodeInMatch, cls;
|
|
198
|
-
|
|
199
|
-
while (matchIndex >= 0) {
|
|
200
|
-
match = positions[matchIndex];
|
|
201
|
-
startInNode = match.begin.node === nodeIndex;
|
|
202
|
-
endInNode = match.end.node === nodeIndex;
|
|
203
|
-
nodeInMatch = nodeIndex > match.begin.node && nodeIndex < match.end.node;
|
|
204
|
-
cls = selected ? ' selected' : '';
|
|
205
|
-
|
|
206
|
-
if (startInNode && endInNode) {
|
|
207
|
-
nodeText = highlightInText(nodeText, match.begin.offset, match.end.offset, match.index, cls);
|
|
208
|
-
matchIndex--;
|
|
209
|
-
} else if (startInNode) {
|
|
210
|
-
nodeText = highlightInText(nodeText, match.begin.offset, nodeText.length, match.index, 'begin' + cls);
|
|
211
|
-
matchIndex--;
|
|
212
|
-
} else if (endInNode) {
|
|
213
|
-
nodeText = highlightInText(nodeText, 0, match.end.offset, match.index, 'end' + cls);
|
|
214
|
-
break;
|
|
215
|
-
} else if (nodeInMatch) {
|
|
216
|
-
nodeText = highlight(nodeText, match.index, 'middle' + cls);
|
|
217
|
-
break;
|
|
218
|
-
} else {
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
selected = matchIndex === selectedMatch;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
node.innerHTML = nodeText;
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Embeds the search engine for the PDF viewer
|
|
231
|
-
* @param {Object} config A config set
|
|
232
|
-
* @param {Object} config.textManager - The textManager component that gives access to the text content
|
|
233
|
-
* @param {Boolean} [config.caseSensitive] - Use a case sensitive search when the search feature is available
|
|
234
|
-
* @returns {Object} Returns the search engine instance
|
|
235
|
-
*/
|
|
236
|
-
function pdfjsSearchFactory(config) {
|
|
237
|
-
var textManager = null;
|
|
238
|
-
var currentQuery = null;
|
|
239
|
-
var currentMatch = null;
|
|
240
|
-
var matches = [];
|
|
241
|
-
var pages = [];
|
|
242
|
-
var count = 0;
|
|
243
|
-
|
|
244
|
-
config = config || {};
|
|
245
|
-
textManager = config.textManager;
|
|
246
|
-
|
|
247
|
-
if (!_.isPlainObject(textManager)) {
|
|
248
|
-
throw new TypeError(
|
|
249
|
-
'You must provide a textManager to give access to the PDF text content! [config.textManager is missing]'
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
/**
|
|
255
|
-
* Gets the list of page numbers that lead to search matches
|
|
256
|
-
* @returns {Array}
|
|
257
|
-
*/
|
|
258
|
-
getPages: function getPages() {
|
|
259
|
-
return pages;
|
|
260
|
-
},
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Gets the search matches
|
|
264
|
-
* @returns {Array}
|
|
265
|
-
*/
|
|
266
|
-
getMatches: function getMatches() {
|
|
267
|
-
return matches;
|
|
268
|
-
},
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Gets the number of search matches
|
|
272
|
-
* @returns {Number}
|
|
273
|
-
*/
|
|
274
|
-
getMatchCount: function getMatchCount() {
|
|
275
|
-
return count;
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Clears the search matches
|
|
280
|
-
*/
|
|
281
|
-
clearMatches: function clearMatches() {
|
|
282
|
-
currentMatch = null;
|
|
283
|
-
matches = [];
|
|
284
|
-
pages = [];
|
|
285
|
-
count = 0;
|
|
286
|
-
},
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Sets the text manager
|
|
290
|
-
* @param {Object} manager
|
|
291
|
-
*/
|
|
292
|
-
setTextManager: function setTextManager(manager) {
|
|
293
|
-
textManager = manager;
|
|
294
|
-
},
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Gets the text manager
|
|
298
|
-
* @returns {Object}
|
|
299
|
-
*/
|
|
300
|
-
getTextManager: function getTextManager() {
|
|
301
|
-
return textManager;
|
|
302
|
-
},
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Gets the currently matched query
|
|
306
|
-
* @returns {String}
|
|
307
|
-
*/
|
|
308
|
-
getQuery: function getQuery() {
|
|
309
|
-
return currentQuery;
|
|
310
|
-
},
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Gets the current match data. It contains:
|
|
314
|
-
* - overall: the index of the match over all the document, starting at 1
|
|
315
|
-
* - page: the page number of the match, starting at 1
|
|
316
|
-
* - index: the index of the match within its page, starting at 0
|
|
317
|
-
* @returns {Object}
|
|
318
|
-
*/
|
|
319
|
-
getCurrentMatch: function getCurrentMatch() {
|
|
320
|
-
return currentMatch;
|
|
321
|
-
},
|
|
322
|
-
|
|
323
|
-
/**
|
|
324
|
-
* Go to the previous match and returns the match data
|
|
325
|
-
* @returns {Boolean} Returns true if the search has reached the beginning of the document and moved to the end.
|
|
326
|
-
*/
|
|
327
|
-
previousMatch: function previousMatch() {
|
|
328
|
-
var pageIndex;
|
|
329
|
-
var loop = false;
|
|
330
|
-
if (currentMatch) {
|
|
331
|
-
if (currentMatch.index) {
|
|
332
|
-
currentMatch.index--;
|
|
333
|
-
} else {
|
|
334
|
-
pageIndex = _.indexOf(pages, currentMatch.page);
|
|
335
|
-
loop = !pageIndex;
|
|
336
|
-
currentMatch.page = pages[(pageIndex + pages.length - 1) % pages.length];
|
|
337
|
-
currentMatch.index = matches[currentMatch.page - 1].length - 1;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// the overall index start at 1 instead of 0, so the formula is a little bit more complex
|
|
341
|
-
currentMatch.overall = ((currentMatch.overall + count - 2) % count) + 1;
|
|
342
|
-
}
|
|
343
|
-
return loop;
|
|
344
|
-
},
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Go to the next match and returns the match data
|
|
348
|
-
* @returns {Boolean} Returns true if the search has reached the end of the document and moved to the beginning.
|
|
349
|
-
*/
|
|
350
|
-
nextMatch: function nextMatch() {
|
|
351
|
-
var pageIndex;
|
|
352
|
-
var loop = false;
|
|
353
|
-
if (currentMatch) {
|
|
354
|
-
if (currentMatch.index + 1 < matches[currentMatch.page - 1].length) {
|
|
355
|
-
currentMatch.index++;
|
|
356
|
-
} else {
|
|
357
|
-
pageIndex = _.indexOf(pages, currentMatch.page);
|
|
358
|
-
loop = pageIndex === pages.length - 1;
|
|
359
|
-
currentMatch.page = pages[(pageIndex + 1) % pages.length];
|
|
360
|
-
currentMatch.index = 0;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// the overall index start at 1 instead of 0, so the formula is a little bit more complex
|
|
364
|
-
currentMatch.overall = (currentMatch.overall % count) + 1;
|
|
365
|
-
}
|
|
366
|
-
return loop;
|
|
367
|
-
},
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Searches for the requested query.
|
|
371
|
-
* The promise will return the page number of the first match, that could be 0 if no result has been found.
|
|
372
|
-
* @param {String} query - The terms to search for
|
|
373
|
-
* @param {Number} [pageNum] - An optional page number from which start the search
|
|
374
|
-
* @returns {Promise}
|
|
375
|
-
*/
|
|
376
|
-
search: function search(query, pageNum) {
|
|
377
|
-
matches = null;
|
|
378
|
-
return textManager.getContents().then(function(pageContents) {
|
|
379
|
-
var contentText = _.map(pageContents, 'text');
|
|
380
|
-
var firstPage = 0;
|
|
381
|
-
var firstMatch = 0;
|
|
382
|
-
matches = findInDocument(query, contentText, config);
|
|
383
|
-
|
|
384
|
-
currentQuery = query;
|
|
385
|
-
currentMatch = null;
|
|
386
|
-
pages = [];
|
|
387
|
-
count = 0;
|
|
388
|
-
_.forEach(matches, function(pageMatches, pageIndex) {
|
|
389
|
-
var page = pageIndex + 1;
|
|
390
|
-
|
|
391
|
-
if (pageMatches.length > 0) {
|
|
392
|
-
pages.push(page);
|
|
393
|
-
|
|
394
|
-
if (!firstPage && page >= pageNum) {
|
|
395
|
-
firstPage = page;
|
|
396
|
-
firstMatch = count;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
count += pageMatches.length;
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
if (!firstPage) {
|
|
404
|
-
firstPage = pages[0] || 0;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
if (firstPage) {
|
|
408
|
-
currentMatch = {
|
|
409
|
-
overall: firstMatch + 1, // the overall index of the match
|
|
410
|
-
page: firstPage, // the page number of the match
|
|
411
|
-
index: 0 // the index of the match within its page
|
|
412
|
-
};
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
return firstPage;
|
|
416
|
-
});
|
|
417
|
-
},
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Displays the search matches on the rendered page
|
|
421
|
-
* @param {Number} pageNum - The page number of the rendered page
|
|
422
|
-
* @returns {Promise}
|
|
423
|
-
*/
|
|
424
|
-
updateMatches: function updateMatches(pageNum) {
|
|
425
|
-
return textManager.getPageContent(pageNum).then(function(pageContent) {
|
|
426
|
-
var selectedMatch;
|
|
427
|
-
if (currentMatch && currentMatch.page === pageNum) {
|
|
428
|
-
selectedMatch = currentMatch.index;
|
|
429
|
-
}
|
|
430
|
-
if (pageContent) {
|
|
431
|
-
renderMatches(matches[pageNum - 1], pageContent, selectedMatch);
|
|
432
|
-
}
|
|
433
|
-
return pageNum;
|
|
434
|
-
});
|
|
435
|
-
},
|
|
436
|
-
|
|
437
|
-
/**
|
|
438
|
-
* Destroys the search engine and frees the resources
|
|
439
|
-
*/
|
|
440
|
-
destroy: function destroy() {
|
|
441
|
-
textManager = null;
|
|
442
|
-
currentQuery = null;
|
|
443
|
-
currentMatch = null;
|
|
444
|
-
matches = null;
|
|
445
|
-
pages = null;
|
|
446
|
-
config = null;
|
|
447
|
-
}
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
export default pdfjsSearchFactory;
|
|
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) 2016 (original work) Open Assessment Technologies SA ;
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>
|
|
20
|
+
*/
|
|
21
|
+
import _ from 'lodash';
|
|
22
|
+
import matchTpl from 'ui/documentViewer/providers/pdfViewer/pdfjs/match';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Map of special chars to normalize
|
|
26
|
+
* @type {Object}
|
|
27
|
+
*/
|
|
28
|
+
var charactersToNormalize = {
|
|
29
|
+
'\u2018': "'", // Left single quotation mark
|
|
30
|
+
'\u2019': "'", // Right single quotation mark
|
|
31
|
+
'\u201A': "'", // Single low-9 quotation mark
|
|
32
|
+
'\u201B': "'", // Single high-reversed-9 quotation mark
|
|
33
|
+
'\u201C': '"', // Left double quotation mark
|
|
34
|
+
'\u201D': '"', // Right double quotation mark
|
|
35
|
+
'\u201E': '"', // Double low-9 quotation mark
|
|
36
|
+
'\u201F': '"', // Double high-reversed-9 quotation mark
|
|
37
|
+
'\u00BC': '1/4', // Vulgar fraction one quarter
|
|
38
|
+
'\u00BD': '1/2', // Vulgar fraction one half
|
|
39
|
+
'\u00BE': '3/4' // Vulgar fraction three quarters
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* RegExp that will match special chars to normalize
|
|
44
|
+
* @type {RegExp}
|
|
45
|
+
*/
|
|
46
|
+
var normalizationRegex = new RegExp('[' + Object.keys(charactersToNormalize).join('') + ']', 'g');
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Replaces special chars by normalized equivalent
|
|
50
|
+
* @param {String} text
|
|
51
|
+
* @returns {String}
|
|
52
|
+
*/
|
|
53
|
+
function normalizeSpecialChars(text) {
|
|
54
|
+
return text.replace(normalizationRegex, function(ch) {
|
|
55
|
+
return charactersToNormalize[ch];
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Find terms in a text
|
|
61
|
+
* @param {String} query
|
|
62
|
+
* @param {String} text
|
|
63
|
+
* @returns {Array}
|
|
64
|
+
*/
|
|
65
|
+
function findInText(query, text) {
|
|
66
|
+
var queryLen = query.length;
|
|
67
|
+
var index,
|
|
68
|
+
end = 0;
|
|
69
|
+
var matches = [];
|
|
70
|
+
|
|
71
|
+
if (queryLen) {
|
|
72
|
+
do {
|
|
73
|
+
index = text.indexOf(query, end);
|
|
74
|
+
end = index + queryLen;
|
|
75
|
+
if (index !== -1) {
|
|
76
|
+
matches.push([index, end]);
|
|
77
|
+
}
|
|
78
|
+
} while (index !== -1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return matches;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Find the query in the whole document
|
|
86
|
+
* @param {String} query
|
|
87
|
+
* @param {Array} contentText
|
|
88
|
+
* @param {Object} config
|
|
89
|
+
* @returns {Array}
|
|
90
|
+
*/
|
|
91
|
+
function findInDocument(query, contentText, config) {
|
|
92
|
+
var normalizedQuery = normalizeSpecialChars(query);
|
|
93
|
+
|
|
94
|
+
if (!config.caseSensitive) {
|
|
95
|
+
normalizedQuery = normalizedQuery.toLowerCase();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return _.times(contentText.length, function(pageIndex) {
|
|
99
|
+
var pageContent = normalizeSpecialChars(contentText[pageIndex]);
|
|
100
|
+
|
|
101
|
+
if (!config.caseSensitive) {
|
|
102
|
+
pageContent = pageContent.toLowerCase();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return findInText(normalizedQuery, pageContent);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Wraps a text into a highlighting span
|
|
111
|
+
* @param {String} text - The text to highlight
|
|
112
|
+
* @param {Number} index - The match index
|
|
113
|
+
* @param {String} [cls] - An additional CSS class to set
|
|
114
|
+
* @returns {String}
|
|
115
|
+
*/
|
|
116
|
+
function highlight(text, index, cls) {
|
|
117
|
+
return matchTpl({
|
|
118
|
+
text: text,
|
|
119
|
+
index: index,
|
|
120
|
+
cls: cls
|
|
121
|
+
}).trim();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Highlights a substring in a text
|
|
126
|
+
* @param {String} text - The text in which highlight the substring
|
|
127
|
+
* @param {Number} start - The start position of the substring in the text
|
|
128
|
+
* @param {Number} end - The end position of the substring in the text
|
|
129
|
+
* @param {Number} index - The match index
|
|
130
|
+
* @param {String} [cls] - An additional CSS class to set
|
|
131
|
+
* @returns {String}
|
|
132
|
+
*/
|
|
133
|
+
function highlightInText(text, start, end, index, cls) {
|
|
134
|
+
return text.substring(0, start) + highlight(text.substring(start, end), index, cls) + text.substring(end);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Refines the array of matches to provide positions inside the text layer per nodes basis
|
|
139
|
+
* @param {Array} matches
|
|
140
|
+
* @param {Object} pageContent
|
|
141
|
+
* @returns {Array}
|
|
142
|
+
*/
|
|
143
|
+
function refineMatches(matches, pageContent) {
|
|
144
|
+
var refinedMatches = [];
|
|
145
|
+
var textItems = pageContent.content.items;
|
|
146
|
+
var count = textItems.length;
|
|
147
|
+
var cursor = 0;
|
|
148
|
+
var strPos = 0;
|
|
149
|
+
|
|
150
|
+
_.forEach(matches, function(match, index) {
|
|
151
|
+
var matchStart = match[0];
|
|
152
|
+
var matchEnd = match[1];
|
|
153
|
+
var position = {
|
|
154
|
+
index: index
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
while (cursor < count && matchStart >= strPos + textItems[cursor].str.length) {
|
|
158
|
+
strPos += textItems[cursor].str.length;
|
|
159
|
+
cursor++;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
position.begin = {
|
|
163
|
+
node: cursor,
|
|
164
|
+
offset: matchStart - strPos
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
while (cursor < count && matchEnd > strPos + textItems[cursor].str.length) {
|
|
168
|
+
strPos += textItems[cursor].str.length;
|
|
169
|
+
cursor++;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
position.end = {
|
|
173
|
+
node: cursor,
|
|
174
|
+
offset: matchEnd - strPos
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
refinedMatches.push(position);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
return refinedMatches;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Renders the matches into the text layer
|
|
185
|
+
* @param {Array} matches
|
|
186
|
+
* @param {Object} pageContent
|
|
187
|
+
* @param {Number} [selectedMatch]
|
|
188
|
+
*/
|
|
189
|
+
function renderMatches(matches, pageContent, selectedMatch) {
|
|
190
|
+
var positions = refineMatches(matches, pageContent);
|
|
191
|
+
var matchIndex = positions.length - 1;
|
|
192
|
+
var nodes = pageContent.nodes;
|
|
193
|
+
var selected = matchIndex === selectedMatch;
|
|
194
|
+
|
|
195
|
+
_.forEachRight(nodes, function(node, nodeIndex) {
|
|
196
|
+
var nodeText = pageContent.content.items[nodeIndex].str;
|
|
197
|
+
var match, startInNode, endInNode, nodeInMatch, cls;
|
|
198
|
+
|
|
199
|
+
while (matchIndex >= 0) {
|
|
200
|
+
match = positions[matchIndex];
|
|
201
|
+
startInNode = match.begin.node === nodeIndex;
|
|
202
|
+
endInNode = match.end.node === nodeIndex;
|
|
203
|
+
nodeInMatch = nodeIndex > match.begin.node && nodeIndex < match.end.node;
|
|
204
|
+
cls = selected ? ' selected' : '';
|
|
205
|
+
|
|
206
|
+
if (startInNode && endInNode) {
|
|
207
|
+
nodeText = highlightInText(nodeText, match.begin.offset, match.end.offset, match.index, cls);
|
|
208
|
+
matchIndex--;
|
|
209
|
+
} else if (startInNode) {
|
|
210
|
+
nodeText = highlightInText(nodeText, match.begin.offset, nodeText.length, match.index, 'begin' + cls);
|
|
211
|
+
matchIndex--;
|
|
212
|
+
} else if (endInNode) {
|
|
213
|
+
nodeText = highlightInText(nodeText, 0, match.end.offset, match.index, 'end' + cls);
|
|
214
|
+
break;
|
|
215
|
+
} else if (nodeInMatch) {
|
|
216
|
+
nodeText = highlight(nodeText, match.index, 'middle' + cls);
|
|
217
|
+
break;
|
|
218
|
+
} else {
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
selected = matchIndex === selectedMatch;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
node.innerHTML = nodeText;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Embeds the search engine for the PDF viewer
|
|
231
|
+
* @param {Object} config A config set
|
|
232
|
+
* @param {Object} config.textManager - The textManager component that gives access to the text content
|
|
233
|
+
* @param {Boolean} [config.caseSensitive] - Use a case sensitive search when the search feature is available
|
|
234
|
+
* @returns {Object} Returns the search engine instance
|
|
235
|
+
*/
|
|
236
|
+
function pdfjsSearchFactory(config) {
|
|
237
|
+
var textManager = null;
|
|
238
|
+
var currentQuery = null;
|
|
239
|
+
var currentMatch = null;
|
|
240
|
+
var matches = [];
|
|
241
|
+
var pages = [];
|
|
242
|
+
var count = 0;
|
|
243
|
+
|
|
244
|
+
config = config || {};
|
|
245
|
+
textManager = config.textManager;
|
|
246
|
+
|
|
247
|
+
if (!_.isPlainObject(textManager)) {
|
|
248
|
+
throw new TypeError(
|
|
249
|
+
'You must provide a textManager to give access to the PDF text content! [config.textManager is missing]'
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
/**
|
|
255
|
+
* Gets the list of page numbers that lead to search matches
|
|
256
|
+
* @returns {Array}
|
|
257
|
+
*/
|
|
258
|
+
getPages: function getPages() {
|
|
259
|
+
return pages;
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Gets the search matches
|
|
264
|
+
* @returns {Array}
|
|
265
|
+
*/
|
|
266
|
+
getMatches: function getMatches() {
|
|
267
|
+
return matches;
|
|
268
|
+
},
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Gets the number of search matches
|
|
272
|
+
* @returns {Number}
|
|
273
|
+
*/
|
|
274
|
+
getMatchCount: function getMatchCount() {
|
|
275
|
+
return count;
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Clears the search matches
|
|
280
|
+
*/
|
|
281
|
+
clearMatches: function clearMatches() {
|
|
282
|
+
currentMatch = null;
|
|
283
|
+
matches = [];
|
|
284
|
+
pages = [];
|
|
285
|
+
count = 0;
|
|
286
|
+
},
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Sets the text manager
|
|
290
|
+
* @param {Object} manager
|
|
291
|
+
*/
|
|
292
|
+
setTextManager: function setTextManager(manager) {
|
|
293
|
+
textManager = manager;
|
|
294
|
+
},
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Gets the text manager
|
|
298
|
+
* @returns {Object}
|
|
299
|
+
*/
|
|
300
|
+
getTextManager: function getTextManager() {
|
|
301
|
+
return textManager;
|
|
302
|
+
},
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Gets the currently matched query
|
|
306
|
+
* @returns {String}
|
|
307
|
+
*/
|
|
308
|
+
getQuery: function getQuery() {
|
|
309
|
+
return currentQuery;
|
|
310
|
+
},
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Gets the current match data. It contains:
|
|
314
|
+
* - overall: the index of the match over all the document, starting at 1
|
|
315
|
+
* - page: the page number of the match, starting at 1
|
|
316
|
+
* - index: the index of the match within its page, starting at 0
|
|
317
|
+
* @returns {Object}
|
|
318
|
+
*/
|
|
319
|
+
getCurrentMatch: function getCurrentMatch() {
|
|
320
|
+
return currentMatch;
|
|
321
|
+
},
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Go to the previous match and returns the match data
|
|
325
|
+
* @returns {Boolean} Returns true if the search has reached the beginning of the document and moved to the end.
|
|
326
|
+
*/
|
|
327
|
+
previousMatch: function previousMatch() {
|
|
328
|
+
var pageIndex;
|
|
329
|
+
var loop = false;
|
|
330
|
+
if (currentMatch) {
|
|
331
|
+
if (currentMatch.index) {
|
|
332
|
+
currentMatch.index--;
|
|
333
|
+
} else {
|
|
334
|
+
pageIndex = _.indexOf(pages, currentMatch.page);
|
|
335
|
+
loop = !pageIndex;
|
|
336
|
+
currentMatch.page = pages[(pageIndex + pages.length - 1) % pages.length];
|
|
337
|
+
currentMatch.index = matches[currentMatch.page - 1].length - 1;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// the overall index start at 1 instead of 0, so the formula is a little bit more complex
|
|
341
|
+
currentMatch.overall = ((currentMatch.overall + count - 2) % count) + 1;
|
|
342
|
+
}
|
|
343
|
+
return loop;
|
|
344
|
+
},
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Go to the next match and returns the match data
|
|
348
|
+
* @returns {Boolean} Returns true if the search has reached the end of the document and moved to the beginning.
|
|
349
|
+
*/
|
|
350
|
+
nextMatch: function nextMatch() {
|
|
351
|
+
var pageIndex;
|
|
352
|
+
var loop = false;
|
|
353
|
+
if (currentMatch) {
|
|
354
|
+
if (currentMatch.index + 1 < matches[currentMatch.page - 1].length) {
|
|
355
|
+
currentMatch.index++;
|
|
356
|
+
} else {
|
|
357
|
+
pageIndex = _.indexOf(pages, currentMatch.page);
|
|
358
|
+
loop = pageIndex === pages.length - 1;
|
|
359
|
+
currentMatch.page = pages[(pageIndex + 1) % pages.length];
|
|
360
|
+
currentMatch.index = 0;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// the overall index start at 1 instead of 0, so the formula is a little bit more complex
|
|
364
|
+
currentMatch.overall = (currentMatch.overall % count) + 1;
|
|
365
|
+
}
|
|
366
|
+
return loop;
|
|
367
|
+
},
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Searches for the requested query.
|
|
371
|
+
* The promise will return the page number of the first match, that could be 0 if no result has been found.
|
|
372
|
+
* @param {String} query - The terms to search for
|
|
373
|
+
* @param {Number} [pageNum] - An optional page number from which start the search
|
|
374
|
+
* @returns {Promise}
|
|
375
|
+
*/
|
|
376
|
+
search: function search(query, pageNum) {
|
|
377
|
+
matches = null;
|
|
378
|
+
return textManager.getContents().then(function(pageContents) {
|
|
379
|
+
var contentText = _.map(pageContents, 'text');
|
|
380
|
+
var firstPage = 0;
|
|
381
|
+
var firstMatch = 0;
|
|
382
|
+
matches = findInDocument(query, contentText, config);
|
|
383
|
+
|
|
384
|
+
currentQuery = query;
|
|
385
|
+
currentMatch = null;
|
|
386
|
+
pages = [];
|
|
387
|
+
count = 0;
|
|
388
|
+
_.forEach(matches, function(pageMatches, pageIndex) {
|
|
389
|
+
var page = pageIndex + 1;
|
|
390
|
+
|
|
391
|
+
if (pageMatches.length > 0) {
|
|
392
|
+
pages.push(page);
|
|
393
|
+
|
|
394
|
+
if (!firstPage && page >= pageNum) {
|
|
395
|
+
firstPage = page;
|
|
396
|
+
firstMatch = count;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
count += pageMatches.length;
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
if (!firstPage) {
|
|
404
|
+
firstPage = pages[0] || 0;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (firstPage) {
|
|
408
|
+
currentMatch = {
|
|
409
|
+
overall: firstMatch + 1, // the overall index of the match
|
|
410
|
+
page: firstPage, // the page number of the match
|
|
411
|
+
index: 0 // the index of the match within its page
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
return firstPage;
|
|
416
|
+
});
|
|
417
|
+
},
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Displays the search matches on the rendered page
|
|
421
|
+
* @param {Number} pageNum - The page number of the rendered page
|
|
422
|
+
* @returns {Promise}
|
|
423
|
+
*/
|
|
424
|
+
updateMatches: function updateMatches(pageNum) {
|
|
425
|
+
return textManager.getPageContent(pageNum).then(function(pageContent) {
|
|
426
|
+
var selectedMatch;
|
|
427
|
+
if (currentMatch && currentMatch.page === pageNum) {
|
|
428
|
+
selectedMatch = currentMatch.index;
|
|
429
|
+
}
|
|
430
|
+
if (pageContent) {
|
|
431
|
+
renderMatches(matches[pageNum - 1], pageContent, selectedMatch);
|
|
432
|
+
}
|
|
433
|
+
return pageNum;
|
|
434
|
+
});
|
|
435
|
+
},
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Destroys the search engine and frees the resources
|
|
439
|
+
*/
|
|
440
|
+
destroy: function destroy() {
|
|
441
|
+
textManager = null;
|
|
442
|
+
currentQuery = null;
|
|
443
|
+
currentMatch = null;
|
|
444
|
+
matches = null;
|
|
445
|
+
pages = null;
|
|
446
|
+
config = null;
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export default pdfjsSearchFactory;
|