statixite 1.0.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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +145 -0
- data/Rakefile +26 -0
- data/app/assets/images/statixite/STATIXITE-logo.png +0 -0
- data/app/assets/images/statixite/favicon.ico +0 -0
- data/app/assets/images/statixite/jekyll.png +0 -0
- data/app/assets/images/statixite/md-editor.png +0 -0
- data/app/assets/images/statixite/ring-alt.gif +0 -0
- data/app/assets/javascripts/controllers/statixite/deployments_create.js +13 -0
- data/app/assets/javascripts/controllers/statixite/deployments_index.js +13 -0
- data/app/assets/javascripts/controllers/statixite/sites_create.js +27 -0
- data/app/assets/javascripts/controllers/statixite/sites_new.js +27 -0
- data/app/assets/javascripts/controllers/statixite/templates_edit.js +208 -0
- data/app/assets/javascripts/statixite/application.js +8 -0
- data/app/assets/javascripts/statixite/array-helpers.js +13 -0
- data/app/assets/javascripts/statixite/editor.js +244 -0
- data/app/assets/javascripts/statixite/loader.js +14 -0
- data/app/assets/javascripts/statixite/notify-defaults.js +5 -0
- data/app/assets/stylesheets/statixite/application.less +271 -0
- data/app/assets/stylesheets/statixite/bootstrap-glyphicons.less +305 -0
- data/app/assets/stylesheets/statixite/bootstrap.less +58 -0
- data/app/assets/stylesheets/statixite/bootstrap_and_overrides.less +2 -0
- data/app/assets/stylesheets/statixite/landing-page.less +156 -0
- data/app/controllers/statixite/application_controller.rb +22 -0
- data/app/controllers/statixite/deployments_controller.rb +61 -0
- data/app/controllers/statixite/media_controller.rb +61 -0
- data/app/controllers/statixite/posts_controller.rb +68 -0
- data/app/controllers/statixite/sites_controller.rb +141 -0
- data/app/controllers/statixite/templates_controller.rb +233 -0
- data/app/helpers/statixite/application_helper.rb +63 -0
- data/app/models/statixite/deployment.rb +5 -0
- data/app/models/statixite/media.rb +7 -0
- data/app/models/statixite/post.rb +76 -0
- data/app/models/statixite/site.rb +76 -0
- data/app/services/statixite/deployment_service.rb +73 -0
- data/app/services/statixite/git_service.rb +102 -0
- data/app/services/statixite/site_deactivation_service.rb +52 -0
- data/app/services/statixite/site_operation_service.rb +251 -0
- data/app/uploaders/statixite/file_uploader.rb +14 -0
- data/app/validators/statixite/jekyll_template_validator.rb +16 -0
- data/app/validators/statixite/liquid_validator.rb +11 -0
- data/app/views/layouts/statixite/_dash_nav.html.haml +20 -0
- data/app/views/layouts/statixite/_flash.html.haml +13 -0
- data/app/views/layouts/statixite/_head.html.haml +12 -0
- data/app/views/layouts/statixite/_header.html.haml +30 -0
- data/app/views/layouts/statixite/_site_sub_items.html.haml +38 -0
- data/app/views/layouts/statixite/dashboard.html.haml +27 -0
- data/app/views/statixite/deployments/_modal.html.haml +18 -0
- data/app/views/statixite/deployments/index.html.haml +39 -0
- data/app/views/statixite/kaminari/_first_page.html.haml +2 -0
- data/app/views/statixite/kaminari/_gap.html.haml +2 -0
- data/app/views/statixite/kaminari/_last_page.html.haml +2 -0
- data/app/views/statixite/kaminari/_next_page.html.haml +2 -0
- data/app/views/statixite/kaminari/_page.html.haml +6 -0
- data/app/views/statixite/kaminari/_paginator.html.haml +11 -0
- data/app/views/statixite/kaminari/_prev_page.html.haml +2 -0
- data/app/views/statixite/media/_index.html.haml +13 -0
- data/app/views/statixite/media/_paginate.html.haml +1 -0
- data/app/views/statixite/media/index.html.haml +39 -0
- data/app/views/statixite/media/index.js.haml +2 -0
- data/app/views/statixite/posts/_form.html.haml +65 -0
- data/app/views/statixite/posts/_image_modal.html.haml +21 -0
- data/app/views/statixite/posts/_modals.html.haml +111 -0
- data/app/views/statixite/posts/_posts.html.haml +15 -0
- data/app/views/statixite/posts/edit.html.haml +6 -0
- data/app/views/statixite/posts/index.html.haml +4 -0
- data/app/views/statixite/posts/index.js.haml +1 -0
- data/app/views/statixite/posts/new.html.haml +5 -0
- data/app/views/statixite/sites/_sites.html.haml +27 -0
- data/app/views/statixite/sites/_templates.html.haml +26 -0
- data/app/views/statixite/sites/build_and_preview.html.haml +24 -0
- data/app/views/statixite/sites/index.html.haml +4 -0
- data/app/views/statixite/sites/index.js.haml +1 -0
- data/app/views/statixite/sites/new.html.haml +45 -0
- data/app/views/statixite/sites/settings.html.haml +77 -0
- data/app/views/statixite/templates/edit.html.haml +93 -0
- data/app/views/statixite/templates/upload_files.js.haml +2 -0
- data/config/routes.rb +24 -0
- data/db/migrate/20150525171543_create_statixite_sites.rb +15 -0
- data/db/migrate/20150530041055_create_statixite_posts.rb +14 -0
- data/db/migrate/20150610024047_create_statixite_deployments.rb +11 -0
- data/db/migrate/20151013131224_create_statixite_media.rb +10 -0
- data/lib/assets/templates.yaml +734 -0
- data/lib/generators/statixite/statixite_generator.rb +49 -0
- data/lib/statixite.rb +14 -0
- data/lib/statixite/cloud_sync.rb +104 -0
- data/lib/statixite/engine.rb +49 -0
- data/lib/statixite/version.rb +3 -0
- data/lib/tasks/statixite_tasks.rake +4 -0
- data/vendor/assets/bower_components/bootstrap/CHANGELOG.md +5 -0
- data/vendor/assets/bower_components/bootstrap/Gruntfile.js +533 -0
- data/vendor/assets/bower_components/bootstrap/LICENSE +21 -0
- data/vendor/assets/bower_components/bootstrap/README.md +139 -0
- data/vendor/assets/bower_components/bootstrap/bower.json +34 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css +587 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.css.map +1 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +6 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap-theme.min.css.map +1 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css +6760 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.css.map +1 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css +6 -0
- data/vendor/assets/bower_components/bootstrap/dist/css/bootstrap.min.css.map +1 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +288 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.js +2363 -0
- data/vendor/assets/bower_components/bootstrap/dist/js/bootstrap.min.js +7 -0
- data/vendor/assets/bower_components/bootstrap/dist/js/npm.js +13 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg +288 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/vendor/assets/bower_components/bootstrap/grunt/bs-commonjs-generator.js +30 -0
- data/vendor/assets/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js +42 -0
- data/vendor/assets/bower_components/bootstrap/grunt/bs-lessdoc-parser.js +237 -0
- data/vendor/assets/bower_components/bootstrap/grunt/bs-raw-files-generator.js +44 -0
- data/vendor/assets/bower_components/bootstrap/grunt/configBridge.json +46 -0
- data/vendor/assets/bower_components/bootstrap/grunt/sauce_browsers.yml +82 -0
- data/vendor/assets/bower_components/bootstrap/js/affix.js +162 -0
- data/vendor/assets/bower_components/bootstrap/js/alert.js +94 -0
- data/vendor/assets/bower_components/bootstrap/js/button.js +120 -0
- data/vendor/assets/bower_components/bootstrap/js/carousel.js +237 -0
- data/vendor/assets/bower_components/bootstrap/js/collapse.js +211 -0
- data/vendor/assets/bower_components/bootstrap/js/dropdown.js +165 -0
- data/vendor/assets/bower_components/bootstrap/js/modal.js +337 -0
- data/vendor/assets/bower_components/bootstrap/js/popover.js +108 -0
- data/vendor/assets/bower_components/bootstrap/js/scrollspy.js +172 -0
- data/vendor/assets/bower_components/bootstrap/js/tab.js +155 -0
- data/vendor/assets/bower_components/bootstrap/js/tooltip.js +514 -0
- data/vendor/assets/bower_components/bootstrap/js/transition.js +59 -0
- data/vendor/assets/bower_components/bootstrap/less/alerts.less +73 -0
- data/vendor/assets/bower_components/bootstrap/less/badges.less +66 -0
- data/vendor/assets/bower_components/bootstrap/less/bootstrap.less +56 -0
- data/vendor/assets/bower_components/bootstrap/less/breadcrumbs.less +26 -0
- data/vendor/assets/bower_components/bootstrap/less/button-groups.less +244 -0
- data/vendor/assets/bower_components/bootstrap/less/buttons.less +166 -0
- data/vendor/assets/bower_components/bootstrap/less/carousel.less +270 -0
- data/vendor/assets/bower_components/bootstrap/less/close.less +34 -0
- data/vendor/assets/bower_components/bootstrap/less/code.less +69 -0
- data/vendor/assets/bower_components/bootstrap/less/component-animations.less +33 -0
- data/vendor/assets/bower_components/bootstrap/less/dropdowns.less +216 -0
- data/vendor/assets/bower_components/bootstrap/less/forms.less +613 -0
- data/vendor/assets/bower_components/bootstrap/less/glyphicons.less +305 -0
- data/vendor/assets/bower_components/bootstrap/less/grid.less +84 -0
- data/vendor/assets/bower_components/bootstrap/less/input-groups.less +171 -0
- data/vendor/assets/bower_components/bootstrap/less/jumbotron.less +54 -0
- data/vendor/assets/bower_components/bootstrap/less/labels.less +64 -0
- data/vendor/assets/bower_components/bootstrap/less/list-group.less +130 -0
- data/vendor/assets/bower_components/bootstrap/less/media.less +66 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins.less +40 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/alerts.less +14 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/background-variant.less +9 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/border-radius.less +18 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/buttons.less +65 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/center-block.less +7 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/clearfix.less +22 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/forms.less +85 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/gradients.less +59 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/grid-framework.less +91 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/grid.less +122 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/hide-text.less +21 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/image.less +33 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/labels.less +12 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/list-group.less +30 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/nav-divider.less +10 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/nav-vertical-align.less +9 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/opacity.less +8 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/pagination.less +24 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/panels.less +24 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/progress-bar.less +10 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/reset-filter.less +8 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/reset-text.less +18 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/resize.less +6 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/responsive-visibility.less +15 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/size.less +10 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/tab-focus.less +9 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/table-row.less +28 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/text-emphasis.less +9 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/text-overflow.less +8 -0
- data/vendor/assets/bower_components/bootstrap/less/mixins/vendor-prefixes.less +227 -0
- data/vendor/assets/bower_components/bootstrap/less/modals.less +150 -0
- data/vendor/assets/bower_components/bootstrap/less/navbar.less +660 -0
- data/vendor/assets/bower_components/bootstrap/less/navs.less +242 -0
- data/vendor/assets/bower_components/bootstrap/less/normalize.less +424 -0
- data/vendor/assets/bower_components/bootstrap/less/pager.less +54 -0
- data/vendor/assets/bower_components/bootstrap/less/pagination.less +89 -0
- data/vendor/assets/bower_components/bootstrap/less/panels.less +271 -0
- data/vendor/assets/bower_components/bootstrap/less/popovers.less +131 -0
- data/vendor/assets/bower_components/bootstrap/less/print.less +101 -0
- data/vendor/assets/bower_components/bootstrap/less/progress-bars.less +87 -0
- data/vendor/assets/bower_components/bootstrap/less/responsive-embed.less +35 -0
- data/vendor/assets/bower_components/bootstrap/less/responsive-utilities.less +194 -0
- data/vendor/assets/bower_components/bootstrap/less/scaffolding.less +161 -0
- data/vendor/assets/bower_components/bootstrap/less/tables.less +234 -0
- data/vendor/assets/bower_components/bootstrap/less/theme.less +291 -0
- data/vendor/assets/bower_components/bootstrap/less/thumbnails.less +36 -0
- data/vendor/assets/bower_components/bootstrap/less/tooltip.less +101 -0
- data/vendor/assets/bower_components/bootstrap/less/type.less +302 -0
- data/vendor/assets/bower_components/bootstrap/less/utilities.less +55 -0
- data/vendor/assets/bower_components/bootstrap/less/variables.less +869 -0
- data/vendor/assets/bower_components/bootstrap/less/wells.less +29 -0
- data/vendor/assets/bower_components/bootstrap/nuget/MyGet.ps1 +8 -0
- data/vendor/assets/bower_components/bootstrap/nuget/bootstrap.less.nuspec +28 -0
- data/vendor/assets/bower_components/bootstrap/nuget/bootstrap.nuspec +28 -0
- data/vendor/assets/bower_components/bootstrap/package.js +32 -0
- data/vendor/assets/bower_components/bootstrap/package.json +87 -0
- data/vendor/assets/bower_components/jquery/AUTHORS.txt +275 -0
- data/vendor/assets/bower_components/jquery/LICENSE.txt +36 -0
- data/vendor/assets/bower_components/jquery/README.md +5 -0
- data/vendor/assets/bower_components/jquery/bower.json +14 -0
- data/vendor/assets/bower_components/jquery/dist/jquery.js +9831 -0
- data/vendor/assets/bower_components/jquery/dist/jquery.min.js +4 -0
- data/vendor/assets/bower_components/jquery/dist/jquery.min.map +1 -0
- data/vendor/assets/bower_components/jquery/src/ajax.js +845 -0
- data/vendor/assets/bower_components/jquery/src/ajax/jsonp.js +100 -0
- data/vendor/assets/bower_components/jquery/src/ajax/load.js +83 -0
- data/vendor/assets/bower_components/jquery/src/ajax/parseJSON.js +13 -0
- data/vendor/assets/bower_components/jquery/src/ajax/parseXML.js +27 -0
- data/vendor/assets/bower_components/jquery/src/ajax/script.js +68 -0
- data/vendor/assets/bower_components/jquery/src/ajax/var/location.js +3 -0
- data/vendor/assets/bower_components/jquery/src/ajax/var/nonce.js +5 -0
- data/vendor/assets/bower_components/jquery/src/ajax/var/rquery.js +3 -0
- data/vendor/assets/bower_components/jquery/src/ajax/xhr.js +167 -0
- data/vendor/assets/bower_components/jquery/src/attributes.js +11 -0
- data/vendor/assets/bower_components/jquery/src/attributes/attr.js +142 -0
- data/vendor/assets/bower_components/jquery/src/attributes/classes.js +177 -0
- data/vendor/assets/bower_components/jquery/src/attributes/prop.js +109 -0
- data/vendor/assets/bower_components/jquery/src/attributes/support.js +36 -0
- data/vendor/assets/bower_components/jquery/src/attributes/val.js +170 -0
- data/vendor/assets/bower_components/jquery/src/callbacks.js +232 -0
- data/vendor/assets/bower_components/jquery/src/core.js +489 -0
- data/vendor/assets/bower_components/jquery/src/core/access.js +65 -0
- data/vendor/assets/bower_components/jquery/src/core/init.js +134 -0
- data/vendor/assets/bower_components/jquery/src/core/parseHTML.js +49 -0
- data/vendor/assets/bower_components/jquery/src/core/ready.js +103 -0
- data/vendor/assets/bower_components/jquery/src/core/support.js +18 -0
- data/vendor/assets/bower_components/jquery/src/core/var/rsingleTag.js +5 -0
- data/vendor/assets/bower_components/jquery/src/css.js +515 -0
- data/vendor/assets/bower_components/jquery/src/css/addGetHookIf.js +24 -0
- data/vendor/assets/bower_components/jquery/src/css/adjustCSS.js +65 -0
- data/vendor/assets/bower_components/jquery/src/css/curCSS.js +57 -0
- data/vendor/assets/bower_components/jquery/src/css/defaultDisplay.js +72 -0
- data/vendor/assets/bower_components/jquery/src/css/hiddenVisibleSelectors.js +18 -0
- data/vendor/assets/bower_components/jquery/src/css/showHide.js +48 -0
- data/vendor/assets/bower_components/jquery/src/css/support.js +121 -0
- data/vendor/assets/bower_components/jquery/src/css/var/cssExpand.js +3 -0
- data/vendor/assets/bower_components/jquery/src/css/var/getStyles.js +15 -0
- data/vendor/assets/bower_components/jquery/src/css/var/isHidden.js +16 -0
- data/vendor/assets/bower_components/jquery/src/css/var/rmargin.js +3 -0
- data/vendor/assets/bower_components/jquery/src/css/var/rnumnonpx.js +5 -0
- data/vendor/assets/bower_components/jquery/src/css/var/swap.js +24 -0
- data/vendor/assets/bower_components/jquery/src/data.js +187 -0
- data/vendor/assets/bower_components/jquery/src/data/Data.js +200 -0
- data/vendor/assets/bower_components/jquery/src/data/accepts.js +20 -0
- data/vendor/assets/bower_components/jquery/src/data/support.js +23 -0
- data/vendor/assets/bower_components/jquery/src/data/var/acceptData.js +18 -0
- data/vendor/assets/bower_components/jquery/src/data/var/dataPriv.js +5 -0
- data/vendor/assets/bower_components/jquery/src/data/var/dataUser.js +5 -0
- data/vendor/assets/bower_components/jquery/src/deferred.js +158 -0
- data/vendor/assets/bower_components/jquery/src/deprecated.js +32 -0
- data/vendor/assets/bower_components/jquery/src/dimensions.js +54 -0
- data/vendor/assets/bower_components/jquery/src/effects.js +629 -0
- data/vendor/assets/bower_components/jquery/src/effects/Tween.js +121 -0
- data/vendor/assets/bower_components/jquery/src/effects/animatedSelector.js +13 -0
- data/vendor/assets/bower_components/jquery/src/effects/support.js +58 -0
- data/vendor/assets/bower_components/jquery/src/event.js +710 -0
- data/vendor/assets/bower_components/jquery/src/event/ajax.js +20 -0
- data/vendor/assets/bower_components/jquery/src/event/alias.js +27 -0
- data/vendor/assets/bower_components/jquery/src/event/focusin.js +53 -0
- data/vendor/assets/bower_components/jquery/src/event/support.js +9 -0
- data/vendor/assets/bower_components/jquery/src/event/trigger.js +199 -0
- data/vendor/assets/bower_components/jquery/src/exports/amd.js +24 -0
- data/vendor/assets/bower_components/jquery/src/exports/global.js +26 -0
- data/vendor/assets/bower_components/jquery/src/intro.js +44 -0
- data/vendor/assets/bower_components/jquery/src/jquery.js +37 -0
- data/vendor/assets/bower_components/jquery/src/manipulation.js +481 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/_evalUrl.js +20 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/buildFragment.js +102 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/createSafeFragment.js +20 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/getAll.js +21 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/setGlobalEval.js +20 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/support.js +33 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/var/nodeNames.js +5 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/var/rcheckableType.js +3 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/var/rleadingWhitespace.js +3 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/var/rscriptType.js +3 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/var/rtagName.js +3 -0
- data/vendor/assets/bower_components/jquery/src/manipulation/wrapMap.js +27 -0
- data/vendor/assets/bower_components/jquery/src/offset.js +221 -0
- data/vendor/assets/bower_components/jquery/src/outro.js +2 -0
- data/vendor/assets/bower_components/jquery/src/queue.js +143 -0
- data/vendor/assets/bower_components/jquery/src/queue/delay.js +22 -0
- data/vendor/assets/bower_components/jquery/src/selector-native.js +211 -0
- data/vendor/assets/bower_components/jquery/src/selector-sizzle.js +14 -0
- data/vendor/assets/bower_components/jquery/src/selector.js +1 -0
- data/vendor/assets/bower_components/jquery/src/serialize.js +125 -0
- data/vendor/assets/bower_components/jquery/src/support.js +63 -0
- data/vendor/assets/bower_components/jquery/src/traversing.js +175 -0
- data/vendor/assets/bower_components/jquery/src/traversing/findFilter.js +100 -0
- data/vendor/assets/bower_components/jquery/src/traversing/var/dir.js +20 -0
- data/vendor/assets/bower_components/jquery/src/traversing/var/rneedsContext.js +6 -0
- data/vendor/assets/bower_components/jquery/src/traversing/var/siblings.js +15 -0
- data/vendor/assets/bower_components/jquery/src/var/arr.js +3 -0
- data/vendor/assets/bower_components/jquery/src/var/class2type.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/concat.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/deletedIds.js +3 -0
- data/vendor/assets/bower_components/jquery/src/var/document.js +3 -0
- data/vendor/assets/bower_components/jquery/src/var/documentElement.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/hasOwn.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/indexOf.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/pnum.js +3 -0
- data/vendor/assets/bower_components/jquery/src/var/push.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/rcssNum.js +7 -0
- data/vendor/assets/bower_components/jquery/src/var/rnotwhite.js +3 -0
- data/vendor/assets/bower_components/jquery/src/var/slice.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/support.js +5 -0
- data/vendor/assets/bower_components/jquery/src/var/toString.js +5 -0
- data/vendor/assets/bower_components/jquery/src/wrap.js +79 -0
- data/vendor/assets/bower_components/jsoneditor/CONTRIBUTING.md +15 -0
- data/vendor/assets/bower_components/jsoneditor/HISTORY.md +457 -0
- data/vendor/assets/bower_components/jsoneditor/LICENSE +176 -0
- data/vendor/assets/bower_components/jsoneditor/NOTICE +17 -0
- data/vendor/assets/bower_components/jsoneditor/README.md +155 -0
- data/vendor/assets/bower_components/jsoneditor/bower.json +32 -0
- data/vendor/assets/bower_components/jsoneditor/dist/img/jsoneditor-icons.svg +893 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor-minimalist.js +9418 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor-minimalist.map +1 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor-minimalist.min.js +35 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor.css.less +879 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor.js +35095 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor.map +1 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor.min.css +1 -0
- data/vendor/assets/bower_components/jsoneditor/dist/jsoneditor.min.js +48 -0
- data/vendor/assets/bower_components/jsoneditor/dist/which files do I need.md +41 -0
- data/vendor/assets/bower_components/jsoneditor/docs/api.md +286 -0
- data/vendor/assets/bower_components/jsoneditor/docs/shortcut_keys.md +38 -0
- data/vendor/assets/bower_components/jsoneditor/docs/usage.md +117 -0
- data/vendor/assets/bower_components/jsoneditor/examples/01_basic_usage.html +49 -0
- data/vendor/assets/bower_components/jsoneditor/examples/02_viewer.html +44 -0
- data/vendor/assets/bower_components/jsoneditor/examples/03_switch_mode.html +66 -0
- data/vendor/assets/bower_components/jsoneditor/examples/04_load_and_save.html +62 -0
- data/vendor/assets/bower_components/jsoneditor/examples/05_custom_fields_editable.html +63 -0
- data/vendor/assets/bower_components/jsoneditor/examples/06_custom_styling.html +51 -0
- data/vendor/assets/bower_components/jsoneditor/examples/07_json_schema_validation.html +71 -0
- data/vendor/assets/bower_components/jsoneditor/examples/css/darktheme.css +76 -0
- data/vendor/assets/bower_components/jsoneditor/examples/requirejs_demo/requirejs_demo.html +21 -0
- data/vendor/assets/bower_components/jsoneditor/examples/requirejs_demo/scripts/main.js +25 -0
- data/vendor/assets/bower_components/jsoneditor/examples/requirejs_demo/scripts/require.js +36 -0
- data/vendor/assets/bower_components/jsoneditor/index.js +1 -0
- data/vendor/assets/bower_components/jsoneditor/package.json +41 -0
- data/vendor/assets/bower_components/jsoneditor/src/css/contextmenu.css +233 -0
- data/vendor/assets/bower_components/jsoneditor/src/css/img/description.txt +14 -0
- data/vendor/assets/bower_components/jsoneditor/src/css/img/jsoneditor-icons.svg +893 -0
- data/vendor/assets/bower_components/jsoneditor/src/css/jsoneditor.css +433 -0
- data/vendor/assets/bower_components/jsoneditor/src/css/menu.css +110 -0
- data/vendor/assets/bower_components/jsoneditor/src/css/searchbox.css +75 -0
- data/vendor/assets/bower_components/jsoneditor/src/docs/which files do I need.md +41 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/ContextMenu.js +455 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/Highlighter.js +84 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/History.js +252 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/JSONEditor.js +371 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/Node.js +3400 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/SearchBox.js +295 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/ace/index.js +9 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/ace/theme-jsoneditor.js +144 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/appendNodeFactory.js +226 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/assets/jsonlint/README.md +15 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/assets/jsonlint/jsonlint.js +418 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/header.js +29 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/modeswitcher.js +105 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/textmode.js +474 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/treemode.js +1150 -0
- data/vendor/assets/bower_components/jsoneditor/src/js/util.js +765 -0
- data/vendor/assets/bower_components/notifyjs/CHANGES.md +7 -0
- data/vendor/assets/bower_components/notifyjs/README.md +31 -0
- data/vendor/assets/bower_components/notifyjs/bower.json +14 -0
- data/vendor/assets/bower_components/notifyjs/dist/notify.js +586 -0
- data/vendor/assets/bower_components/notifyjs/dist/styles/metro/notify-metro.css +40 -0
- data/vendor/assets/bower_components/notifyjs/dist/styles/metro/notify-metro.js +39 -0
- data/vendor/assets/bower_components/notifyjs/examples/classes.html +49 -0
- data/vendor/assets/bower_components/notifyjs/examples/images/Mail.png +0 -0
- data/vendor/assets/bower_components/notifyjs/examples/inlines.html +111 -0
- data/vendor/assets/bower_components/notifyjs/examples/metro.html +37 -0
- data/vendor/assets/bower_components/notifyjs/examples/multi-text.html +55 -0
- data/vendor/assets/bower_components/notifyjs/examples/position.html +42 -0
- data/vendor/assets/bower_components/notifyjs/notify.jquery.json +28 -0
- data/vendor/assets/bower_components/notifyjs/package.json +18 -0
- data/vendor/assets/bower_components/vue/LICENSE +21 -0
- data/vendor/assets/bower_components/vue/bower.json +19 -0
- data/vendor/assets/bower_components/vue/dist/vue.js +10198 -0
- data/vendor/assets/bower_components/vue/dist/vue.min.js +8 -0
- data/vendor/assets/bower_components/vue/src/api/child.js +49 -0
- data/vendor/assets/bower_components/vue/src/api/data.js +159 -0
- data/vendor/assets/bower_components/vue/src/api/dom.js +226 -0
- data/vendor/assets/bower_components/vue/src/api/events.js +174 -0
- data/vendor/assets/bower_components/vue/src/api/global.js +129 -0
- data/vendor/assets/bower_components/vue/src/api/lifecycle.js +68 -0
- data/vendor/assets/bower_components/vue/src/batcher.js +98 -0
- data/vendor/assets/bower_components/vue/src/cache.js +112 -0
- data/vendor/assets/bower_components/vue/src/compiler/compile-props.js +183 -0
- data/vendor/assets/bower_components/vue/src/compiler/compile.js +630 -0
- data/vendor/assets/bower_components/vue/src/compiler/index.js +4 -0
- data/vendor/assets/bower_components/vue/src/compiler/transclude.js +144 -0
- data/vendor/assets/bower_components/vue/src/config.js +124 -0
- data/vendor/assets/bower_components/vue/src/directive.js +254 -0
- data/vendor/assets/bower_components/vue/src/directives/attr.js +59 -0
- data/vendor/assets/bower_components/vue/src/directives/class.js +70 -0
- data/vendor/assets/bower_components/vue/src/directives/cloak.js +10 -0
- data/vendor/assets/bower_components/vue/src/directives/component.js +344 -0
- data/vendor/assets/bower_components/vue/src/directives/el.js +12 -0
- data/vendor/assets/bower_components/vue/src/directives/html.js +40 -0
- data/vendor/assets/bower_components/vue/src/directives/if.js +125 -0
- data/vendor/assets/bower_components/vue/src/directives/index.js +24 -0
- data/vendor/assets/bower_components/vue/src/directives/model/checkbox.js +42 -0
- data/vendor/assets/bower_components/vue/src/directives/model/index.js +82 -0
- data/vendor/assets/bower_components/vue/src/directives/model/radio.js +33 -0
- data/vendor/assets/bower_components/vue/src/directives/model/select.js +236 -0
- data/vendor/assets/bower_components/vue/src/directives/model/text.js +132 -0
- data/vendor/assets/bower_components/vue/src/directives/on.js +59 -0
- data/vendor/assets/bower_components/vue/src/directives/prop.js +62 -0
- data/vendor/assets/bower_components/vue/src/directives/ref.js +22 -0
- data/vendor/assets/bower_components/vue/src/directives/repeat.js +770 -0
- data/vendor/assets/bower_components/vue/src/directives/show.js +8 -0
- data/vendor/assets/bower_components/vue/src/directives/style.js +110 -0
- data/vendor/assets/bower_components/vue/src/directives/text.js +14 -0
- data/vendor/assets/bower_components/vue/src/directives/transition.js +26 -0
- data/vendor/assets/bower_components/vue/src/element-directives/content.js +111 -0
- data/vendor/assets/bower_components/vue/src/element-directives/index.js +2 -0
- data/vendor/assets/bower_components/vue/src/element-directives/partial.js +73 -0
- data/vendor/assets/bower_components/vue/src/filters/array-filters.js +97 -0
- data/vendor/assets/bower_components/vue/src/filters/index.js +146 -0
- data/vendor/assets/bower_components/vue/src/instance/compile.js +200 -0
- data/vendor/assets/bower_components/vue/src/instance/events.js +139 -0
- data/vendor/assets/bower_components/vue/src/instance/init.js +89 -0
- data/vendor/assets/bower_components/vue/src/instance/misc.js +93 -0
- data/vendor/assets/bower_components/vue/src/instance/scope.js +282 -0
- data/vendor/assets/bower_components/vue/src/observer/array.js +98 -0
- data/vendor/assets/bower_components/vue/src/observer/dep.js +61 -0
- data/vendor/assets/bower_components/vue/src/observer/index.js +234 -0
- data/vendor/assets/bower_components/vue/src/observer/object.js +82 -0
- data/vendor/assets/bower_components/vue/src/parsers/directive.js +180 -0
- data/vendor/assets/bower_components/vue/src/parsers/expression.js +264 -0
- data/vendor/assets/bower_components/vue/src/parsers/path.js +348 -0
- data/vendor/assets/bower_components/vue/src/parsers/template.js +288 -0
- data/vendor/assets/bower_components/vue/src/parsers/text.js +178 -0
- data/vendor/assets/bower_components/vue/src/transition/index.js +128 -0
- data/vendor/assets/bower_components/vue/src/transition/queue.js +35 -0
- data/vendor/assets/bower_components/vue/src/transition/transition.js +357 -0
- data/vendor/assets/bower_components/vue/src/util/component.js +124 -0
- data/vendor/assets/bower_components/vue/src/util/debug.js +64 -0
- data/vendor/assets/bower_components/vue/src/util/dom.js +272 -0
- data/vendor/assets/bower_components/vue/src/util/env.js +85 -0
- data/vendor/assets/bower_components/vue/src/util/index.js +9 -0
- data/vendor/assets/bower_components/vue/src/util/lang.js +310 -0
- data/vendor/assets/bower_components/vue/src/util/options.js +357 -0
- data/vendor/assets/bower_components/vue/src/vue.js +89 -0
- data/vendor/assets/bower_components/vue/src/watcher.js +312 -0
- metadata +870 -0
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
var jsonlint = require('./assets/jsonlint/jsonlint');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Parse JSON using the parser built-in in the browser.
|
|
5
|
+
* On exception, the jsonString is validated and a detailed error is thrown.
|
|
6
|
+
* @param {String} jsonString
|
|
7
|
+
* @return {JSON} json
|
|
8
|
+
*/
|
|
9
|
+
exports.parse = function parse(jsonString) {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(jsonString);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
// try to throw a more detailed error message using validate
|
|
15
|
+
exports.validate(jsonString);
|
|
16
|
+
|
|
17
|
+
// rethrow the original error
|
|
18
|
+
throw err;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Sanitize a JSON-like string containing. For example changes JavaScript
|
|
24
|
+
* notation into JSON notation.
|
|
25
|
+
* This function for example changes a string like "{a: 2, 'b': {c: 'd'}"
|
|
26
|
+
* into '{"a": 2, "b": {"c": "d"}'
|
|
27
|
+
* @param {string} jsString
|
|
28
|
+
* @returns {string} json
|
|
29
|
+
*/
|
|
30
|
+
exports.sanitize = function (jsString) {
|
|
31
|
+
// escape all single and double quotes inside strings
|
|
32
|
+
var chars = [];
|
|
33
|
+
var i = 0;
|
|
34
|
+
|
|
35
|
+
//If JSON starts with a function (characters/digits/"_-"), remove this function.
|
|
36
|
+
//This is useful for "stripping" JSONP objects to become JSON
|
|
37
|
+
//For example: /* some comment */ function_12321321 ( [{"a":"b"}] ); => [{"a":"b"}]
|
|
38
|
+
var match = jsString.match(/^\s*(\/\*(.|[\r\n])*?\*\/)?\s*[\da-zA-Z_$]+\s*\(([\s\S]*)\)\s*;?\s*$/);
|
|
39
|
+
if (match) {
|
|
40
|
+
jsString = match[3];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// helper functions to get the current/prev/next character
|
|
44
|
+
function curr () { return jsString.charAt(i); }
|
|
45
|
+
function next() { return jsString.charAt(i + 1); }
|
|
46
|
+
function prev() { return jsString.charAt(i - 1); }
|
|
47
|
+
|
|
48
|
+
// get the last parsed non-whitespace character
|
|
49
|
+
function lastNonWhitespace () {
|
|
50
|
+
var p = chars.length - 1;
|
|
51
|
+
|
|
52
|
+
while (p >= 0) {
|
|
53
|
+
var pp = chars[p];
|
|
54
|
+
if (pp !== ' ' && pp !== '\n' && pp !== '\r' && pp !== '\t') { // non whitespace
|
|
55
|
+
return pp;
|
|
56
|
+
}
|
|
57
|
+
p--;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return '';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// skip a block comment '/* ... */'
|
|
64
|
+
function skipBlockComment () {
|
|
65
|
+
i += 2;
|
|
66
|
+
while (i < jsString.length && (curr() !== '*' || next() !== '/')) {
|
|
67
|
+
i++;
|
|
68
|
+
}
|
|
69
|
+
i += 2;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// skip a comment '// ...'
|
|
73
|
+
function skipComment () {
|
|
74
|
+
i += 2;
|
|
75
|
+
while (i < jsString.length && (curr() !== '\n')) {
|
|
76
|
+
i++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// parse single or double quoted string
|
|
81
|
+
function parseString(quote) {
|
|
82
|
+
chars.push('"');
|
|
83
|
+
i++;
|
|
84
|
+
var c = curr();
|
|
85
|
+
while (i < jsString.length && c !== quote) {
|
|
86
|
+
if (c === '"' && prev() !== '\\') {
|
|
87
|
+
// unescaped double quote, escape it
|
|
88
|
+
chars.push('\\');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// handle escape character
|
|
92
|
+
if (c === '\\') {
|
|
93
|
+
i++;
|
|
94
|
+
c = curr();
|
|
95
|
+
|
|
96
|
+
// remove the escape character when followed by a single quote ', not needed
|
|
97
|
+
if (c !== '\'') {
|
|
98
|
+
chars.push('\\');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
chars.push(c);
|
|
102
|
+
|
|
103
|
+
i++;
|
|
104
|
+
c = curr();
|
|
105
|
+
}
|
|
106
|
+
if (c === quote) {
|
|
107
|
+
chars.push('"');
|
|
108
|
+
i++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// parse an unquoted key
|
|
113
|
+
function parseKey() {
|
|
114
|
+
var specialValues = ['null', 'true', 'false'];
|
|
115
|
+
var key = '';
|
|
116
|
+
var c = curr();
|
|
117
|
+
|
|
118
|
+
var regexp = /[a-zA-Z_$\d]/; // letter, number, underscore, dollar character
|
|
119
|
+
while (regexp.test(c)) {
|
|
120
|
+
key += c;
|
|
121
|
+
i++;
|
|
122
|
+
c = curr();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (specialValues.indexOf(key) === -1) {
|
|
126
|
+
chars.push('"' + key + '"');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
chars.push(key);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
while(i < jsString.length) {
|
|
134
|
+
var c = curr();
|
|
135
|
+
|
|
136
|
+
if (c === '/' && next() === '*') {
|
|
137
|
+
skipBlockComment();
|
|
138
|
+
}
|
|
139
|
+
else if (c === '/' && next() === '/') {
|
|
140
|
+
skipComment();
|
|
141
|
+
}
|
|
142
|
+
else if (c === '\'' || c === '"') {
|
|
143
|
+
parseString(c);
|
|
144
|
+
}
|
|
145
|
+
else if (/[a-zA-Z_$]/.test(c) && ['{', ','].indexOf(lastNonWhitespace()) !== -1) {
|
|
146
|
+
// an unquoted object key (like a in '{a:2}')
|
|
147
|
+
parseKey();
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
chars.push(c);
|
|
151
|
+
i++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return chars.join('');
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Escape unicode characters.
|
|
160
|
+
* For example input '\u2661' (length 1) will output '\\u2661' (length 5).
|
|
161
|
+
* @param {string} text
|
|
162
|
+
* @return {string}
|
|
163
|
+
*/
|
|
164
|
+
exports.escapeUnicodeChars = function (text) {
|
|
165
|
+
// see https://www.wikiwand.com/en/UTF-16
|
|
166
|
+
// note: we leave surrogate pairs as two individual chars,
|
|
167
|
+
// as JSON doesn't interpret them as a single unicode char.
|
|
168
|
+
return text.replace(/[\u007F-\uFFFF]/g, function(c) {
|
|
169
|
+
return '\\u'+('0000' + c.charCodeAt(0).toString(16)).slice(-4);
|
|
170
|
+
})
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Validate a string containing a JSON object
|
|
175
|
+
* This method uses JSONLint to validate the String. If JSONLint is not
|
|
176
|
+
* available, the built-in JSON parser of the browser is used.
|
|
177
|
+
* @param {String} jsonString String with an (invalid) JSON object
|
|
178
|
+
* @throws Error
|
|
179
|
+
*/
|
|
180
|
+
exports.validate = function validate(jsonString) {
|
|
181
|
+
if (typeof(jsonlint) != 'undefined') {
|
|
182
|
+
jsonlint.parse(jsonString);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
JSON.parse(jsonString);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Extend object a with the properties of object b
|
|
191
|
+
* @param {Object} a
|
|
192
|
+
* @param {Object} b
|
|
193
|
+
* @return {Object} a
|
|
194
|
+
*/
|
|
195
|
+
exports.extend = function extend(a, b) {
|
|
196
|
+
for (var prop in b) {
|
|
197
|
+
if (b.hasOwnProperty(prop)) {
|
|
198
|
+
a[prop] = b[prop];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return a;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Remove all properties from object a
|
|
206
|
+
* @param {Object} a
|
|
207
|
+
* @return {Object} a
|
|
208
|
+
*/
|
|
209
|
+
exports.clear = function clear (a) {
|
|
210
|
+
for (var prop in a) {
|
|
211
|
+
if (a.hasOwnProperty(prop)) {
|
|
212
|
+
delete a[prop];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return a;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Get the type of an object
|
|
220
|
+
* @param {*} object
|
|
221
|
+
* @return {String} type
|
|
222
|
+
*/
|
|
223
|
+
exports.type = function type (object) {
|
|
224
|
+
if (object === null) {
|
|
225
|
+
return 'null';
|
|
226
|
+
}
|
|
227
|
+
if (object === undefined) {
|
|
228
|
+
return 'undefined';
|
|
229
|
+
}
|
|
230
|
+
if ((object instanceof Number) || (typeof object === 'number')) {
|
|
231
|
+
return 'number';
|
|
232
|
+
}
|
|
233
|
+
if ((object instanceof String) || (typeof object === 'string')) {
|
|
234
|
+
return 'string';
|
|
235
|
+
}
|
|
236
|
+
if ((object instanceof Boolean) || (typeof object === 'boolean')) {
|
|
237
|
+
return 'boolean';
|
|
238
|
+
}
|
|
239
|
+
if ((object instanceof RegExp) || (typeof object === 'regexp')) {
|
|
240
|
+
return 'regexp';
|
|
241
|
+
}
|
|
242
|
+
if (exports.isArray(object)) {
|
|
243
|
+
return 'array';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return 'object';
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Test whether a text contains a url (matches when a string starts
|
|
251
|
+
* with 'http://*' or 'https://*' and has no whitespace characters)
|
|
252
|
+
* @param {String} text
|
|
253
|
+
*/
|
|
254
|
+
var isUrlRegex = /^https?:\/\/\S+$/;
|
|
255
|
+
exports.isUrl = function isUrl (text) {
|
|
256
|
+
return (typeof text == 'string' || text instanceof String) &&
|
|
257
|
+
isUrlRegex.test(text);
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Tes whether given object is an Array
|
|
262
|
+
* @param {*} obj
|
|
263
|
+
* @returns {boolean} returns true when obj is an array
|
|
264
|
+
*/
|
|
265
|
+
exports.isArray = function (obj) {
|
|
266
|
+
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Retrieve the absolute left value of a DOM element
|
|
271
|
+
* @param {Element} elem A dom element, for example a div
|
|
272
|
+
* @return {Number} left The absolute left position of this element
|
|
273
|
+
* in the browser page.
|
|
274
|
+
*/
|
|
275
|
+
exports.getAbsoluteLeft = function getAbsoluteLeft(elem) {
|
|
276
|
+
var rect = elem.getBoundingClientRect();
|
|
277
|
+
return rect.left + window.pageXOffset || document.scrollLeft || 0;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Retrieve the absolute top value of a DOM element
|
|
282
|
+
* @param {Element} elem A dom element, for example a div
|
|
283
|
+
* @return {Number} top The absolute top position of this element
|
|
284
|
+
* in the browser page.
|
|
285
|
+
*/
|
|
286
|
+
exports.getAbsoluteTop = function getAbsoluteTop(elem) {
|
|
287
|
+
var rect = elem.getBoundingClientRect();
|
|
288
|
+
return rect.top + window.pageYOffset || document.scrollTop || 0;
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* add a className to the given elements style
|
|
293
|
+
* @param {Element} elem
|
|
294
|
+
* @param {String} className
|
|
295
|
+
*/
|
|
296
|
+
exports.addClassName = function addClassName(elem, className) {
|
|
297
|
+
var classes = elem.className.split(' ');
|
|
298
|
+
if (classes.indexOf(className) == -1) {
|
|
299
|
+
classes.push(className); // add the class to the array
|
|
300
|
+
elem.className = classes.join(' ');
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* add a className to the given elements style
|
|
306
|
+
* @param {Element} elem
|
|
307
|
+
* @param {String} className
|
|
308
|
+
*/
|
|
309
|
+
exports.removeClassName = function removeClassName(elem, className) {
|
|
310
|
+
var classes = elem.className.split(' ');
|
|
311
|
+
var index = classes.indexOf(className);
|
|
312
|
+
if (index != -1) {
|
|
313
|
+
classes.splice(index, 1); // remove the class from the array
|
|
314
|
+
elem.className = classes.join(' ');
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Strip the formatting from the contents of a div
|
|
320
|
+
* the formatting from the div itself is not stripped, only from its childs.
|
|
321
|
+
* @param {Element} divElement
|
|
322
|
+
*/
|
|
323
|
+
exports.stripFormatting = function stripFormatting(divElement) {
|
|
324
|
+
var childs = divElement.childNodes;
|
|
325
|
+
for (var i = 0, iMax = childs.length; i < iMax; i++) {
|
|
326
|
+
var child = childs[i];
|
|
327
|
+
|
|
328
|
+
// remove the style
|
|
329
|
+
if (child.style) {
|
|
330
|
+
// TODO: test if child.attributes does contain style
|
|
331
|
+
child.removeAttribute('style');
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// remove all attributes
|
|
335
|
+
var attributes = child.attributes;
|
|
336
|
+
if (attributes) {
|
|
337
|
+
for (var j = attributes.length - 1; j >= 0; j--) {
|
|
338
|
+
var attribute = attributes[j];
|
|
339
|
+
if (attribute.specified === true) {
|
|
340
|
+
child.removeAttribute(attribute.name);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// recursively strip childs
|
|
346
|
+
exports.stripFormatting(child);
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Set focus to the end of an editable div
|
|
352
|
+
* code from Nico Burns
|
|
353
|
+
* http://stackoverflow.com/users/140293/nico-burns
|
|
354
|
+
* http://stackoverflow.com/questions/1125292/how-to-move-cursor-to-end-of-contenteditable-entity
|
|
355
|
+
* @param {Element} contentEditableElement A content editable div
|
|
356
|
+
*/
|
|
357
|
+
exports.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) {
|
|
358
|
+
var range, selection;
|
|
359
|
+
if(document.createRange) {
|
|
360
|
+
range = document.createRange();//Create a range (a range is a like the selection but invisible)
|
|
361
|
+
range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range
|
|
362
|
+
range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start
|
|
363
|
+
selection = window.getSelection();//get the selection object (allows you to change selection)
|
|
364
|
+
selection.removeAllRanges();//remove any selections already made
|
|
365
|
+
selection.addRange(range);//make the range you have just created the visible selection
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Select all text of a content editable div.
|
|
371
|
+
* http://stackoverflow.com/a/3806004/1262753
|
|
372
|
+
* @param {Element} contentEditableElement A content editable div
|
|
373
|
+
*/
|
|
374
|
+
exports.selectContentEditable = function selectContentEditable(contentEditableElement) {
|
|
375
|
+
if (!contentEditableElement || contentEditableElement.nodeName != 'DIV') {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
var sel, range;
|
|
380
|
+
if (window.getSelection && document.createRange) {
|
|
381
|
+
range = document.createRange();
|
|
382
|
+
range.selectNodeContents(contentEditableElement);
|
|
383
|
+
sel = window.getSelection();
|
|
384
|
+
sel.removeAllRanges();
|
|
385
|
+
sel.addRange(range);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Get text selection
|
|
391
|
+
* http://stackoverflow.com/questions/4687808/contenteditable-selected-text-save-and-restore
|
|
392
|
+
* @return {Range | TextRange | null} range
|
|
393
|
+
*/
|
|
394
|
+
exports.getSelection = function getSelection() {
|
|
395
|
+
if (window.getSelection) {
|
|
396
|
+
var sel = window.getSelection();
|
|
397
|
+
if (sel.getRangeAt && sel.rangeCount) {
|
|
398
|
+
return sel.getRangeAt(0);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return null;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Set text selection
|
|
406
|
+
* http://stackoverflow.com/questions/4687808/contenteditable-selected-text-save-and-restore
|
|
407
|
+
* @param {Range | TextRange | null} range
|
|
408
|
+
*/
|
|
409
|
+
exports.setSelection = function setSelection(range) {
|
|
410
|
+
if (range) {
|
|
411
|
+
if (window.getSelection) {
|
|
412
|
+
var sel = window.getSelection();
|
|
413
|
+
sel.removeAllRanges();
|
|
414
|
+
sel.addRange(range);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Get selected text range
|
|
421
|
+
* @return {Object} params object containing parameters:
|
|
422
|
+
* {Number} startOffset
|
|
423
|
+
* {Number} endOffset
|
|
424
|
+
* {Element} container HTML element holding the
|
|
425
|
+
* selected text element
|
|
426
|
+
* Returns null if no text selection is found
|
|
427
|
+
*/
|
|
428
|
+
exports.getSelectionOffset = function getSelectionOffset() {
|
|
429
|
+
var range = exports.getSelection();
|
|
430
|
+
|
|
431
|
+
if (range && 'startOffset' in range && 'endOffset' in range &&
|
|
432
|
+
range.startContainer && (range.startContainer == range.endContainer)) {
|
|
433
|
+
return {
|
|
434
|
+
startOffset: range.startOffset,
|
|
435
|
+
endOffset: range.endOffset,
|
|
436
|
+
container: range.startContainer.parentNode
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
return null;
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Set selected text range in given element
|
|
445
|
+
* @param {Object} params An object containing:
|
|
446
|
+
* {Element} container
|
|
447
|
+
* {Number} startOffset
|
|
448
|
+
* {Number} endOffset
|
|
449
|
+
*/
|
|
450
|
+
exports.setSelectionOffset = function setSelectionOffset(params) {
|
|
451
|
+
if (document.createRange && window.getSelection) {
|
|
452
|
+
var selection = window.getSelection();
|
|
453
|
+
if(selection) {
|
|
454
|
+
var range = document.createRange();
|
|
455
|
+
|
|
456
|
+
if (!params.container.firstChild) {
|
|
457
|
+
params.container.appendChild(document.createTextNode(''));
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// TODO: do not suppose that the first child of the container is a textnode,
|
|
461
|
+
// but recursively find the textnodes
|
|
462
|
+
range.setStart(params.container.firstChild, params.startOffset);
|
|
463
|
+
range.setEnd(params.container.firstChild, params.endOffset);
|
|
464
|
+
|
|
465
|
+
exports.setSelection(range);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Get the inner text of an HTML element (for example a div element)
|
|
472
|
+
* @param {Element} element
|
|
473
|
+
* @param {Object} [buffer]
|
|
474
|
+
* @return {String} innerText
|
|
475
|
+
*/
|
|
476
|
+
exports.getInnerText = function getInnerText(element, buffer) {
|
|
477
|
+
var first = (buffer == undefined);
|
|
478
|
+
if (first) {
|
|
479
|
+
buffer = {
|
|
480
|
+
'text': '',
|
|
481
|
+
'flush': function () {
|
|
482
|
+
var text = this.text;
|
|
483
|
+
this.text = '';
|
|
484
|
+
return text;
|
|
485
|
+
},
|
|
486
|
+
'set': function (text) {
|
|
487
|
+
this.text = text;
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// text node
|
|
493
|
+
if (element.nodeValue) {
|
|
494
|
+
return buffer.flush() + element.nodeValue;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// divs or other HTML elements
|
|
498
|
+
if (element.hasChildNodes()) {
|
|
499
|
+
var childNodes = element.childNodes;
|
|
500
|
+
var innerText = '';
|
|
501
|
+
|
|
502
|
+
for (var i = 0, iMax = childNodes.length; i < iMax; i++) {
|
|
503
|
+
var child = childNodes[i];
|
|
504
|
+
|
|
505
|
+
if (child.nodeName == 'DIV' || child.nodeName == 'P') {
|
|
506
|
+
var prevChild = childNodes[i - 1];
|
|
507
|
+
var prevName = prevChild ? prevChild.nodeName : undefined;
|
|
508
|
+
if (prevName && prevName != 'DIV' && prevName != 'P' && prevName != 'BR') {
|
|
509
|
+
innerText += '\n';
|
|
510
|
+
buffer.flush();
|
|
511
|
+
}
|
|
512
|
+
innerText += exports.getInnerText(child, buffer);
|
|
513
|
+
buffer.set('\n');
|
|
514
|
+
}
|
|
515
|
+
else if (child.nodeName == 'BR') {
|
|
516
|
+
innerText += buffer.flush();
|
|
517
|
+
buffer.set('\n');
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
innerText += exports.getInnerText(child, buffer);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return innerText;
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
if (element.nodeName == 'P' && exports.getInternetExplorerVersion() != -1) {
|
|
528
|
+
// On Internet Explorer, a <p> with hasChildNodes()==false is
|
|
529
|
+
// rendered with a new line. Note that a <p> with
|
|
530
|
+
// hasChildNodes()==true is rendered without a new line
|
|
531
|
+
// Other browsers always ensure there is a <br> inside the <p>,
|
|
532
|
+
// and if not, the <p> does not render a new line
|
|
533
|
+
return buffer.flush();
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// br or unknown
|
|
538
|
+
return '';
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Returns the version of Internet Explorer or a -1
|
|
543
|
+
* (indicating the use of another browser).
|
|
544
|
+
* Source: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx
|
|
545
|
+
* @return {Number} Internet Explorer version, or -1 in case of an other browser
|
|
546
|
+
*/
|
|
547
|
+
exports.getInternetExplorerVersion = function getInternetExplorerVersion() {
|
|
548
|
+
if (_ieVersion == -1) {
|
|
549
|
+
var rv = -1; // Return value assumes failure.
|
|
550
|
+
if (navigator.appName == 'Microsoft Internet Explorer')
|
|
551
|
+
{
|
|
552
|
+
var ua = navigator.userAgent;
|
|
553
|
+
var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
|
|
554
|
+
if (re.exec(ua) != null) {
|
|
555
|
+
rv = parseFloat( RegExp.$1 );
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
_ieVersion = rv;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return _ieVersion;
|
|
563
|
+
};
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Test whether the current browser is Firefox
|
|
567
|
+
* @returns {boolean} isFirefox
|
|
568
|
+
*/
|
|
569
|
+
exports.isFirefox = function isFirefox () {
|
|
570
|
+
return (navigator.userAgent.indexOf("Firefox") != -1);
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* cached internet explorer version
|
|
575
|
+
* @type {Number}
|
|
576
|
+
* @private
|
|
577
|
+
*/
|
|
578
|
+
var _ieVersion = -1;
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* Add and event listener. Works for all browsers
|
|
582
|
+
* @param {Element} element An html element
|
|
583
|
+
* @param {string} action The action, for example "click",
|
|
584
|
+
* without the prefix "on"
|
|
585
|
+
* @param {function} listener The callback function to be executed
|
|
586
|
+
* @param {boolean} [useCapture] false by default
|
|
587
|
+
* @return {function} the created event listener
|
|
588
|
+
*/
|
|
589
|
+
exports.addEventListener = function addEventListener(element, action, listener, useCapture) {
|
|
590
|
+
if (element.addEventListener) {
|
|
591
|
+
if (useCapture === undefined)
|
|
592
|
+
useCapture = false;
|
|
593
|
+
|
|
594
|
+
if (action === "mousewheel" && exports.isFirefox()) {
|
|
595
|
+
action = "DOMMouseScroll"; // For Firefox
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
element.addEventListener(action, listener, useCapture);
|
|
599
|
+
return listener;
|
|
600
|
+
} else if (element.attachEvent) {
|
|
601
|
+
// Old IE browsers
|
|
602
|
+
var f = function () {
|
|
603
|
+
return listener.call(element, window.event);
|
|
604
|
+
};
|
|
605
|
+
element.attachEvent("on" + action, f);
|
|
606
|
+
return f;
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Remove an event listener from an element
|
|
612
|
+
* @param {Element} element An html dom element
|
|
613
|
+
* @param {string} action The name of the event, for example "mousedown"
|
|
614
|
+
* @param {function} listener The listener function
|
|
615
|
+
* @param {boolean} [useCapture] false by default
|
|
616
|
+
*/
|
|
617
|
+
exports.removeEventListener = function removeEventListener(element, action, listener, useCapture) {
|
|
618
|
+
if (element.removeEventListener) {
|
|
619
|
+
if (useCapture === undefined)
|
|
620
|
+
useCapture = false;
|
|
621
|
+
|
|
622
|
+
if (action === "mousewheel" && exports.isFirefox()) {
|
|
623
|
+
action = "DOMMouseScroll"; // For Firefox
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
element.removeEventListener(action, listener, useCapture);
|
|
627
|
+
} else if (element.detachEvent) {
|
|
628
|
+
// Old IE browsers
|
|
629
|
+
element.detachEvent("on" + action, listener);
|
|
630
|
+
}
|
|
631
|
+
};
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* Parse a JSON path like '.items[3].name' into an array
|
|
635
|
+
* @param {string} jsonPath
|
|
636
|
+
* @return {Array}
|
|
637
|
+
*/
|
|
638
|
+
exports.parsePath = function parsePath(jsonPath) {
|
|
639
|
+
var prop, remainder;
|
|
640
|
+
|
|
641
|
+
if (jsonPath.length === 0) {
|
|
642
|
+
return [];
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// find a match like '.prop'
|
|
646
|
+
var match = jsonPath.match(/^\.(\w+)/);
|
|
647
|
+
if (match) {
|
|
648
|
+
prop = match[1];
|
|
649
|
+
remainder = jsonPath.substr(prop.length + 1);
|
|
650
|
+
}
|
|
651
|
+
else if (jsonPath[0] === '[') {
|
|
652
|
+
// find a match like
|
|
653
|
+
var end = jsonPath.indexOf(']');
|
|
654
|
+
if (end === -1) {
|
|
655
|
+
throw new SyntaxError('Character ] expected in path');
|
|
656
|
+
}
|
|
657
|
+
if (end === 1) {
|
|
658
|
+
throw new SyntaxError('Index expected after [');
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
prop = JSON.parse(jsonPath.substring(1, end));
|
|
662
|
+
remainder = jsonPath.substr(end + 1);
|
|
663
|
+
}
|
|
664
|
+
else {
|
|
665
|
+
throw new SyntaxError('Failed to parse path');
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
return [prop].concat(parsePath(remainder))
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Improve the error message of a JSON schema error
|
|
673
|
+
* @param {Object} error
|
|
674
|
+
* @return {Object} The error
|
|
675
|
+
*/
|
|
676
|
+
exports.improveSchemaError = function (error) {
|
|
677
|
+
if (error.keyword === 'enum' && Array.isArray(error.schema)) {
|
|
678
|
+
var enums = error.schema;
|
|
679
|
+
if (enums) {
|
|
680
|
+
enums = enums.map(function (value) {
|
|
681
|
+
return JSON.stringify(value);
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
if (enums.length > 5) {
|
|
685
|
+
var more = ['(' + (enums.length - 5) + ' more...)'];
|
|
686
|
+
enums = enums.slice(0, 5);
|
|
687
|
+
enums.push(more);
|
|
688
|
+
}
|
|
689
|
+
error.message = 'should be equal to one of: ' + enums.join(', ');
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
return error;
|
|
694
|
+
};
|
|
695
|
+
|
|
696
|
+
/**
|
|
697
|
+
* Test whether the child rect fits completely inside the parent rect.
|
|
698
|
+
* @param {ClientRect} parent
|
|
699
|
+
* @param {ClientRect} child
|
|
700
|
+
* @param {number} margin
|
|
701
|
+
*/
|
|
702
|
+
exports.insideRect = function (parent, child, margin) {
|
|
703
|
+
var _margin = margin !== undefined ? margin : 0;
|
|
704
|
+
return child.left - _margin >= parent.left
|
|
705
|
+
&& child.right + _margin <= parent.right
|
|
706
|
+
&& child.top - _margin >= parent.top
|
|
707
|
+
&& child.bottom + _margin <= parent.bottom;
|
|
708
|
+
};
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Returns a function, that, as long as it continues to be invoked, will not
|
|
712
|
+
* be triggered. The function will be called after it stops being called for
|
|
713
|
+
* N milliseconds.
|
|
714
|
+
*
|
|
715
|
+
* Source: https://davidwalsh.name/javascript-debounce-function
|
|
716
|
+
*
|
|
717
|
+
* @param {function} func
|
|
718
|
+
* @param {number} wait Number in milliseconds
|
|
719
|
+
* @param {boolean} [immediate=false] If `immediate` is passed, trigger the
|
|
720
|
+
* function on the leading edge, instead
|
|
721
|
+
* of the trailing.
|
|
722
|
+
* @return {function} Return the debounced function
|
|
723
|
+
*/
|
|
724
|
+
exports.debounce = function debounce(func, wait, immediate) {
|
|
725
|
+
var timeout;
|
|
726
|
+
return function() {
|
|
727
|
+
var context = this, args = arguments;
|
|
728
|
+
var later = function() {
|
|
729
|
+
timeout = null;
|
|
730
|
+
if (!immediate) func.apply(context, args);
|
|
731
|
+
};
|
|
732
|
+
var callNow = immediate && !timeout;
|
|
733
|
+
clearTimeout(timeout);
|
|
734
|
+
timeout = setTimeout(later, wait);
|
|
735
|
+
if (callNow) func.apply(context, args);
|
|
736
|
+
};
|
|
737
|
+
};
|
|
738
|
+
|
|
739
|
+
/**
|
|
740
|
+
* Determines the difference between two texts.
|
|
741
|
+
* Can only detect one removed or inserted block of characters.
|
|
742
|
+
* @param {string} oldText
|
|
743
|
+
* @param {string} newText
|
|
744
|
+
* @return {{start: number, end: number}} Returns the start and end
|
|
745
|
+
* of the changed part in newText.
|
|
746
|
+
*/
|
|
747
|
+
exports.textDiff = function textDiff(oldText, newText) {
|
|
748
|
+
var len = newText.length;
|
|
749
|
+
var start = 0;
|
|
750
|
+
var oldEnd = oldText.length;
|
|
751
|
+
var newEnd = newText.length;
|
|
752
|
+
|
|
753
|
+
while (newText.charAt(start) === oldText.charAt(start)
|
|
754
|
+
&& start < len) {
|
|
755
|
+
start++;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
while (newText.charAt(newEnd - 1) === oldText.charAt(oldEnd - 1)
|
|
759
|
+
&& newEnd > start && oldEnd > 0) {
|
|
760
|
+
newEnd--;
|
|
761
|
+
oldEnd--;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
return {start: start, end: newEnd};
|
|
765
|
+
};
|