mosaico 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/Gemfile +7 -0
- data/LICENSE +680 -0
- data/README.md +179 -0
- data/Rakefile +5 -0
- data/app/assets/images/mosaico/logo_transparent.png +0 -0
- data/app/assets/javascripts/mosaico/application.js.erb +51 -0
- data/app/assets/javascripts/mosaico/plugins/debug.js.erb +10 -0
- data/app/assets/javascripts/mosaico/plugins/logo.js.erb +10 -0
- data/app/assets/javascripts/mosaico/plugins/preview.js +85 -0
- data/app/assets/javascripts/mosaico/plugins/save.js.erb +72 -0
- data/app/assets/javascripts/mosaico/plugins/template_path.js.erb +22 -0
- data/app/assets/javascripts/mosaico/plugins/translations.js +10 -0
- data/app/assets/javascripts/mosaico/utilities.js +25 -0
- data/app/assets/stylesheets/mosaico/application.css +6 -0
- data/app/controllers/mosaico/application_controller.rb +17 -0
- data/app/controllers/mosaico/images_controller.rb +142 -0
- data/app/controllers/mosaico/projects_controller.rb +31 -0
- data/app/controllers/mosaico/templates_controller.rb +8 -0
- data/app/helpers/mosaico/application_helper.rb +7 -0
- data/app/models/mosaico/image.rb +9 -0
- data/app/models/mosaico/placeholder_image.rb +9 -0
- data/app/models/mosaico/project.rb +13 -0
- data/app/models/mosaico/uploaded_image.rb +26 -0
- data/app/views/layouts/mosaico/application.html.erb +13 -0
- data/app/views/mosaico/projects/new.html.erb +1 -0
- data/app/views/mosaico/projects/show.html.erb +1 -0
- data/app/views/mosaico/shared/_metadata.html.erb +12 -0
- data/config/routes.rb +12 -0
- data/db/migrate/20170817202255_add_images.rb +14 -0
- data/db/migrate/20170824233755_add_projects.rb +11 -0
- data/lib/mosaico.rb +100 -0
- data/lib/mosaico/engine.rb +72 -0
- data/lib/mosaico/local_backend.rb +23 -0
- data/lib/mosaico/local_image_backend.rb +7 -0
- data/lib/mosaico/local_placeholder_backend.rb +7 -0
- data/lib/mosaico/placeholder.png +0 -0
- data/lib/mosaico/template.rb +89 -0
- data/lib/mosaico/versafix_template.rb +43 -0
- data/lib/mosaico/version.rb +4 -0
- data/lib/tasks/makeThumbs.js.erb +57 -0
- data/lib/tasks/thumbs.rake +35 -0
- data/mosaico.gemspec +22 -0
- data/screenshot.png +0 -0
- data/vendor/assets/fonts/LiberationSans-Regular.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/.jsbeautifyrc +6 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/.jshintrc +8 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/.travis.yml +6 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/CONTRIBUTING.md +37 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/Dockerfile +21 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/Gruntfile.js +241 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/LICENSE +680 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/NOTICE.txt +87 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/README.md +73 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/backend/README.txt +23 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/backend/main.js +162 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/bower.json +76 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico-material.css +7425 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico.css +7133 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico.debug.js +1517 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico.js +12828 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/templates.js +15 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.svg +685 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.woff2 +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/byvoxmail.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaico-badge.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaico-v.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaico32.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaicologo.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/screenshot-orig.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/screenshot.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/README.md +26 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-de.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-en.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-es.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-fr.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-it.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-nl.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-sv.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico-material.min.css +5 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico-material.min.css.map +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.css +5 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.css.map +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.js +1517 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.js.map +147 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/canvas-to-blob.min.js +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery-ui.min.css +7 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery-ui.min.js +13 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload-image.js +324 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload-process.js +175 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload-validate.js +122 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload.js +1482 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.iframe-transport.js +217 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.min.js +5 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.min.map +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.ui.touch-punch.min.js +11 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/knockout-jqueryui.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/knockout.js +123 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/load-image.all.min.js +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/NotoSans-Regular-webfont.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/NotoSans-Regular-webfont.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/NotoSans-Regular-webfont.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/stylesheet.css +9 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/advlist/plugin.js +101 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/advlist/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/anchor/plugin.js +55 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/anchor/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autolink/plugin.js +204 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autolink/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autoresize/plugin.js +162 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autoresize/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autosave/plugin.js +165 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autosave/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/bbcode/plugin.js +123 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/bbcode/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/charmap/plugin.js +462 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/charmap/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/code/plugin.js +60 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/code/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/codesample/css/prism.css +138 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/codesample/plugin.js +1319 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/codesample/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/colorpicker/plugin.js +112 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/colorpicker/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/contextmenu/plugin.js +100 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/contextmenu/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/directionality/plugin.js +64 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/directionality/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-cool.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-cry.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-embarassed.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-foot-in-mouth.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-frown.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-innocent.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-kiss.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-laughing.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-money-mouth.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-sealed.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-smile.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-surprised.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-tongue-out.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-undecided.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-wink.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-yell.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/plugin.js +65 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullpage/plugin.js +490 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullpage/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullscreen/plugin.js +154 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullscreen/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/hr/plugin.js +30 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/hr/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/image/plugin.js +630 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/image/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/imagetools/plugin.js +2944 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/imagetools/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/importcss/plugin.js +273 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/importcss/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/insertdatetime/plugin.js +121 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/insertdatetime/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/layer/plugin.js +225 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/layer/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/legacyoutput/plugin.js +208 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/legacyoutput/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/link/plugin.js +403 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/link/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/lists/plugin.js +965 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/lists/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/media/moxieplayer.swf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/media/plugin.js +879 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/media/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/nonbreaking/plugin.js +53 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/nonbreaking/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/noneditable/plugin.js +101 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/noneditable/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/pagebreak/plugin.js +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/pagebreak/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/paste/plugin.js +1844 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/paste/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/preview/plugin.js +101 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/preview/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/print/plugin.js +32 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/print/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/save/plugin.js +98 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/save/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/searchreplace/plugin.js +609 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/searchreplace/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/spellchecker/plugin.js +1031 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/spellchecker/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/tabfocus/plugin.js +120 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/tabfocus/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/table/plugin.js +4400 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/table/plugin.min.js +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/template/plugin.js +276 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/template/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textcolor/plugin.js +297 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textcolor/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textpattern/plugin.js +268 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textpattern/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualblocks/css/visualblocks.css +135 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualblocks/plugin.js +86 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualblocks/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualchars/plugin.js +123 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualchars/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/wordcount/plugin.js +69 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/wordcount/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/Variables.less +196 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/content.inline.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/content.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/readme.md +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.json +1277 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.svg +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.json +1972 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.svg +98 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/anchor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/loader.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/object.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/trans.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/skin.ie7.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/skin.json +79 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/skin.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/content.inline.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/content.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.svg +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.svg +129 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/anchor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/loader.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/object.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/trans.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/skin.ie7.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/skin.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/inlite/theme.js +1828 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/inlite/theme.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/modern/theme.js +934 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/modern/theme.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/tinymce.min.js +14 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/editor.html +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/favicon.ico +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/index.html +368 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/package.json +92 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/byvoxmail.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaico-badge.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaico-v.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaico32.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaicologo.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/screenshot-orig.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/screenshot.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/README.md +26 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-de.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-en.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-es.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-fr.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-it.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-nl.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-sv.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/Variables.less +196 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/content.inline.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/content.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/readme.md +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.json +1277 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.svg +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.json +1972 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.svg +98 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/anchor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/loader.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/object.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/trans.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/skin.ie7.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/skin.json +79 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/skin.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/server-config.js +12 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/converter-spec.js +115 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/data/template-versafix-1.model.json +137 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/declarations-spec.js +282 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/mensch-spec.js +114 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/model-spec.js +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/stylesheet-spec.js +177 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/app_standalone.less +7 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/app_standalone_material.less +350 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/safarihack.css +17 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements.less +497 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements_jquery.less +344 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements_mixins.less +406 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements_moxie.less +130 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_mosaico.less +529 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_mosaico_content.less +391 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_mosaico_tools.less +1043 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_reset.less +45 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_variables.less +156 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/app.js +167 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/bind-iframe.js +64 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/blocks.js +118 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/choose-template.js +7 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/colorpicker.js +58 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/csstext.js +16 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/droppable.js +87 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/eventable.js +33 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/extender-pagination.js +60 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/extsortables.js +103 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/fileupload.js +373 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/if-subs.js +110 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/jqueryui-spinner.js +31 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/jqueryui-tabs.js +17 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/script-template.js +30 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/scrollfix.js +48 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/scrollintoview.js +83 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/string-template.js +76 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/tooltips.js +36 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/validated-value.js +40 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/virtuals.js +102 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/wysiwygs.js +304 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/checkmodel.js +114 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/declarations.js +279 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/domutils.js +93 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/editor.js +411 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/main.js +42 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/model.js +536 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/parser.js +485 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/stylesheet.js +205 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/utils.js +156 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/wrapper.js +308 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ext/color.js +53 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ext/inliner.js +35 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ext/localstorage.js +100 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ko-bindings.js +22 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/template-loader.js +446 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/timed-call.js +31 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/undomanager/undomain.js +49 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/undomanager/undoserializer.js +120 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/viewmodel.js +595 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/array.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/block-show.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/block-wysiwyg.tmpl.html +18 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/blocks-show.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/blocks-wysiwyg.tmpl.html +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/customstyle.tmpl.html +3 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/empty.tmpl.html +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/error.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/gallery-images.tmpl.html +16 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/img-wysiwyg.tmpl.html +43 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/main.tmpl.html +102 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/toolbox.tmpl.html +111 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/tasks/combineKOTemplates.js +24 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/tasks/lib/phantom-thumbnailer-editor.js +168 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/tasks/makeThumbs.js +79 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/README.md +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/_full.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/footerBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/headerBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/heroBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/socialBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/threetwoBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/twoColumnBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/template-tedc15.html +567 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/edres/HeaderAndText.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/edres/_full.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/edres/fixedlist.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/mosaico-tutorial.md +335 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/mosaico-tutorial.pdf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_384.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_385.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_386.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_387.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_407.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_408.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/template-tutorial.html +68 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/_full.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/buttonBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/doubleArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/doubleImageBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/hrBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/imageBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/logoBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/sideArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/singleArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/socialBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/spacerBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/textBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/titleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/tripleArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/tripleImageBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/facebook_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/facebook_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/flickr_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/flickr_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/google+_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/google+_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/instagram_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/instagram_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/linkedin_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/linkedin_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/twitter_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/twitter_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/vimeo_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/vimeo_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/web_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/web_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/youtube_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/youtube_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/sponsor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/template-versafix-1.html +1531 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/uploads/README.md +1 -0
- metadata +536 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var console = require("console");
|
4
|
+
|
5
|
+
var _call = function(whatToCall) {
|
6
|
+
return whatToCall();
|
7
|
+
};
|
8
|
+
|
9
|
+
var logs = [];
|
10
|
+
|
11
|
+
var _timedCall = function(name, whatToCall) {
|
12
|
+
var res;
|
13
|
+
var start = new Date().getTime();
|
14
|
+
if (typeof console == 'object' && console.time) console.time(name);
|
15
|
+
res = _call(whatToCall);
|
16
|
+
if (typeof console == 'object' && console.time) console.timeEnd(name);
|
17
|
+
var diff = new Date().getTime() - start;
|
18
|
+
if (typeof console == 'object' && !console.time) console.log(name, "took", diff, "ms");
|
19
|
+
logs.push({
|
20
|
+
name: name,
|
21
|
+
time: diff
|
22
|
+
});
|
23
|
+
// max logs
|
24
|
+
if (logs.length > 100) logs.unshift();
|
25
|
+
return res;
|
26
|
+
};
|
27
|
+
|
28
|
+
module.exports = {
|
29
|
+
timedCall: _timedCall,
|
30
|
+
logs: logs
|
31
|
+
};
|
@@ -0,0 +1,49 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var ko = require("knockout");
|
4
|
+
var undoManager = require('knockout-undomanager');
|
5
|
+
var undoserializer = require("./undoserializer.js");
|
6
|
+
|
7
|
+
var addUndoStackExtensionMaker = function(performanceAwareCaller) {
|
8
|
+
return function(viewModel) {
|
9
|
+
|
10
|
+
viewModel.contentListeners(viewModel.contentListeners() + 2);
|
11
|
+
|
12
|
+
// TODO the labels should be computed observables (needs changes in undomanager projects)
|
13
|
+
var undoRedoStack = undoManager(viewModel.content, {
|
14
|
+
levels: 100,
|
15
|
+
undoLabel: ko.computed(function() { return viewModel.t("Undo (#COUNT#)"); }),
|
16
|
+
redoLabel: ko.computed(function() { return viewModel.t("Redo"); })
|
17
|
+
});
|
18
|
+
viewModel.undo = undoRedoStack.undoCommand;
|
19
|
+
viewModel.undo.execute = performanceAwareCaller.bind(viewModel, 'undo', viewModel.undo.execute);
|
20
|
+
viewModel.redo = undoRedoStack.redoCommand;
|
21
|
+
viewModel.redo.execute = performanceAwareCaller.bind(viewModel, 'redo', viewModel.redo.execute);
|
22
|
+
viewModel.undoReset = performanceAwareCaller.bind(viewModel, 'undoReset', undoRedoStack.reset);
|
23
|
+
viewModel.setUndoModeMerge = undoRedoStack.setModeMerge;
|
24
|
+
viewModel.setUndoModeOnce = undoRedoStack.setModeOnce;
|
25
|
+
undoRedoStack.setModeIgnore();
|
26
|
+
undoRedoStack.setUndoActionMaker(undoserializer.makeUndoAction.bind(undefined, viewModel.content));
|
27
|
+
undoserializer.watchEnabled(true);
|
28
|
+
|
29
|
+
return {
|
30
|
+
pause: function() {
|
31
|
+
undoRedoStack.setModeIgnore();
|
32
|
+
},
|
33
|
+
run: function() {
|
34
|
+
undoRedoStack.setModeOnce();
|
35
|
+
},
|
36
|
+
init: function() {
|
37
|
+
undoRedoStack.setModeOnce();
|
38
|
+
},
|
39
|
+
dispose: function() {
|
40
|
+
viewModel.contentListeners(viewModel.contentListeners() - 2);
|
41
|
+
undoserializer.watchEnabled(false);
|
42
|
+
undoRedoStack.dispose();
|
43
|
+
}
|
44
|
+
};
|
45
|
+
|
46
|
+
};
|
47
|
+
};
|
48
|
+
|
49
|
+
module.exports = addUndoStackExtensionMaker;
|
@@ -0,0 +1,120 @@
|
|
1
|
+
"use strict";
|
2
|
+
var ko = require("knockout");
|
3
|
+
var console = require("console");
|
4
|
+
// This module deals with serialization/deserialization of a "tree-path" representing the path to reach the given leaf.
|
5
|
+
// In order to be correctly serialized we have to move from "reference" to "string" and viceversa.
|
6
|
+
|
7
|
+
var _reference = function(model, path) {
|
8
|
+
var p = 0;
|
9
|
+
var p1, p2;
|
10
|
+
var m = model;
|
11
|
+
while (p < path.length) {
|
12
|
+
switch (path.charAt(p)) {
|
13
|
+
case '(':
|
14
|
+
if (path.charAt(p + 1) == ')') {
|
15
|
+
m = m();
|
16
|
+
} else {
|
17
|
+
// TODO error
|
18
|
+
}
|
19
|
+
p += 2;
|
20
|
+
break;
|
21
|
+
case '[':
|
22
|
+
p2 = path.indexOf(']', p);
|
23
|
+
m = m[path.substring(p + 1, p2)];
|
24
|
+
p = p2 + 1;
|
25
|
+
break;
|
26
|
+
case '.':
|
27
|
+
p1 = path.indexOf('(', p);
|
28
|
+
if (p1 == -1) p1 = path.length;
|
29
|
+
p2 = path.indexOf('[', p);
|
30
|
+
if (p2 == -1) p2 = path.length;
|
31
|
+
p2 = Math.min(p1, p2);
|
32
|
+
m = m[path.substring(p + 1, p2)];
|
33
|
+
p = p2;
|
34
|
+
break;
|
35
|
+
default:
|
36
|
+
// TODO error
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return m;
|
40
|
+
};
|
41
|
+
|
42
|
+
var _getPath = function(parents, child) {
|
43
|
+
var path = "";
|
44
|
+
var p;
|
45
|
+
for (var k = 0; k <= parents.length; k++) {
|
46
|
+
p = k < parents.length ? parents[k] : child;
|
47
|
+
if (ko.isObservable(p)) path += '()';
|
48
|
+
if (typeof p._fieldName !== 'undefined') {
|
49
|
+
path += "." + p._fieldName;
|
50
|
+
} else if (k > 0 && typeof parents[k - 1].pop == 'function') {
|
51
|
+
var parentArray = ko.isObservable(parents[k - 1]) ? ko.utils.peekObservable(parents[k - 1]) : parents[k - 1];
|
52
|
+
var pos = ko.utils.arrayIndexOf(parentArray, p);
|
53
|
+
if (pos != -1) {
|
54
|
+
path += "[" + pos + "]";
|
55
|
+
} else {
|
56
|
+
// NOTE this happen, sometimes when TinyMCE sends updates for objects already removed.
|
57
|
+
console.error("Unexpected object not found in parent array", parentArray, p, k, parents.length, ko.toJS(parentArray), ko.utils.unwrapObservable(p));
|
58
|
+
throw "Unexpected object not found in parent array";
|
59
|
+
}
|
60
|
+
} else {
|
61
|
+
console.error("Unexpected parent with no _fieldName and no parent array", k, parents);
|
62
|
+
throw "Unexpected parent with no _fieldName and no parent array";
|
63
|
+
}
|
64
|
+
}
|
65
|
+
return path;
|
66
|
+
};
|
67
|
+
|
68
|
+
var makeDereferencedUndoAction = function(undoFunc, model, path, value, item) {
|
69
|
+
var child = _reference(model, path);
|
70
|
+
undoFunc(child, value, item);
|
71
|
+
};
|
72
|
+
|
73
|
+
var listener;
|
74
|
+
|
75
|
+
var _setListener = function(listenfunc) {
|
76
|
+
listener = listenfunc;
|
77
|
+
};
|
78
|
+
|
79
|
+
/* dereferencing path and changing value with "toJS" */
|
80
|
+
var makeUndoActionDereferenced = function(model, undoFunc, parents, child, oldVal, item) {
|
81
|
+
try {
|
82
|
+
var path = _getPath(parents, child);
|
83
|
+
|
84
|
+
// Transform actions in simple JS objects.
|
85
|
+
if (typeof oldVal === 'object' || typeof oldVal === 'function') oldVal = ko.toJS(oldVal);
|
86
|
+
if (typeof item !== 'undefined' && (typeof item.value === 'object' || typeof item.value === 'function')) {
|
87
|
+
var newItem = ko.toJS(item);
|
88
|
+
item = newItem;
|
89
|
+
}
|
90
|
+
|
91
|
+
if (typeof listener !== 'undefined') {
|
92
|
+
try {
|
93
|
+
listener(path, child, oldVal, item);
|
94
|
+
} catch (e) {
|
95
|
+
console.log("Undoserializer ignoring exception in listener callback");
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
return makeDereferencedUndoAction.bind(undefined, undoFunc, model, path, oldVal, item);
|
100
|
+
} catch (e) {
|
101
|
+
// NOTE this happens, from time to time, when TinyMCE sends updates for deleted content.
|
102
|
+
console.error("Exception processing undo", e, parents, child, item);
|
103
|
+
}
|
104
|
+
};
|
105
|
+
|
106
|
+
var watchEnabled;
|
107
|
+
var _watchEnabled = function(newVal) {
|
108
|
+
if (typeof newVal !== 'undefined')
|
109
|
+
watchEnabled = newVal;
|
110
|
+
else
|
111
|
+
return watchEnabled;
|
112
|
+
};
|
113
|
+
|
114
|
+
module.exports = {
|
115
|
+
dereference: _getPath,
|
116
|
+
reference: _reference,
|
117
|
+
makeUndoAction: makeUndoActionDereferenced,
|
118
|
+
setListener: _setListener,
|
119
|
+
watchEnabled: _watchEnabled
|
120
|
+
};
|
@@ -0,0 +1,595 @@
|
|
1
|
+
"use strict";
|
2
|
+
/* global global: false */
|
3
|
+
|
4
|
+
var $ = require("jquery");
|
5
|
+
var ko = require("knockout");
|
6
|
+
var console = require("console");
|
7
|
+
var performanceAwareCaller = require("./timed-call.js").timedCall;
|
8
|
+
|
9
|
+
var toastr = require("toastr");
|
10
|
+
toastr.options = {
|
11
|
+
"closeButton": false,
|
12
|
+
"debug": false,
|
13
|
+
"positionClass": "toast-bottom-full-width",
|
14
|
+
"target": "#mo-body",
|
15
|
+
"onclick": null,
|
16
|
+
"showDuration": "300",
|
17
|
+
"hideDuration": "1000",
|
18
|
+
"timeOut": "5000",
|
19
|
+
"extendedTimeOut": "1000",
|
20
|
+
"showEasing": "swing",
|
21
|
+
"hideEasing": "linear",
|
22
|
+
"showMethod": "fadeIn",
|
23
|
+
"hideMethod": "fadeOut"
|
24
|
+
};
|
25
|
+
|
26
|
+
/* NOTE: translations moved to "plugin"
|
27
|
+
var strings = {
|
28
|
+
'show preview and send test': 'Visualizza una anteprima e fai un invio di test',
|
29
|
+
// Strings for app.js
|
30
|
+
'Download': 'Download',
|
31
|
+
'Test': 'Test',
|
32
|
+
'Save': 'Salva',
|
33
|
+
'Downloading...': "Download in corso...",
|
34
|
+
'Invalid email address': "Indirizzo email invalido",
|
35
|
+
"Test email sent...": "Email di test inviata...",
|
36
|
+
'Unexpected error talking to server: contact us!': 'Errore di comunicazione con il server: contattaci!',
|
37
|
+
'Insert here the recipient email address': 'Inserisci qui l\'indirizzo email a cui spedire',
|
38
|
+
"Test email address": "Indirizzo email di test",
|
39
|
+
// viewModel
|
40
|
+
'Block removed: use undo button to restore it...': 'Blocco eliminato: usa il pulsante annulla per recuperarlo...',
|
41
|
+
'New block added after the selected one (__pos__)': 'Nuovo blocco aggiunto sotto a quello selezionato (__pos__)',
|
42
|
+
'New block added at the model bottom (__pos__)': 'Nuovo blocco aggiunto in fondo al modello (__pos__)',
|
43
|
+
// undomain.js
|
44
|
+
'Undo (#COUNT#)': 'Annulla (#COUNT#)',
|
45
|
+
'Redo': 'Ripristina',
|
46
|
+
// editor.js
|
47
|
+
'Selected element has no editable properties': 'L\'elemento selezionato non fornisce proprietà editabili',
|
48
|
+
'This style is specific for this block: click here to remove the custom style and revert to the theme value': 'Questo stile è specifico di questo blocco: clicca qui per annullare lo stile personalizzato',
|
49
|
+
'Switch between global and block level styles editing': 'Permette di specificare se si vuole modificare lo stile generale o solamente quello specifico del blocco selezionato',
|
50
|
+
// main.tpl.html
|
51
|
+
'Undo last operation': 'Annulla ultima operazione',
|
52
|
+
'Redo last operation': 'Ripeti operazione annullata',
|
53
|
+
'Show image gallery': 'Visualizza galleria immagini',
|
54
|
+
'Gallery': 'Galleria',
|
55
|
+
'Preview': 'Anteprima',
|
56
|
+
'Show live preview': 'Mostra anteprima live',
|
57
|
+
'Large screen': 'Schermo grande',
|
58
|
+
'Tablet': 'Tablet',
|
59
|
+
'Smartphone': 'Smartphone',
|
60
|
+
'Show preview and send test': 'Visualizza una anteprima e fai un invio di test',
|
61
|
+
'Download template': 'Scarica il template',
|
62
|
+
'Save template': 'Salva il template',
|
63
|
+
'Saved model is obsolete': 'Modello salvato obsoleto',
|
64
|
+
'<p>The saved model has been created with a previous, non completely compatible version, of the template</p><p>Some content or style in the model <b>COULD BE LOST</b> if you will <b>save</b></p><p>Contact us for more informations!</p>': '<p>Il modello salvato è stato creato con una versione precedente del template non del tutto compatibile</p><p>Alcuni contenuti o stili del modello <b>POTREBBERO ESSERE PERSI</b> se procederai e deciderai di <b>salvare</b></p><p>Contattaci se hai dei dubbi!</p>',
|
65
|
+
|
66
|
+
// TODO this cannot be done in knockout as with uncompatible browsers we don't initialize
|
67
|
+
// 'Usupported browser': 'Browser non compatibile',
|
68
|
+
// '<p>Your browser is not supported.</p><p>Use a different browser or try updaring your browser.</p><p>Supported browsers: <ul><li>Internet Explorer >= 10</li><li>Google Chrome >= 30</li><li>Apple Safari >= 5</li><li>Mozilla Firefix >= 20</li></ul></p>': '<p>Il tuo browser non è supportato.</p><p>Accedi con un browser differente o prova ad aggiornare il tuo browser.</p><p>Browser supportati: <ul><li>Internet Explorer >= 10</li><li>Google Chrome >= 30</li><li>Apple Safari >= 5</li><li>Mozilla Firefix >= 20</li></ul></p>',
|
69
|
+
|
70
|
+
// toolbox
|
71
|
+
'Blocks': 'Blocchi',
|
72
|
+
'Blocks ready to be added to the template': 'Elenco contenuti aggiungibili al messaggio',
|
73
|
+
'Content': 'Contenuto',
|
74
|
+
'Edit content options': 'Modifica opzioni contenuti',
|
75
|
+
'Style': 'Stile',
|
76
|
+
'Edit style options': 'Modifica opzioni grafiche',
|
77
|
+
'Block __name__': 'Blocco __name__',
|
78
|
+
'Click or drag to add this block to the template': 'Clicca o trascina per aggiungere al messaggio',
|
79
|
+
'Add': 'Aggiungi',
|
80
|
+
'By clicking on message parts you will select a block and content options, if any, will show here': 'Cliccando su alcune parti del messaggio selezionerai un blocco e le opzioni contenutistiche, se disponibili, compariranno qui',
|
81
|
+
'By clicking on message parts you will select a block and style options, if available, will show here': 'Cliccando su alcune parti del messaggio selezionerai un blocco e le opzioni di stile, se disponibili, compariranno qui',
|
82
|
+
'Click or drag files here': 'Clicca o trascina i file qui!',
|
83
|
+
'No images uploaded, yet': 'Non hai ancora caricato immagini',
|
84
|
+
'Show images from the gallery': 'Visualizza le immagini caricate nella tua area',
|
85
|
+
'Loading...': 'Caricamento...',
|
86
|
+
'Load gallery': 'Carica galleria',
|
87
|
+
'Loading gallery...': 'Caricamento in corso...',
|
88
|
+
'The gallery is empty': 'Nessuna immagine nella galleria',
|
89
|
+
// img-wysiwyg.tmlp
|
90
|
+
'Remove image': 'Rimuovi immagine',
|
91
|
+
'Open the image editing tool': 'Avvia strumento modifica immagine',
|
92
|
+
'Upload a new image': 'Carica una nuova immagine',
|
93
|
+
'Drop an image here': 'Trascina una immagine qui',
|
94
|
+
'Drop an image here or click the upload button': 'Trascina una immagine qui o clicca sul pulsante di caricamento',
|
95
|
+
// gallery
|
96
|
+
'Drag this image and drop it on any template image placeholder': 'Trascina questa immagine sulla posizione in cui vuoi inserirla',
|
97
|
+
'Gallery:': 'Galleria:',
|
98
|
+
'Session images': 'Immagini di sessione',
|
99
|
+
'Recents': 'Recenti',
|
100
|
+
'Remote gallery': 'Galleria remota',
|
101
|
+
|
102
|
+
// customstyle
|
103
|
+
'Customized block.<ul><li>In this status changes to properties will be specific to the current block (instead of being global to all blocks in the same section)</li><li>A <span class="customStyled"><span>"small cube" </span></span> icon beside the property will mark the customization. By clicking this icon the property value will be reverted to the value defined for the section.</li></ul>': 'Blocco personalizzato.<ul><li>In questa modalità se cambi una proprietà verrà modificata solamente per questo specifico blocco (invece che per tutti i blocchi della stessa sezione).</li><li>Per segnalare la personalizzazione apparirà l\'icona <span class="customStyled"><span> del "cubetto"</span></span> a fianco delle proprietà. Cliccando questa icona tornerai al valore comune.</li></ul>',
|
104
|
+
// blocks-wysiwyg
|
105
|
+
'Drop here blocks from the "Blocks" tab': 'Trascina qui i blocchi dalla scheda \'Blocchi\'',
|
106
|
+
// block-wysiwyg
|
107
|
+
'Drag this handle to move the block': 'Trascina per spostare il blocco altrove',
|
108
|
+
'Move this block upside': 'Sposta il blocco in su',
|
109
|
+
'Move this block downside': 'Sposta il blocco in giu',
|
110
|
+
'Delete block': 'Elimina blocco',
|
111
|
+
'Duplicate block': 'Duplica blocco',
|
112
|
+
'Switch block variant': 'Cambia variante blocco',
|
113
|
+
// colorpicker
|
114
|
+
'Theme Colors,Standard Colors,Web Colors,Theme Colors,Back to Palette,History,No history yet.': 'Colori Tema,Colori Standard,Colori Web,Colori Tema,Torna alla tavolozza,Storico,storico colori vuoto',
|
115
|
+
|
116
|
+
'Drop here': 'Rilascia qui',
|
117
|
+
|
118
|
+
};
|
119
|
+
*/
|
120
|
+
|
121
|
+
function initializeEditor(content, blockDefs, thumbPathConverter, galleryUrl) {
|
122
|
+
|
123
|
+
var viewModel = {
|
124
|
+
galleryRecent: ko.observableArray([]).extend({
|
125
|
+
paging: 16
|
126
|
+
}),
|
127
|
+
galleryRemote: ko.observableArray([]).extend({
|
128
|
+
paging: 16
|
129
|
+
}),
|
130
|
+
selectedBlock: ko.observable(null),
|
131
|
+
selectedItem: ko.observable(null),
|
132
|
+
selectedTool: ko.observable(0),
|
133
|
+
selectedImageTab: ko.observable(0),
|
134
|
+
dragging: ko.observable(false),
|
135
|
+
draggingImage: ko.observable(false),
|
136
|
+
galleryLoaded: ko.observable(false),
|
137
|
+
showPreviewFrame: ko.observable(false),
|
138
|
+
previewMode: ko.observable('mobile'),
|
139
|
+
showToolbox: ko.observable(true),
|
140
|
+
showTheme: ko.observable(false),
|
141
|
+
showGallery: ko.observable(false),
|
142
|
+
debug: ko.observable(false),
|
143
|
+
contentListeners: ko.observable(0),
|
144
|
+
|
145
|
+
logoPath: 'dist/img/mosaico32.png',
|
146
|
+
logoUrl: '.',
|
147
|
+
logoAlt: 'mosaico'
|
148
|
+
};
|
149
|
+
|
150
|
+
// viewModel.content = content._instrument(ko, content, undefined, true);
|
151
|
+
viewModel.content = content;
|
152
|
+
viewModel.blockDefs = blockDefs;
|
153
|
+
|
154
|
+
viewModel.notifier = toastr;
|
155
|
+
|
156
|
+
// Does token substitution in i18next style
|
157
|
+
viewModel.tt = function(key, paramObj) {
|
158
|
+
if (typeof paramObj !== 'undefined')
|
159
|
+
for (var prop in paramObj)
|
160
|
+
if (paramObj.hasOwnProperty(prop)) {
|
161
|
+
key = key.replace(new RegExp('__' + prop + '__', 'g'), paramObj[prop]);
|
162
|
+
}
|
163
|
+
return key;
|
164
|
+
};
|
165
|
+
|
166
|
+
// Simply maps to tt: language plugins can override this method to define their own language
|
167
|
+
// handling.
|
168
|
+
// If this method invokes an observable (e.g: viewModel.lang()) then the UI language will automatically
|
169
|
+
// update when the "lang" observable changes.
|
170
|
+
viewModel.t = viewModel.tt;
|
171
|
+
|
172
|
+
// currently called by editor.html to translate template-defined keys (label, help, descriptions)
|
173
|
+
// the editor always uses the "template" category for that strings.
|
174
|
+
// you can override this method as you like in order to provide translation or change the strings in any way.
|
175
|
+
viewModel.ut = function(category, key) {
|
176
|
+
return key;
|
177
|
+
};
|
178
|
+
|
179
|
+
viewModel.templatePath = thumbPathConverter;
|
180
|
+
|
181
|
+
viewModel.remoteUrlProcessor = function(url) {
|
182
|
+
return url;
|
183
|
+
};
|
184
|
+
|
185
|
+
viewModel.remoteFileProcessor = function(fileObj) {
|
186
|
+
if (typeof fileObj.url !== 'undefined') fileObj.url = viewModel.remoteUrlProcessor(fileObj.url);
|
187
|
+
if (typeof fileObj.thumbnailUrl !== 'undefined') fileObj.thumbnailUrl = viewModel.remoteUrlProcessor(fileObj.thumbnailUrl);
|
188
|
+
// deleteUrl?
|
189
|
+
return fileObj;
|
190
|
+
};
|
191
|
+
|
192
|
+
// toolbox.tmpl.html
|
193
|
+
viewModel.loadGallery = function() {
|
194
|
+
viewModel.galleryLoaded('loading');
|
195
|
+
var url = galleryUrl ? galleryUrl : '/upload/';
|
196
|
+
// retrieve the full list of remote files
|
197
|
+
$.getJSON(url, function(data) {
|
198
|
+
for (var i = 0; i < data.files.length; i++) data.files[i] = viewModel.remoteFileProcessor(data.files[i]);
|
199
|
+
viewModel.galleryLoaded(data.files.length);
|
200
|
+
// TODO do I want this call to return relative paths? Or just absolute paths?
|
201
|
+
viewModel.galleryRemote(data.files.reverse());
|
202
|
+
}).fail(function() {
|
203
|
+
viewModel.galleryLoaded(false);
|
204
|
+
viewModel.notifier.error(viewModel.t('Unexpected error listing files'));
|
205
|
+
});
|
206
|
+
};
|
207
|
+
|
208
|
+
// img-wysiwyg.tmpl.html
|
209
|
+
viewModel.fileToImage = function(obj, event, ui) {
|
210
|
+
// console.log("fileToImage", obj);
|
211
|
+
return obj.url;
|
212
|
+
};
|
213
|
+
|
214
|
+
// block-wysiwyg.tmpl.html
|
215
|
+
viewModel.removeBlock = function(data, parent) {
|
216
|
+
// let's unselect the block
|
217
|
+
if (ko.utils.unwrapObservable(viewModel.selectedBlock) == ko.utils.unwrapObservable(data)) {
|
218
|
+
viewModel.selectBlock(null, true);
|
219
|
+
}
|
220
|
+
var res = parent.blocks.remove(data);
|
221
|
+
// TODO This message should be different depending on undo plugin presence.
|
222
|
+
viewModel.notifier.info(viewModel.t('Block removed: use undo button to restore it...'));
|
223
|
+
return res;
|
224
|
+
};
|
225
|
+
|
226
|
+
// block-wysiwyg.tmpl.html
|
227
|
+
viewModel.duplicateBlock = function(index, parent) {
|
228
|
+
var idx = ko.utils.unwrapObservable(index);
|
229
|
+
// Deinstrument/deobserve the object
|
230
|
+
var unwrapped = ko.toJS(ko.utils.unwrapObservable(parent.blocks)[idx]);
|
231
|
+
// We need to remove the id so that a new one will be assigned to the clone
|
232
|
+
if (typeof unwrapped.id !== 'undefined') unwrapped.id = '';
|
233
|
+
// insert the cloned block
|
234
|
+
parent.blocks.splice(idx + 1, 0, unwrapped);
|
235
|
+
};
|
236
|
+
|
237
|
+
// block-wysiwyg.tmpl.html
|
238
|
+
viewModel.moveBlock = function(index, parent, up) {
|
239
|
+
var idx = ko.utils.unwrapObservable(index);
|
240
|
+
var parentBlocks = ko.utils.unwrapObservable(parent.blocks);
|
241
|
+
if ((up && idx > 0) || (!up && idx < parentBlocks.length - 1)) {
|
242
|
+
var destIndex = idx + (up ? -1 : 1);
|
243
|
+
var destBlock = parentBlocks[destIndex];
|
244
|
+
viewModel.startMultiple();
|
245
|
+
parent.blocks.splice(destIndex, 1);
|
246
|
+
parent.blocks.splice(idx, 0, destBlock);
|
247
|
+
viewModel.stopMultiple();
|
248
|
+
}
|
249
|
+
};
|
250
|
+
|
251
|
+
// test method, command line use only
|
252
|
+
viewModel.loadDefaultBlocks = function() {
|
253
|
+
// cloning the whole "mainBlocks" object so that undomanager will
|
254
|
+
// see it as a single operation (maybe I could use "startMultiple"/"stopMultiple".
|
255
|
+
var res = ko.toJS(viewModel.content().mainBlocks);
|
256
|
+
res.blocks = [];
|
257
|
+
var input = ko.utils.unwrapObservable(viewModel.blockDefs);
|
258
|
+
for (var i = 0; i < input.length; i++) {
|
259
|
+
var obj = ko.toJS(input[i]);
|
260
|
+
// generating ids for blocks, maybe this would work also leaving it empty.
|
261
|
+
obj.id = 'block_' + i;
|
262
|
+
res.blocks.push(obj);
|
263
|
+
}
|
264
|
+
performanceAwareCaller('setMainBlocks', viewModel.content().mainBlocks._wrap.bind(viewModel.content().mainBlocks, res));
|
265
|
+
};
|
266
|
+
|
267
|
+
// gallery-images.tmpl.html
|
268
|
+
viewModel.addImage = function(img) {
|
269
|
+
var selectedImg = $('#main-wysiwyg-area .selectable-img.selecteditem');
|
270
|
+
if (selectedImg.length == 1 && typeof img == 'object' && typeof img.url !== 'undefined') {
|
271
|
+
ko.contextFor(selectedImg[0])._src(img.url);
|
272
|
+
return true;
|
273
|
+
} else {
|
274
|
+
return false;
|
275
|
+
}
|
276
|
+
};
|
277
|
+
|
278
|
+
// toolbox.tmpl.html
|
279
|
+
viewModel.addBlock = function(obj, event) {
|
280
|
+
// if there is a selected block we try to add the block just after the selected one.
|
281
|
+
var selected = viewModel.selectedBlock();
|
282
|
+
// search the selected block position.
|
283
|
+
var found;
|
284
|
+
if (selected !== null) {
|
285
|
+
// TODO "mainBlocks" is an hardcoded thing.
|
286
|
+
for (var i = viewModel.content().mainBlocks().blocks().length - 1; i >= 0; i--) {
|
287
|
+
if (viewModel.content().mainBlocks().blocks()[i]() == selected) {
|
288
|
+
found = i;
|
289
|
+
break;
|
290
|
+
}
|
291
|
+
}
|
292
|
+
}
|
293
|
+
var pos;
|
294
|
+
if (typeof found !== 'undefined') {
|
295
|
+
pos = found + 1;
|
296
|
+
viewModel.content().mainBlocks().blocks.splice(pos, 0, obj);
|
297
|
+
viewModel.notifier.info(viewModel.t('New block added after the selected one (__pos__)', {
|
298
|
+
pos: pos
|
299
|
+
}));
|
300
|
+
} else {
|
301
|
+
viewModel.content().mainBlocks().blocks.push(obj);
|
302
|
+
pos = viewModel.content().mainBlocks().blocks().length - 1;
|
303
|
+
viewModel.notifier.info(viewModel.t('New block added at the model bottom (__pos__)', {
|
304
|
+
pos: pos
|
305
|
+
}));
|
306
|
+
}
|
307
|
+
// find the newly added block and select it!
|
308
|
+
var added = viewModel.content().mainBlocks().blocks()[pos]();
|
309
|
+
viewModel.selectBlock(added, true);
|
310
|
+
// prevent click propagation (losing url hash - see #43)
|
311
|
+
return false;
|
312
|
+
};
|
313
|
+
|
314
|
+
// Used by stylesheet.js to create multiple styles
|
315
|
+
viewModel.findObjectsOfType = function(data, type) {
|
316
|
+
var res = [];
|
317
|
+
var obj = ko.utils.unwrapObservable(data);
|
318
|
+
for (var prop in obj)
|
319
|
+
if (obj.hasOwnProperty(prop)) {
|
320
|
+
var val = ko.utils.unwrapObservable(obj[prop]);
|
321
|
+
// TODO this is not the right way to deal with "block list" objects.
|
322
|
+
if (prop.match(/Blocks$/)) {
|
323
|
+
var contents = ko.utils.unwrapObservable(val.blocks);
|
324
|
+
for (var i = 0; i < contents.length; i++) {
|
325
|
+
var c = ko.utils.unwrapObservable(contents[i]);
|
326
|
+
if (type === null || ko.utils.unwrapObservable(c.type) == type) res.push(c);
|
327
|
+
}
|
328
|
+
// TODO investigate which condition provide a null value.
|
329
|
+
} else if (typeof val == 'object' && val !== null) {
|
330
|
+
if (type === null || ko.utils.unwrapObservable(val.type) == type) res.push(val);
|
331
|
+
}
|
332
|
+
}
|
333
|
+
return res;
|
334
|
+
};
|
335
|
+
|
336
|
+
/*
|
337
|
+
viewModel.placeholderHelper = 'sortable-placeholder';
|
338
|
+
if (false) {
|
339
|
+
viewModel.placeholderHelper = {
|
340
|
+
element: function(currentItem) {
|
341
|
+
return $('<div />').removeClass('ui-draggable').addClass('sortable-placeholder').css('position', 'relative').css('width', '100%').css('height', currentItem.css('height')).css('opacity', '.8')[0];
|
342
|
+
},
|
343
|
+
update: function(container, p) {
|
344
|
+
return;
|
345
|
+
}
|
346
|
+
};
|
347
|
+
}
|
348
|
+
*/
|
349
|
+
|
350
|
+
// Attempt to insert the block in the destination layout during dragging
|
351
|
+
viewModel.placeholderHelper = {
|
352
|
+
element: function(currentItem) {
|
353
|
+
return $(currentItem[0].outerHTML).removeClass('ui-draggable').addClass('sortable-placeholder').css('display', 'block').css('position', 'relative').css('width', '100%').css('height', 'auto').css('opacity', '.8')[0];
|
354
|
+
},
|
355
|
+
update: function(container, p) {
|
356
|
+
return;
|
357
|
+
}
|
358
|
+
};
|
359
|
+
|
360
|
+
// TODO the undumanager should be pluggable.
|
361
|
+
// Used by "moveBlock" and blocks-wysiwyg.tmpl.html to "merge" drag/drop operations into a single undo/redo op.
|
362
|
+
viewModel.startMultiple = function() {
|
363
|
+
if (typeof viewModel.setUndoModeMerge !== 'undefined') viewModel.setUndoModeMerge();
|
364
|
+
};
|
365
|
+
viewModel.stopMultiple = function() {
|
366
|
+
if (typeof viewModel.setUndoModeOnce !== 'undefined') viewModel.setUndoModeOnce();
|
367
|
+
};
|
368
|
+
|
369
|
+
// Used by code generated by editor.js
|
370
|
+
viewModel.localGlobalSwitch = function(prop, globalProp) {
|
371
|
+
var current = prop();
|
372
|
+
if (current === null) prop(globalProp());
|
373
|
+
else prop(null);
|
374
|
+
return false;
|
375
|
+
};
|
376
|
+
|
377
|
+
// Used by editor and main "converter" to support item selection
|
378
|
+
viewModel.selectItem = function(valueAccessor, item, block) {
|
379
|
+
var val = ko.utils.peekObservable(valueAccessor);
|
380
|
+
if (typeof block !== 'undefined') viewModel.selectBlock(block, false, true);
|
381
|
+
if (val != item) {
|
382
|
+
valueAccessor(item);
|
383
|
+
// On selectItem if we were on "Blocks" toolbox tab we move to "Content" toolbox tab.
|
384
|
+
if (item !== null && viewModel.selectedTool() === 0) viewModel.selectedTool(1);
|
385
|
+
}
|
386
|
+
return false;
|
387
|
+
}.bind(viewModel, viewModel.selectedItem);
|
388
|
+
|
389
|
+
viewModel.isSelectedItem = function(item) {
|
390
|
+
return viewModel.selectedItem() == item;
|
391
|
+
};
|
392
|
+
|
393
|
+
viewModel.selectBlock = function(valueAccessor, item, doNotSelect, doNotUnselectItem) {
|
394
|
+
var val = ko.utils.peekObservable(valueAccessor);
|
395
|
+
if (!doNotUnselectItem) viewModel.selectItem(null);
|
396
|
+
if (val != item) {
|
397
|
+
valueAccessor(item);
|
398
|
+
// hide gallery on block selection
|
399
|
+
viewModel.showGallery(false);
|
400
|
+
if (item !== null && !doNotSelect && viewModel.selectedTool() === 0) viewModel.selectedTool(1);
|
401
|
+
}
|
402
|
+
}.bind(viewModel, viewModel.selectedBlock);
|
403
|
+
|
404
|
+
// DEBUG
|
405
|
+
viewModel.countSubscriptions = function(model, debug) {
|
406
|
+
var res = 0;
|
407
|
+
for (var prop in model)
|
408
|
+
if (model.hasOwnProperty(prop)) {
|
409
|
+
var p = model[prop];
|
410
|
+
if (ko.isObservable(p)) {
|
411
|
+
if (typeof p._defaultComputed != 'undefined') {
|
412
|
+
if (typeof debug != 'undefined') console.log(debug + "/" + prop + "/_", p._defaultComputed.getSubscriptionsCount());
|
413
|
+
res += p._defaultComputed.getSubscriptionsCount();
|
414
|
+
}
|
415
|
+
if (typeof debug != 'undefined') console.log(debug + "/" + prop + "/-", p.getSubscriptionsCount());
|
416
|
+
res += p.getSubscriptionsCount();
|
417
|
+
p = ko.utils.unwrapObservable(p);
|
418
|
+
}
|
419
|
+
if (typeof p == 'object' && p !== null) {
|
420
|
+
var tot = viewModel.countSubscriptions(p, typeof debug != 'undefined' ? debug + '/' + prop + "@" : undefined);
|
421
|
+
if (typeof debug != 'undefined') console.log(debug + "/" + prop + "@", tot);
|
422
|
+
res += tot;
|
423
|
+
}
|
424
|
+
}
|
425
|
+
return res;
|
426
|
+
};
|
427
|
+
|
428
|
+
// DEBUG
|
429
|
+
viewModel.loopSubscriptionsCount = function() {
|
430
|
+
var count = viewModel.countSubscriptions(viewModel.content());
|
431
|
+
global.document.getElementById('subscriptionsCount').innerHTML = count;
|
432
|
+
global.setTimeout(viewModel.loopSubscriptionsCount, 1000);
|
433
|
+
};
|
434
|
+
|
435
|
+
viewModel.export = function() {
|
436
|
+
var content = performanceAwareCaller("exportHTML", viewModel.exportHTML);
|
437
|
+
return content;
|
438
|
+
};
|
439
|
+
|
440
|
+
function conditional_restore(html) {
|
441
|
+
return html.replace(/<replacedcc[^>]* condition="([^"]*)"[^>]*>([\s\S]*?)<\/replacedcc>/g, function(match, condition, body) {
|
442
|
+
var dd = '<!--[if '+condition.replace(/&/, '&')+']>';
|
443
|
+
dd += body.replace(/<!-- cc:bc:([A-Za-z:]*) -->(<\/cc>)?<!-- cc:ac:\1 -->/g, '</$1>') // restore closing tags (including lost tags)
|
444
|
+
.replace(/><\/cc><!-- cc:sc -->/g, '/>') // restore selfclosing tags
|
445
|
+
.replace(/<!-- cc:bo:([A-Za-z:]*) --><cc/g, '<$1') // restore open tags
|
446
|
+
.replace(/^.*<!-- cc:start -->/,'') // remove content before start
|
447
|
+
.replace(/<!-- cc:end -->.*$/,''); // remove content after end
|
448
|
+
dd += '<![endif]-->';
|
449
|
+
return dd;
|
450
|
+
});
|
451
|
+
}
|
452
|
+
|
453
|
+
viewModel.exportHTML = function() {
|
454
|
+
var id = 'exportframe';
|
455
|
+
$('body').append('<iframe id="' + id + '" data-bind="bindIframe: $data"></iframe>');
|
456
|
+
var frameEl = global.document.getElementById(id);
|
457
|
+
ko.applyBindings(viewModel, frameEl);
|
458
|
+
|
459
|
+
ko.cleanNode(frameEl);
|
460
|
+
|
461
|
+
if (viewModel.inline) viewModel.inline(frameEl.contentWindow.document);
|
462
|
+
|
463
|
+
// Obsolete method didn't work on IE11 when using "HTML5 doctype":
|
464
|
+
// var docType = new XMLSerializer().serializeToString(global.document.doctype);
|
465
|
+
var node = frameEl.contentWindow.document.doctype;
|
466
|
+
var docType = "<!DOCTYPE " + node.name +
|
467
|
+
(node.publicId ? ' PUBLIC "' + node.publicId + '"' : '') +
|
468
|
+
(!node.publicId && node.systemId ? ' SYSTEM' : '') +
|
469
|
+
(node.systemId ? ' "' + node.systemId + '"' : '') + '>';
|
470
|
+
var content = docType + "\n" + frameEl.contentWindow.document.documentElement.outerHTML;
|
471
|
+
ko.removeNode(frameEl);
|
472
|
+
|
473
|
+
content = content.replace(/<script ([^>]* )?type="text\/html"[^>]*>[\s\S]*?<\/script>/gm, '');
|
474
|
+
// content = content.replace(/<!-- ko .*? -->/g, ''); // sometimes we have expressions like (<!-- ko var > 2 -->)
|
475
|
+
content = content.replace(/<!-- ko ((?!--).)*? -->/g, ''); // this replaces the above with a more formal (but slower) solution
|
476
|
+
content = content.replace(/<!-- \/ko -->/g, '');
|
477
|
+
// Remove data-bind/data-block attributes
|
478
|
+
content = content.replace(/ data-bind="[^"]*"/gm, '');
|
479
|
+
// Remove trash leftover by TinyMCE
|
480
|
+
content = content.replace(/ data-mce-(href|src|style)="[^"]*"/gm, '');
|
481
|
+
|
482
|
+
// Replace "replacedstyle" to "style" attributes (chrome puts replacedstyle after style)
|
483
|
+
content = content.replace(/ style="[^"]*"([^>]*) replaced(style="[^"]*")/gm, '$1 $2');
|
484
|
+
// Replace "replacedstyle" to "style" attributes (ie/ff have reverse order)
|
485
|
+
content = content.replace(/ replaced(style="[^"]*")([^>]*) style="[^"]*"/gm, ' $1$2');
|
486
|
+
content = content.replace(/ replaced(style="[^"]*")/gm, ' $1');
|
487
|
+
|
488
|
+
// same as style, but for http-equiv (some browser break it if we don't replace, but then we find it duplicated)
|
489
|
+
content = content.replace(/ http-equiv="[^"]*"([^>]*) replaced(http-equiv="[^"]*")/gm, '$1 $2');
|
490
|
+
content = content.replace(/ replaced(http-equiv="[^"]*")([^>]*) http-equiv="[^"]*"/gm, ' $1$2');
|
491
|
+
content = content.replace(/ replaced(http-equiv="[^"]*")/gm, ' $1');
|
492
|
+
|
493
|
+
// We already replace style and http-equiv and we don't need this.
|
494
|
+
// content = content.replace(/ replaced([^= ]*=)/gm, ' $1');
|
495
|
+
// Restore conditional comments
|
496
|
+
content = conditional_restore(content);
|
497
|
+
var trash = content.match(/ data-[^ =]+(="[^"]+")? /) || content.match(/ replaced([^= ]*=)/);
|
498
|
+
if (trash) {
|
499
|
+
console.warn("Output HTML contains unexpected data- attributes or replaced attributes", trash);
|
500
|
+
}
|
501
|
+
|
502
|
+
return content;
|
503
|
+
};
|
504
|
+
|
505
|
+
viewModel.exportHTMLtoTextarea = function(textareaid) {
|
506
|
+
$(textareaid).val(viewModel.exportHTML());
|
507
|
+
};
|
508
|
+
|
509
|
+
viewModel.exportJSONtoTextarea = function(textareaid) {
|
510
|
+
$(textareaid).val(viewModel.exportJSON());
|
511
|
+
};
|
512
|
+
|
513
|
+
viewModel.importJSONfromTextarea = function(textareaid) {
|
514
|
+
viewModel.importJSON($(textareaid).val());
|
515
|
+
};
|
516
|
+
|
517
|
+
viewModel.exportMetadata = function() {
|
518
|
+
var json = ko.toJSON(viewModel.metadata);
|
519
|
+
return json;
|
520
|
+
};
|
521
|
+
|
522
|
+
viewModel.exportJSON = function() {
|
523
|
+
var json = ko.toJSON(viewModel.content);
|
524
|
+
return json;
|
525
|
+
};
|
526
|
+
|
527
|
+
viewModel.exportJS = function() {
|
528
|
+
return ko.toJS(viewModel.content);
|
529
|
+
};
|
530
|
+
|
531
|
+
viewModel.importJSON = function(json) {
|
532
|
+
var unwrapped = ko.utils.parseJson(json);
|
533
|
+
viewModel.content._wrap(unwrapped);
|
534
|
+
};
|
535
|
+
|
536
|
+
viewModel.exportTheme = function() {
|
537
|
+
var flat = {};
|
538
|
+
var mod = viewModel.content().theme();
|
539
|
+
|
540
|
+
var _export = function(prefix, flat, mod) {
|
541
|
+
for (var prop in mod)
|
542
|
+
if (mod.hasOwnProperty(prop)) {
|
543
|
+
var a = ko.utils.unwrapObservable(mod[prop]);
|
544
|
+
if (a !== null && typeof a == 'object') {
|
545
|
+
_export(prop + '.', flat, a);
|
546
|
+
} else {
|
547
|
+
flat[prefix + prop] = a;
|
548
|
+
}
|
549
|
+
}
|
550
|
+
};
|
551
|
+
|
552
|
+
_export('', flat, mod);
|
553
|
+
|
554
|
+
var output = '';
|
555
|
+
for (var prop in flat)
|
556
|
+
if (flat.hasOwnProperty(prop) && prop != 'type') {
|
557
|
+
output += prop + ": " + flat[prop] + ";" + "\n";
|
558
|
+
}
|
559
|
+
|
560
|
+
return output;
|
561
|
+
};
|
562
|
+
|
563
|
+
// moxiemanager (or file browser/imageeditor) extension points.
|
564
|
+
// Just implement editImage or linkDialog methods
|
565
|
+
// viewModel.editImage = function(src, done) {} : implement this method to enable image editing (src is a wirtableObservable).
|
566
|
+
// viewModel.linkDialog = function() {}: implement this method using "this" to find the input element $(this).val is a writableObservable.
|
567
|
+
|
568
|
+
viewModel.loadImage = function(img) {
|
569
|
+
// push image at top of "recent" gallery
|
570
|
+
viewModel.galleryRecent.unshift(img);
|
571
|
+
// select recent gallery tab
|
572
|
+
viewModel.selectedImageTab(0);
|
573
|
+
};
|
574
|
+
|
575
|
+
viewModel.dialog = function(selector, options) {
|
576
|
+
$(selector).dialog(options);
|
577
|
+
};
|
578
|
+
|
579
|
+
// Dummy log method overridden by extensions
|
580
|
+
viewModel.log = function(category, msg) {
|
581
|
+
// console.log("viewModel.log", category, msg);
|
582
|
+
};
|
583
|
+
|
584
|
+
// automatically load the gallery when the gallery tab is selected
|
585
|
+
viewModel.selectedImageTab.subscribe(function(newValue) {
|
586
|
+
if (newValue == 1 && viewModel.galleryLoaded() === false) {
|
587
|
+
viewModel.loadGallery();
|
588
|
+
}
|
589
|
+
}, viewModel, 'change');
|
590
|
+
|
591
|
+
return viewModel;
|
592
|
+
|
593
|
+
}
|
594
|
+
|
595
|
+
module.exports = initializeEditor;
|