6688 lines
358 KiB
JavaScript
6688 lines
358 KiB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Mosaico = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|
var templateSystem=require("../src/js/bindings/choose-template.js");document.addEventListener("DOMContentLoaded",function(e){templateSystem.addTemplate("array","\x3c!-- ko foreach: $data --\x3e\x3c!-- ko block: $data --\x3e\x3c!-- /ko --\x3e\x3c!-- /ko --\x3e"),templateSystem.addTemplate("block-show","\x3c!-- ko block: $data, scrollIntoView: $root.selectedBlock() === $data --\x3e\x3c!-- /ko --\x3e"),templateSystem.addTemplate("block-wysiwyg",'<div class="editable block" data-drop-content="Drop here" data-bind="attr: { \'data-drop-content\': $root.t(\'Drop here\') }, click: function(obj, evt) { $root.selectBlock(obj); return true }, clickBubble: false, css: { selected: $root.selectedBlock() === $data }, scrollIntoView: $root.selectedBlock() === $data"> <div class="mo-blockselectionhelper"></div> <div class="tools" data-bind="tooltips: {}"> \x3c!-- ko if: typeof $index != \'undefined\' --\x3e <div title="Drag this handle to move the block" data-bind="attr: { title: $root.t(\'Drag this handle to move the block\') }" class="tool handle"><i class="fa fa-fw fa-sort"></i></div> \x3c!-- ko if: $index() > 0 --\x3e <div title="Move this block upside" data-bind="attr: { title: $root.t(\'Move this block upside\') }" class="tool moveup"><i class="fa fa-fw fa-sort-asc" data-bind=\'click: $root.moveBlock.bind($element, $index, $parent, true)\'></i></div> \x3c!-- /ko --\x3e \x3c!-- ko if: $index() < $parent.blocks().length -1 --\x3e <div title="Move this block downside" data-bind="attr: { title: $root.t(\'Move this block downside\') }" class="tool movedown"><i class="fa fa-fw fa-sort-desc" data-bind=\'click: $root.moveBlock.bind($element, $index, $parent, false)\'></i></div> \x3c!-- /ko --\x3e <div title="Delete block" class="tool delete" data-bind="attr: { title: $root.t(\'Delete block\') }, click: $root.removeBlock.bind($element, $rawData, $parent)"><i class="fa fa-fw fa-trash-o"></i></div> <div title="Duplicate block" class="tool clone" data-bind="attr: { title: $root.t(\'Duplicate block\') }, click: $root.duplicateBlock.bind($element, $index, $parent)"><i class="fa fa-fw fa-files-o"></i></div> \x3c!-- /ko --\x3e \x3c!-- ko if: typeof $data._nextVariant != \'undefined\' --\x3e<div title="Switch block variant" class="tool variant" data-bind="attr: { title: $root.t(\'Switch block variant\') }, click: $data._nextVariant"><i class="fa fa-fw fa-magic"></i></div>\x3c!-- /ko --\x3e </div> \x3c!-- ko block: $data --\x3e\x3c!-- /ko --\x3e</div>'),templateSystem.addTemplate("blocks-show","\x3c!-- ko template: { name: 'block-show', foreach: blocks } --\x3e\x3c!-- /ko --\x3e"),templateSystem.addTemplate("blocks-wysiwyg","<div class=\"sortable-blocks-edit\" data-drop-content=\"Drop here\" data-empty-content=\"Drop here blocks from the Blocks tab\" data-bind=\"attr: { 'data-drop-content': $root.t('Drop here'), 'data-empty-content': $root.t('Drop here blocks from the "Blocks" tab') }, css: { 'empty': ko.utils.unwrapObservable(blocks).length == 0 }, extsortable: { connectClass: 'sortable-blocks-edit', template: 'block-wysiwyg', data: blocks, dragging: $root.dragging, beforeMove: $root.startMultiple, afterMove: $root.stopMultiple, options: { handle: '.handle', placeholder: $root.placeholderHelper } }\"></div>"),templateSystem.addTemplate("customstyle",'<div class="customStyleHelp" data-bind="html: $root.t(\'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>\')">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></div>'),templateSystem.addTemplate("empty",""),templateSystem.addTemplate("error",'[<div style="background-color: #fff0f0" data-bind="text: ko.toJS($data)"></div>]'),templateSystem.addTemplate("gallery-images",'<div data-bind="foreach: items.currentPageData"> <div class="draggable-item" data-bind="if: typeof thumbnailUrl != \'undefined\'"> <div class="draggable image" data-bind="click: $root.addImage, extdraggable: { data: $data, dropContainer: \'#main-wysiwyg-area\', dragging: $root.draggingImage, \'options\': { \'appendTo\': \'#page\' } }, style: { backgroundImage: \'url(\\\'\' + thumbnailUrl + \'\\\')\' }"> <img title="Drag this image and drop it on any template image placeholder" style="display: block;" data-bind="tooltips: {}, attr: { src: thumbnailUrl, \'title\': $root.t(\'Drag this image and drop it on any template image placeholder\') }"/> </div> </div></div>\x3c!-- ko if: items.pageCount() > 1 --\x3e<div class="galleryPager" data-bind="buttonset: {}"> <a href="javascript:void(0)" data-bind="click: items.moveFirst, button: { disabled: items.currentPage() == 1, icons: { primary: \'fa fa-fast-backward\' }, text: false }">First</a> <a href="javascript:void(0)" data-bind="click: items.movePrevious, button: { disabled: items.currentPage() == 1, icons: { primary: \'fa fa-backward\' }, text: false }">Previous</a> <span data-bind="button: { disabled: true, text: true, label: \' \'+items.currentPage()+\' di \'+items.pageCount()+\' \' }"> X di Y </span> <a href="javascript:void(0)" data-bind="click: items.moveNext, button: { disabled: items.currentPage() == items.pageCount(), icons: { primary: \'fa fa-forward\' }, text: false }">Next</a> <a href="javascript:void(0)" data-bind="click: items.moveLast, button: { disabled: items.currentPage() == items.pageCount(), icons: { primary: \'fa fa-fast-forward\' }, text: false }">Last</a></div>\x3c!-- /ko --\x3e'),templateSystem.addTemplate("img-wysiwyg",'<table tabfocus="0" cellspacing="0" cellpadding="0" data-drop-content="Drop here" data-bind="style: _stylebind, click: function(obj, evt) { $root.selectItem(_item, _data); return true; }, clickBubble: false, fudroppable: { activeClass: \'ui-state-highlight\', hoverClass: \'ui-state-draghover\' }, droppable: { options: { accept: \'.image\', activeClass: \'ui-state-highlight\', hoverClass: \'ui-state-draghover\' }, data: _src, dragged: $root.fileToImage }, css: { selecteditem: $root.isSelectedItem(_item) }, scrollIntoView: $root.isSelectedItem(_item), attr: { \'data-drop-content\': $root.t(\'Drop here\'), width: _width, height: _height, align: _align }" class="img-wysiwyg selectable-img" style="display: table;"><tr><td class="uploadzone"> <div class="mo-imgselectionhelper"></div> <div class="mo-uploadzone"></div> <div class="img-size" data-bind="text: _size">size</div> <div class="midtools" data-bind="tooltips: {}"> \x3c!-- ko if: _src() != \'\' --\x3e <div title="Remove image" class="tool delete" data-bind="attr: { title: $root.t(\'Remove image\') }, click: _src.bind(_src, \'\'), clickBubble: false"><i class="fa fa-fw fa-trash-o"></i></div> \x3c!-- ko if: typeof $root.editImage !== \'undefined\' --\x3e <div title="Open the image editing tool" class="tool edit" data-bind="attr: { title: $root.t(\'Open the image editing tool\') }, click: $root.editImage.bind($element, _src), clickBubble: false"><i class="fa fa-fw fa-pencil"></i></div> \x3c!-- /ko --\x3e \x3c!-- /ko --\x3e \x3c!-- ko if: _src() == \'\' --\x3e <div title="Upload a new image" data-bind="attr: { title: $root.t(\'Upload a new image\') }" class="tool upload" style="position: relative; overflow: hidden;"><i class="fa fa-fw fa-upload"></i> <input class="fileupload nofile" type="file" name="files[]" data-bind="fileupload: { data: _src, onerror: $root.notifier.error, onfile: $root.loadImage, canvasPreview: true }" style="z-index: 20; position: absolute; top: 0; left: 0; right: 0; bottom: 0; min-width: 100%; min-height: 100%; font-size: 999px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; cursor: inherit; display: block"> </div> \x3c!-- /ko --\x3e </div> \x3c!-- ko template: _template --\x3e\x3c!-- /ko --\x3e \x3c!-- ko if: _src() == \'\' --\x3e \x3c!-- <img style="display: block;" class="imgplaceholder" width="200" src="" alt="Insert an image here" data-bind="wysiwygSrc: { src: _src.preloaded, placeholder: _placeholdersrc, width: _width, height: _height, method: _method }" /> --\x3e <span class="fileuploadtext" style="text-align: center; display: -ms-flexbox; display: flex; align-items: center; flex-align: center; justify-content: center; padding: 1em; position: absolute; top: 0; left: 0; right: 0; bottom: 0;"><span class="textMiddle" style=" text-shadow: 1px 1px 0 #FFFFFF, 0 0 10px #FFFFFF; font-weight: bold;" data-bind="text: $root.t(\'Drop an image here\')">Drop an image here</span></span> \x3c!-- /ko --\x3e \x3c!-- ko if: _src() != \'\' --\x3e \x3c!-- <img style="display: block;" width="200" src="" data-bind="preloader: _src, wysiwygSrc: { src: _src.preloaded, placeholder: _placeholdersrc, width: _width, height: _height, method: _method }" /> --\x3e \x3c!-- /ko --\x3e \x3c!-- pulsante per la cancellazione --\x3e <div title="Drop an image here or click the upload button" data-bind="attr: { title: $root.t(\'Drop an image here or click the upload button\') }, tooltips: {}" class="workzone" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"> \x3c!-- ko if: _src.preloaded && _src() != _src.preloaded() --\x3ePRELOADING....\x3c!-- /ko --\x3e \x3c!-- ko if: _src() != \'\' --\x3e <input class="fileupload withfile" type="file" name="files[]" data-bind="fileupload: { data: _src, onerror: $root.notifier.error, onfile: $root.galleryRecent.unshift.bind($root.galleryRecent), canvasPreview: true }" style="z-index: -20; position: absolute; top: 0; left: 0; right: 0; bottom: 0; min-width: 100%; min-height: 100%; font-zie: 999px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; cursor: inherit; display: block"> \x3c!-- /ko --\x3e <div class="progress" style="opacity: .5; width: 80%; margin-left: 10%; position: absolute; bottom: 30%; height: 20px; border: 2px solid black;"> <div class="progress-bar progress-bar-success" style="height: 20px; background-color: black; "></div> </div> </div></table>'),templateSystem.addTemplate("main",'<div id="page" style="display: none;" data-bind="visible: true, css: { withToolbox: $root.showToolbox, withPreviewFrame: showPreviewFrame }"> <div id="main-edit-area" data-bind="click: function(obj, evt) { $root.selectBlock(null); return true; }, clickBubble: false"> \x3c!-- ko withProperties: { templateMode: \'wysiwyg\', templateModeFallback: \'show\' } --\x3e <div id="main-wysiwyg-area" data-bind="wysiwygScrollfix: true, scrollable: true, fudroppable: { active: draggingImage }, css: { isdragging: dragging, isdraggingimg: draggingImage }, block: content"></div> \x3c!-- /ko --\x3e </div> <div id="toolbar" class="mo" data-bind="tooltips: {}"> \x3c!-- ko if: typeof $root.undo != \'undefined\' --\x3e <span data-bind="buttonset: { }" class="leftButtons"> <a title="Undo last operation" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Undo last operation\') }, click: $root.undo.execute, clickBubble: false, button: { disabled: !$root.undo.enabled(), icons: { primary: \'fa fa-reply\' }, label: $root.undo.name, text: true }">UNDO</a> <a title="Redo last operation" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Redo last operation\') }, click: $root.redo.execute, clickBubble: false, button: { disabled: !$root.redo.enabled(), icons: { primary: \'fa fa-share\' }, label: $root.redo.name, text: true }">REDO</a> </span> \x3c!-- ko if: $root.debug --\x3e <a href="javascript:void(0)" data-bind="click: $root.undoReset, clickBubble: false, button: { disabled: !$root.undo.enabled() && !$root.redo.enabled(), label: \'reset\', text: true }">RESET</a> \x3c!-- /ko --\x3e \x3c!-- /ko --\x3e <span> <input id="showGallery" type="checkbox" data-bind="checked: $root.showGallery, button: { refreshOn: $root.showGallery, icons: { primary: \'fa fa-fw fa-picture-o\', secondary: null }, text: true, label: $root.t(\'Gallery\') }"><label title="Show image gallery" for="showGallery" data-bind="attr: { title: $root.t(\'Show image gallery\') }">show gallery</label></input> </span> <input id="previewFrameToggle" type="checkbox" data-bind="checked: $root.showPreviewFrame, button: { refreshOn: $root.showPreviewFrame, icons: { primary: \'fa fa-fw fa-tablet\', secondary: null }, text: false, label: $root.t(\'Preview\') }"><label title="Show live preview" for="previewFrameToggle" data-bind="attr: { title: $root.t(\'Show live preview\') }">PREVIEW</label></input> \x3c!-- ko if: $root.debug --\x3e <a href="javascript:void(0)" data-bind="click: $root.export, clickBubble: false, button: { label: \'export\', text: true }">EXPORT</a> <input type="checkbox" data-bind="checked: $root.debug" /> debug <a href="javascript:void(0)" data-bind="click: $root.loadDefaultBlocks, clickBubble: false, button: { icons: { primary: \'fa fa-fw fa-upload\' }, label: \'Default\', text: true }">LOAD BLOCKS</a> [<a id="subscriptionsCount" href="javascript:viewModel.loopSubscriptionsCount()">subs</a>] \x3c!-- /ko --\x3e <span data-bind="visible: false"> <input type="checkbox" data-bind="checked: $root.showToolbox" /> toolbox </span> <div class="rightButtons"> \x3c!-- ko if: typeof $root.save !== \'undefined\' --\x3e <a title="Save template" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Save template\') }, click: $root.save.execute, clickBubble: false, button: { disabled: !$root.save.enabled(), icons: { primary: \'fa fa-fw fa-cloud-upload\' }, label: $root.t($root.save.name), text: true }">SALVA</a> \x3c!-- /ko --\x3e \x3c!-- ko if: typeof $root.test !== \'undefined\' --\x3e <a title="Show preview and send test" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Show preview and send test\') }, click: $root.test.execute, clickBubble: false, button: { disabled: !$root.test.enabled(), icons: { primary: \'fa fa-fw fa-paper-plane\' }, label: $root.t($root.test.name), text: true }">TEST</a> \x3c!-- /ko --\x3e \x3c!-- ko if: typeof $root.download !== \'undefined\' --\x3e <form id="downloadForm" action="#" method="POST"> <input type="hidden" name="action" value="download" /> <input type="hidden" name="filename" value="email.html" /> <input type="hidden" name="html" id="downloadHtmlTextarea" /> <a title="Download template" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Download template\') }, click: $root.download.execute, clickBubble: false, button: { disabled: !$root.download.enabled(), icons: { primary: \'fa fa-fw fa-download\' }, label: $root.t($root.download.name), text: true }">DOWNLOAD</a> </form> \x3c!-- /ko --\x3e </div> </div> \x3c!-- ko if: $root.showToolbox --\x3e <div id="main-toolbox" class="mo" data-bind="scrollable: true, withProperties: { templateMode: \'edit\' }"> <div data-bind="template: { name: \'toolbox\' }"></div> </div> \x3c!-- /ko --\x3e <div id="main-preview" class="mo" data-bind="scrollable: true, if: $root.showPreviewFrame"> <div id="preview-toolbar"> <div data-bind="visible: $root.showPreviewFrame, buttonset: { }" style="display: inline-block"> <input id="previewLarge" type="radio" name="previewMode" value="large" data-bind="checked: $root.previewMode, button: { text: false, label: \'large\', icons: { primary: \'fa fa-fw fa-desktop\' } }" /> <label for="previewLarge" title="Large screen" data-bind="attr: { title: $root.t(\'Large screen\') }">Large screen</label> <input id="previewDesktop" type="radio" name="previewMode" value="desktop" data-bind="checked: $root.previewMode, button: { text: false, label: \'desktop\', icons: { primary: \'fa fa-fw fa-tablet\' } }" /> <label for="previewDesktop" title="Tablet" data-bind="attr: { title: $root.t(\'Tablet\') }">Tablet</label> <input id="previewMobile" type="radio" name="previewMode" value="mobile" data-bind="checked: $root.previewMode, button: { text: false, label: \'mobile\', icons: { primary: \'fa fa-fw fa-mobile\' } }" /> <label for="previewMobile" title="Smartphone" data-bind="attr: { title: $root.t(\'Smartphone\') }">Smartphone</label> </div> </div> <div id="frame-container" data-bind="css: { desktop: $root.previewMode() == \'desktop\', mobile: $root.previewMode() == \'mobile\', large: $root.previewMode() == \'large\' }"> <iframe data-bind="bindIframe: $data"></iframe> </div> </div> <div class="mo" id="mo-body"></div> <div id="incompatible-template" title="Saved model is obsolete" style="display: none" data-bind="attr: { title: $root.t(\'Saved model is obsolete\') }, html: $root.t(\'<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>\')"> Incompatible template </div> <div id="fake-image-editor" title="Fake image editor" style="display: none" data-bind="attr: { title: $root.t(\'Fake image editor\') }, html: $root.t(\'<p>Fake image editor</p>\')"> <p>Fake image editor</p> </div></div>\x3c!-- ko if: $root.logoPath --\x3e<div id="loading" class="loading" style="display: block; width: 300px; text-align: center; height: 32px; position: absolute; top:0; bottom: 0; left: 0; right: 0; margin: auto;" data-bind="attr: { style: \'position: absolute; top: 5px; left: 6px; z-index: 150;\'}, css: { loading: false }"> <a href="/" data-bind="attr: { href: $root.logoUrl, alt: $root.logoAlt }"><img data-bind="attr: { src: $root.logoPath }" width="32" height="32" alt="mosaico" border="0" /></a> <div style="opacity: 0" data-bind="visible: false">Oppps... !!</div></div>\x3c!-- /ko --\x3e'),templateSystem.addTemplate("toolbox",'<div id="tooltabs" class="tabs_horizontal button_color" data-bind="tabs: { active: $root.selectedTool }"> <ul> <li data-bind="tooltips: {}"><a title="Blocks ready to be added to the template" data-local="true" href="#toolblocks" data-bind="attr: { title: $root.t(\'Blocks ready to be added to the template\') }"><i class="fa fa-fw fa-cubes"></i> <span data-bind="html: $root.t(\'Blocks\')">Blocks</span></a></li> <li data-bind="tooltips: {}"><a title="Edit content options" href="#toolcontents" data-local="true" data-bind="attr: { title: $root.t(\'Edit content options\') }"><i class="fa fa-fw fa-pencil"></i> <span data-bind="html: $root.t(\'Content\')">Content</span></a></li> <li data-bind="tooltips: {}"><a title="Edit style options" href="#toolstyles" data-local="true" data-bind="attr: { title: $root.t(\'Edit style options\') }"><i class="fa fa-fw fa-paint-brush"></i> <span data-bind="html: $root.t(\'Style\')">Style</span></a></li> </ul> <div id="toolblocks" data-bind="scrollable: true"> <div class="block-list" data-bind="foreach: blockDefs" style="text-align: center"> <div class="draggable-item" data-bind="withProperties: { templateMode: \'show\' }"> <div class="block" data-bind="extdraggable: { connectClass: \'sortable-blocks-edit\', data: $data, dropContainer: \'#main-wysiwyg-area\', dragging: $root.dragging, \'options\': { handle: \'.handle\', distance: 10, \'appendTo\': \'#page\' } }, click: $root.addBlock" style="position: relative;"> <div title="Click or drag to add this block to the template" class="handle" data-bind="attr: { title: $root.t(\'Click or drag to add this block to the template\') }, tooltips: {}"></div> <img data-bind="attr: { alt: $root.t(\'Block __name__\', { name: ko.utils.unwrapObservable(type) }), src: $root.templatePath(\'edres/\'+ko.utils.unwrapObservable(type)+\'.png\') }" alt="Block __name__" /> </div> <a href="javascript:void(0)" class="addblockbutton" data-bind="click: $root.addBlock, button: { label: $root.t(\'Add\') }">Add</a> </div> </div> </div> <div id="toolcontents" data-bind="scrollable: true"> \x3c!-- ko if: $root.selectedBlock() !== null --\x3e <div data-bind="block: $root.selectedBlock"></div> \x3c!-- /ko --\x3e \x3c!-- ko if: $root.selectedBlock() == null --\x3e <div class="noSelectedBlock" data-bind="text: $root.t(\'By clicking on message parts you will select a block and content options, if any, will show here\')">By clicking on message parts you will select a block and content options, if any, will show here</div> \x3c!-- /ko --\x3e \x3c!-- ko block: content --\x3e\x3c!-- /ko --\x3e </div> <div id="toolstyles" data-bind="scrollable: true, withProperties: { templateMode: \'styler\' }"> \x3c!-- ko if: typeof $root.content().theme === \'undefined\' || typeof $root.content().theme().scheme === \'undefined\' || $root.content().theme().scheme() === \'custom\' --\x3e \x3c!-- ko if: $root.selectedBlock() !== null --\x3e <div data-bind="block: $root.selectedBlock, css: { workLocal: $root.selectedBlock().customStyle, workGlobal: typeof $root.selectedBlock().customStyle === \'undefined\' || !$root.selectedBlock().customStyle() }"></div> \x3c!-- /ko --\x3e \x3c!-- ko if: $root.selectedBlock() == null --\x3e <div class="noSelectedBlock" data-bind="text: $root.t(\'By clicking on message parts you will select a block and style options, if available, will show here\')">By clicking on message parts you will select a block and style options, if available, will show here</div> \x3c!-- /ko --\x3e <div class="workGlobalContent"> \x3c!-- ko block: content --\x3e\x3c!-- /ko --\x3e </div> \x3c!-- /ko --\x3e </div></div> <div id="toolimages" class="slidebar" data-bind="scrollable: true, css: { hidden: $root.showGallery() === false }"> <div class="close" data-bind="click: $root.showGallery.bind($element, false);">X</div> <span class="pane-title" data-bind="text: $root.t(\'Gallery:\')">Gallery:</span> <div data-drop-content="Drop here" class="img-dropzone pane uploadzone" data-bind="attr: { \'data-drop-content\': $root.t(\'Drop here\') }, fudroppable: { activeClass: \'ui-state-highlight\', hoverClass: \'ui-state-draghover\' }"> <div class="mo-uploadzone" style="position: relative; padding: 2em; border: 2px dotted #808080"> <input class="fileupload" type="file" multiple name="files[]" data-bind="fileupload: { onerror: $root.notifier.error, onfile: $root.loadImage }" style="z-index: 10; position: absolute; top: 0; left: 0; right: 0; bottom: 0; min-width: 100%; min-height: 100%; font-zie: 999px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; cursor: inherit; display: block"> <span data-bind="text: $root.t(\'Click or drag files here\')">Click or drag files here</span> <div class="workzone" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"> <div class="progress" style="opacity: .5; width: 80%; margin-left: 10%; position: absolute; bottom: 30%; height: 20px; border: 2px solid black;"> <div class="progress-bar progress-bar-success" style="height: 20px; background-color: black; "></div> </div> </div> </div> </div> \x3c!-- ko if: $root.showGallery() --\x3e <div id="toolimagestab" class="tabs_horizontal" data-bind="tabs: { active: $root.selectedImageTab }"> <ul> <li data-bind="tooltips: {}"><a title="Session images" data-local="true" href="#toolimagesrecent" data-bind="attr: { title: $root.t(\'Session images\') }, text: $root.t(\'Recents\')">Recents</a></li> <li data-bind="tooltips: {}"><a title="Remote gallery" data-local="true" href="#toolimagesgallery" data-bind="attr: { title: $root.t(\'Remote gallery\') }, text: $root.t(\'Gallery\')">Gallery</a></li> </ul> <div id="toolimagesrecent"> \x3c!-- ko if: galleryRecent().length == 0 --\x3e<div class="galleryEmpty" data-bind="text: $root.t(\'No images uploaded, yet\')">No images uploaded, yet</div>\x3c!-- /ko --\x3e \x3c!-- ko template: {name: \'gallery-images\', data: { items: galleryRecent } } --\x3e# recent gallery #\x3c!-- /ko --\x3e </div> <div id="toolimagesgallery" style="text-align: center"> \x3c!-- ko if: $root.galleryLoaded() === false --\x3e<a class="loadbutton" title="Show images from the gallery" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Show images from the gallery\') }, click: $root.loadGallery, button: { disabled: $root.galleryLoaded, icons: { primary: \'fa fa-fw fa-picture-o\' }, label: $root.galleryLoaded() == \'loading\' ? $root.t(\'Loading...\') : $root.t(\'Load gallery\'), text: true }"># load gally #</a>\x3c!-- /ko --\x3e \x3c!-- ko if: $root.galleryLoaded() === \'loading\' --\x3e<div class="galleryEmpty" data-bind="text: $root.t(\'Loading gallery...\')">Loading gallery...</div>\x3c!-- /ko --\x3e \x3c!-- ko if: $root.galleryLoaded() === 0 --\x3e<div class="galleryEmpty" data-bind="text: $root.t(\'The gallery is empty\')">The gallery is empty</div>\x3c!-- /ko --\x3e \x3c!-- ko template: {name: \'gallery-images\', data: { items: galleryRemote } } --\x3e# remote gallery #\x3c!-- /ko --\x3e </div> </div> \x3c!-- /ko --\x3e</div><div id="tooldebug" class="slidebar" data-bind="css: { hidden: $root.debug() === false }"> <div class="close" data-bind="click: $root.debug.bind($element, false);">X</div> \x3c!-- ko if: $root.debug --\x3e Content: <pre data-bind=\'text: ko.toJSON(content, null, 2)\' style="overflow: auto; height: 20%"></pre> BlockDefs: <pre data-bind=\'text: ko.toJSON(blockDefs, null, 2)\' style="overflow: auto; height: 20%"></pre> \x3c!-- /ko --\x3e <a href="javascript:void(0)" data-bind="click: $root.exportHTMLtoTextarea.bind($element, \'#outputhtml\'); clickBubble: false, button: { text: true, label:\'Generate\' }">Output</a> <a href="javascript:void(0)" data-bind="click: $root.exportJSONtoTextarea.bind($element, \'#outputhtml\'); clickBubble: false, button: { text: true, label:\'Export\' }">Export</a> <a href="javascript:void(0)" data-bind="click: $root.importJSONfromTextarea.bind($element, \'#outputhtml\'); clickBubble: false, button: { text: true, label:\'Import\' }">Import</a> <textarea id="outputhtml" rows="10" style="width: 100%;"></textarea></div><div id="tooltheme" class="ui-widget slidebar" data-bind="css: { hidden: $root.showTheme() === false }"> <div class="close" data-bind="click: $root.showTheme.bind($element, false);">X</div> \x3c!-- ko withProperties: { templateMode: \'styler\' } --\x3e \x3c!-- ko if: $root.showTheme --\x3e \x3c!-- ko block: $root.content().theme --\x3e\x3c!-- /ko --\x3e \x3c!-- /ko --\x3e \x3c!-- /ko --\x3e</div>')});
|
|
|
|
},{"../src/js/bindings/choose-template.js":28}],2:[function(require,module,exports){
|
|
(function (global){
|
|
'use strict';
|
|
|
|
// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
|
|
// original notice:
|
|
|
|
/*!
|
|
* The buffer module from node.js, for the browser.
|
|
*
|
|
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
|
* @license MIT
|
|
*/
|
|
function compare(a, b) {
|
|
if (a === b) {
|
|
return 0;
|
|
}
|
|
|
|
var x = a.length;
|
|
var y = b.length;
|
|
|
|
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
|
if (a[i] !== b[i]) {
|
|
x = a[i];
|
|
y = b[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (x < y) {
|
|
return -1;
|
|
}
|
|
if (y < x) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function isBuffer(b) {
|
|
if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
|
|
return global.Buffer.isBuffer(b);
|
|
}
|
|
return !!(b != null && b._isBuffer);
|
|
}
|
|
|
|
// based on node assert, original notice:
|
|
|
|
// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
|
|
//
|
|
// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
|
|
//
|
|
// Originally from narwhal.js (http://narwhaljs.org)
|
|
// Copyright (c) 2009 Thomas Robinson <280north.com>
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the 'Software'), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
var util = require('util/');
|
|
var hasOwn = Object.prototype.hasOwnProperty;
|
|
var pSlice = Array.prototype.slice;
|
|
var functionsHaveNames = (function () {
|
|
return function foo() {}.name === 'foo';
|
|
}());
|
|
function pToString (obj) {
|
|
return Object.prototype.toString.call(obj);
|
|
}
|
|
function isView(arrbuf) {
|
|
if (isBuffer(arrbuf)) {
|
|
return false;
|
|
}
|
|
if (typeof global.ArrayBuffer !== 'function') {
|
|
return false;
|
|
}
|
|
if (typeof ArrayBuffer.isView === 'function') {
|
|
return ArrayBuffer.isView(arrbuf);
|
|
}
|
|
if (!arrbuf) {
|
|
return false;
|
|
}
|
|
if (arrbuf instanceof DataView) {
|
|
return true;
|
|
}
|
|
if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
// 1. The assert module provides functions that throw
|
|
// AssertionError's when particular conditions are not met. The
|
|
// assert module must conform to the following interface.
|
|
|
|
var assert = module.exports = ok;
|
|
|
|
// 2. The AssertionError is defined in assert.
|
|
// new assert.AssertionError({ message: message,
|
|
// actual: actual,
|
|
// expected: expected })
|
|
|
|
var regex = /\s*function\s+([^\(\s]*)\s*/;
|
|
// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
|
|
function getName(func) {
|
|
if (!util.isFunction(func)) {
|
|
return;
|
|
}
|
|
if (functionsHaveNames) {
|
|
return func.name;
|
|
}
|
|
var str = func.toString();
|
|
var match = str.match(regex);
|
|
return match && match[1];
|
|
}
|
|
assert.AssertionError = function AssertionError(options) {
|
|
this.name = 'AssertionError';
|
|
this.actual = options.actual;
|
|
this.expected = options.expected;
|
|
this.operator = options.operator;
|
|
if (options.message) {
|
|
this.message = options.message;
|
|
this.generatedMessage = false;
|
|
} else {
|
|
this.message = getMessage(this);
|
|
this.generatedMessage = true;
|
|
}
|
|
var stackStartFunction = options.stackStartFunction || fail;
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, stackStartFunction);
|
|
} else {
|
|
// non v8 browsers so we can have a stacktrace
|
|
var err = new Error();
|
|
if (err.stack) {
|
|
var out = err.stack;
|
|
|
|
// try to strip useless frames
|
|
var fn_name = getName(stackStartFunction);
|
|
var idx = out.indexOf('\n' + fn_name);
|
|
if (idx >= 0) {
|
|
// once we have located the function frame
|
|
// we need to strip out everything before it (and its line)
|
|
var next_line = out.indexOf('\n', idx + 1);
|
|
out = out.substring(next_line + 1);
|
|
}
|
|
|
|
this.stack = out;
|
|
}
|
|
}
|
|
};
|
|
|
|
// assert.AssertionError instanceof Error
|
|
util.inherits(assert.AssertionError, Error);
|
|
|
|
function truncate(s, n) {
|
|
if (typeof s === 'string') {
|
|
return s.length < n ? s : s.slice(0, n);
|
|
} else {
|
|
return s;
|
|
}
|
|
}
|
|
function inspect(something) {
|
|
if (functionsHaveNames || !util.isFunction(something)) {
|
|
return util.inspect(something);
|
|
}
|
|
var rawname = getName(something);
|
|
var name = rawname ? ': ' + rawname : '';
|
|
return '[Function' + name + ']';
|
|
}
|
|
function getMessage(self) {
|
|
return truncate(inspect(self.actual), 128) + ' ' +
|
|
self.operator + ' ' +
|
|
truncate(inspect(self.expected), 128);
|
|
}
|
|
|
|
// At present only the three keys mentioned above are used and
|
|
// understood by the spec. Implementations or sub modules can pass
|
|
// other keys to the AssertionError's constructor - they will be
|
|
// ignored.
|
|
|
|
// 3. All of the following functions must throw an AssertionError
|
|
// when a corresponding condition is not met, with a message that
|
|
// may be undefined if not provided. All assertion methods provide
|
|
// both the actual and expected values to the assertion error for
|
|
// display purposes.
|
|
|
|
function fail(actual, expected, message, operator, stackStartFunction) {
|
|
throw new assert.AssertionError({
|
|
message: message,
|
|
actual: actual,
|
|
expected: expected,
|
|
operator: operator,
|
|
stackStartFunction: stackStartFunction
|
|
});
|
|
}
|
|
|
|
// EXTENSION! allows for well behaved errors defined elsewhere.
|
|
assert.fail = fail;
|
|
|
|
// 4. Pure assertion tests whether a value is truthy, as determined
|
|
// by !!guard.
|
|
// assert.ok(guard, message_opt);
|
|
// This statement is equivalent to assert.equal(true, !!guard,
|
|
// message_opt);. To test strictly for the value true, use
|
|
// assert.strictEqual(true, guard, message_opt);.
|
|
|
|
function ok(value, message) {
|
|
if (!value) fail(value, true, message, '==', assert.ok);
|
|
}
|
|
assert.ok = ok;
|
|
|
|
// 5. The equality assertion tests shallow, coercive equality with
|
|
// ==.
|
|
// assert.equal(actual, expected, message_opt);
|
|
|
|
assert.equal = function equal(actual, expected, message) {
|
|
if (actual != expected) fail(actual, expected, message, '==', assert.equal);
|
|
};
|
|
|
|
// 6. The non-equality assertion tests for whether two objects are not equal
|
|
// with != assert.notEqual(actual, expected, message_opt);
|
|
|
|
assert.notEqual = function notEqual(actual, expected, message) {
|
|
if (actual == expected) {
|
|
fail(actual, expected, message, '!=', assert.notEqual);
|
|
}
|
|
};
|
|
|
|
// 7. The equivalence assertion tests a deep equality relation.
|
|
// assert.deepEqual(actual, expected, message_opt);
|
|
|
|
assert.deepEqual = function deepEqual(actual, expected, message) {
|
|
if (!_deepEqual(actual, expected, false)) {
|
|
fail(actual, expected, message, 'deepEqual', assert.deepEqual);
|
|
}
|
|
};
|
|
|
|
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
|
|
if (!_deepEqual(actual, expected, true)) {
|
|
fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
|
|
}
|
|
};
|
|
|
|
function _deepEqual(actual, expected, strict, memos) {
|
|
// 7.1. All identical values are equivalent, as determined by ===.
|
|
if (actual === expected) {
|
|
return true;
|
|
} else if (isBuffer(actual) && isBuffer(expected)) {
|
|
return compare(actual, expected) === 0;
|
|
|
|
// 7.2. If the expected value is a Date object, the actual value is
|
|
// equivalent if it is also a Date object that refers to the same time.
|
|
} else if (util.isDate(actual) && util.isDate(expected)) {
|
|
return actual.getTime() === expected.getTime();
|
|
|
|
// 7.3 If the expected value is a RegExp object, the actual value is
|
|
// equivalent if it is also a RegExp object with the same source and
|
|
// properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
|
|
} else if (util.isRegExp(actual) && util.isRegExp(expected)) {
|
|
return actual.source === expected.source &&
|
|
actual.global === expected.global &&
|
|
actual.multiline === expected.multiline &&
|
|
actual.lastIndex === expected.lastIndex &&
|
|
actual.ignoreCase === expected.ignoreCase;
|
|
|
|
// 7.4. Other pairs that do not both pass typeof value == 'object',
|
|
// equivalence is determined by ==.
|
|
} else if ((actual === null || typeof actual !== 'object') &&
|
|
(expected === null || typeof expected !== 'object')) {
|
|
return strict ? actual === expected : actual == expected;
|
|
|
|
// If both values are instances of typed arrays, wrap their underlying
|
|
// ArrayBuffers in a Buffer each to increase performance
|
|
// This optimization requires the arrays to have the same type as checked by
|
|
// Object.prototype.toString (aka pToString). Never perform binary
|
|
// comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
|
|
// bit patterns are not identical.
|
|
} else if (isView(actual) && isView(expected) &&
|
|
pToString(actual) === pToString(expected) &&
|
|
!(actual instanceof Float32Array ||
|
|
actual instanceof Float64Array)) {
|
|
return compare(new Uint8Array(actual.buffer),
|
|
new Uint8Array(expected.buffer)) === 0;
|
|
|
|
// 7.5 For all other Object pairs, including Array objects, equivalence is
|
|
// determined by having the same number of owned properties (as verified
|
|
// with Object.prototype.hasOwnProperty.call), the same set of keys
|
|
// (although not necessarily the same order), equivalent values for every
|
|
// corresponding key, and an identical 'prototype' property. Note: this
|
|
// accounts for both named and indexed properties on Arrays.
|
|
} else if (isBuffer(actual) !== isBuffer(expected)) {
|
|
return false;
|
|
} else {
|
|
memos = memos || {actual: [], expected: []};
|
|
|
|
var actualIndex = memos.actual.indexOf(actual);
|
|
if (actualIndex !== -1) {
|
|
if (actualIndex === memos.expected.indexOf(expected)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
memos.actual.push(actual);
|
|
memos.expected.push(expected);
|
|
|
|
return objEquiv(actual, expected, strict, memos);
|
|
}
|
|
}
|
|
|
|
function isArguments(object) {
|
|
return Object.prototype.toString.call(object) == '[object Arguments]';
|
|
}
|
|
|
|
function objEquiv(a, b, strict, actualVisitedObjects) {
|
|
if (a === null || a === undefined || b === null || b === undefined)
|
|
return false;
|
|
// if one is a primitive, the other must be same
|
|
if (util.isPrimitive(a) || util.isPrimitive(b))
|
|
return a === b;
|
|
if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
|
|
return false;
|
|
var aIsArgs = isArguments(a);
|
|
var bIsArgs = isArguments(b);
|
|
if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
|
|
return false;
|
|
if (aIsArgs) {
|
|
a = pSlice.call(a);
|
|
b = pSlice.call(b);
|
|
return _deepEqual(a, b, strict);
|
|
}
|
|
var ka = objectKeys(a);
|
|
var kb = objectKeys(b);
|
|
var key, i;
|
|
// having the same number of owned properties (keys incorporates
|
|
// hasOwnProperty)
|
|
if (ka.length !== kb.length)
|
|
return false;
|
|
//the same set of keys (although not necessarily the same order),
|
|
ka.sort();
|
|
kb.sort();
|
|
//~~~cheap key test
|
|
for (i = ka.length - 1; i >= 0; i--) {
|
|
if (ka[i] !== kb[i])
|
|
return false;
|
|
}
|
|
//equivalent values for every corresponding key, and
|
|
//~~~possibly expensive deep test
|
|
for (i = ka.length - 1; i >= 0; i--) {
|
|
key = ka[i];
|
|
if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// 8. The non-equivalence assertion tests for any deep inequality.
|
|
// assert.notDeepEqual(actual, expected, message_opt);
|
|
|
|
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
|
|
if (_deepEqual(actual, expected, false)) {
|
|
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
|
|
}
|
|
};
|
|
|
|
assert.notDeepStrictEqual = notDeepStrictEqual;
|
|
function notDeepStrictEqual(actual, expected, message) {
|
|
if (_deepEqual(actual, expected, true)) {
|
|
fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
|
|
}
|
|
}
|
|
|
|
|
|
// 9. The strict equality assertion tests strict equality, as determined by ===.
|
|
// assert.strictEqual(actual, expected, message_opt);
|
|
|
|
assert.strictEqual = function strictEqual(actual, expected, message) {
|
|
if (actual !== expected) {
|
|
fail(actual, expected, message, '===', assert.strictEqual);
|
|
}
|
|
};
|
|
|
|
// 10. The strict non-equality assertion tests for strict inequality, as
|
|
// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
|
|
|
|
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
|
|
if (actual === expected) {
|
|
fail(actual, expected, message, '!==', assert.notStrictEqual);
|
|
}
|
|
};
|
|
|
|
function expectedException(actual, expected) {
|
|
if (!actual || !expected) {
|
|
return false;
|
|
}
|
|
|
|
if (Object.prototype.toString.call(expected) == '[object RegExp]') {
|
|
return expected.test(actual);
|
|
}
|
|
|
|
try {
|
|
if (actual instanceof expected) {
|
|
return true;
|
|
}
|
|
} catch (e) {
|
|
// Ignore. The instanceof check doesn't work for arrow functions.
|
|
}
|
|
|
|
if (Error.isPrototypeOf(expected)) {
|
|
return false;
|
|
}
|
|
|
|
return expected.call({}, actual) === true;
|
|
}
|
|
|
|
function _tryBlock(block) {
|
|
var error;
|
|
try {
|
|
block();
|
|
} catch (e) {
|
|
error = e;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
function _throws(shouldThrow, block, expected, message) {
|
|
var actual;
|
|
|
|
if (typeof block !== 'function') {
|
|
throw new TypeError('"block" argument must be a function');
|
|
}
|
|
|
|
if (typeof expected === 'string') {
|
|
message = expected;
|
|
expected = null;
|
|
}
|
|
|
|
actual = _tryBlock(block);
|
|
|
|
message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
|
|
(message ? ' ' + message : '.');
|
|
|
|
if (shouldThrow && !actual) {
|
|
fail(actual, expected, 'Missing expected exception' + message);
|
|
}
|
|
|
|
var userProvidedMessage = typeof message === 'string';
|
|
var isUnwantedException = !shouldThrow && util.isError(actual);
|
|
var isUnexpectedException = !shouldThrow && actual && !expected;
|
|
|
|
if ((isUnwantedException &&
|
|
userProvidedMessage &&
|
|
expectedException(actual, expected)) ||
|
|
isUnexpectedException) {
|
|
fail(actual, expected, 'Got unwanted exception' + message);
|
|
}
|
|
|
|
if ((shouldThrow && actual && expected &&
|
|
!expectedException(actual, expected)) || (!shouldThrow && actual)) {
|
|
throw actual;
|
|
}
|
|
}
|
|
|
|
// 11. Expected to throw an error:
|
|
// assert.throws(block, Error_opt, message_opt);
|
|
|
|
assert.throws = function(block, /*optional*/error, /*optional*/message) {
|
|
_throws(true, block, error, message);
|
|
};
|
|
|
|
// EXTENSION! This is annoying to write outside this module.
|
|
assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
|
|
_throws(false, block, error, message);
|
|
};
|
|
|
|
assert.ifError = function(err) { if (err) throw err; };
|
|
|
|
var objectKeys = Object.keys || function (obj) {
|
|
var keys = [];
|
|
for (var key in obj) {
|
|
if (hasOwn.call(obj, key)) keys.push(key);
|
|
}
|
|
return keys;
|
|
};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"util/":24}],3:[function(require,module,exports){
|
|
(function (global){
|
|
/*global window, global*/
|
|
var util = require("util")
|
|
var assert = require("assert")
|
|
var now = require("date-now")
|
|
|
|
var slice = Array.prototype.slice
|
|
var console
|
|
var times = {}
|
|
|
|
if (typeof global !== "undefined" && global.console) {
|
|
console = global.console
|
|
} else if (typeof window !== "undefined" && window.console) {
|
|
console = window.console
|
|
} else {
|
|
console = {}
|
|
}
|
|
|
|
var functions = [
|
|
[log, "log"],
|
|
[info, "info"],
|
|
[warn, "warn"],
|
|
[error, "error"],
|
|
[time, "time"],
|
|
[timeEnd, "timeEnd"],
|
|
[trace, "trace"],
|
|
[dir, "dir"],
|
|
[consoleAssert, "assert"]
|
|
]
|
|
|
|
for (var i = 0; i < functions.length; i++) {
|
|
var tuple = functions[i]
|
|
var f = tuple[0]
|
|
var name = tuple[1]
|
|
|
|
if (!console[name]) {
|
|
console[name] = f
|
|
}
|
|
}
|
|
|
|
module.exports = console
|
|
|
|
function log() {}
|
|
|
|
function info() {
|
|
console.log.apply(console, arguments)
|
|
}
|
|
|
|
function warn() {
|
|
console.log.apply(console, arguments)
|
|
}
|
|
|
|
function error() {
|
|
console.warn.apply(console, arguments)
|
|
}
|
|
|
|
function time(label) {
|
|
times[label] = now()
|
|
}
|
|
|
|
function timeEnd(label) {
|
|
var time = times[label]
|
|
if (!time) {
|
|
throw new Error("No such label: " + label)
|
|
}
|
|
|
|
var duration = now() - time
|
|
console.log(label + ": " + duration + "ms")
|
|
}
|
|
|
|
function trace() {
|
|
var err = new Error()
|
|
err.name = "Trace"
|
|
err.message = util.format.apply(null, arguments)
|
|
console.error(err.stack)
|
|
}
|
|
|
|
function dir(object) {
|
|
console.log(util.inspect(object) + "\n")
|
|
}
|
|
|
|
function consoleAssert(expression) {
|
|
if (!expression) {
|
|
var arr = slice.call(arguments, 1)
|
|
assert.ok(false, util.format.apply(null, arr))
|
|
}
|
|
}
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"assert":2,"date-now":4,"util":24}],4:[function(require,module,exports){
|
|
module.exports = now
|
|
|
|
function now() {
|
|
return new Date().getTime()
|
|
}
|
|
|
|
},{}],5:[function(require,module,exports){
|
|
/*
|
|
evol.colorpicker 3.2.2
|
|
(c) 2015 Olivier Giulieri
|
|
http://evoluteur.github.io/colorpicker/
|
|
*/
|
|
!function(a,b){var c=0,d=window.navigator.userAgent,e=d.indexOf("MSIE ")>0,f=e?"-ie":"",g=e?!1:/mozilla/.test(d.toLowerCase())&&!/webkit/.test(d.toLowerCase()),h=[],i=["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646"],j=["f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","92cddc","fac08f","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","31859b","e36c09","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","205867","974806"],k=["c00000","ff0000","ffc000","ffff00","92d050","00b050","00b0f0","0070c0","002060","7030a0"],l=[["003366","336699","3366cc","003399","000099","0000cc","000066"],["006666","006699","0099cc","0066cc","0033cc","0000ff","3333ff","333399"],["669999","009999","33cccc","00ccff","0099ff","0066ff","3366ff","3333cc","666699"],["339966","00cc99","00ffcc","00ffff","33ccff","3399ff","6699ff","6666ff","6600ff","6600cc"],["339933","00cc66","00ff99","66ffcc","66ffff","66ccff","99ccff","9999ff","9966ff","9933ff","9900ff"],["006600","00cc00","00ff00","66ff99","99ffcc","ccffff","ccccff","cc99ff","cc66ff","cc33ff","cc00ff","9900cc"],["003300","009933","33cc33","66ff66","99ff99","ccffcc","ffffff","ffccff","ff99ff","ff66ff","ff00ff","cc00cc","660066"],["333300","009900","66ff33","99ff66","ccff99","ffffcc","ffcccc","ff99cc","ff66cc","ff33cc","cc0099","993399"],["336600","669900","99ff33","ccff66","ffff99","ffcc99","ff9999","ff6699","ff3399","cc3399","990099"],["666633","99cc00","ccff33","ffff66","ffcc66","ff9966","ff6666","ff0066","d60094","993366"],["a58800","cccc00","ffff00","ffcc00","ff9933","ff6600","ff0033","cc0066","660033"],["996633","cc9900","ff9900","cc6600","ff3300","ff0000","cc0000","990033"],["663300","996600","cc3300","993300","990000","800000","993333"]],m="#0000ffff",n=function(a){var b=a.toString(16);return 1==b.length&&(b="0"+b),b},o=function(a){return n(Number(a))},p=function(a){var b=n(a);return b+b+b},q=function(a){if(a.length>10){var b=1+a.indexOf("("),c=a.indexOf(")"),d=a.substring(b,c).split(",");return["#",o(d[0]),o(d[1]),o(d[2])].join("")}return a};a.widget("evol.colorpicker",{version:"3.2.1",options:{color:null,showOn:"both",hideButton:!1,displayIndicator:!0,transparentColor:!1,history:!0,defaultPalette:"theme",strings:"Theme Colors,Standard Colors,Web Colors,Theme Colors,Back to Palette,History,No history yet."},_active:!1,_create:function(){var b=this;switch(this._paletteIdx="theme"==this.options.defaultPalette?1:2,this._id="evo-cp"+c++,this._enabled=!0,this.options.showOn=this.options.hideButton?"focus":this.options.showOn,this.element.get(0).tagName){case"INPUT":var d=this.options.color,h=this.element,i=("focus"===this.options.showOn?"":"evo-pointer ")+"evo-colorind"+(g?"-ff":f)+(this.options.hideButton?" evo-hidden-button":""),j="";if(this._isPopup=!0,this._palette=null,null!==d)h.val(d);else{var k=h.val();""!==k&&(d=this.options.color=k)}d===m?i+=" evo-transparent":j=null!==d?"background-color:"+d:"",h.addClass("colorPicker "+this._id).wrap('<div style="width:'+(this.options.hideButton?this.element.width():this.element.width()+32)+"px;"+(e?"margin-bottom:-21px;":"")+(g?"padding:1px 0;":"")+'"></div>').after('<div class="'+i+'" style="'+j+'"></div>').on("keyup onpaste",function(c){var d=a(this).val();d!=b.options.color&&b._setValue(d,!0)});var l=this.options.showOn;("both"===l||"focus"===l)&&h.on("focus",function(){b.showPalette()}),("both"===l||"button"===l)&&h.next().on("click",function(a){return a.stopPropagation(),b.showPalette(),!1});break;default:this._isPopup=!1,this._palette=this.element.html(this._paletteHTML()).attr("aria-haspopup","true"),this._bindColors()}if(this.options.history&&(d&&this._add2History(d),this.options.initialHistory)){var n=this.options.initialHistory;for(var o in n)this._add2History(n[o])}},_paletteHTML:function(){var a=this._paletteIdx=Math.abs(this._paletteIdx),b=this.options,c=b.strings.split(","),d='<div class="evo-pop'+f+' ui-widget ui-widget-content ui-corner-all"'+(this._isPopup?' style="position:absolute"':"")+"><span>"+this["_paletteHTML"+a]()+'</span><div class="evo-more"><a href="javascript:void(0)">'+c[1+a]+"</a>";return b.history&&(d+='<a href="javascript:void(0)" class="evo-hist">'+c[5]+"</a>"),d+="</div>",b.displayIndicator&&(d+=this._colorIndHTML(this.options.color)+this._colorIndHTML("")),d+="</div>"},_colorIndHTML:function(a){var b=e?"evo-colorbox-ie ":"",c="";return a?a===m?b+="evo-transparent":c="background-color:"+a:c="display:none",'<div class="evo-color" style="float:left"><div style="'+c+'" class="'+b+'"></div><span>'+(a?a:"")+"</span></div>"},_paletteHTML1:function(){for(var a=this.options,b=a.strings.split(","),c='<td style="background-color:#',d=e?'"><div style="width:2px;"></div></td>':'"><span/></td>',g='<tr><th colspan="10" class="ui-widget-content">',h='<table class="evo-palette'+f+'">'+g+b[0]+"</th></tr><tr>",l=0;10>l;l++)h+=c+i[l]+d;for(h+="</tr>",e||(h+='<tr><th colspan="10"></th></tr>'),h+='<tr class="top">',l=0;10>l;l++)h+=c+j[l]+d;for(var m=1;4>m;m++)for(h+='</tr><tr class="in">',l=0;10>l;l++)h+=c+j[10*m+l]+d;for(h+='</tr><tr class="bottom">',l=40;50>l;l++)h+=c+j[l]+d;for(h+="</tr>"+g,a.transparentColor&&(h+='<div class="evo-transparent evo-tr-box"></div>'),h+=b[1]+"</th></tr><tr>",l=0;10>l;l++)h+=c+k[l]+d;return h+="</tr></table>"},_paletteHTML2:function(){for(var a,b,c='<td style="background-color:#',d=e?'"><div style="width:5px;"></div></td>':'"><span/></td>',g='<table class="evo-palette2'+f+'"><tr>',h="</tr></table>",i='<div class="evo-palcenter">',j=0,k=l.length;k>j;j++){i+=g;var m=l[j];for(a=0,b=m.length;b>a;a++)i+=c+m[a]+d;i+=h}i+='<div class="evo-sep"/>';var n="";for(i+=g,a=255;a>10;a-=10)i+=c+p(a)+d,a-=10,n+=c+p(a)+d;return i+=h+g+n+h+"</div>"},_switchPalette:function(b){if(this._enabled){var c,d,e,f=this.options.strings.split(",");if(a(b).hasClass("evo-hist")){var g=['<table class="evo-palette"><tr><th class="ui-widget-content">',f[5],"</th></tr></tr></table>",'<div class="evo-cHist">'];if(0===h.length)g.push("<p> ",f[6],"</p>");else for(var i=h.length-1;i>-1;i--)9===h[i].length?g.push('<div class="evo-transparent"></div>'):g.push('<div style="background-color:',h[i],'"></div>');g.push("</div>"),c=-this._paletteIdx,d=g.join(""),e=f[4]}else this._paletteIdx<0?(c=-this._paletteIdx,this._palette.find(".evo-hist").show()):c=2==this._paletteIdx?1:2,d=this["_paletteHTML"+c](),e=f[c+1],this._paletteIdx=c;this._paletteIdx=c;var j=this._palette.find(".evo-more").prev().html(d).end().children().eq(0).html(e);0>c&&j.next().hide()}},_downOrUpPositioning:function(){for(var a=this.element,b=0;null!==a&&100>b;){if("visible"!=a.css("overflow")){var c=this._palette.offset().top+this._palette.height(),d=a.offset().top+a.height(),e=this._palette.offset().top-this._palette.height()-this.element.outerHeight(),f=a.offset().top,g=c>d&&e>f;g?this._palette.css({bottom:this.element.outerHeight()+"px"}):this._palette.css({bottom:"auto"});break}if("HTML"==a[0].tagName)break;a=a.offsetParent(),b++}},showPalette:function(){if(this._enabled&&(this._active=!0,a(".colorPicker").not("."+this._id).colorpicker("hidePalette"),null===this._palette)){this._palette=this.element.next().after(this._paletteHTML()).next().on("click",function(a){return a.stopPropagation(),!1}),this._bindColors();var b=this;this._isPopup&&(this._downOrUpPositioning(),a(document.body).on("click."+b._id,function(a){a.target!=b.element.get(0)&&b.hidePalette()}).on("keyup."+b._id,function(a){27===a.keyCode&&b.hidePalette()}))}return this},hidePalette:function(){if(this._isPopup&&this._palette){a(document.body).off("click."+this._id);var b=this;this._palette.off("mouseover click","td,.evo-transparent").fadeOut(function(){b._palette.remove(),b._palette=b._cTxt=null}).find(".evo-more a").off("click")}return this},_bindColors:function(){var b=this,c=this.options,d=this._palette.find("div.evo-color"),e=c.history?"td,.evo-cHist>div":"td";c.transparentColor&&(e+=",.evo-transparent"),this._cTxt1=d.eq(0).children().eq(0),this._cTxt2=d.eq(1).children().eq(0),this._palette.on("click",e,function(c){if(b._enabled){var d=a(this);b._setValue(d.hasClass("evo-transparent")?m:q(d.attr("style").substring(17))),b._active=!1}}).on("mouseover",e,function(c){if(b._enabled){var d=a(this),e=d.hasClass("evo-transparent")?m:q(d.attr("style").substring(17));b.options.displayIndicator&&b._setColorInd(e,2),b._active&&b.element.trigger("mouseover.color",e)}}).find(".evo-more a").on("click",function(){b._switchPalette(this)})},val:function(a){return"undefined"==typeof a?this.options.color:(this._setValue(a),this)},_setValue:function(a,b){a=a.replace(/ /g,""),this.options.color=a,this._isPopup?(b||this.hidePalette(),this._setBoxColor(this.element.val(a).next(),a)):this._setColorInd(a,1),this.options.history&&this._paletteIdx>0&&this._add2History(a),this.element.trigger("change.color",a)},_setColorInd:function(a,b){var c=this["_cTxt"+b];this._setBoxColor(c,a),c.next().html(a)},_setBoxColor:function(a,b){b===m?a.addClass("evo-transparent").removeAttr("style"):a.removeClass("evo-transparent").attr("style","background-color:"+b)},_setOption:function(a,b){"color"==a?this._setValue(b,!0):this.options[a]=b},_add2History:function(a){for(var b=h.length,c=0;b>c;c++)if(a==h[c])return;b>27&&h.shift(),h.push(a)},clear:function(){this.hidePalette().val("")},enable:function(){var a=this.element;return this._isPopup?a.removeAttr("disabled"):a.css({opacity:"1","pointer-events":"auto"}),"focus"!==this.options.showOn&&this.element.next().addClass("evo-pointer"),a.removeAttr("aria-disabled"),this._enabled=!0,this},disable:function(){var a=this.element;return this._isPopup?a.attr("disabled","disabled"):(this.hidePalette(),a.css({opacity:"0.3","pointer-events":"none"})),"focus"!==this.options.showOn&&this.element.next().removeClass("evo-pointer"),a.attr("aria-disabled","true"),this._enabled=!1,this},isDisabled:function(){return!this._enabled},destroy:function(){a(document.body).off("click."+this._id),this._palette&&(this._palette.off("mouseover click","td,.evo-cHist>div,.evo-transparent").find(".evo-more a").off("click"),this._isPopup&&this._palette.remove(),this._palette=this._cTxt=null),this._isPopup&&this.element.next().off("click").remove().end().off("focus").unwrap(),this.element.removeClass("colorPicker "+this.id).empty(),a.Widget.prototype.destroy.call(this)}})}(jQuery);
|
|
},{}],6:[function(require,module,exports){
|
|
// JavaScript Expression Parser (JSEP) 0.3.3
|
|
// JSEP may be freely distributed under the MIT License
|
|
// http://jsep.from.so/
|
|
|
|
/*global module: true, exports: true, console: true */
|
|
(function (root) {
|
|
'use strict';
|
|
// Node Types
|
|
// ----------
|
|
|
|
// This is the full set of types that any JSEP node can be.
|
|
// Store them here to save space when minified
|
|
var COMPOUND = 'Compound',
|
|
IDENTIFIER = 'Identifier',
|
|
MEMBER_EXP = 'MemberExpression',
|
|
LITERAL = 'Literal',
|
|
THIS_EXP = 'ThisExpression',
|
|
CALL_EXP = 'CallExpression',
|
|
UNARY_EXP = 'UnaryExpression',
|
|
BINARY_EXP = 'BinaryExpression',
|
|
LOGICAL_EXP = 'LogicalExpression',
|
|
CONDITIONAL_EXP = 'ConditionalExpression',
|
|
ARRAY_EXP = 'ArrayExpression',
|
|
|
|
PERIOD_CODE = 46, // '.'
|
|
COMMA_CODE = 44, // ','
|
|
SQUOTE_CODE = 39, // single quote
|
|
DQUOTE_CODE = 34, // double quotes
|
|
OPAREN_CODE = 40, // (
|
|
CPAREN_CODE = 41, // )
|
|
OBRACK_CODE = 91, // [
|
|
CBRACK_CODE = 93, // ]
|
|
QUMARK_CODE = 63, // ?
|
|
SEMCOL_CODE = 59, // ;
|
|
COLON_CODE = 58, // :
|
|
|
|
throwError = function(message, index) {
|
|
var error = new Error(message + ' at character ' + index);
|
|
error.index = index;
|
|
error.description = message;
|
|
throw error;
|
|
},
|
|
|
|
// Operations
|
|
// ----------
|
|
|
|
// Set `t` to `true` to save space (when minified, not gzipped)
|
|
t = true,
|
|
// Use a quickly-accessible map to store all of the unary operators
|
|
// Values are set to `true` (it really doesn't matter)
|
|
unary_ops = {'-': t, '!': t, '~': t, '+': t},
|
|
// Also use a map for the binary operations but set their values to their
|
|
// binary precedence for quick reference:
|
|
// see [Order of operations](http://en.wikipedia.org/wiki/Order_of_operations#Programming_language)
|
|
binary_ops = {
|
|
'||': 1, '&&': 2, '|': 3, '^': 4, '&': 5,
|
|
'==': 6, '!=': 6, '===': 6, '!==': 6,
|
|
'<': 7, '>': 7, '<=': 7, '>=': 7,
|
|
'<<':8, '>>': 8, '>>>': 8,
|
|
'+': 9, '-': 9,
|
|
'*': 10, '/': 10, '%': 10
|
|
},
|
|
// Get return the longest key length of any object
|
|
getMaxKeyLen = function(obj) {
|
|
var max_len = 0, len;
|
|
for(var key in obj) {
|
|
if((len = key.length) > max_len && obj.hasOwnProperty(key)) {
|
|
max_len = len;
|
|
}
|
|
}
|
|
return max_len;
|
|
},
|
|
max_unop_len = getMaxKeyLen(unary_ops),
|
|
max_binop_len = getMaxKeyLen(binary_ops),
|
|
// Literals
|
|
// ----------
|
|
// Store the values to return for the various literals we may encounter
|
|
literals = {
|
|
'true': true,
|
|
'false': false,
|
|
'null': null
|
|
},
|
|
// Except for `this`, which is special. This could be changed to something like `'self'` as well
|
|
this_str = 'this',
|
|
// Returns the precedence of a binary operator or `0` if it isn't a binary operator
|
|
binaryPrecedence = function(op_val) {
|
|
return binary_ops[op_val] || 0;
|
|
},
|
|
// Utility function (gets called from multiple places)
|
|
// Also note that `a && b` and `a || b` are *logical* expressions, not binary expressions
|
|
createBinaryExpression = function (operator, left, right) {
|
|
var type = (operator === '||' || operator === '&&') ? LOGICAL_EXP : BINARY_EXP;
|
|
return {
|
|
type: type,
|
|
operator: operator,
|
|
left: left,
|
|
right: right
|
|
};
|
|
},
|
|
// `ch` is a character code in the next three functions
|
|
isDecimalDigit = function(ch) {
|
|
return (ch >= 48 && ch <= 57); // 0...9
|
|
},
|
|
isIdentifierStart = function(ch) {
|
|
return (ch === 36) || (ch === 95) || // `$` and `_`
|
|
(ch >= 65 && ch <= 90) || // A...Z
|
|
(ch >= 97 && ch <= 122) || // a...z
|
|
(ch >= 128 && !binary_ops[String.fromCharCode(ch)]); // any non-ASCII that is not an operator
|
|
},
|
|
isIdentifierPart = function(ch) {
|
|
return (ch === 36) || (ch === 95) || // `$` and `_`
|
|
(ch >= 65 && ch <= 90) || // A...Z
|
|
(ch >= 97 && ch <= 122) || // a...z
|
|
(ch >= 48 && ch <= 57) || // 0...9
|
|
(ch >= 128 && !binary_ops[String.fromCharCode(ch)]); // any non-ASCII that is not an operator
|
|
},
|
|
|
|
// Parsing
|
|
// -------
|
|
// `expr` is a string with the passed in expression
|
|
jsep = function(expr) {
|
|
// `index` stores the character number we are currently at while `length` is a constant
|
|
// All of the gobbles below will modify `index` as we move along
|
|
var index = 0,
|
|
charAtFunc = expr.charAt,
|
|
charCodeAtFunc = expr.charCodeAt,
|
|
exprI = function(i) { return charAtFunc.call(expr, i); },
|
|
exprICode = function(i) { return charCodeAtFunc.call(expr, i); },
|
|
length = expr.length,
|
|
|
|
// Push `index` up to the next non-space character
|
|
gobbleSpaces = function() {
|
|
var ch = exprICode(index);
|
|
// space or tab
|
|
while(ch === 32 || ch === 9 || ch === 10 || ch === 13) {
|
|
ch = exprICode(++index);
|
|
}
|
|
},
|
|
|
|
// The main parsing function. Much of this code is dedicated to ternary expressions
|
|
gobbleExpression = function() {
|
|
var test = gobbleBinaryExpression(),
|
|
consequent, alternate;
|
|
gobbleSpaces();
|
|
if(exprICode(index) === QUMARK_CODE) {
|
|
// Ternary expression: test ? consequent : alternate
|
|
index++;
|
|
consequent = gobbleExpression();
|
|
if(!consequent) {
|
|
throwError('Expected expression', index);
|
|
}
|
|
gobbleSpaces();
|
|
if(exprICode(index) === COLON_CODE) {
|
|
index++;
|
|
alternate = gobbleExpression();
|
|
if(!alternate) {
|
|
throwError('Expected expression', index);
|
|
}
|
|
return {
|
|
type: CONDITIONAL_EXP,
|
|
test: test,
|
|
consequent: consequent,
|
|
alternate: alternate
|
|
};
|
|
} else {
|
|
throwError('Expected :', index);
|
|
}
|
|
} else {
|
|
return test;
|
|
}
|
|
},
|
|
|
|
// Search for the operation portion of the string (e.g. `+`, `===`)
|
|
// Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)
|
|
// and move down from 3 to 2 to 1 character until a matching binary operation is found
|
|
// then, return that binary operation
|
|
gobbleBinaryOp = function() {
|
|
gobbleSpaces();
|
|
var biop, to_check = expr.substr(index, max_binop_len), tc_len = to_check.length;
|
|
while(tc_len > 0) {
|
|
if(binary_ops.hasOwnProperty(to_check)) {
|
|
index += tc_len;
|
|
return to_check;
|
|
}
|
|
to_check = to_check.substr(0, --tc_len);
|
|
}
|
|
return false;
|
|
},
|
|
|
|
// This function is responsible for gobbling an individual expression,
|
|
// e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`
|
|
gobbleBinaryExpression = function() {
|
|
var ch_i, node, biop, prec, stack, biop_info, left, right, i;
|
|
|
|
// First, try to get the leftmost thing
|
|
// Then, check to see if there's a binary operator operating on that leftmost thing
|
|
left = gobbleToken();
|
|
biop = gobbleBinaryOp();
|
|
|
|
// If there wasn't a binary operator, just return the leftmost node
|
|
if(!biop) {
|
|
return left;
|
|
}
|
|
|
|
// Otherwise, we need to start a stack to properly place the binary operations in their
|
|
// precedence structure
|
|
biop_info = { value: biop, prec: binaryPrecedence(biop)};
|
|
|
|
right = gobbleToken();
|
|
if(!right) {
|
|
throwError("Expected expression after " + biop, index);
|
|
}
|
|
stack = [left, biop_info, right];
|
|
|
|
// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)
|
|
while((biop = gobbleBinaryOp())) {
|
|
prec = binaryPrecedence(biop);
|
|
|
|
if(prec === 0) {
|
|
break;
|
|
}
|
|
biop_info = { value: biop, prec: prec };
|
|
|
|
// Reduce: make a binary expression from the three topmost entries.
|
|
while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
|
|
right = stack.pop();
|
|
biop = stack.pop().value;
|
|
left = stack.pop();
|
|
node = createBinaryExpression(biop, left, right);
|
|
stack.push(node);
|
|
}
|
|
|
|
node = gobbleToken();
|
|
if(!node) {
|
|
throwError("Expected expression after " + biop, index);
|
|
}
|
|
stack.push(biop_info, node);
|
|
}
|
|
|
|
i = stack.length - 1;
|
|
node = stack[i];
|
|
while(i > 1) {
|
|
node = createBinaryExpression(stack[i - 1].value, stack[i - 2], node);
|
|
i -= 2;
|
|
}
|
|
return node;
|
|
},
|
|
|
|
// An individual part of a binary expression:
|
|
// e.g. `foo.bar(baz)`, `1`, `"abc"`, `(a % 2)` (because it's in parenthesis)
|
|
gobbleToken = function() {
|
|
var ch, to_check, tc_len;
|
|
|
|
gobbleSpaces();
|
|
ch = exprICode(index);
|
|
|
|
if(isDecimalDigit(ch) || ch === PERIOD_CODE) {
|
|
// Char code 46 is a dot `.` which can start off a numeric literal
|
|
return gobbleNumericLiteral();
|
|
} else if(ch === SQUOTE_CODE || ch === DQUOTE_CODE) {
|
|
// Single or double quotes
|
|
return gobbleStringLiteral();
|
|
} else if (ch === OBRACK_CODE) {
|
|
return gobbleArray();
|
|
} else {
|
|
to_check = expr.substr(index, max_unop_len);
|
|
tc_len = to_check.length;
|
|
while(tc_len > 0) {
|
|
if(unary_ops.hasOwnProperty(to_check)) {
|
|
index += tc_len;
|
|
return {
|
|
type: UNARY_EXP,
|
|
operator: to_check,
|
|
argument: gobbleToken(),
|
|
prefix: true
|
|
};
|
|
}
|
|
to_check = to_check.substr(0, --tc_len);
|
|
}
|
|
|
|
if (isIdentifierStart(ch) || ch === OPAREN_CODE) { // open parenthesis
|
|
// `foo`, `bar.baz`
|
|
return gobbleVariable();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
},
|
|
// Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to
|
|
// keep track of everything in the numeric literal and then calling `parseFloat` on that string
|
|
gobbleNumericLiteral = function() {
|
|
var number = '', ch, chCode;
|
|
while(isDecimalDigit(exprICode(index))) {
|
|
number += exprI(index++);
|
|
}
|
|
|
|
if(exprICode(index) === PERIOD_CODE) { // can start with a decimal marker
|
|
number += exprI(index++);
|
|
|
|
while(isDecimalDigit(exprICode(index))) {
|
|
number += exprI(index++);
|
|
}
|
|
}
|
|
|
|
ch = exprI(index);
|
|
if(ch === 'e' || ch === 'E') { // exponent marker
|
|
number += exprI(index++);
|
|
ch = exprI(index);
|
|
if(ch === '+' || ch === '-') { // exponent sign
|
|
number += exprI(index++);
|
|
}
|
|
while(isDecimalDigit(exprICode(index))) { //exponent itself
|
|
number += exprI(index++);
|
|
}
|
|
if(!isDecimalDigit(exprICode(index-1)) ) {
|
|
throwError('Expected exponent (' + number + exprI(index) + ')', index);
|
|
}
|
|
}
|
|
|
|
|
|
chCode = exprICode(index);
|
|
// Check to make sure this isn't a variable name that start with a number (123abc)
|
|
if(isIdentifierStart(chCode)) {
|
|
throwError('Variable names cannot start with a number (' +
|
|
number + exprI(index) + ')', index);
|
|
} else if(chCode === PERIOD_CODE) {
|
|
throwError('Unexpected period', index);
|
|
}
|
|
|
|
return {
|
|
type: LITERAL,
|
|
value: parseFloat(number),
|
|
raw: number
|
|
};
|
|
},
|
|
|
|
// Parses a string literal, staring with single or double quotes with basic support for escape codes
|
|
// e.g. `"hello world"`, `'this is\nJSEP'`
|
|
gobbleStringLiteral = function() {
|
|
var str = '', quote = exprI(index++), closed = false, ch;
|
|
|
|
while(index < length) {
|
|
ch = exprI(index++);
|
|
if(ch === quote) {
|
|
closed = true;
|
|
break;
|
|
} else if(ch === '\\') {
|
|
// Check for all of the common escape codes
|
|
ch = exprI(index++);
|
|
switch(ch) {
|
|
case 'n': str += '\n'; break;
|
|
case 'r': str += '\r'; break;
|
|
case 't': str += '\t'; break;
|
|
case 'b': str += '\b'; break;
|
|
case 'f': str += '\f'; break;
|
|
case 'v': str += '\x0B'; break;
|
|
default : str += ch;
|
|
}
|
|
} else {
|
|
str += ch;
|
|
}
|
|
}
|
|
|
|
if(!closed) {
|
|
throwError('Unclosed quote after "'+str+'"', index);
|
|
}
|
|
|
|
return {
|
|
type: LITERAL,
|
|
value: str,
|
|
raw: quote + str + quote
|
|
};
|
|
},
|
|
|
|
// Gobbles only identifiers
|
|
// e.g.: `foo`, `_value`, `$x1`
|
|
// Also, this function checks if that identifier is a literal:
|
|
// (e.g. `true`, `false`, `null`) or `this`
|
|
gobbleIdentifier = function() {
|
|
var ch = exprICode(index), start = index, identifier;
|
|
|
|
if(isIdentifierStart(ch)) {
|
|
index++;
|
|
} else {
|
|
throwError('Unexpected ' + exprI(index), index);
|
|
}
|
|
|
|
while(index < length) {
|
|
ch = exprICode(index);
|
|
if(isIdentifierPart(ch)) {
|
|
index++;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
identifier = expr.slice(start, index);
|
|
|
|
if(literals.hasOwnProperty(identifier)) {
|
|
return {
|
|
type: LITERAL,
|
|
value: literals[identifier],
|
|
raw: identifier
|
|
};
|
|
} else if(identifier === this_str) {
|
|
return { type: THIS_EXP };
|
|
} else {
|
|
return {
|
|
type: IDENTIFIER,
|
|
name: identifier
|
|
};
|
|
}
|
|
},
|
|
|
|
// Gobbles a list of arguments within the context of a function call
|
|
// or array literal. This function also assumes that the opening character
|
|
// `(` or `[` has already been gobbled, and gobbles expressions and commas
|
|
// until the terminator character `)` or `]` is encountered.
|
|
// e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`
|
|
gobbleArguments = function(termination) {
|
|
var ch_i, args = [], node, closed = false;
|
|
while(index < length) {
|
|
gobbleSpaces();
|
|
ch_i = exprICode(index);
|
|
if(ch_i === termination) { // done parsing
|
|
closed = true;
|
|
index++;
|
|
break;
|
|
} else if (ch_i === COMMA_CODE) { // between expressions
|
|
index++;
|
|
} else {
|
|
node = gobbleExpression();
|
|
if(!node || node.type === COMPOUND) {
|
|
throwError('Expected comma', index);
|
|
}
|
|
args.push(node);
|
|
}
|
|
}
|
|
if (!closed) {
|
|
throwError('Expected ' + String.fromCharCode(termination), index);
|
|
}
|
|
return args;
|
|
},
|
|
|
|
// Gobble a non-literal variable name. This variable name may include properties
|
|
// e.g. `foo`, `bar.baz`, `foo['bar'].baz`
|
|
// It also gobbles function calls:
|
|
// e.g. `Math.acos(obj.angle)`
|
|
gobbleVariable = function() {
|
|
var ch_i, node;
|
|
ch_i = exprICode(index);
|
|
|
|
if(ch_i === OPAREN_CODE) {
|
|
node = gobbleGroup();
|
|
} else {
|
|
node = gobbleIdentifier();
|
|
}
|
|
gobbleSpaces();
|
|
ch_i = exprICode(index);
|
|
while(ch_i === PERIOD_CODE || ch_i === OBRACK_CODE || ch_i === OPAREN_CODE) {
|
|
index++;
|
|
if(ch_i === PERIOD_CODE) {
|
|
gobbleSpaces();
|
|
node = {
|
|
type: MEMBER_EXP,
|
|
computed: false,
|
|
object: node,
|
|
property: gobbleIdentifier()
|
|
};
|
|
} else if(ch_i === OBRACK_CODE) {
|
|
node = {
|
|
type: MEMBER_EXP,
|
|
computed: true,
|
|
object: node,
|
|
property: gobbleExpression()
|
|
};
|
|
gobbleSpaces();
|
|
ch_i = exprICode(index);
|
|
if(ch_i !== CBRACK_CODE) {
|
|
throwError('Unclosed [', index);
|
|
}
|
|
index++;
|
|
} else if(ch_i === OPAREN_CODE) {
|
|
// A function call is being made; gobble all the arguments
|
|
node = {
|
|
type: CALL_EXP,
|
|
'arguments': gobbleArguments(CPAREN_CODE),
|
|
callee: node
|
|
};
|
|
}
|
|
gobbleSpaces();
|
|
ch_i = exprICode(index);
|
|
}
|
|
return node;
|
|
},
|
|
|
|
// Responsible for parsing a group of things within parentheses `()`
|
|
// This function assumes that it needs to gobble the opening parenthesis
|
|
// and then tries to gobble everything within that parenthesis, assuming
|
|
// that the next thing it should see is the close parenthesis. If not,
|
|
// then the expression probably doesn't have a `)`
|
|
gobbleGroup = function() {
|
|
index++;
|
|
var node = gobbleExpression();
|
|
gobbleSpaces();
|
|
if(exprICode(index) === CPAREN_CODE) {
|
|
index++;
|
|
return node;
|
|
} else {
|
|
throwError('Unclosed (', index);
|
|
}
|
|
},
|
|
|
|
// Responsible for parsing Array literals `[1, 2, 3]`
|
|
// This function assumes that it needs to gobble the opening bracket
|
|
// and then tries to gobble the expressions as arguments.
|
|
gobbleArray = function() {
|
|
index++;
|
|
return {
|
|
type: ARRAY_EXP,
|
|
elements: gobbleArguments(CBRACK_CODE)
|
|
};
|
|
},
|
|
|
|
nodes = [], ch_i, node;
|
|
|
|
while(index < length) {
|
|
ch_i = exprICode(index);
|
|
|
|
// Expressions can be separated by semicolons, commas, or just inferred without any
|
|
// separators
|
|
if(ch_i === SEMCOL_CODE || ch_i === COMMA_CODE) {
|
|
index++; // ignore separators
|
|
} else {
|
|
// Try to gobble each expression individually
|
|
if((node = gobbleExpression())) {
|
|
nodes.push(node);
|
|
// If we weren't able to find a binary expression and are out of room, then
|
|
// the expression passed in probably has too much
|
|
} else if(index < length) {
|
|
throwError('Unexpected "' + exprI(index) + '"', index);
|
|
}
|
|
}
|
|
}
|
|
|
|
// If there's only one expression just try returning the expression
|
|
if(nodes.length === 1) {
|
|
return nodes[0];
|
|
} else {
|
|
return {
|
|
type: COMPOUND,
|
|
body: nodes
|
|
};
|
|
}
|
|
};
|
|
|
|
// To be filled in by the template
|
|
jsep.version = '0.3.3';
|
|
jsep.toString = function() { return 'JavaScript Expression Parser (JSEP) v' + jsep.version; };
|
|
|
|
/**
|
|
* @method jsep.addUnaryOp
|
|
* @param {string} op_name The name of the unary op to add
|
|
* @return jsep
|
|
*/
|
|
jsep.addUnaryOp = function(op_name) {
|
|
max_unop_len = Math.max(op_name.length, max_unop_len);
|
|
unary_ops[op_name] = t; return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.addBinaryOp
|
|
* @param {string} op_name The name of the binary op to add
|
|
* @param {number} precedence The precedence of the binary op (can be a float)
|
|
* @return jsep
|
|
*/
|
|
jsep.addBinaryOp = function(op_name, precedence) {
|
|
max_binop_len = Math.max(op_name.length, max_binop_len);
|
|
binary_ops[op_name] = precedence;
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.addLiteral
|
|
* @param {string} literal_name The name of the literal to add
|
|
* @param {*} literal_value The value of the literal
|
|
* @return jsep
|
|
*/
|
|
jsep.addLiteral = function(literal_name, literal_value) {
|
|
literals[literal_name] = literal_value;
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.removeUnaryOp
|
|
* @param {string} op_name The name of the unary op to remove
|
|
* @return jsep
|
|
*/
|
|
jsep.removeUnaryOp = function(op_name) {
|
|
delete unary_ops[op_name];
|
|
if(op_name.length === max_unop_len) {
|
|
max_unop_len = getMaxKeyLen(unary_ops);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.removeAllUnaryOps
|
|
* @return jsep
|
|
*/
|
|
jsep.removeAllUnaryOps = function() {
|
|
unary_ops = {};
|
|
max_unop_len = 0;
|
|
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.removeBinaryOp
|
|
* @param {string} op_name The name of the binary op to remove
|
|
* @return jsep
|
|
*/
|
|
jsep.removeBinaryOp = function(op_name) {
|
|
delete binary_ops[op_name];
|
|
if(op_name.length === max_binop_len) {
|
|
max_binop_len = getMaxKeyLen(binary_ops);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.removeAllBinaryOps
|
|
* @return jsep
|
|
*/
|
|
jsep.removeAllBinaryOps = function() {
|
|
binary_ops = {};
|
|
max_binop_len = 0;
|
|
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.removeLiteral
|
|
* @param {string} literal_name The name of the literal to remove
|
|
* @return jsep
|
|
*/
|
|
jsep.removeLiteral = function(literal_name) {
|
|
delete literals[literal_name];
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* @method jsep.removeAllLiterals
|
|
* @return jsep
|
|
*/
|
|
jsep.removeAllLiterals = function() {
|
|
literals = {};
|
|
|
|
return this;
|
|
};
|
|
|
|
// In desktop environments, have a way to restore the old value for `jsep`
|
|
if (typeof exports === 'undefined') {
|
|
var old_jsep = root.jsep;
|
|
// The star of the show! It's a function!
|
|
root.jsep = jsep;
|
|
// And a courteous function willing to move out of the way for other similarly-named objects!
|
|
jsep.noConflict = function() {
|
|
if(root.jsep === jsep) {
|
|
root.jsep = old_jsep;
|
|
}
|
|
return jsep;
|
|
};
|
|
} else {
|
|
// In Node.JS environments
|
|
if (typeof module !== 'undefined' && module.exports) {
|
|
exports = module.exports = jsep;
|
|
} else {
|
|
exports.parse = jsep;
|
|
}
|
|
}
|
|
}(this));
|
|
|
|
},{}],7:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var utils = require('./utils');
|
|
|
|
module.exports = function makeJuiceClient(juiceClient) {
|
|
|
|
juiceClient.ignoredPseudos = ['hover', 'active', 'focus', 'visited', 'link'];
|
|
juiceClient.widthElements = ['TABLE', 'TD', 'IMG'];
|
|
juiceClient.heightElements = ['TABLE', 'TD', 'IMG'];
|
|
juiceClient.tableElements = ['TABLE', 'TD', 'TH', 'TR', 'TD', 'CAPTION', 'COLGROUP', 'COL', 'THEAD', 'TBODY', 'TFOOT'];
|
|
juiceClient.nonVisualElements = [ 'HEAD', 'TITLE', 'BASE', 'LINK', 'STYLE', 'META', 'SCRIPT', 'NOSCRIPT' ];
|
|
juiceClient.styleToAttribute = {
|
|
'background-color': 'bgcolor',
|
|
'background-image': 'background',
|
|
'text-align': 'align',
|
|
'vertical-align': 'valign'
|
|
};
|
|
juiceClient.excludedProperties = [];
|
|
|
|
juiceClient.juiceDocument = juiceDocument;
|
|
juiceClient.inlineDocument = inlineDocument;
|
|
|
|
function inlineDocument($, css, options) {
|
|
|
|
options = options || {};
|
|
var rules = utils.parseCSS(css);
|
|
var editedElements = [];
|
|
var styleAttributeName = 'style';
|
|
|
|
if (options.styleAttributeName) {
|
|
styleAttributeName = options.styleAttributeName;
|
|
}
|
|
|
|
rules.forEach(handleRule);
|
|
editedElements.forEach(setStyleAttrs);
|
|
|
|
if (options.inlinePseudoElements) {
|
|
editedElements.forEach(inlinePseudoElements);
|
|
}
|
|
|
|
if (options.applyWidthAttributes) {
|
|
editedElements.forEach(function(el) {
|
|
setDimensionAttrs(el, 'width');
|
|
});
|
|
}
|
|
|
|
if (options.applyHeightAttributes) {
|
|
editedElements.forEach(function(el) {
|
|
setDimensionAttrs(el, 'height');
|
|
});
|
|
}
|
|
|
|
if (options.applyAttributesTableElements) {
|
|
editedElements.forEach(setAttributesOnTableElements);
|
|
}
|
|
|
|
if (options.insertPreservedExtraCss && options.extraCss) {
|
|
var preservedText = utils.getPreservedText(options.extraCss, {
|
|
mediaQueries: options.preserveMediaQueries,
|
|
fontFaces: options.preserveFontFaces
|
|
});
|
|
if (preservedText) {
|
|
var $appendTo = null;
|
|
if (options.insertPreservedExtraCss !== true) {
|
|
$appendTo = $(options.insertPreservedExtraCss);
|
|
} else {
|
|
$appendTo = $('head');
|
|
if (!$appendTo.length) { $appendTo = $('body'); }
|
|
if (!$appendTo.length) { $appendTo = $.root(); }
|
|
}
|
|
|
|
$appendTo.first().append('<style>' + preservedText + '</style>');
|
|
}
|
|
}
|
|
|
|
function handleRule(rule) {
|
|
var sel = rule[0];
|
|
var style = rule[1];
|
|
var selector = new utils.Selector(sel);
|
|
var parsedSelector = selector.parsed();
|
|
var pseudoElementType = getPseudoElementType(parsedSelector);
|
|
|
|
// skip rule if the selector has any pseudos which are ignored
|
|
for (var i = 0; i < parsedSelector.length; ++i) {
|
|
var subSel = parsedSelector[i];
|
|
if (subSel.pseudos) {
|
|
for (var j = 0; j < subSel.pseudos.length; ++j) {
|
|
var subSelPseudo = subSel.pseudos[j];
|
|
if (juiceClient.ignoredPseudos.indexOf(subSelPseudo.name) >= 0) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pseudoElementType) {
|
|
var last = parsedSelector[parsedSelector.length - 1];
|
|
var pseudos = last.pseudos;
|
|
last.pseudos = filterElementPseudos(last.pseudos);
|
|
sel = parsedSelector.toString();
|
|
last.pseudos = pseudos;
|
|
}
|
|
|
|
var els;
|
|
try {
|
|
els = $(sel);
|
|
} catch (err) {
|
|
// skip invalid selector
|
|
return;
|
|
}
|
|
|
|
els.each(function() {
|
|
var el = this;
|
|
|
|
if (el.name && juiceClient.nonVisualElements.indexOf(el.name.toUpperCase()) >= 0) {
|
|
return;
|
|
}
|
|
|
|
if (pseudoElementType) {
|
|
var pseudoElPropName = 'pseudo' + pseudoElementType;
|
|
var pseudoEl = el[pseudoElPropName];
|
|
if (!pseudoEl) {
|
|
pseudoEl = el[pseudoElPropName] = $('<span />').get(0);
|
|
pseudoEl.pseudoElementType = pseudoElementType;
|
|
pseudoEl.pseudoElementParent = el;
|
|
el[pseudoElPropName] = pseudoEl;
|
|
}
|
|
el = pseudoEl;
|
|
}
|
|
|
|
if (!el.styleProps) {
|
|
el.styleProps = {};
|
|
|
|
// if the element has inline styles, fake selector with topmost specificity
|
|
if ($(el).attr(styleAttributeName)) {
|
|
var cssText = '* { ' + $(el).attr(styleAttributeName) + ' } ';
|
|
addProps(utils.parseCSS(cssText)[0][1], new utils.Selector('<style>', true));
|
|
}
|
|
|
|
// store reference to an element we need to compile style="" attr for
|
|
editedElements.push(el);
|
|
}
|
|
|
|
// go through the properties
|
|
function addProps(style, selector) {
|
|
for (var i = 0, l = style.length; i < l; i++) {
|
|
if (style[i].type == 'property') {
|
|
var name = style[i].name;
|
|
var value = style[i].value;
|
|
var important = style[i].value.match(/!important$/) !== null;
|
|
if (important && !options.preserveImportant) value = value.replace(/\s*!important$/, '');
|
|
// adds line number and column number for the properties as "additionalPriority" to the
|
|
// properties because in CSS the position directly affect the priority.
|
|
var additionalPriority = [style[i].position.start.line, style[i].position.start.col];
|
|
var prop = new utils.Property(name, value, selector, important ? 2 : 0, additionalPriority);
|
|
var existing = el.styleProps[name];
|
|
|
|
// if property name is not in the excluded properties array
|
|
if (juiceClient.excludedProperties.indexOf(name) < 0) {
|
|
if (existing && existing.compare(prop) === prop || !existing) {
|
|
// deleting a property let us change the order (move it to the end in the setStyleAttrs loop)
|
|
if (existing && existing.selector !== selector) {
|
|
delete el.styleProps[name];
|
|
} else if (existing) {
|
|
// make "prop" a special composed property.
|
|
prop.nextProp = existing;
|
|
}
|
|
|
|
el.styleProps[name] = prop;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
addProps(style, selector);
|
|
});
|
|
}
|
|
|
|
function setStyleAttrs(el) {
|
|
var l = Object.keys(el.styleProps).length;
|
|
var props = [];
|
|
// Here we loop each property and make sure to "expand"
|
|
// linked "nextProp" properties happening when the same property
|
|
// is declared multiple times in the same selector.
|
|
Object.keys(el.styleProps).forEach(function(key) {
|
|
var np = el.styleProps[key];
|
|
while (typeof np !== 'undefined') {
|
|
props.push(np);
|
|
np = np.nextProp;
|
|
}
|
|
});
|
|
// sort properties by their originating selector's specificity so that
|
|
// props like "padding" and "padding-bottom" are resolved as expected.
|
|
props.sort(function(a, b) {
|
|
return a.compareFunc(b);
|
|
});
|
|
var string = props
|
|
.filter(function(prop) {
|
|
// Content becomes the innerHTML of pseudo elements, not used as a
|
|
// style property
|
|
return prop.prop !== 'content';
|
|
})
|
|
.map(function(prop) {
|
|
return prop.prop + ': ' + prop.value.replace(/["]/g, '\'') + ';';
|
|
})
|
|
.join(' ');
|
|
if (string) {
|
|
$(el).attr(styleAttributeName, string);
|
|
}
|
|
}
|
|
|
|
function inlinePseudoElements(el) {
|
|
if (el.pseudoElementType && el.styleProps.content) {
|
|
var parsed = parseContent(el.styleProps.content.value);
|
|
if (parsed.img) {
|
|
el.name = 'img';
|
|
$(el).attr('src', parsed.img);
|
|
} else {
|
|
$(el).text(parsed);
|
|
}
|
|
var parent = el.pseudoElementParent;
|
|
if (el.pseudoElementType === 'before') {
|
|
$(parent).prepend(el);
|
|
} else {
|
|
$(parent).append(el);
|
|
}
|
|
}
|
|
}
|
|
|
|
function setDimensionAttrs(el, dimension) {
|
|
if (!el.name) { return; }
|
|
var elName = el.name.toUpperCase();
|
|
if (juiceClient[dimension + 'Elements'].indexOf(elName) > -1) {
|
|
for (var i in el.styleProps) {
|
|
if (el.styleProps[i].prop === dimension) {
|
|
if (el.styleProps[i].value.match(/px/)) {
|
|
var pxSize = el.styleProps[i].value.replace('px', '');
|
|
$(el).attr(dimension, pxSize);
|
|
return;
|
|
}
|
|
if (juiceClient.tableElements.indexOf(elName) > -1 && el.styleProps[i].value.match(/\%/)) {
|
|
$(el).attr(dimension, el.styleProps[i].value);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function extractBackgroundUrl(value) {
|
|
return value.indexOf('url(') !== 0
|
|
? value
|
|
: value.replace(/^url\((["'])?([^"']+)\1\)$/, '$2');
|
|
}
|
|
|
|
function setAttributesOnTableElements(el) {
|
|
if (!el.name) { return; }
|
|
var elName = el.name.toUpperCase();
|
|
var styleProps = Object.keys(juiceClient.styleToAttribute);
|
|
|
|
if (juiceClient.tableElements.indexOf(elName) > -1) {
|
|
for (var i in el.styleProps) {
|
|
if (styleProps.indexOf(el.styleProps[i].prop) > -1) {
|
|
var prop = juiceClient.styleToAttribute[el.styleProps[i].prop];
|
|
var value = el.styleProps[i].value;
|
|
if (prop === 'background') {
|
|
value = extractBackgroundUrl(value)
|
|
}
|
|
$(el).attr(prop, value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseContent(content) {
|
|
if (content === 'none' || content === 'normal') {
|
|
return '';
|
|
}
|
|
|
|
var imageUrlMatch = content.match(/^\s*url\s*\(\s*(.*?)\s*\)\s*$/i);
|
|
if (imageUrlMatch) {
|
|
var url = imageUrlMatch[1].replace(/^['"]|['"]$/g, '');
|
|
return { img: url };
|
|
}
|
|
|
|
// Naive parsing, assume well-formed value
|
|
content = content.slice(1, content.length - 1);
|
|
// Naive unescape, assume no unicode char codes
|
|
content = content.replace(/\\/g, '');
|
|
return content;
|
|
}
|
|
|
|
// Return "before" or "after" if the given selector is a pseudo element (e.g.,
|
|
// a::after).
|
|
function getPseudoElementType(selector) {
|
|
if (selector.length === 0) {
|
|
return;
|
|
}
|
|
|
|
var pseudos = selector[selector.length - 1].pseudos;
|
|
if (!pseudos) {
|
|
return;
|
|
}
|
|
|
|
for (var i = 0; i < pseudos.length; i++) {
|
|
if (isPseudoElementName(pseudos[i])) {
|
|
return pseudos[i].name;
|
|
}
|
|
}
|
|
}
|
|
|
|
function isPseudoElementName(pseudo) {
|
|
return pseudo.name === 'before' || pseudo.name === 'after';
|
|
}
|
|
|
|
function filterElementPseudos(pseudos) {
|
|
return pseudos.filter(function(pseudo) {
|
|
return !isPseudoElementName(pseudo);
|
|
});
|
|
}
|
|
|
|
function juiceDocument($, options) {
|
|
options = utils.getDefaultOptions(options);
|
|
var css = extractCssFromDocument($, options);
|
|
css += '\n' + options.extraCss;
|
|
inlineDocument($, css, options);
|
|
return $;
|
|
}
|
|
|
|
function getStylesData($, options) {
|
|
var results = [];
|
|
var stylesList = $('style');
|
|
var styleDataList, styleData, styleElement;
|
|
stylesList.each(function() {
|
|
styleElement = this;
|
|
styleDataList = styleElement.childNodes;
|
|
if (styleDataList.length !== 1) {
|
|
return;
|
|
}
|
|
styleData = styleDataList[0].data;
|
|
if (options.applyStyleTags && $(styleElement).attr('data-embed') === undefined) {
|
|
results.push(styleData);
|
|
}
|
|
if (options.removeStyleTags && $(styleElement).attr('data-embed') === undefined) {
|
|
var preservedText = utils.getPreservedText(styleElement.childNodes[0].nodeValue, {
|
|
mediaQueries: options.preserveMediaQueries,
|
|
fontFaces: options.preserveFontFaces
|
|
});
|
|
if (preservedText) {
|
|
styleElement.childNodes[0].nodeValue = preservedText;
|
|
} else {
|
|
$(styleElement).remove();
|
|
}
|
|
}
|
|
$(styleElement).removeAttr('data-embed');
|
|
});
|
|
return results;
|
|
}
|
|
|
|
function extractCssFromDocument($, options) {
|
|
var results = getStylesData($, options);
|
|
var css = results.join('\n');
|
|
return css;
|
|
}
|
|
|
|
return juiceClient;
|
|
|
|
};
|
|
|
|
},{"./utils":10}],8:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
module.exports = exports = Property;
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var utils = require('./utils');
|
|
|
|
/**
|
|
* CSS property constructor.
|
|
*
|
|
* @param {String} property
|
|
* @param {String} value
|
|
* @param {Selector} selector the property originates from
|
|
* @param {Integer} priority 0 for normal properties, 2 for !important properties.
|
|
* @param {Array} additional array of integers representing more detailed priorities (sorting)
|
|
* @api public
|
|
*/
|
|
|
|
function Property(prop, value, selector, priority, additionalPriority) {
|
|
this.prop = prop;
|
|
this.value = value;
|
|
this.selector = selector;
|
|
this.priority = priority || 0;
|
|
this.additionalPriority = additionalPriority || [];
|
|
}
|
|
|
|
/**
|
|
* Compares with another Property based on Selector#specificity.
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
Property.prototype.compareFunc = function(property) {
|
|
var a = [];
|
|
a.push.apply(a, this.selector.specificity());
|
|
a.push.apply(a, this.additionalPriority);
|
|
a[0] += this.priority;
|
|
var b = [];
|
|
b.push.apply(b, property.selector.specificity());
|
|
b.push.apply(b, property.additionalPriority);
|
|
b[0] += property.priority;
|
|
return utils.compareFunc(a, b);
|
|
};
|
|
|
|
Property.prototype.compare = function(property) {
|
|
var winner = this.compareFunc(property);
|
|
if (winner === 1) {
|
|
return this;
|
|
}
|
|
return property;
|
|
};
|
|
|
|
|
|
/**
|
|
* Returns CSS property
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
Property.prototype.toString = function() {
|
|
return this.prop + ': ' + this.value.replace(/['"]+/g, '') + ';';
|
|
};
|
|
|
|
},{"./utils":10}],9:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var parser = require('slick/parser');
|
|
|
|
module.exports = exports = Selector;
|
|
|
|
/**
|
|
* CSS selector constructor.
|
|
*
|
|
* @param {String} selector text
|
|
* @param {Array} optionally, precalculated specificity
|
|
* @api public
|
|
*/
|
|
|
|
function Selector(text, styleAttribute) {
|
|
this.text = text;
|
|
this.spec = undefined;
|
|
this.styleAttribute = styleAttribute || false;
|
|
}
|
|
|
|
/**
|
|
* Get parsed selector.
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
Selector.prototype.parsed = function() {
|
|
if (!this.tokens) { this.tokens = parse(this.text); }
|
|
return this.tokens;
|
|
};
|
|
|
|
/**
|
|
* Lazy specificity getter
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
Selector.prototype.specificity = function() {
|
|
var styleAttribute = this.styleAttribute;
|
|
if (!this.spec) { this.spec = specificity(this.text, this.parsed()); }
|
|
return this.spec;
|
|
|
|
function specificity(text, parsed) {
|
|
var expressions = parsed || parse(text);
|
|
var spec = [styleAttribute ? 1 : 0, 0, 0, 0];
|
|
var nots = [];
|
|
|
|
for (var i = 0; i < expressions.length; i++) {
|
|
var expression = expressions[i];
|
|
var pseudos = expression.pseudos;
|
|
|
|
// id awards a point in the second column
|
|
if (expression.id) { spec[1]++; }
|
|
|
|
// classes and attributes award a point each in the third column
|
|
if (expression.attributes) { spec[2] += expression.attributes.length; }
|
|
if (expression.classList) { spec[2] += expression.classList.length; }
|
|
|
|
// tag awards a point in the fourth column
|
|
if (expression.tag && expression.tag !== '*') { spec[3]++; }
|
|
|
|
// pseudos award a point each in the fourth column
|
|
if (pseudos) {
|
|
spec[3] += pseudos.length;
|
|
|
|
for (var p = 0; p < pseudos.length; p++) {
|
|
if (pseudos[p].name === 'not') {
|
|
nots.push(pseudos[p].value);
|
|
spec[3]--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var ii = nots.length; ii--;) {
|
|
var not = specificity(nots[ii]);
|
|
for (var jj = 4; jj--;) { spec[jj] += not[jj]; }
|
|
}
|
|
|
|
return spec;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Parses a selector and returns the tokens.
|
|
*
|
|
* @param {String} selector
|
|
* @api private.
|
|
*/
|
|
|
|
function parse(text) {
|
|
try {
|
|
return parser(text)[0];
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
},{"slick/parser":19}],10:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var mensch = require('mensch');
|
|
var own = {}.hasOwnProperty;
|
|
var Selector = require('./selector');
|
|
var Property = require('./property');
|
|
|
|
exports.Selector = Selector;
|
|
exports.Property = Property;
|
|
|
|
/**
|
|
* Returns an array of the selectors.
|
|
*
|
|
* @license Sizzle CSS Selector Engine - MIT
|
|
* @param {String} selectorText from mensch
|
|
* @api public
|
|
*/
|
|
|
|
exports.extract = function extract(selectorText) {
|
|
var attr = 0;
|
|
var sels = [];
|
|
var sel = '';
|
|
|
|
for (var i = 0, l = selectorText.length; i < l; i++) {
|
|
var c = selectorText.charAt(i);
|
|
|
|
if (attr) {
|
|
if (']' === c || ')' === c) { attr--; }
|
|
sel += c;
|
|
} else {
|
|
if (',' === c) {
|
|
sels.push(sel);
|
|
sel = '';
|
|
} else {
|
|
if ('[' === c || '(' === c) { attr++; }
|
|
if (sel.length || (c !== ',' && c !== '\n' && c !== ' ')) { sel += c; }
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sel.length) {
|
|
sels.push(sel);
|
|
}
|
|
|
|
return sels;
|
|
};
|
|
|
|
/**
|
|
* Returns a parse tree for a CSS source.
|
|
* If it encounters multiple selectors separated by a comma, it splits the
|
|
* tree.
|
|
*
|
|
* @param {String} css source
|
|
* @api public
|
|
*/
|
|
|
|
exports.parseCSS = function(css) {
|
|
var parsed = mensch.parse(css, {position: true, comments: true});
|
|
var rules = typeof parsed.stylesheet != 'undefined' && parsed.stylesheet.rules ? parsed.stylesheet.rules : [];
|
|
var ret = [];
|
|
|
|
for (var i = 0, l = rules.length; i < l; i++) {
|
|
if (rules[i].type == 'rule') {
|
|
var rule = rules[i];
|
|
var selectors = rule.selectors;
|
|
|
|
for (var ii = 0, ll = selectors.length; ii < ll; ii++) {
|
|
ret.push([selectors[ii], rule.declarations]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
};
|
|
|
|
/**
|
|
* Returns preserved text for a CSS source.
|
|
*
|
|
* @param {String} css source
|
|
* @param {Object} options
|
|
* @api public
|
|
*/
|
|
|
|
exports.getPreservedText = function(css, options) {
|
|
var parsed = mensch.parse(css, {position: true, comments: true});
|
|
var rules = typeof parsed.stylesheet != 'undefined' && parsed.stylesheet.rules ? parsed.stylesheet.rules : [];
|
|
var preserved = [];
|
|
var lastStart = null;
|
|
|
|
for (var i = rules.length - 1; i >= 0; i--) {
|
|
if ((options.fontFaces && rules[i].type === 'font-face') ||
|
|
(options.mediaQueries && rules[i].type === 'media')) {
|
|
preserved.unshift(
|
|
mensch.stringify(
|
|
{ stylesheet: { rules: [ rules[i] ] }},
|
|
{ comments: false, indentation: ' ' }
|
|
)
|
|
);
|
|
}
|
|
lastStart = rules[i].position.start;
|
|
}
|
|
|
|
if (preserved.length === 0) {
|
|
return false;
|
|
}
|
|
return '\n' + preserved.join('\n') + '\n';
|
|
};
|
|
|
|
exports.normalizeLineEndings = function(text) {
|
|
return text.replace(/\r\n/g, '\n').replace(/\n/g, '\r\n');
|
|
};
|
|
|
|
|
|
/**
|
|
* Compares two specificity vectors, returning the winning one.
|
|
*
|
|
* @param {Array} vector a
|
|
* @param {Array} vector b
|
|
* @return {Array}
|
|
* @api public
|
|
*/
|
|
|
|
exports.compareFunc = function(a, b) {
|
|
var min = Math.min(a.length, b.length);
|
|
for (var i = 0; i < min; i++) {
|
|
if (a[i] === b[i]) { continue; }
|
|
if (a[i] > b[i]) { return 1; }
|
|
return -1;
|
|
}
|
|
|
|
return a.length - b.length;
|
|
};
|
|
|
|
exports.compare = function(a, b) {
|
|
return exports.compareFunc(a, b) == 1 ? a : b;
|
|
};
|
|
|
|
exports.extend = function(obj, src) {
|
|
for (var key in src) {
|
|
if (own.call(src, key)) {
|
|
obj[key] = src[key];
|
|
}
|
|
}
|
|
return obj;
|
|
};
|
|
|
|
exports.getDefaultOptions = function(options) {
|
|
var result = exports.extend({
|
|
extraCss: '',
|
|
insertPreservedExtraCss: true,
|
|
applyStyleTags: true,
|
|
removeStyleTags: true,
|
|
preserveMediaQueries: true,
|
|
preserveFontFaces: true,
|
|
applyWidthAttributes: true,
|
|
applyHeightAttributes: true,
|
|
applyAttributesTableElements: true,
|
|
url: ''
|
|
}, options);
|
|
|
|
result.webResources = result.webResources || {};
|
|
|
|
return result;
|
|
};
|
|
|
|
},{"./property":8,"./selector":9,"mensch":13}],11:[function(require,module,exports){
|
|
(function (global){
|
|
// knockout-sortable 1.0.0 | (c) 2016 Ryan Niemeyer | http://www.opensource.org/licenses/mit-license
|
|
;(function(factory) {
|
|
if (typeof define === "function" && define.amd) {
|
|
// AMD anonymous module
|
|
define(["knockout", "jquery", "jquery-ui/ui/widgets/sortable", "jquery-ui/ui/widgets/draggable"], factory);
|
|
} else if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
|
|
// CommonJS module
|
|
var ko = (typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),
|
|
jQuery = (typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null);
|
|
(typeof window !== "undefined" ? window['jQuery']['ui']['sortable'] : typeof global !== "undefined" ? global['jQuery']['ui']['sortable'] : null);
|
|
(typeof window !== "undefined" ? window['jQuery']['ui']['draggable'] : typeof global !== "undefined" ? global['jQuery']['ui']['draggable'] : null);
|
|
factory(ko, jQuery);
|
|
} else {
|
|
// No module loader (plain <script> tag) - put directly in global namespace
|
|
factory(window.ko, window.jQuery);
|
|
}
|
|
})(function(ko, $) {
|
|
var ITEMKEY = "ko_sortItem",
|
|
INDEXKEY = "ko_sourceIndex",
|
|
LISTKEY = "ko_sortList",
|
|
PARENTKEY = "ko_parentList",
|
|
DRAGKEY = "ko_dragItem",
|
|
unwrap = ko.utils.unwrapObservable,
|
|
dataGet = ko.utils.domData.get,
|
|
dataSet = ko.utils.domData.set,
|
|
version = $.ui && $.ui.version,
|
|
//1.8.24 included a fix for how events were triggered in nested sortables. indexOf checks will fail if version starts with that value (0 vs. -1)
|
|
hasNestedSortableFix = version && version.indexOf("1.6.") && version.indexOf("1.7.") && (version.indexOf("1.8.") || version === "1.8.24");
|
|
|
|
//internal afterRender that adds meta-data to children
|
|
var addMetaDataAfterRender = function(elements, data) {
|
|
ko.utils.arrayForEach(elements, function(element) {
|
|
if (element.nodeType === 1) {
|
|
dataSet(element, ITEMKEY, data);
|
|
dataSet(element, PARENTKEY, dataGet(element.parentNode, LISTKEY));
|
|
}
|
|
});
|
|
};
|
|
|
|
//prepare the proper options for the template binding
|
|
var prepareTemplateOptions = function(valueAccessor, dataName) {
|
|
var result = {},
|
|
options = unwrap(valueAccessor()) || {},
|
|
actualAfterRender;
|
|
|
|
//build our options to pass to the template engine
|
|
if (options.data) {
|
|
result[dataName] = options.data;
|
|
result.name = options.template;
|
|
} else {
|
|
result[dataName] = valueAccessor();
|
|
}
|
|
|
|
ko.utils.arrayForEach(["afterAdd", "afterRender", "as", "beforeRemove", "includeDestroyed", "templateEngine", "templateOptions", "nodes"], function (option) {
|
|
if (options.hasOwnProperty(option)) {
|
|
result[option] = options[option];
|
|
} else if (ko.bindingHandlers.sortable.hasOwnProperty(option)) {
|
|
result[option] = ko.bindingHandlers.sortable[option];
|
|
}
|
|
});
|
|
|
|
//use an afterRender function to add meta-data
|
|
if (dataName === "foreach") {
|
|
if (result.afterRender) {
|
|
//wrap the existing function, if it was passed
|
|
actualAfterRender = result.afterRender;
|
|
result.afterRender = function(element, data) {
|
|
addMetaDataAfterRender.call(data, element, data);
|
|
actualAfterRender.call(data, element, data);
|
|
};
|
|
} else {
|
|
result.afterRender = addMetaDataAfterRender;
|
|
}
|
|
}
|
|
|
|
//return options to pass to the template binding
|
|
return result;
|
|
};
|
|
|
|
var updateIndexFromDestroyedItems = function(index, items) {
|
|
var unwrapped = unwrap(items);
|
|
|
|
if (unwrapped) {
|
|
for (var i = 0; i < index; i++) {
|
|
//add one for every destroyed item we find before the targetIndex in the target array
|
|
if (unwrapped[i] && unwrap(unwrapped[i]._destroy)) {
|
|
index++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return index;
|
|
};
|
|
|
|
//remove problematic leading/trailing whitespace from templates
|
|
var stripTemplateWhitespace = function(element, name) {
|
|
var templateSource,
|
|
templateElement;
|
|
|
|
//process named templates
|
|
if (name) {
|
|
templateElement = document.getElementById(name);
|
|
if (templateElement) {
|
|
templateSource = new ko.templateSources.domElement(templateElement);
|
|
templateSource.text($.trim(templateSource.text()));
|
|
}
|
|
}
|
|
else {
|
|
//remove leading/trailing non-elements from anonymous templates
|
|
$(element).contents().each(function() {
|
|
if (this && this.nodeType !== 1) {
|
|
element.removeChild(this);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
//connect items with observableArrays
|
|
ko.bindingHandlers.sortable = {
|
|
init: function(element, valueAccessor, allBindingsAccessor, data, context) {
|
|
var $element = $(element),
|
|
value = unwrap(valueAccessor()) || {},
|
|
templateOptions = prepareTemplateOptions(valueAccessor, "foreach"),
|
|
sortable = {},
|
|
startActual, updateActual;
|
|
|
|
stripTemplateWhitespace(element, templateOptions.name);
|
|
|
|
//build a new object that has the global options with overrides from the binding
|
|
$.extend(true, sortable, ko.bindingHandlers.sortable);
|
|
if (value.options && sortable.options) {
|
|
ko.utils.extend(sortable.options, value.options);
|
|
delete value.options;
|
|
}
|
|
ko.utils.extend(sortable, value);
|
|
|
|
//if allowDrop is an observable or a function, then execute it in a computed observable
|
|
if (sortable.connectClass && (ko.isObservable(sortable.allowDrop) || typeof sortable.allowDrop == "function")) {
|
|
ko.computed({
|
|
read: function() {
|
|
var value = unwrap(sortable.allowDrop),
|
|
shouldAdd = typeof value == "function" ? value.call(this, templateOptions.foreach) : value;
|
|
ko.utils.toggleDomNodeCssClass(element, sortable.connectClass, shouldAdd);
|
|
},
|
|
disposeWhenNodeIsRemoved: element
|
|
}, this);
|
|
} else {
|
|
ko.utils.toggleDomNodeCssClass(element, sortable.connectClass, sortable.allowDrop);
|
|
}
|
|
|
|
//wrap the template binding
|
|
ko.bindingHandlers.template.init(element, function() { return templateOptions; }, allBindingsAccessor, data, context);
|
|
|
|
//keep a reference to start/update functions that might have been passed in
|
|
startActual = sortable.options.start;
|
|
updateActual = sortable.options.update;
|
|
|
|
//ensure draggable table row cells maintain their width while dragging (unless a helper is provided)
|
|
if ( !sortable.options.helper ) {
|
|
sortable.options.helper = function(e, ui) {
|
|
if (ui.is("tr")) {
|
|
ui.children().each(function() {
|
|
$(this).width($(this).width());
|
|
});
|
|
}
|
|
return ui;
|
|
};
|
|
}
|
|
|
|
//initialize sortable binding after template binding has rendered in update function
|
|
var createTimeout = setTimeout(function() {
|
|
var dragItem;
|
|
var originalReceive = sortable.options.receive;
|
|
|
|
$element.sortable(ko.utils.extend(sortable.options, {
|
|
start: function(event, ui) {
|
|
//track original index
|
|
var el = ui.item[0];
|
|
dataSet(el, INDEXKEY, ko.utils.arrayIndexOf(ui.item.parent().children(), el));
|
|
|
|
//make sure that fields have a chance to update model
|
|
ui.item.find("input:focus").change();
|
|
if (startActual) {
|
|
startActual.apply(this, arguments);
|
|
}
|
|
},
|
|
receive: function(event, ui) {
|
|
//optionally apply an existing receive handler
|
|
if (typeof originalReceive === "function") {
|
|
originalReceive.call(this, event, ui);
|
|
}
|
|
|
|
dragItem = dataGet(ui.item[0], DRAGKEY);
|
|
if (dragItem) {
|
|
//copy the model item, if a clone option is provided
|
|
if (dragItem.clone) {
|
|
dragItem = dragItem.clone();
|
|
}
|
|
|
|
//configure a handler to potentially manipulate item before drop
|
|
if (sortable.dragged) {
|
|
dragItem = sortable.dragged.call(this, dragItem, event, ui) || dragItem;
|
|
}
|
|
}
|
|
},
|
|
update: function(event, ui) {
|
|
var sourceParent, targetParent, sourceIndex, targetIndex, arg,
|
|
el = ui.item[0],
|
|
parentEl = ui.item.parent()[0],
|
|
item = dataGet(el, ITEMKEY) || dragItem;
|
|
|
|
if (!item) {
|
|
$(el).remove();
|
|
}
|
|
dragItem = null;
|
|
|
|
//make sure that moves only run once, as update fires on multiple containers
|
|
if (item && (this === parentEl) || (!hasNestedSortableFix && $.contains(this, parentEl))) {
|
|
//identify parents
|
|
sourceParent = dataGet(el, PARENTKEY);
|
|
sourceIndex = dataGet(el, INDEXKEY);
|
|
targetParent = dataGet(el.parentNode, LISTKEY);
|
|
targetIndex = ko.utils.arrayIndexOf(ui.item.parent().children(), el);
|
|
|
|
//take destroyed items into consideration
|
|
if (!templateOptions.includeDestroyed) {
|
|
sourceIndex = updateIndexFromDestroyedItems(sourceIndex, sourceParent);
|
|
targetIndex = updateIndexFromDestroyedItems(targetIndex, targetParent);
|
|
}
|
|
|
|
//build up args for the callbacks
|
|
if (sortable.beforeMove || sortable.afterMove) {
|
|
arg = {
|
|
item: item,
|
|
sourceParent: sourceParent,
|
|
sourceParentNode: sourceParent && ui.sender || el.parentNode,
|
|
sourceIndex: sourceIndex,
|
|
targetParent: targetParent,
|
|
targetIndex: targetIndex,
|
|
cancelDrop: false
|
|
};
|
|
|
|
//execute the configured callback prior to actually moving items
|
|
if (sortable.beforeMove) {
|
|
sortable.beforeMove.call(this, arg, event, ui);
|
|
}
|
|
}
|
|
|
|
//call cancel on the correct list, so KO can take care of DOM manipulation
|
|
if (sourceParent) {
|
|
$(sourceParent === targetParent ? this : ui.sender || this).sortable("cancel");
|
|
}
|
|
//for a draggable item just remove the element
|
|
else {
|
|
$(el).remove();
|
|
}
|
|
|
|
//if beforeMove told us to cancel, then we are done
|
|
if (arg && arg.cancelDrop) {
|
|
return;
|
|
}
|
|
|
|
//if the strategy option is unset or false, employ the order strategy involving removal and insertion of items
|
|
if (!sortable.hasOwnProperty("strategyMove") || sortable.strategyMove === false) {
|
|
//do the actual move
|
|
if (targetIndex >= 0) {
|
|
if (sourceParent) {
|
|
sourceParent.splice(sourceIndex, 1);
|
|
|
|
//if using deferred updates plugin, force updates
|
|
if (ko.processAllDeferredBindingUpdates) {
|
|
ko.processAllDeferredBindingUpdates();
|
|
}
|
|
|
|
//if using deferred updates on knockout 3.4, force updates
|
|
if (ko.options && ko.options.deferUpdates) {
|
|
ko.tasks.runEarly();
|
|
}
|
|
}
|
|
|
|
targetParent.splice(targetIndex, 0, item);
|
|
}
|
|
|
|
//rendering is handled by manipulating the observableArray; ignore dropped element
|
|
dataSet(el, ITEMKEY, null);
|
|
}
|
|
else { //employ the strategy of moving items
|
|
if (targetIndex >= 0) {
|
|
if (sourceParent) {
|
|
if (sourceParent !== targetParent) {
|
|
// moving from one list to another
|
|
|
|
sourceParent.splice(sourceIndex, 1);
|
|
targetParent.splice(targetIndex, 0, item);
|
|
|
|
//rendering is handled by manipulating the observableArray; ignore dropped element
|
|
dataSet(el, ITEMKEY, null);
|
|
ui.item.remove();
|
|
}
|
|
else {
|
|
// moving within same list
|
|
var underlyingList = unwrap(sourceParent);
|
|
|
|
// notify 'beforeChange' subscribers
|
|
if (sourceParent.valueWillMutate) {
|
|
sourceParent.valueWillMutate();
|
|
}
|
|
|
|
// move from source index ...
|
|
underlyingList.splice(sourceIndex, 1);
|
|
// ... to target index
|
|
underlyingList.splice(targetIndex, 0, item);
|
|
|
|
// notify subscribers
|
|
if (sourceParent.valueHasMutated) {
|
|
sourceParent.valueHasMutated();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// drop new element from outside
|
|
targetParent.splice(targetIndex, 0, item);
|
|
|
|
//rendering is handled by manipulating the observableArray; ignore dropped element
|
|
dataSet(el, ITEMKEY, null);
|
|
ui.item.remove();
|
|
}
|
|
}
|
|
}
|
|
|
|
//if using deferred updates plugin, force updates
|
|
if (ko.processAllDeferredBindingUpdates) {
|
|
ko.processAllDeferredBindingUpdates();
|
|
}
|
|
|
|
//allow binding to accept a function to execute after moving the item
|
|
if (sortable.afterMove) {
|
|
sortable.afterMove.call(this, arg, event, ui);
|
|
}
|
|
}
|
|
|
|
if (updateActual) {
|
|
updateActual.apply(this, arguments);
|
|
}
|
|
},
|
|
connectWith: sortable.connectClass ? "." + sortable.connectClass : false
|
|
}));
|
|
|
|
//handle enabling/disabling sorting
|
|
if (sortable.isEnabled !== undefined) {
|
|
ko.computed({
|
|
read: function() {
|
|
$element.sortable(unwrap(sortable.isEnabled) ? "enable" : "disable");
|
|
},
|
|
disposeWhenNodeIsRemoved: element
|
|
});
|
|
}
|
|
}, 0);
|
|
|
|
//handle disposal
|
|
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
|
|
//only call destroy if sortable has been created
|
|
if ($element.data("ui-sortable") || $element.data("sortable")) {
|
|
$element.sortable("destroy");
|
|
}
|
|
|
|
ko.utils.toggleDomNodeCssClass(element, sortable.connectClass, false);
|
|
|
|
//do not create the sortable if the element has been removed from DOM
|
|
clearTimeout(createTimeout);
|
|
});
|
|
|
|
return { 'controlsDescendantBindings': true };
|
|
},
|
|
update: function(element, valueAccessor, allBindingsAccessor, data, context) {
|
|
var templateOptions = prepareTemplateOptions(valueAccessor, "foreach");
|
|
|
|
//attach meta-data
|
|
dataSet(element, LISTKEY, templateOptions.foreach);
|
|
|
|
//call template binding's update with correct options
|
|
ko.bindingHandlers.template.update(element, function() { return templateOptions; }, allBindingsAccessor, data, context);
|
|
},
|
|
connectClass: 'ko_container',
|
|
allowDrop: true,
|
|
afterMove: null,
|
|
beforeMove: null,
|
|
options: {}
|
|
};
|
|
|
|
//create a draggable that is appropriate for dropping into a sortable
|
|
ko.bindingHandlers.draggable = {
|
|
init: function(element, valueAccessor, allBindingsAccessor, data, context) {
|
|
var value = unwrap(valueAccessor()) || {},
|
|
options = value.options || {},
|
|
draggableOptions = ko.utils.extend({}, ko.bindingHandlers.draggable.options),
|
|
templateOptions = prepareTemplateOptions(valueAccessor, "data"),
|
|
connectClass = value.connectClass || ko.bindingHandlers.draggable.connectClass,
|
|
isEnabled = value.isEnabled !== undefined ? value.isEnabled : ko.bindingHandlers.draggable.isEnabled;
|
|
|
|
value = "data" in value ? value.data : value;
|
|
|
|
//set meta-data
|
|
dataSet(element, DRAGKEY, value);
|
|
|
|
//override global options with override options passed in
|
|
ko.utils.extend(draggableOptions, options);
|
|
|
|
//setup connection to a sortable
|
|
draggableOptions.connectToSortable = connectClass ? "." + connectClass : false;
|
|
|
|
//initialize draggable
|
|
$(element).draggable(draggableOptions);
|
|
|
|
//handle enabling/disabling sorting
|
|
if (isEnabled !== undefined) {
|
|
ko.computed({
|
|
read: function() {
|
|
$(element).draggable(unwrap(isEnabled) ? "enable" : "disable");
|
|
},
|
|
disposeWhenNodeIsRemoved: element
|
|
});
|
|
}
|
|
|
|
//handle disposal
|
|
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
|
|
$(element).draggable("destroy");
|
|
});
|
|
|
|
return ko.bindingHandlers.template.init(element, function() { return templateOptions; }, allBindingsAccessor, data, context);
|
|
},
|
|
update: function(element, valueAccessor, allBindingsAccessor, data, context) {
|
|
var templateOptions = prepareTemplateOptions(valueAccessor, "data");
|
|
|
|
return ko.bindingHandlers.template.update(element, function() { return templateOptions; }, allBindingsAccessor, data, context);
|
|
},
|
|
connectClass: ko.bindingHandlers.sortable.connectClass,
|
|
options: {
|
|
helper: "clone"
|
|
}
|
|
};
|
|
});
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],12:[function(require,module,exports){
|
|
(function (global){
|
|
/*! ko-reactor v1.4.0
|
|
* The MIT License (MIT)
|
|
* Copyright (c) 2018 Ziad Jeeroburkhan */
|
|
!function(e){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?e((typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null)):"function"==typeof define&&define.amd?define(["knockout"],e):e(window.ko)}(function(e){e.subscribable.fn.watch=function(t,a,n,r){var o=typeof t;return"boolean"===o||"undefined"===o?e.watch(this,{enabled:!1!==t}):"function"!==o||e.isSubscribable(t)?e.watch(t,a,n,r||this):e.watch(this,a||{},t,r||this),this},e.watch=function(t,a,n,r){function o(c,u,f,s,b,h){if(c&&0!==a.depth&&(-1===a.depth||f.length<(a.depth||1))){if(a.watchedOnly&&!c.watchable&&c!=t)return;if(!1!==a.enabled&&!0!==a.enabled||(c.watchable=a.enabled),!1===c.watchable)return;!0===a.seal&&(c.watchable=!1);var d=typeof c;if("object"===d||"function"===d){if(c._watcher===r)return;if(a.hide&&e.utils.arrayIndexOf(a.hide,c)>-1)return;var p=[].concat(f,u&&u!==t?u:[]);if("function"!==d){if("[object Object]"===Object.prototype.toString.call(c))e.utils.objectForEach(c,function(t,n){if(n=a.getter?a.getter.call(r,p,c,t):n){if(a.wrap){var i=Object.prototype.toString.call(n);"[object Function]"!==i&&"[object Object]"!==i&&(a.beforeWrap&&!1===a.beforeWrap.call(r,p,c,n)||(n=c[t]="[object Array]"===i?e.observableArray(n):e.observable(n)))}a.unloop&&(n._watcher=s?void 0:r);var l=o(n,b?null:c,p,s,null,t);a.tagFields&&void 0===n._fieldName&&(l||"parentsOnly"!==a.tagFields&&"function"==typeof n||"object"==typeof n)&&(n._fieldName=t)}});else if(!0!==a.hideArrays)for(var y=0;y<c.length;y++)o(c[y],b?null:c,p,s);return!0}if("function"==typeof c.notifySubscribers&&n){if(!0===a.enabled&&!1===c.watchable)return;if(s||!a.beforeWatch||!1!==a.beforeWatch.call(r,p,c,h)){var v="function"==typeof c.pop;if(s?i(c):l(c,v,p,b),v)return o(c(),b?null:c,p,s,!0),!0;if(!0!==a.hideWrappedValues)return o(c(),b?null:c,p,s,!0)}}}}}function i(e){var t=e[c];if(!t)throw"Subscriptions field (."+c+") not defined for observable child "+(e._fieldName||"");if(t.change)for(n=t.change.length-1;n>=0;n--)t.change[n]._watcher===r&&t.change[n].dispose();if(t.beforeChange&&(a.mutable||a.oldValues>0))for(n=t.beforeChange.length-1;n>=0;n--)t.beforeChange[n]._watcher===r&&t.beforeChange[n].dispose();if(t.arrayChange)for(var n=t.arrayChange.length-1;n>=0;n--)t.arrayChange[n]._watcher===r&&t.arrayChange[n].dispose()}function l(t,i,l,c){i?t.subscribe(function(i){var u;!1===a.splitArrayChanges&&void 0!==(u=n.call(r,l,t,i))&&r(u),e.utils.arrayForEach(i,function(e){if(!1!==a.splitArrayChanges){var i=n.call(r,l,t,e);void 0!==i&&r(i)}e.moved||(!1===a.async?o(e.value,c?null:t,l,"deleted"===e.status):setTimeout(function(){o(e.value,c?null:t,l,"deleted"===e.status)}))})},void 0,"arrayChange")._watcher=r:(t.subscribe(function(){if(!1!==t.watchable){var e=n.call(r,l,t);void 0!==e&&r(e),a.mutable&&"object"==typeof t()&&(!1===a.async?o(t(),c?null:t,l,!1,!0):setTimeout(function(){o(t(),c?null:t,l,!1,!0)}))}},null,"change")._watcher=r,(a.oldValues>0||a.mutable)&&(t.subscribe(function(e){if(a.oldValues>0){var n=t.oldValues?t.oldValues:t.oldValues=[];for(n.unshift(e);n.length>a.oldValues;)n.pop()}a.mutable&&"object"==typeof e&&o(e,c?null:t,l,!0,!0)},null,"beforeChange")._watcher=r))}"function"==typeof a&&(r=r||n,n=a,a={}),r=r||this;var c;switch("function"==typeof e.subscription||e.version){case!0:c="_subscriptions";break;case"3.0.0":c="F";break;case"3.1.0":c="H";break;case"3.2.0":c="M";break;case"3.3.0":c="G";break;case"3.4.0":case"3.4.1":c="K";break;case"3.4.2":c="F";break;case"3.5.0-beta":c="S";break;default:throw"Unsupported Knockout version. Only v3.0.0 to v3.5.0-beta are supported when minified. Current version is "+e.version}return"function"!=typeof t||e.isSubscribable(t)?(o(t,null,[]),{dispose:function(){o(t,null,[],!0)}}):e.computed(t,n,a)}});window.foo = "1.4.0";
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],13:[function(require,module,exports){
|
|
module.exports = {
|
|
lex : require('./lib/lexer'),
|
|
parse: require('./lib/parser'),
|
|
stringify: require('./lib/stringify')
|
|
};
|
|
|
|
},{"./lib/lexer":15,"./lib/parser":16,"./lib/stringify":17}],14:[function(require,module,exports){
|
|
(function (process){
|
|
exports = module.exports = debug;
|
|
|
|
function debug(label) {
|
|
return _debug.bind(null, label);
|
|
}
|
|
|
|
function _debug(label) {
|
|
var args = [].slice.call(arguments, 1);
|
|
args.unshift('[' + label + ']');
|
|
process.stderr.write(args.join(' ') + '\n');
|
|
}
|
|
}).call(this,require('_process'))
|
|
|
|
},{"_process":18}],15:[function(require,module,exports){
|
|
var DEBUG = false; // `true` to print debugging info.
|
|
var TIMER = false; // `true` to time calls to `lex()` and print the results.
|
|
|
|
var debug = require('./debug')('lex');
|
|
|
|
exports = module.exports = lex;
|
|
|
|
/**
|
|
* Convert a CSS string into an array of lexical tokens.
|
|
*
|
|
* @param {String} css CSS
|
|
* @returns {Array} lexical tokens
|
|
*/
|
|
function lex(css) {
|
|
var start; // Debug timer start.
|
|
|
|
var buffer = ''; // Character accumulator
|
|
var ch; // Current character
|
|
var column = 0; // Current source column number
|
|
var cursor = -1; // Current source cursor position
|
|
var depth = 0; // Current nesting depth
|
|
var line = 1; // Current source line number
|
|
var state = 'before-selector'; // Current state
|
|
var stack = [state]; // State stack
|
|
var token = {}; // Current token
|
|
var tokens = []; // Token accumulator
|
|
|
|
// Supported @-rules, in roughly descending order of usage probability.
|
|
var atRules = [
|
|
'media',
|
|
'keyframes',
|
|
{ name: '-webkit-keyframes', type: 'keyframes', prefix: '-webkit-' },
|
|
{ name: '-moz-keyframes', type: 'keyframes', prefix: '-moz-' },
|
|
{ name: '-ms-keyframes', type: 'keyframes', prefix: '-ms-' },
|
|
{ name: '-o-keyframes', type: 'keyframes', prefix: '-o-' },
|
|
'font-face',
|
|
{ name: 'import', state: 'before-at-value' },
|
|
{ name: 'charset', state: 'before-at-value' },
|
|
'supports',
|
|
'viewport',
|
|
{ name: 'namespace', state: 'before-at-value' },
|
|
'document',
|
|
{ name: '-moz-document', type: 'document', prefix: '-moz-' },
|
|
'page'
|
|
];
|
|
|
|
// -- Functions ------------------------------------------------------------
|
|
|
|
/**
|
|
* Advance the character cursor and return the next character.
|
|
*
|
|
* @returns {String} The next character.
|
|
*/
|
|
function getCh() {
|
|
skip();
|
|
return css[cursor];
|
|
}
|
|
|
|
/**
|
|
* Return the state at the given index in the stack.
|
|
* The stack is LIFO so indexing is from the right.
|
|
*
|
|
* @param {Number} [index=0] Index to return.
|
|
* @returns {String} state
|
|
*/
|
|
function getState(index) {
|
|
return index ? stack[stack.length - 1 - index] : state;
|
|
}
|
|
|
|
/**
|
|
* Look ahead for a string beginning from the next position. The string
|
|
* being looked for must start at the next position.
|
|
*
|
|
* @param {String} str The string to look for.
|
|
* @returns {Boolean} Whether the string was found.
|
|
*/
|
|
function isNextString(str) {
|
|
var start = cursor + 1;
|
|
return (str === css.slice(start, start + str.length));
|
|
}
|
|
|
|
/**
|
|
* Find the start position of a substring beginning from the next
|
|
* position. The string being looked for may begin anywhere.
|
|
*
|
|
* @param {String} str The substring to look for.
|
|
* @returns {Number|false} The position, or `false` if not found.
|
|
*/
|
|
function find(str) {
|
|
var pos = css.slice(cursor).indexOf(str);
|
|
|
|
return pos > 0 ? pos : false;
|
|
}
|
|
|
|
/**
|
|
* Determine whether a character is next.
|
|
*
|
|
* @param {String} ch Character.
|
|
* @returns {Boolean} Whether the character is next.
|
|
*/
|
|
function isNextChar(ch) {
|
|
return ch === peek(1);
|
|
}
|
|
|
|
/**
|
|
* Return the character at the given cursor offset. The offset is relative
|
|
* to the cursor, so negative values move backwards.
|
|
*
|
|
* @param {Number} [offset=1] Cursor offset.
|
|
* @returns {String} Character.
|
|
*/
|
|
function peek(offset) {
|
|
return css[cursor + (offset || 1)];
|
|
}
|
|
|
|
/**
|
|
* Remove the current state from the stack and set the new current state.
|
|
*
|
|
* @returns {String} The removed state.
|
|
*/
|
|
function popState() {
|
|
var removed = stack.pop();
|
|
state = stack[stack.length - 1];
|
|
|
|
return removed;
|
|
}
|
|
|
|
/**
|
|
* Set the current state and add it to the stack.
|
|
*
|
|
* @param {String} newState The new state.
|
|
* @returns {Number} The new stack length.
|
|
*/
|
|
function pushState(newState) {
|
|
state = newState;
|
|
stack.push(state);
|
|
|
|
return stack.length;
|
|
}
|
|
|
|
/**
|
|
* Replace the current state with a new state.
|
|
*
|
|
* @param {String} newState The new state.
|
|
* @returns {String} The replaced state.
|
|
*/
|
|
function replaceState(newState) {
|
|
var previousState = state;
|
|
stack[stack.length - 1] = state = newState;
|
|
|
|
return previousState;
|
|
}
|
|
|
|
/**
|
|
* Move the character cursor. Positive numbers move the cursor forward.
|
|
* Negative numbers are not supported!
|
|
*
|
|
* @param {Number} [n=1] Number of characters to skip.
|
|
*/
|
|
function skip(n) {
|
|
if ((n || 1) == 1) {
|
|
if (css[cursor] == '\n') {
|
|
line++;
|
|
column = 1;
|
|
} else {
|
|
column++;
|
|
}
|
|
cursor++;
|
|
} else {
|
|
var skipStr = css.slice(cursor, cursor + n).split('\n');
|
|
if (skipStr.length > 1) {
|
|
line += skipStr.length - 1;
|
|
column = 1;
|
|
}
|
|
column += skipStr[skipStr.length - 1].length;
|
|
cursor = cursor + n;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add the current token to the pile and reset the buffer.
|
|
*/
|
|
function addToken() {
|
|
token.end = {
|
|
line: line,
|
|
col: column
|
|
};
|
|
|
|
DEBUG && debug('addToken:', JSON.stringify(token, null, 2));
|
|
|
|
tokens.push(token);
|
|
|
|
buffer = '';
|
|
token = {};
|
|
}
|
|
|
|
/**
|
|
* Set the current token.
|
|
*
|
|
* @param {String} type Token type.
|
|
*/
|
|
function initializeToken(type) {
|
|
token = {
|
|
type: type,
|
|
start: {
|
|
line: line,
|
|
col : column
|
|
}
|
|
};
|
|
}
|
|
|
|
// -- Main Loop ------------------------------------------------------------
|
|
|
|
/*
|
|
The main loop is a state machine that reads in one character at a time,
|
|
and determines what to do based on the current state and character.
|
|
This is implemented as a series of nested `switch` statements and the
|
|
case orders have been mildly optimized based on rough probabilities
|
|
calculated by processing a small sample of real-world CSS.
|
|
|
|
Further optimization (such as a dispatch table) shouldn't be necessary
|
|
since the total number of cases is very low.
|
|
*/
|
|
|
|
TIMER && (start = Date.now());
|
|
|
|
while (ch = getCh()) {
|
|
DEBUG && debug(ch, getState());
|
|
|
|
// column += 1;
|
|
|
|
switch (ch) {
|
|
// Space
|
|
case ' ':
|
|
switch (getState()) {
|
|
case 'selector':
|
|
case 'value':
|
|
case 'value-paren':
|
|
case 'at-group':
|
|
case 'at-value':
|
|
case 'comment':
|
|
case 'double-string':
|
|
case 'single-string':
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Newline or tab
|
|
case '\n':
|
|
case '\t':
|
|
case '\r':
|
|
case '\f':
|
|
switch (getState()) {
|
|
case 'value':
|
|
case 'value-paren':
|
|
case 'at-group':
|
|
case 'comment':
|
|
case 'single-string':
|
|
case 'double-string':
|
|
case 'selector':
|
|
buffer += ch;
|
|
break;
|
|
|
|
case 'at-value':
|
|
// Tokenize an @-rule if a semi-colon was omitted.
|
|
if ('\n' === ch) {
|
|
token.value = buffer.trim();
|
|
addToken();
|
|
popState();
|
|
}
|
|
break;
|
|
}
|
|
|
|
// if ('\n' === ch) {
|
|
// column = 0;
|
|
// line += 1;
|
|
// }
|
|
break;
|
|
|
|
case ':':
|
|
switch (getState()) {
|
|
case 'name':
|
|
token.name = buffer.trim();
|
|
buffer = '';
|
|
|
|
replaceState('before-value');
|
|
break;
|
|
|
|
case 'before-selector':
|
|
buffer += ch;
|
|
|
|
initializeToken('selector');
|
|
pushState('selector');
|
|
break;
|
|
|
|
case 'before-value':
|
|
replaceState('value');
|
|
buffer += ch;
|
|
break;
|
|
|
|
default:
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ';':
|
|
switch (getState()) {
|
|
case 'name':
|
|
case 'before-value':
|
|
case 'value':
|
|
// Tokenize a declaration
|
|
// if value is empty skip the declaration
|
|
if (buffer.trim().length > 0) {
|
|
token.value = buffer.trim(),
|
|
addToken();
|
|
}
|
|
replaceState('before-name');
|
|
break;
|
|
|
|
case 'value-paren':
|
|
// Insignificant semi-colon
|
|
buffer += ch;
|
|
break;
|
|
|
|
case 'at-value':
|
|
// Tokenize an @-rule
|
|
token.value = buffer.trim();
|
|
addToken();
|
|
popState();
|
|
break;
|
|
|
|
case 'before-name':
|
|
// Extraneous semi-colon
|
|
break;
|
|
|
|
default:
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case '{':
|
|
switch (getState()) {
|
|
case 'selector':
|
|
// If the sequence is `\{` then assume that the brace should be escaped.
|
|
if (peek(-1) === '\\') {
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
|
|
// Tokenize a selector
|
|
token.text = buffer.trim();
|
|
addToken();
|
|
replaceState('before-name');
|
|
depth = depth + 1;
|
|
break;
|
|
|
|
case 'at-group':
|
|
// Tokenize an @-group
|
|
token.name = buffer.trim();
|
|
|
|
// XXX: @-rules are starting to get hairy
|
|
switch (token.type) {
|
|
case 'font-face':
|
|
case 'viewport' :
|
|
case 'page' :
|
|
pushState('before-name');
|
|
break;
|
|
|
|
default:
|
|
pushState('before-selector');
|
|
}
|
|
|
|
addToken();
|
|
depth = depth + 1;
|
|
break;
|
|
|
|
case 'name':
|
|
case 'at-rule':
|
|
// Tokenize a declaration or an @-rule
|
|
token.name = buffer.trim();
|
|
addToken();
|
|
pushState('before-name');
|
|
depth = depth + 1;
|
|
break;
|
|
|
|
case 'comment':
|
|
case 'double-string':
|
|
case 'single-string':
|
|
// Ignore braces in comments and strings
|
|
buffer += ch;
|
|
break;
|
|
case 'before-value':
|
|
replaceState('value');
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case '}':
|
|
switch (getState()) {
|
|
case 'before-name':
|
|
case 'name':
|
|
case 'before-value':
|
|
case 'value':
|
|
// If the buffer contains anything, it is a value
|
|
if (buffer) {
|
|
token.value = buffer.trim();
|
|
}
|
|
|
|
// If the current token has a name and a value it should be tokenized.
|
|
if (token.name && token.value) {
|
|
addToken();
|
|
}
|
|
|
|
// Leave the block
|
|
initializeToken('end');
|
|
addToken();
|
|
popState();
|
|
|
|
// We might need to leave again.
|
|
// XXX: What about 3 levels deep?
|
|
if ('at-group' === getState()) {
|
|
initializeToken('at-group-end');
|
|
addToken();
|
|
popState();
|
|
}
|
|
|
|
if (depth > 0) {
|
|
depth = depth - 1;
|
|
}
|
|
|
|
break;
|
|
|
|
case 'at-group':
|
|
case 'before-selector':
|
|
case 'selector':
|
|
// If the sequence is `\}` then assume that the brace should be escaped.
|
|
if (peek(-1) === '\\') {
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
|
|
if (depth > 0) {
|
|
// Leave block if in an at-group
|
|
if ('at-group' === getState(1)) {
|
|
initializeToken('at-group-end');
|
|
addToken();
|
|
}
|
|
}
|
|
|
|
if (depth > 1) {
|
|
popState();
|
|
}
|
|
|
|
if (depth > 0) {
|
|
depth = depth - 1;
|
|
}
|
|
break;
|
|
|
|
case 'double-string':
|
|
case 'single-string':
|
|
case 'comment':
|
|
// Ignore braces in comments and strings.
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
// Strings
|
|
case '"':
|
|
case "'":
|
|
switch (getState()) {
|
|
case 'double-string':
|
|
if ('"' === ch && '\\' !== peek(-1)) {
|
|
popState();
|
|
}
|
|
break;
|
|
|
|
case 'single-string':
|
|
if ("'" === ch && '\\' !== peek(-1)) {
|
|
popState();
|
|
}
|
|
break;
|
|
|
|
case 'before-at-value':
|
|
replaceState('at-value');
|
|
pushState('"' === ch ? 'double-string' : 'single-string');
|
|
break;
|
|
|
|
case 'before-value':
|
|
replaceState('value');
|
|
pushState('"' === ch ? 'double-string' : 'single-string');
|
|
break;
|
|
|
|
case 'comment':
|
|
// Ignore strings within comments.
|
|
break;
|
|
|
|
default:
|
|
if ('\\' !== peek(-1)) {
|
|
pushState('"' === ch ? 'double-string' : 'single-string');
|
|
}
|
|
}
|
|
|
|
buffer += ch;
|
|
break;
|
|
|
|
// Comments
|
|
case '/':
|
|
switch (getState()) {
|
|
case 'comment':
|
|
case 'double-string':
|
|
case 'single-string':
|
|
// Ignore
|
|
buffer += ch;
|
|
break;
|
|
|
|
case 'before-value':
|
|
case 'selector':
|
|
case 'name':
|
|
case 'value':
|
|
if (isNextChar('*')) {
|
|
// Ignore comments in selectors, properties and values. They are
|
|
// difficult to represent in the AST.
|
|
var pos = find('*/');
|
|
|
|
if (pos) {
|
|
skip(pos + 1);
|
|
}
|
|
} else {
|
|
if (getState() == 'before-value') replaceState('value');
|
|
buffer += ch;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
if (isNextChar('*')) {
|
|
// Create a comment token
|
|
initializeToken('comment');
|
|
pushState('comment');
|
|
skip();
|
|
}
|
|
else {
|
|
buffer += ch;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Comment end or universal selector
|
|
case '*':
|
|
switch (getState()) {
|
|
case 'comment':
|
|
if (isNextChar('/')) {
|
|
// Tokenize a comment
|
|
token.text = buffer; // Don't trim()!
|
|
skip();
|
|
addToken();
|
|
popState();
|
|
}
|
|
else {
|
|
buffer += ch;
|
|
}
|
|
break;
|
|
|
|
case 'before-selector':
|
|
buffer += ch;
|
|
initializeToken('selector');
|
|
pushState('selector');
|
|
break;
|
|
|
|
case 'before-value':
|
|
replaceState('value');
|
|
buffer += ch;
|
|
break;
|
|
|
|
default:
|
|
buffer += ch;
|
|
}
|
|
break;
|
|
|
|
// @-rules
|
|
case '@':
|
|
switch (getState()) {
|
|
case 'comment':
|
|
case 'double-string':
|
|
case 'single-string':
|
|
buffer += ch;
|
|
break;
|
|
case 'before-value':
|
|
replaceState('value');
|
|
buffer += ch;
|
|
break;
|
|
|
|
default:
|
|
// Iterate over the supported @-rules and attempt to tokenize one.
|
|
var tokenized = false;
|
|
var name;
|
|
var rule;
|
|
|
|
for (var j = 0, len = atRules.length; !tokenized && j < len; ++j) {
|
|
rule = atRules[j];
|
|
name = rule.name || rule;
|
|
|
|
if (!isNextString(name)) { continue; }
|
|
|
|
tokenized = true;
|
|
|
|
initializeToken(name);
|
|
pushState(rule.state || 'at-group');
|
|
skip(name.length);
|
|
|
|
if (rule.prefix) {
|
|
token.prefix = rule.prefix;
|
|
}
|
|
|
|
if (rule.type) {
|
|
token.type = rule.type;
|
|
}
|
|
}
|
|
|
|
if (!tokenized) {
|
|
// Keep on truckin' America!
|
|
buffer += ch;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Parentheses are tracked to disambiguate semi-colons, such as within a
|
|
// data URI.
|
|
case '(':
|
|
switch (getState()) {
|
|
case 'value':
|
|
pushState('value-paren');
|
|
break;
|
|
case 'before-value':
|
|
replaceState('value');
|
|
break;
|
|
}
|
|
|
|
buffer += ch;
|
|
break;
|
|
|
|
case ')':
|
|
switch (getState()) {
|
|
case 'value-paren':
|
|
popState();
|
|
break;
|
|
case 'before-value':
|
|
replaceState('value');
|
|
break;
|
|
}
|
|
|
|
buffer += ch;
|
|
break;
|
|
|
|
default:
|
|
switch (getState()) {
|
|
case 'before-selector':
|
|
initializeToken('selector');
|
|
pushState('selector');
|
|
break;
|
|
|
|
case 'before-name':
|
|
initializeToken('property');
|
|
replaceState('name');
|
|
break;
|
|
|
|
case 'before-value':
|
|
replaceState('value');
|
|
break;
|
|
|
|
case 'before-at-value':
|
|
replaceState('at-value');
|
|
break;
|
|
}
|
|
|
|
buffer += ch;
|
|
break;
|
|
}
|
|
}
|
|
|
|
TIMER && debug('ran in', (Date.now() - start) + 'ms');
|
|
|
|
return tokens;
|
|
}
|
|
|
|
},{"./debug":14}],16:[function(require,module,exports){
|
|
var DEBUG = false; // `true` to print debugging info.
|
|
var TIMER = false; // `true` to time calls to `parse()` and print the results.
|
|
|
|
var debug = require('./debug')('parse');
|
|
var lex = require('./lexer');
|
|
|
|
exports = module.exports = parse;
|
|
|
|
var _comments; // Whether comments are allowed.
|
|
var _depth; // Current block nesting depth.
|
|
var _position; // Whether to include line/column position.
|
|
var _tokens; // Array of lexical tokens.
|
|
|
|
/**
|
|
* Convert a CSS string or array of lexical tokens into a `stringify`-able AST.
|
|
*
|
|
* @param {String} css CSS string or array of lexical token
|
|
* @param {Object} [options]
|
|
* @param {Boolean} [options.comments=false] allow comment nodes in the AST
|
|
* @returns {Object} `stringify`-able AST
|
|
*/
|
|
function parse(css, options) {
|
|
var start; // Debug timer start.
|
|
|
|
options || (options = {});
|
|
_comments = !!options.comments;
|
|
_position = !!options.position;
|
|
|
|
_depth = 0;
|
|
|
|
// Operate on a copy of the given tokens, or the lex()'d CSS string.
|
|
_tokens = Array.isArray(css) ? css.slice() : lex(css);
|
|
|
|
var rule;
|
|
var rules = [];
|
|
var token;
|
|
|
|
TIMER && (start = Date.now());
|
|
|
|
while ((token = next())) {
|
|
rule = parseToken(token);
|
|
rule && rules.push(rule);
|
|
}
|
|
|
|
TIMER && debug('ran in', (Date.now() - start) + 'ms');
|
|
|
|
return {
|
|
type: "stylesheet",
|
|
stylesheet: {
|
|
rules: rules
|
|
}
|
|
};
|
|
}
|
|
|
|
// -- Functions --------------------------------------------------------------
|
|
|
|
/**
|
|
* Build an AST node from a lexical token.
|
|
*
|
|
* @param {Object} token lexical token
|
|
* @param {Object} [override] object hash of properties that override those
|
|
* already in the token, or that will be added to the token.
|
|
* @returns {Object} AST node
|
|
*/
|
|
function astNode(token, override) {
|
|
override || (override = {});
|
|
|
|
var key;
|
|
var keys = ['type', 'name', 'value'];
|
|
var node = {};
|
|
|
|
// Avoiding [].forEach for performance reasons.
|
|
for (var i = 0; i < keys.length; ++i) {
|
|
key = keys[i];
|
|
|
|
if (token[key]) {
|
|
node[key] = override[key] || token[key];
|
|
}
|
|
}
|
|
|
|
keys = Object.keys(override);
|
|
|
|
for (i = 0; i < keys.length; ++i) {
|
|
key = keys[i];
|
|
|
|
if (!node[key]) {
|
|
node[key] = override[key];
|
|
}
|
|
}
|
|
|
|
if (_position) {
|
|
node.position = {
|
|
start: token.start,
|
|
end: token.end
|
|
};
|
|
}
|
|
|
|
DEBUG && debug('astNode:', JSON.stringify(node, null, 2));
|
|
|
|
return node;
|
|
}
|
|
|
|
/**
|
|
* Remove a lexical token from the stack and return the removed token.
|
|
*
|
|
* @returns {Object} lexical token
|
|
*/
|
|
function next() {
|
|
var token = _tokens.shift();
|
|
DEBUG && debug('next:', JSON.stringify(token, null, 2));
|
|
return token;
|
|
}
|
|
|
|
// -- Parse* Functions ---------------------------------------------------------
|
|
|
|
/**
|
|
* Convert an @-group lexical token to an AST node.
|
|
*
|
|
* @param {Object} token @-group lexical token
|
|
* @returns {Object} @-group AST node
|
|
*/
|
|
function parseAtGroup(token) {
|
|
_depth = _depth + 1;
|
|
|
|
// As the @-group token is assembled, relevant token values are captured here
|
|
// temporarily. They will later be used as `tokenize()` overrides.
|
|
var overrides = {};
|
|
|
|
switch (token.type) {
|
|
case 'font-face':
|
|
case 'viewport' :
|
|
overrides.declarations = parseDeclarations();
|
|
break;
|
|
|
|
case 'page':
|
|
overrides.prefix = token.prefix;
|
|
overrides.declarations = parseDeclarations();
|
|
break;
|
|
|
|
default:
|
|
overrides.prefix = token.prefix;
|
|
overrides.rules = parseRules();
|
|
}
|
|
|
|
return astNode(token, overrides);
|
|
}
|
|
|
|
/**
|
|
* Convert an @import lexical token to an AST node.
|
|
*
|
|
* @param {Object} token @import lexical token
|
|
* @returns {Object} @import AST node
|
|
*/
|
|
function parseAtImport(token) {
|
|
return astNode(token);
|
|
}
|
|
|
|
/**
|
|
* Convert an @charset token to an AST node.
|
|
*
|
|
* @param {Object} token @charset lexical token
|
|
* @returns {Object} @charset node
|
|
*/
|
|
function parseCharset(token) {
|
|
return astNode(token);
|
|
}
|
|
|
|
/**
|
|
* Convert a comment token to an AST Node.
|
|
*
|
|
* @param {Object} token comment lexical token
|
|
* @returns {Object} comment node
|
|
*/
|
|
function parseComment(token) {
|
|
return astNode(token, {text: token.text});
|
|
}
|
|
|
|
function parseNamespace(token) {
|
|
return astNode(token);
|
|
}
|
|
|
|
/**
|
|
* Convert a property lexical token to a property AST node.
|
|
*
|
|
* @returns {Object} property node
|
|
*/
|
|
function parseProperty(token) {
|
|
return astNode(token);
|
|
}
|
|
|
|
/**
|
|
* Convert a selector lexical token to a selector AST node.
|
|
*
|
|
* @param {Object} token selector lexical token
|
|
* @returns {Object} selector node
|
|
*/
|
|
function parseSelector(token) {
|
|
function trim(str) {
|
|
return str.trim();
|
|
}
|
|
|
|
return astNode(token, {
|
|
type: 'rule',
|
|
selectors: token.text.split(',').map(trim),
|
|
declarations: parseDeclarations(token)
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Convert a lexical token to an AST node.
|
|
*
|
|
* @returns {Object|undefined} AST node
|
|
*/
|
|
function parseToken(token) {
|
|
switch (token.type) {
|
|
// Cases are listed in roughly descending order of probability.
|
|
case 'property': return parseProperty(token);
|
|
|
|
case 'selector': return parseSelector(token);
|
|
|
|
case 'at-group-end': _depth = _depth - 1; return;
|
|
|
|
case 'media' :
|
|
case 'keyframes' :return parseAtGroup(token);
|
|
|
|
case 'comment': if (_comments) { return parseComment(token); } break;
|
|
|
|
case 'charset': return parseCharset(token);
|
|
case 'import': return parseAtImport(token);
|
|
|
|
case 'namespace': return parseNamespace(token);
|
|
|
|
case 'font-face':
|
|
case 'supports' :
|
|
case 'viewport' :
|
|
case 'document' :
|
|
case 'page' : return parseAtGroup(token);
|
|
}
|
|
|
|
DEBUG && debug('parseToken: unexpected token:', JSON.stringify(token));
|
|
}
|
|
|
|
// -- Parse Helper Functions ---------------------------------------------------
|
|
|
|
/**
|
|
* Iteratively parses lexical tokens from the stack into AST nodes until a
|
|
* conditional function returns `false`, at which point iteration terminates
|
|
* and any AST nodes collected are returned.
|
|
*
|
|
* @param {Function} conditionFn
|
|
* @param {Object} token the lexical token being parsed
|
|
* @returns {Boolean} `true` if the token should be parsed, `false` otherwise
|
|
* @return {Array} AST nodes
|
|
*/
|
|
function parseTokensWhile(conditionFn) {
|
|
var node;
|
|
var nodes = [];
|
|
var token;
|
|
|
|
while ((token = next()) && (conditionFn && conditionFn(token))) {
|
|
node = parseToken(token);
|
|
node && nodes.push(node);
|
|
}
|
|
|
|
// Place an unused non-`end` lexical token back onto the stack.
|
|
if (token && token.type !== 'end') {
|
|
_tokens.unshift(token);
|
|
}
|
|
|
|
return nodes;
|
|
}
|
|
|
|
/**
|
|
* Convert a series of tokens into a sequence of declaration AST nodes.
|
|
*
|
|
* @returns {Array} declaration nodes
|
|
*/
|
|
function parseDeclarations() {
|
|
return parseTokensWhile(function (token) {
|
|
return (token.type === 'property' || token.type === 'comment');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Convert a series of tokens into a sequence of rule nodes.
|
|
*
|
|
* @returns {Array} rule nodes
|
|
*/
|
|
function parseRules() {
|
|
return parseTokensWhile(function () { return _depth; });
|
|
}
|
|
|
|
},{"./debug":14,"./lexer":15}],17:[function(require,module,exports){
|
|
var DEBUG = false; // `true` to print debugging info.
|
|
var TIMER = false; // `true` to time calls to `stringify()` and print the results.
|
|
|
|
var debug = require('./debug')('stringify');
|
|
|
|
var _comments; // Whether comments are allowed in the stringified CSS.
|
|
var _compress; // Whether the stringified CSS should be compressed.
|
|
var _indentation; // Indentation option value.
|
|
var _n; // Compression-aware newline character.
|
|
var _s; // Compression-aware space character.
|
|
|
|
exports = module.exports = stringify;
|
|
|
|
/**
|
|
* Convert a `stringify`-able AST into a CSS string.
|
|
*
|
|
* @param {Object} `stringify`-able AST
|
|
* @param {Object} [options]
|
|
* @param {Boolean} [options.comments=false] allow comments in the CSS
|
|
* @param {Boolean} [options.compress=false] compress whitespace
|
|
* @param {String} [options.indentation=''] indentation sequence
|
|
* @returns {String} CSS
|
|
*/
|
|
function stringify(ast, options) {
|
|
var start; // Debug timer start.
|
|
|
|
options || (options = {});
|
|
_indentation = options.indentation || '';
|
|
_compress = !!options.compress;
|
|
_comments = !!options.comments;
|
|
|
|
if (_compress) {
|
|
_n = _s = '';
|
|
} else {
|
|
_n = '\n';
|
|
_s = ' ';
|
|
}
|
|
|
|
TIMER && (start = Date.now());
|
|
|
|
var css = reduce(ast.stylesheet.rules, stringifyNode).join('\n').trim();
|
|
|
|
TIMER && debug('ran in', (Date.now() - start) + 'ms');
|
|
|
|
return css;
|
|
}
|
|
|
|
// -- Functions --------------------------------------------------------------
|
|
|
|
/**
|
|
* Modify the indentation level, or return a compression-aware sequence of
|
|
* spaces equal to the current indentation level.
|
|
*
|
|
* @param {Number} [level=undefined] indentation level modifier
|
|
* @returns {String} sequence of spaces
|
|
*/
|
|
function indent(level) {
|
|
this.level || (this.level = 1);
|
|
|
|
if (level) {
|
|
this.level += level;
|
|
return;
|
|
}
|
|
|
|
if (_compress) { return ''; }
|
|
|
|
return Array(this.level).join(_indentation || '');
|
|
}
|
|
|
|
// -- Stringify Functions ------------------------------------------------------
|
|
|
|
/**
|
|
* Stringify an @-rule AST node.
|
|
*
|
|
* Use `stringifyAtGroup()` when dealing with @-groups that may contain blocks
|
|
* such as @media.
|
|
*
|
|
* @param {String} type @-rule type. E.g., import, charset
|
|
* @returns {String} Stringified @-rule
|
|
*/
|
|
function stringifyAtRule(node) {
|
|
return '@' + node.type + ' ' + node.value + ';' + _n;
|
|
}
|
|
|
|
/**
|
|
* Stringify an @-group AST node.
|
|
*
|
|
* Use `stringifyAtRule()` when dealing with @-rules that may not contain blocks
|
|
* such as @import.
|
|
*
|
|
* @param {Object} node @-group AST node
|
|
* @returns {String}
|
|
*/
|
|
function stringifyAtGroup(node) {
|
|
var label = '';
|
|
var prefix = node.prefix || '';
|
|
|
|
if (node.name) {
|
|
label = ' ' + node.name;
|
|
}
|
|
|
|
// FIXME: @-rule conditional logic is leaking everywhere.
|
|
var chomp = node.type !== 'page';
|
|
|
|
return '@' + prefix + node.type + label + _s + stringifyBlock(node, chomp) + _n;
|
|
}
|
|
|
|
/**
|
|
* Stringify a comment AST node.
|
|
*
|
|
* @param {Object} node comment AST node
|
|
* @returns {String}
|
|
*/
|
|
function stringifyComment(node) {
|
|
if (!_comments) { return ''; }
|
|
|
|
return '/*' + (node.text || '') + '*/' + _n;
|
|
}
|
|
|
|
/**
|
|
* Stringify a rule AST node.
|
|
*
|
|
* @param {Object} node rule AST node
|
|
* @returns {String}
|
|
*/
|
|
function stringifyRule(node) {
|
|
var label;
|
|
|
|
if (node.selectors) {
|
|
label = node.selectors.join(',' + _n);
|
|
} else {
|
|
label = '@' + node.type;
|
|
label += node.name ? ' ' + node.name : '';
|
|
}
|
|
|
|
return indent() + label + _s + stringifyBlock(node) + _n;
|
|
}
|
|
|
|
|
|
// -- Stringify Helper Functions -----------------------------------------------
|
|
|
|
/**
|
|
* Reduce an array by applying a function to each item and retaining the truthy
|
|
* results.
|
|
*
|
|
* When `item.type` is `'comment'` `stringifyComment` will be applied instead.
|
|
*
|
|
* @param {Array} items array to reduce
|
|
* @param {Function} fn function to call for each item in the array
|
|
* @returns {Mixed} Truthy values will be retained, falsy values omitted
|
|
* @returns {Array} retained results
|
|
*/
|
|
function reduce(items, fn) {
|
|
return items.reduce(function (results, item) {
|
|
var result = (item.type === 'comment') ? stringifyComment(item) : fn(item);
|
|
result && results.push(result);
|
|
return results;
|
|
}, []);
|
|
}
|
|
|
|
/**
|
|
* Stringify an AST node with the assumption that it represents a block of
|
|
* declarations or other @-group contents.
|
|
*
|
|
* @param {Object} node AST node
|
|
* @returns {String}
|
|
*/
|
|
// FIXME: chomp should not be a magic boolean parameter
|
|
function stringifyBlock(node, chomp) {
|
|
var children = node.declarations;
|
|
var fn = stringifyDeclaration;
|
|
|
|
if (node.rules) {
|
|
children = node.rules;
|
|
fn = stringifyRule;
|
|
}
|
|
|
|
children = stringifyChildren(children, fn);
|
|
children && (children = _n + children + (chomp ? '' : _n));
|
|
|
|
return '{' + children + indent() + '}';
|
|
}
|
|
|
|
/**
|
|
* Stringify an array of child AST nodes by calling the given stringify function
|
|
* once for each child, and concatenating the results.
|
|
*
|
|
* @param {Array} children `node.rules` or `node.declarations`
|
|
* @param {Function} fn stringify function
|
|
* @returns {String}
|
|
*/
|
|
function stringifyChildren(children, fn) {
|
|
if (!children) { return ''; }
|
|
|
|
indent(1);
|
|
var results = reduce(children, fn);
|
|
indent(-1);
|
|
|
|
if (!results.length) { return ''; }
|
|
|
|
return results.join(_n);
|
|
}
|
|
|
|
/**
|
|
* Stringify a declaration AST node.
|
|
*
|
|
* @param {Object} node declaration AST node
|
|
* @returns {String}
|
|
*/
|
|
function stringifyDeclaration(node) {
|
|
if (node.type === 'property') {
|
|
return stringifyProperty(node);
|
|
}
|
|
|
|
DEBUG && debug('stringifyDeclaration: unexpected node:', JSON.stringify(node));
|
|
}
|
|
|
|
/**
|
|
* Stringify an AST node.
|
|
*
|
|
* @param {Object} node AST node
|
|
* @returns {String}
|
|
*/
|
|
function stringifyNode(node) {
|
|
switch (node.type) {
|
|
// Cases are listed in roughly descending order of probability.
|
|
case 'rule': return stringifyRule(node);
|
|
|
|
case 'media' :
|
|
case 'keyframes': return stringifyAtGroup(node);
|
|
|
|
case 'comment': return stringifyComment(node);
|
|
|
|
case 'import' :
|
|
case 'charset' :
|
|
case 'namespace': return stringifyAtRule(node);
|
|
|
|
case 'font-face':
|
|
case 'supports' :
|
|
case 'viewport' :
|
|
case 'document' :
|
|
case 'page' : return stringifyAtGroup(node);
|
|
}
|
|
|
|
DEBUG && debug('stringifyNode: unexpected node: ' + JSON.stringify(node));
|
|
}
|
|
|
|
/**
|
|
* Stringify an AST property node.
|
|
*
|
|
* @param {Object} node AST property node
|
|
* @returns {String}
|
|
*/
|
|
function stringifyProperty(node) {
|
|
var name = node.name ? node.name + ':' + _s : '';
|
|
|
|
return indent() + name + node.value + ';';
|
|
}
|
|
|
|
},{"./debug":14}],18:[function(require,module,exports){
|
|
// shim for using process in browser
|
|
var process = module.exports = {};
|
|
|
|
// cached from whatever global is present so that test runners that stub it
|
|
// don't break things. But we need to wrap it in a try catch in case it is
|
|
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
|
// function because try/catches deoptimize in certain engines.
|
|
|
|
var cachedSetTimeout;
|
|
var cachedClearTimeout;
|
|
|
|
function defaultSetTimout() {
|
|
throw new Error('setTimeout has not been defined');
|
|
}
|
|
function defaultClearTimeout () {
|
|
throw new Error('clearTimeout has not been defined');
|
|
}
|
|
(function () {
|
|
try {
|
|
if (typeof setTimeout === 'function') {
|
|
cachedSetTimeout = setTimeout;
|
|
} else {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
} catch (e) {
|
|
cachedSetTimeout = defaultSetTimout;
|
|
}
|
|
try {
|
|
if (typeof clearTimeout === 'function') {
|
|
cachedClearTimeout = clearTimeout;
|
|
} else {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} catch (e) {
|
|
cachedClearTimeout = defaultClearTimeout;
|
|
}
|
|
} ())
|
|
function runTimeout(fun) {
|
|
if (cachedSetTimeout === setTimeout) {
|
|
//normal enviroments in sane situations
|
|
return setTimeout(fun, 0);
|
|
}
|
|
// if setTimeout wasn't available but was latter defined
|
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
cachedSetTimeout = setTimeout;
|
|
return setTimeout(fun, 0);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedSetTimeout(fun, 0);
|
|
} catch(e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedSetTimeout.call(null, fun, 0);
|
|
} catch(e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
return cachedSetTimeout.call(this, fun, 0);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
function runClearTimeout(marker) {
|
|
if (cachedClearTimeout === clearTimeout) {
|
|
//normal enviroments in sane situations
|
|
return clearTimeout(marker);
|
|
}
|
|
// if clearTimeout wasn't available but was latter defined
|
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
cachedClearTimeout = clearTimeout;
|
|
return clearTimeout(marker);
|
|
}
|
|
try {
|
|
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
return cachedClearTimeout(marker);
|
|
} catch (e){
|
|
try {
|
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
return cachedClearTimeout.call(null, marker);
|
|
} catch (e){
|
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
return cachedClearTimeout.call(this, marker);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
var queue = [];
|
|
var draining = false;
|
|
var currentQueue;
|
|
var queueIndex = -1;
|
|
|
|
function cleanUpNextTick() {
|
|
if (!draining || !currentQueue) {
|
|
return;
|
|
}
|
|
draining = false;
|
|
if (currentQueue.length) {
|
|
queue = currentQueue.concat(queue);
|
|
} else {
|
|
queueIndex = -1;
|
|
}
|
|
if (queue.length) {
|
|
drainQueue();
|
|
}
|
|
}
|
|
|
|
function drainQueue() {
|
|
if (draining) {
|
|
return;
|
|
}
|
|
var timeout = runTimeout(cleanUpNextTick);
|
|
draining = true;
|
|
|
|
var len = queue.length;
|
|
while(len) {
|
|
currentQueue = queue;
|
|
queue = [];
|
|
while (++queueIndex < len) {
|
|
if (currentQueue) {
|
|
currentQueue[queueIndex].run();
|
|
}
|
|
}
|
|
queueIndex = -1;
|
|
len = queue.length;
|
|
}
|
|
currentQueue = null;
|
|
draining = false;
|
|
runClearTimeout(timeout);
|
|
}
|
|
|
|
process.nextTick = function (fun) {
|
|
var args = new Array(arguments.length - 1);
|
|
if (arguments.length > 1) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
args[i - 1] = arguments[i];
|
|
}
|
|
}
|
|
queue.push(new Item(fun, args));
|
|
if (queue.length === 1 && !draining) {
|
|
runTimeout(drainQueue);
|
|
}
|
|
};
|
|
|
|
// v8 likes predictible objects
|
|
function Item(fun, array) {
|
|
this.fun = fun;
|
|
this.array = array;
|
|
}
|
|
Item.prototype.run = function () {
|
|
this.fun.apply(null, this.array);
|
|
};
|
|
process.title = 'browser';
|
|
process.browser = true;
|
|
process.env = {};
|
|
process.argv = [];
|
|
process.version = ''; // empty string to avoid regexp issues
|
|
process.versions = {};
|
|
|
|
function noop() {}
|
|
|
|
process.on = noop;
|
|
process.addListener = noop;
|
|
process.once = noop;
|
|
process.off = noop;
|
|
process.removeListener = noop;
|
|
process.removeAllListeners = noop;
|
|
process.emit = noop;
|
|
process.prependListener = noop;
|
|
process.prependOnceListener = noop;
|
|
|
|
process.listeners = function (name) { return [] }
|
|
|
|
process.binding = function (name) {
|
|
throw new Error('process.binding is not supported');
|
|
};
|
|
|
|
process.cwd = function () { return '/' };
|
|
process.chdir = function (dir) {
|
|
throw new Error('process.chdir is not supported');
|
|
};
|
|
process.umask = function() { return 0; };
|
|
|
|
},{}],19:[function(require,module,exports){
|
|
/*
|
|
Slick Parser
|
|
- originally created by the almighty Thomas Aylott <@subtlegradient> (http://subtlegradient.com)
|
|
*/"use strict"
|
|
|
|
// Notable changes from Slick.Parser 1.0.x
|
|
|
|
// The parser now uses 2 classes: Expressions and Expression
|
|
// `new Expressions` produces an array-like object containing a list of Expression objects
|
|
// - Expressions::toString() produces a cleaned up expressions string
|
|
// `new Expression` produces an array-like object
|
|
// - Expression::toString() produces a cleaned up expression string
|
|
// The only exposed method is parse, which produces a (cached) `new Expressions` instance
|
|
// parsed.raw is no longer present, use .toString()
|
|
// parsed.expression is now useless, just use the indices
|
|
// parsed.reverse() has been removed for now, due to its apparent uselessness
|
|
// Other changes in the Expressions object:
|
|
// - classNames are now unique, and save both escaped and unescaped values
|
|
// - attributes now save both escaped and unescaped values
|
|
// - pseudos now save both escaped and unescaped values
|
|
|
|
var escapeRe = /([-.*+?^${}()|[\]\/\\])/g,
|
|
unescapeRe = /\\/g
|
|
|
|
var escape = function(string){
|
|
// XRegExp v2.0.0-beta-3
|
|
// « https://github.com/slevithan/XRegExp/blob/master/src/xregexp.js
|
|
return (string + "").replace(escapeRe, '\\$1')
|
|
}
|
|
|
|
var unescape = function(string){
|
|
return (string + "").replace(unescapeRe, '')
|
|
}
|
|
|
|
var slickRe = RegExp(
|
|
/*
|
|
#!/usr/bin/env ruby
|
|
puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
|
|
__END__
|
|
"(?x)^(?:\
|
|
\\s* ( , ) \\s* # Separator \n\
|
|
| \\s* ( <combinator>+ ) \\s* # Combinator \n\
|
|
| ( \\s+ ) # CombinatorChildren \n\
|
|
| ( <unicode>+ | \\* ) # Tag \n\
|
|
| \\# ( <unicode>+ ) # ID \n\
|
|
| \\. ( <unicode>+ ) # ClassName \n\
|
|
| # Attribute \n\
|
|
\\[ \
|
|
\\s* (<unicode1>+) (?: \
|
|
\\s* ([*^$!~|]?=) (?: \
|
|
\\s* (?:\
|
|
([\"']?)(.*?)\\9 \
|
|
)\
|
|
) \
|
|
)? \\s* \
|
|
\\](?!\\]) \n\
|
|
| :+ ( <unicode>+ )(?:\
|
|
\\( (?:\
|
|
(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
|
|
) \\)\
|
|
)?\
|
|
)"
|
|
*/
|
|
"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
|
|
.replace(/<combinator>/, '[' + escape(">+~`!@$%^&={}\\;</") + ']')
|
|
.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
|
|
.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
|
|
)
|
|
|
|
// Part
|
|
|
|
var Part = function Part(combinator){
|
|
this.combinator = combinator || " "
|
|
this.tag = "*"
|
|
}
|
|
|
|
Part.prototype.toString = function(){
|
|
|
|
if (!this.raw){
|
|
|
|
var xpr = "", k, part
|
|
|
|
xpr += this.tag || "*"
|
|
if (this.id) xpr += "#" + this.id
|
|
if (this.classes) xpr += "." + this.classList.join(".")
|
|
if (this.attributes) for (k = 0; part = this.attributes[k++];){
|
|
xpr += "[" + part.name + (part.operator ? part.operator + '"' + part.value + '"' : '') + "]"
|
|
}
|
|
if (this.pseudos) for (k = 0; part = this.pseudos[k++];){
|
|
xpr += ":" + part.name
|
|
if (part.value) xpr += "(" + part.value + ")"
|
|
}
|
|
|
|
this.raw = xpr
|
|
|
|
}
|
|
|
|
return this.raw
|
|
}
|
|
|
|
// Expression
|
|
|
|
var Expression = function Expression(){
|
|
this.length = 0
|
|
}
|
|
|
|
Expression.prototype.toString = function(){
|
|
|
|
if (!this.raw){
|
|
|
|
var xpr = ""
|
|
|
|
for (var j = 0, bit; bit = this[j++];){
|
|
if (j !== 1) xpr += " "
|
|
if (bit.combinator !== " ") xpr += bit.combinator + " "
|
|
xpr += bit
|
|
}
|
|
|
|
this.raw = xpr
|
|
|
|
}
|
|
|
|
return this.raw
|
|
}
|
|
|
|
var replacer = function(
|
|
rawMatch,
|
|
|
|
separator,
|
|
combinator,
|
|
combinatorChildren,
|
|
|
|
tagName,
|
|
id,
|
|
className,
|
|
|
|
attributeKey,
|
|
attributeOperator,
|
|
attributeQuote,
|
|
attributeValue,
|
|
|
|
pseudoMarker,
|
|
pseudoClass,
|
|
pseudoQuote,
|
|
pseudoClassQuotedValue,
|
|
pseudoClassValue
|
|
){
|
|
|
|
var expression, current
|
|
|
|
if (separator || !this.length){
|
|
expression = this[this.length++] = new Expression
|
|
if (separator) return ''
|
|
}
|
|
|
|
if (!expression) expression = this[this.length - 1]
|
|
|
|
if (combinator || combinatorChildren || !expression.length){
|
|
current = expression[expression.length++] = new Part(combinator)
|
|
}
|
|
|
|
if (!current) current = expression[expression.length - 1]
|
|
|
|
if (tagName){
|
|
|
|
current.tag = unescape(tagName)
|
|
|
|
} else if (id){
|
|
|
|
current.id = unescape(id)
|
|
|
|
} else if (className){
|
|
|
|
var unescaped = unescape(className)
|
|
|
|
var classes = current.classes || (current.classes = {})
|
|
if (!classes[unescaped]){
|
|
classes[unescaped] = escape(className)
|
|
var classList = current.classList || (current.classList = [])
|
|
classList.push(unescaped)
|
|
classList.sort()
|
|
}
|
|
|
|
} else if (pseudoClass){
|
|
|
|
pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue
|
|
|
|
;(current.pseudos || (current.pseudos = [])).push({
|
|
type : pseudoMarker.length == 1 ? 'class' : 'element',
|
|
name : unescape(pseudoClass),
|
|
escapedName : escape(pseudoClass),
|
|
value : pseudoClassValue ? unescape(pseudoClassValue) : null,
|
|
escapedValue : pseudoClassValue ? escape(pseudoClassValue) : null
|
|
})
|
|
|
|
} else if (attributeKey){
|
|
|
|
attributeValue = attributeValue ? escape(attributeValue) : null
|
|
|
|
;(current.attributes || (current.attributes = [])).push({
|
|
operator : attributeOperator,
|
|
name : unescape(attributeKey),
|
|
escapedName : escape(attributeKey),
|
|
value : attributeValue ? unescape(attributeValue) : null,
|
|
escapedValue : attributeValue ? escape(attributeValue) : null
|
|
})
|
|
|
|
}
|
|
|
|
return ''
|
|
|
|
}
|
|
|
|
// Expressions
|
|
|
|
var Expressions = function Expressions(expression){
|
|
this.length = 0
|
|
|
|
var self = this
|
|
|
|
var original = expression, replaced
|
|
|
|
while (expression){
|
|
replaced = expression.replace(slickRe, function(){
|
|
return replacer.apply(self, arguments)
|
|
})
|
|
if (replaced === expression) throw new Error(original + ' is an invalid expression')
|
|
expression = replaced
|
|
}
|
|
}
|
|
|
|
Expressions.prototype.toString = function(){
|
|
if (!this.raw){
|
|
var expressions = []
|
|
for (var i = 0, expression; expression = this[i++];) expressions.push(expression)
|
|
this.raw = expressions.join(", ")
|
|
}
|
|
|
|
return this.raw
|
|
}
|
|
|
|
var cache = {}
|
|
|
|
var parse = function(expression){
|
|
if (expression == null) return null
|
|
expression = ('' + expression).replace(/^\s+|\s+$/g, '')
|
|
return cache[expression] || (cache[expression] = new Expressions(expression))
|
|
}
|
|
|
|
module.exports = parse
|
|
|
|
},{}],20:[function(require,module,exports){
|
|
// TinyColor v1.4.1
|
|
// https://github.com/bgrins/TinyColor
|
|
// Brian Grinstead, MIT License
|
|
|
|
(function(Math) {
|
|
|
|
var trimLeft = /^\s+/,
|
|
trimRight = /\s+$/,
|
|
tinyCounter = 0,
|
|
mathRound = Math.round,
|
|
mathMin = Math.min,
|
|
mathMax = Math.max,
|
|
mathRandom = Math.random;
|
|
|
|
function tinycolor (color, opts) {
|
|
|
|
color = (color) ? color : '';
|
|
opts = opts || { };
|
|
|
|
// If input is already a tinycolor, return itself
|
|
if (color instanceof tinycolor) {
|
|
return color;
|
|
}
|
|
// If we are called as a function, call using new instead
|
|
if (!(this instanceof tinycolor)) {
|
|
return new tinycolor(color, opts);
|
|
}
|
|
|
|
var rgb = inputToRGB(color);
|
|
this._originalInput = color,
|
|
this._r = rgb.r,
|
|
this._g = rgb.g,
|
|
this._b = rgb.b,
|
|
this._a = rgb.a,
|
|
this._roundA = mathRound(100*this._a) / 100,
|
|
this._format = opts.format || rgb.format;
|
|
this._gradientType = opts.gradientType;
|
|
|
|
// Don't let the range of [0,255] come back in [0,1].
|
|
// Potentially lose a little bit of precision here, but will fix issues where
|
|
// .5 gets interpreted as half of the total, instead of half of 1
|
|
// If it was supposed to be 128, this was already taken care of by `inputToRgb`
|
|
if (this._r < 1) { this._r = mathRound(this._r); }
|
|
if (this._g < 1) { this._g = mathRound(this._g); }
|
|
if (this._b < 1) { this._b = mathRound(this._b); }
|
|
|
|
this._ok = rgb.ok;
|
|
this._tc_id = tinyCounter++;
|
|
}
|
|
|
|
tinycolor.prototype = {
|
|
isDark: function() {
|
|
return this.getBrightness() < 128;
|
|
},
|
|
isLight: function() {
|
|
return !this.isDark();
|
|
},
|
|
isValid: function() {
|
|
return this._ok;
|
|
},
|
|
getOriginalInput: function() {
|
|
return this._originalInput;
|
|
},
|
|
getFormat: function() {
|
|
return this._format;
|
|
},
|
|
getAlpha: function() {
|
|
return this._a;
|
|
},
|
|
getBrightness: function() {
|
|
//http://www.w3.org/TR/AERT#color-contrast
|
|
var rgb = this.toRgb();
|
|
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
|
|
},
|
|
getLuminance: function() {
|
|
//http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
|
|
var rgb = this.toRgb();
|
|
var RsRGB, GsRGB, BsRGB, R, G, B;
|
|
RsRGB = rgb.r/255;
|
|
GsRGB = rgb.g/255;
|
|
BsRGB = rgb.b/255;
|
|
|
|
if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);}
|
|
if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);}
|
|
if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);}
|
|
return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);
|
|
},
|
|
setAlpha: function(value) {
|
|
this._a = boundAlpha(value);
|
|
this._roundA = mathRound(100*this._a) / 100;
|
|
return this;
|
|
},
|
|
toHsv: function() {
|
|
var hsv = rgbToHsv(this._r, this._g, this._b);
|
|
return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
|
|
},
|
|
toHsvString: function() {
|
|
var hsv = rgbToHsv(this._r, this._g, this._b);
|
|
var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
|
|
return (this._a == 1) ?
|
|
"hsv(" + h + ", " + s + "%, " + v + "%)" :
|
|
"hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";
|
|
},
|
|
toHsl: function() {
|
|
var hsl = rgbToHsl(this._r, this._g, this._b);
|
|
return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
|
|
},
|
|
toHslString: function() {
|
|
var hsl = rgbToHsl(this._r, this._g, this._b);
|
|
var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
|
|
return (this._a == 1) ?
|
|
"hsl(" + h + ", " + s + "%, " + l + "%)" :
|
|
"hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";
|
|
},
|
|
toHex: function(allow3Char) {
|
|
return rgbToHex(this._r, this._g, this._b, allow3Char);
|
|
},
|
|
toHexString: function(allow3Char) {
|
|
return '#' + this.toHex(allow3Char);
|
|
},
|
|
toHex8: function(allow4Char) {
|
|
return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
|
|
},
|
|
toHex8String: function(allow4Char) {
|
|
return '#' + this.toHex8(allow4Char);
|
|
},
|
|
toRgb: function() {
|
|
return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
|
|
},
|
|
toRgbString: function() {
|
|
return (this._a == 1) ?
|
|
"rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
|
|
"rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
|
|
},
|
|
toPercentageRgb: function() {
|
|
return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
|
|
},
|
|
toPercentageRgbString: function() {
|
|
return (this._a == 1) ?
|
|
"rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
|
|
"rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
|
|
},
|
|
toName: function() {
|
|
if (this._a === 0) {
|
|
return "transparent";
|
|
}
|
|
|
|
if (this._a < 1) {
|
|
return false;
|
|
}
|
|
|
|
return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
|
|
},
|
|
toFilter: function(secondColor) {
|
|
var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
|
|
var secondHex8String = hex8String;
|
|
var gradientType = this._gradientType ? "GradientType = 1, " : "";
|
|
|
|
if (secondColor) {
|
|
var s = tinycolor(secondColor);
|
|
secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
|
|
}
|
|
|
|
return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";
|
|
},
|
|
toString: function(format) {
|
|
var formatSet = !!format;
|
|
format = format || this._format;
|
|
|
|
var formattedString = false;
|
|
var hasAlpha = this._a < 1 && this._a >= 0;
|
|
var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
|
|
|
|
if (needsAlphaFormat) {
|
|
// Special case for "transparent", all other non-alpha formats
|
|
// will return rgba when there is transparency.
|
|
if (format === "name" && this._a === 0) {
|
|
return this.toName();
|
|
}
|
|
return this.toRgbString();
|
|
}
|
|
if (format === "rgb") {
|
|
formattedString = this.toRgbString();
|
|
}
|
|
if (format === "prgb") {
|
|
formattedString = this.toPercentageRgbString();
|
|
}
|
|
if (format === "hex" || format === "hex6") {
|
|
formattedString = this.toHexString();
|
|
}
|
|
if (format === "hex3") {
|
|
formattedString = this.toHexString(true);
|
|
}
|
|
if (format === "hex4") {
|
|
formattedString = this.toHex8String(true);
|
|
}
|
|
if (format === "hex8") {
|
|
formattedString = this.toHex8String();
|
|
}
|
|
if (format === "name") {
|
|
formattedString = this.toName();
|
|
}
|
|
if (format === "hsl") {
|
|
formattedString = this.toHslString();
|
|
}
|
|
if (format === "hsv") {
|
|
formattedString = this.toHsvString();
|
|
}
|
|
|
|
return formattedString || this.toHexString();
|
|
},
|
|
clone: function() {
|
|
return tinycolor(this.toString());
|
|
},
|
|
|
|
_applyModification: function(fn, args) {
|
|
var color = fn.apply(null, [this].concat([].slice.call(args)));
|
|
this._r = color._r;
|
|
this._g = color._g;
|
|
this._b = color._b;
|
|
this.setAlpha(color._a);
|
|
return this;
|
|
},
|
|
lighten: function() {
|
|
return this._applyModification(lighten, arguments);
|
|
},
|
|
brighten: function() {
|
|
return this._applyModification(brighten, arguments);
|
|
},
|
|
darken: function() {
|
|
return this._applyModification(darken, arguments);
|
|
},
|
|
desaturate: function() {
|
|
return this._applyModification(desaturate, arguments);
|
|
},
|
|
saturate: function() {
|
|
return this._applyModification(saturate, arguments);
|
|
},
|
|
greyscale: function() {
|
|
return this._applyModification(greyscale, arguments);
|
|
},
|
|
spin: function() {
|
|
return this._applyModification(spin, arguments);
|
|
},
|
|
|
|
_applyCombination: function(fn, args) {
|
|
return fn.apply(null, [this].concat([].slice.call(args)));
|
|
},
|
|
analogous: function() {
|
|
return this._applyCombination(analogous, arguments);
|
|
},
|
|
complement: function() {
|
|
return this._applyCombination(complement, arguments);
|
|
},
|
|
monochromatic: function() {
|
|
return this._applyCombination(monochromatic, arguments);
|
|
},
|
|
splitcomplement: function() {
|
|
return this._applyCombination(splitcomplement, arguments);
|
|
},
|
|
triad: function() {
|
|
return this._applyCombination(triad, arguments);
|
|
},
|
|
tetrad: function() {
|
|
return this._applyCombination(tetrad, arguments);
|
|
}
|
|
};
|
|
|
|
// If input is an object, force 1 into "1.0" to handle ratios properly
|
|
// String input requires "1.0" as input, so 1 will be treated as 1
|
|
tinycolor.fromRatio = function(color, opts) {
|
|
if (typeof color == "object") {
|
|
var newColor = {};
|
|
for (var i in color) {
|
|
if (color.hasOwnProperty(i)) {
|
|
if (i === "a") {
|
|
newColor[i] = color[i];
|
|
}
|
|
else {
|
|
newColor[i] = convertToPercentage(color[i]);
|
|
}
|
|
}
|
|
}
|
|
color = newColor;
|
|
}
|
|
|
|
return tinycolor(color, opts);
|
|
};
|
|
|
|
// Given a string or object, convert that input to RGB
|
|
// Possible string inputs:
|
|
//
|
|
// "red"
|
|
// "#f00" or "f00"
|
|
// "#ff0000" or "ff0000"
|
|
// "#ff000000" or "ff000000"
|
|
// "rgb 255 0 0" or "rgb (255, 0, 0)"
|
|
// "rgb 1.0 0 0" or "rgb (1, 0, 0)"
|
|
// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
|
|
// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
|
|
// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
|
|
// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
|
|
// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
|
|
//
|
|
function inputToRGB(color) {
|
|
|
|
var rgb = { r: 0, g: 0, b: 0 };
|
|
var a = 1;
|
|
var s = null;
|
|
var v = null;
|
|
var l = null;
|
|
var ok = false;
|
|
var format = false;
|
|
|
|
if (typeof color == "string") {
|
|
color = stringInputToObject(color);
|
|
}
|
|
|
|
if (typeof color == "object") {
|
|
if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
|
|
rgb = rgbToRgb(color.r, color.g, color.b);
|
|
ok = true;
|
|
format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
|
|
}
|
|
else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
|
|
s = convertToPercentage(color.s);
|
|
v = convertToPercentage(color.v);
|
|
rgb = hsvToRgb(color.h, s, v);
|
|
ok = true;
|
|
format = "hsv";
|
|
}
|
|
else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
|
|
s = convertToPercentage(color.s);
|
|
l = convertToPercentage(color.l);
|
|
rgb = hslToRgb(color.h, s, l);
|
|
ok = true;
|
|
format = "hsl";
|
|
}
|
|
|
|
if (color.hasOwnProperty("a")) {
|
|
a = color.a;
|
|
}
|
|
}
|
|
|
|
a = boundAlpha(a);
|
|
|
|
return {
|
|
ok: ok,
|
|
format: color.format || format,
|
|
r: mathMin(255, mathMax(rgb.r, 0)),
|
|
g: mathMin(255, mathMax(rgb.g, 0)),
|
|
b: mathMin(255, mathMax(rgb.b, 0)),
|
|
a: a
|
|
};
|
|
}
|
|
|
|
|
|
// Conversion Functions
|
|
// --------------------
|
|
|
|
// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
|
|
// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
|
|
|
|
// `rgbToRgb`
|
|
// Handle bounds / percentage checking to conform to CSS color spec
|
|
// <http://www.w3.org/TR/css3-color/>
|
|
// *Assumes:* r, g, b in [0, 255] or [0, 1]
|
|
// *Returns:* { r, g, b } in [0, 255]
|
|
function rgbToRgb(r, g, b){
|
|
return {
|
|
r: bound01(r, 255) * 255,
|
|
g: bound01(g, 255) * 255,
|
|
b: bound01(b, 255) * 255
|
|
};
|
|
}
|
|
|
|
// `rgbToHsl`
|
|
// Converts an RGB color value to HSL.
|
|
// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
|
|
// *Returns:* { h, s, l } in [0,1]
|
|
function rgbToHsl(r, g, b) {
|
|
|
|
r = bound01(r, 255);
|
|
g = bound01(g, 255);
|
|
b = bound01(b, 255);
|
|
|
|
var max = mathMax(r, g, b), min = mathMin(r, g, b);
|
|
var h, s, l = (max + min) / 2;
|
|
|
|
if(max == min) {
|
|
h = s = 0; // achromatic
|
|
}
|
|
else {
|
|
var d = max - min;
|
|
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
switch(max) {
|
|
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
|
|
case g: h = (b - r) / d + 2; break;
|
|
case b: h = (r - g) / d + 4; break;
|
|
}
|
|
|
|
h /= 6;
|
|
}
|
|
|
|
return { h: h, s: s, l: l };
|
|
}
|
|
|
|
// `hslToRgb`
|
|
// Converts an HSL color value to RGB.
|
|
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
|
|
// *Returns:* { r, g, b } in the set [0, 255]
|
|
function hslToRgb(h, s, l) {
|
|
var r, g, b;
|
|
|
|
h = bound01(h, 360);
|
|
s = bound01(s, 100);
|
|
l = bound01(l, 100);
|
|
|
|
function hue2rgb(p, q, t) {
|
|
if(t < 0) t += 1;
|
|
if(t > 1) t -= 1;
|
|
if(t < 1/6) return p + (q - p) * 6 * t;
|
|
if(t < 1/2) return q;
|
|
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
|
|
return p;
|
|
}
|
|
|
|
if(s === 0) {
|
|
r = g = b = l; // achromatic
|
|
}
|
|
else {
|
|
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
var p = 2 * l - q;
|
|
r = hue2rgb(p, q, h + 1/3);
|
|
g = hue2rgb(p, q, h);
|
|
b = hue2rgb(p, q, h - 1/3);
|
|
}
|
|
|
|
return { r: r * 255, g: g * 255, b: b * 255 };
|
|
}
|
|
|
|
// `rgbToHsv`
|
|
// Converts an RGB color value to HSV
|
|
// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
|
|
// *Returns:* { h, s, v } in [0,1]
|
|
function rgbToHsv(r, g, b) {
|
|
|
|
r = bound01(r, 255);
|
|
g = bound01(g, 255);
|
|
b = bound01(b, 255);
|
|
|
|
var max = mathMax(r, g, b), min = mathMin(r, g, b);
|
|
var h, s, v = max;
|
|
|
|
var d = max - min;
|
|
s = max === 0 ? 0 : d / max;
|
|
|
|
if(max == min) {
|
|
h = 0; // achromatic
|
|
}
|
|
else {
|
|
switch(max) {
|
|
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
|
|
case g: h = (b - r) / d + 2; break;
|
|
case b: h = (r - g) / d + 4; break;
|
|
}
|
|
h /= 6;
|
|
}
|
|
return { h: h, s: s, v: v };
|
|
}
|
|
|
|
// `hsvToRgb`
|
|
// Converts an HSV color value to RGB.
|
|
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
|
|
// *Returns:* { r, g, b } in the set [0, 255]
|
|
function hsvToRgb(h, s, v) {
|
|
|
|
h = bound01(h, 360) * 6;
|
|
s = bound01(s, 100);
|
|
v = bound01(v, 100);
|
|
|
|
var i = Math.floor(h),
|
|
f = h - i,
|
|
p = v * (1 - s),
|
|
q = v * (1 - f * s),
|
|
t = v * (1 - (1 - f) * s),
|
|
mod = i % 6,
|
|
r = [v, q, p, p, t, v][mod],
|
|
g = [t, v, v, q, p, p][mod],
|
|
b = [p, p, t, v, v, q][mod];
|
|
|
|
return { r: r * 255, g: g * 255, b: b * 255 };
|
|
}
|
|
|
|
// `rgbToHex`
|
|
// Converts an RGB color to hex
|
|
// Assumes r, g, and b are contained in the set [0, 255]
|
|
// Returns a 3 or 6 character hex
|
|
function rgbToHex(r, g, b, allow3Char) {
|
|
|
|
var hex = [
|
|
pad2(mathRound(r).toString(16)),
|
|
pad2(mathRound(g).toString(16)),
|
|
pad2(mathRound(b).toString(16))
|
|
];
|
|
|
|
// Return a 3 character hex if possible
|
|
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
|
|
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
|
|
}
|
|
|
|
return hex.join("");
|
|
}
|
|
|
|
// `rgbaToHex`
|
|
// Converts an RGBA color plus alpha transparency to hex
|
|
// Assumes r, g, b are contained in the set [0, 255] and
|
|
// a in [0, 1]. Returns a 4 or 8 character rgba hex
|
|
function rgbaToHex(r, g, b, a, allow4Char) {
|
|
|
|
var hex = [
|
|
pad2(mathRound(r).toString(16)),
|
|
pad2(mathRound(g).toString(16)),
|
|
pad2(mathRound(b).toString(16)),
|
|
pad2(convertDecimalToHex(a))
|
|
];
|
|
|
|
// Return a 4 character hex if possible
|
|
if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
|
|
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
|
|
}
|
|
|
|
return hex.join("");
|
|
}
|
|
|
|
// `rgbaToArgbHex`
|
|
// Converts an RGBA color to an ARGB Hex8 string
|
|
// Rarely used, but required for "toFilter()"
|
|
function rgbaToArgbHex(r, g, b, a) {
|
|
|
|
var hex = [
|
|
pad2(convertDecimalToHex(a)),
|
|
pad2(mathRound(r).toString(16)),
|
|
pad2(mathRound(g).toString(16)),
|
|
pad2(mathRound(b).toString(16))
|
|
];
|
|
|
|
return hex.join("");
|
|
}
|
|
|
|
// `equals`
|
|
// Can be called with any tinycolor input
|
|
tinycolor.equals = function (color1, color2) {
|
|
if (!color1 || !color2) { return false; }
|
|
return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
|
|
};
|
|
|
|
tinycolor.random = function() {
|
|
return tinycolor.fromRatio({
|
|
r: mathRandom(),
|
|
g: mathRandom(),
|
|
b: mathRandom()
|
|
});
|
|
};
|
|
|
|
|
|
// Modification Functions
|
|
// ----------------------
|
|
// Thanks to less.js for some of the basics here
|
|
// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
|
|
|
|
function desaturate(color, amount) {
|
|
amount = (amount === 0) ? 0 : (amount || 10);
|
|
var hsl = tinycolor(color).toHsl();
|
|
hsl.s -= amount / 100;
|
|
hsl.s = clamp01(hsl.s);
|
|
return tinycolor(hsl);
|
|
}
|
|
|
|
function saturate(color, amount) {
|
|
amount = (amount === 0) ? 0 : (amount || 10);
|
|
var hsl = tinycolor(color).toHsl();
|
|
hsl.s += amount / 100;
|
|
hsl.s = clamp01(hsl.s);
|
|
return tinycolor(hsl);
|
|
}
|
|
|
|
function greyscale(color) {
|
|
return tinycolor(color).desaturate(100);
|
|
}
|
|
|
|
function lighten (color, amount) {
|
|
amount = (amount === 0) ? 0 : (amount || 10);
|
|
var hsl = tinycolor(color).toHsl();
|
|
hsl.l += amount / 100;
|
|
hsl.l = clamp01(hsl.l);
|
|
return tinycolor(hsl);
|
|
}
|
|
|
|
function brighten(color, amount) {
|
|
amount = (amount === 0) ? 0 : (amount || 10);
|
|
var rgb = tinycolor(color).toRgb();
|
|
rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));
|
|
rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));
|
|
rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));
|
|
return tinycolor(rgb);
|
|
}
|
|
|
|
function darken (color, amount) {
|
|
amount = (amount === 0) ? 0 : (amount || 10);
|
|
var hsl = tinycolor(color).toHsl();
|
|
hsl.l -= amount / 100;
|
|
hsl.l = clamp01(hsl.l);
|
|
return tinycolor(hsl);
|
|
}
|
|
|
|
// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
|
|
// Values outside of this range will be wrapped into this range.
|
|
function spin(color, amount) {
|
|
var hsl = tinycolor(color).toHsl();
|
|
var hue = (hsl.h + amount) % 360;
|
|
hsl.h = hue < 0 ? 360 + hue : hue;
|
|
return tinycolor(hsl);
|
|
}
|
|
|
|
// Combination Functions
|
|
// ---------------------
|
|
// Thanks to jQuery xColor for some of the ideas behind these
|
|
// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
|
|
|
|
function complement(color) {
|
|
var hsl = tinycolor(color).toHsl();
|
|
hsl.h = (hsl.h + 180) % 360;
|
|
return tinycolor(hsl);
|
|
}
|
|
|
|
function triad(color) {
|
|
var hsl = tinycolor(color).toHsl();
|
|
var h = hsl.h;
|
|
return [
|
|
tinycolor(color),
|
|
tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
|
|
tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
|
|
];
|
|
}
|
|
|
|
function tetrad(color) {
|
|
var hsl = tinycolor(color).toHsl();
|
|
var h = hsl.h;
|
|
return [
|
|
tinycolor(color),
|
|
tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
|
|
tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
|
|
tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
|
|
];
|
|
}
|
|
|
|
function splitcomplement(color) {
|
|
var hsl = tinycolor(color).toHsl();
|
|
var h = hsl.h;
|
|
return [
|
|
tinycolor(color),
|
|
tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
|
|
tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
|
|
];
|
|
}
|
|
|
|
function analogous(color, results, slices) {
|
|
results = results || 6;
|
|
slices = slices || 30;
|
|
|
|
var hsl = tinycolor(color).toHsl();
|
|
var part = 360 / slices;
|
|
var ret = [tinycolor(color)];
|
|
|
|
for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
|
|
hsl.h = (hsl.h + part) % 360;
|
|
ret.push(tinycolor(hsl));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function monochromatic(color, results) {
|
|
results = results || 6;
|
|
var hsv = tinycolor(color).toHsv();
|
|
var h = hsv.h, s = hsv.s, v = hsv.v;
|
|
var ret = [];
|
|
var modification = 1 / results;
|
|
|
|
while (results--) {
|
|
ret.push(tinycolor({ h: h, s: s, v: v}));
|
|
v = (v + modification) % 1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Utility Functions
|
|
// ---------------------
|
|
|
|
tinycolor.mix = function(color1, color2, amount) {
|
|
amount = (amount === 0) ? 0 : (amount || 50);
|
|
|
|
var rgb1 = tinycolor(color1).toRgb();
|
|
var rgb2 = tinycolor(color2).toRgb();
|
|
|
|
var p = amount / 100;
|
|
|
|
var rgba = {
|
|
r: ((rgb2.r - rgb1.r) * p) + rgb1.r,
|
|
g: ((rgb2.g - rgb1.g) * p) + rgb1.g,
|
|
b: ((rgb2.b - rgb1.b) * p) + rgb1.b,
|
|
a: ((rgb2.a - rgb1.a) * p) + rgb1.a
|
|
};
|
|
|
|
return tinycolor(rgba);
|
|
};
|
|
|
|
|
|
// Readability Functions
|
|
// ---------------------
|
|
// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)
|
|
|
|
// `contrast`
|
|
// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
|
|
tinycolor.readability = function(color1, color2) {
|
|
var c1 = tinycolor(color1);
|
|
var c2 = tinycolor(color2);
|
|
return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05);
|
|
};
|
|
|
|
// `isReadable`
|
|
// Ensure that foreground and background color combinations meet WCAG2 guidelines.
|
|
// The third argument is an optional Object.
|
|
// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
|
|
// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
|
|
// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.
|
|
|
|
// *Example*
|
|
// tinycolor.isReadable("#000", "#111") => false
|
|
// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
|
|
tinycolor.isReadable = function(color1, color2, wcag2) {
|
|
var readability = tinycolor.readability(color1, color2);
|
|
var wcag2Parms, out;
|
|
|
|
out = false;
|
|
|
|
wcag2Parms = validateWCAG2Parms(wcag2);
|
|
switch (wcag2Parms.level + wcag2Parms.size) {
|
|
case "AAsmall":
|
|
case "AAAlarge":
|
|
out = readability >= 4.5;
|
|
break;
|
|
case "AAlarge":
|
|
out = readability >= 3;
|
|
break;
|
|
case "AAAsmall":
|
|
out = readability >= 7;
|
|
break;
|
|
}
|
|
return out;
|
|
|
|
};
|
|
|
|
// `mostReadable`
|
|
// Given a base color and a list of possible foreground or background
|
|
// colors for that base, returns the most readable color.
|
|
// Optionally returns Black or White if the most readable color is unreadable.
|
|
// *Example*
|
|
// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
|
|
// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"
|
|
// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
|
|
// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
|
|
tinycolor.mostReadable = function(baseColor, colorList, args) {
|
|
var bestColor = null;
|
|
var bestScore = 0;
|
|
var readability;
|
|
var includeFallbackColors, level, size ;
|
|
args = args || {};
|
|
includeFallbackColors = args.includeFallbackColors ;
|
|
level = args.level;
|
|
size = args.size;
|
|
|
|
for (var i= 0; i < colorList.length ; i++) {
|
|
readability = tinycolor.readability(baseColor, colorList[i]);
|
|
if (readability > bestScore) {
|
|
bestScore = readability;
|
|
bestColor = tinycolor(colorList[i]);
|
|
}
|
|
}
|
|
|
|
if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) {
|
|
return bestColor;
|
|
}
|
|
else {
|
|
args.includeFallbackColors=false;
|
|
return tinycolor.mostReadable(baseColor,["#fff", "#000"],args);
|
|
}
|
|
};
|
|
|
|
|
|
// Big List of Colors
|
|
// ------------------
|
|
// <http://www.w3.org/TR/css3-color/#svg-color>
|
|
var names = tinycolor.names = {
|
|
aliceblue: "f0f8ff",
|
|
antiquewhite: "faebd7",
|
|
aqua: "0ff",
|
|
aquamarine: "7fffd4",
|
|
azure: "f0ffff",
|
|
beige: "f5f5dc",
|
|
bisque: "ffe4c4",
|
|
black: "000",
|
|
blanchedalmond: "ffebcd",
|
|
blue: "00f",
|
|
blueviolet: "8a2be2",
|
|
brown: "a52a2a",
|
|
burlywood: "deb887",
|
|
burntsienna: "ea7e5d",
|
|
cadetblue: "5f9ea0",
|
|
chartreuse: "7fff00",
|
|
chocolate: "d2691e",
|
|
coral: "ff7f50",
|
|
cornflowerblue: "6495ed",
|
|
cornsilk: "fff8dc",
|
|
crimson: "dc143c",
|
|
cyan: "0ff",
|
|
darkblue: "00008b",
|
|
darkcyan: "008b8b",
|
|
darkgoldenrod: "b8860b",
|
|
darkgray: "a9a9a9",
|
|
darkgreen: "006400",
|
|
darkgrey: "a9a9a9",
|
|
darkkhaki: "bdb76b",
|
|
darkmagenta: "8b008b",
|
|
darkolivegreen: "556b2f",
|
|
darkorange: "ff8c00",
|
|
darkorchid: "9932cc",
|
|
darkred: "8b0000",
|
|
darksalmon: "e9967a",
|
|
darkseagreen: "8fbc8f",
|
|
darkslateblue: "483d8b",
|
|
darkslategray: "2f4f4f",
|
|
darkslategrey: "2f4f4f",
|
|
darkturquoise: "00ced1",
|
|
darkviolet: "9400d3",
|
|
deeppink: "ff1493",
|
|
deepskyblue: "00bfff",
|
|
dimgray: "696969",
|
|
dimgrey: "696969",
|
|
dodgerblue: "1e90ff",
|
|
firebrick: "b22222",
|
|
floralwhite: "fffaf0",
|
|
forestgreen: "228b22",
|
|
fuchsia: "f0f",
|
|
gainsboro: "dcdcdc",
|
|
ghostwhite: "f8f8ff",
|
|
gold: "ffd700",
|
|
goldenrod: "daa520",
|
|
gray: "808080",
|
|
green: "008000",
|
|
greenyellow: "adff2f",
|
|
grey: "808080",
|
|
honeydew: "f0fff0",
|
|
hotpink: "ff69b4",
|
|
indianred: "cd5c5c",
|
|
indigo: "4b0082",
|
|
ivory: "fffff0",
|
|
khaki: "f0e68c",
|
|
lavender: "e6e6fa",
|
|
lavenderblush: "fff0f5",
|
|
lawngreen: "7cfc00",
|
|
lemonchiffon: "fffacd",
|
|
lightblue: "add8e6",
|
|
lightcoral: "f08080",
|
|
lightcyan: "e0ffff",
|
|
lightgoldenrodyellow: "fafad2",
|
|
lightgray: "d3d3d3",
|
|
lightgreen: "90ee90",
|
|
lightgrey: "d3d3d3",
|
|
lightpink: "ffb6c1",
|
|
lightsalmon: "ffa07a",
|
|
lightseagreen: "20b2aa",
|
|
lightskyblue: "87cefa",
|
|
lightslategray: "789",
|
|
lightslategrey: "789",
|
|
lightsteelblue: "b0c4de",
|
|
lightyellow: "ffffe0",
|
|
lime: "0f0",
|
|
limegreen: "32cd32",
|
|
linen: "faf0e6",
|
|
magenta: "f0f",
|
|
maroon: "800000",
|
|
mediumaquamarine: "66cdaa",
|
|
mediumblue: "0000cd",
|
|
mediumorchid: "ba55d3",
|
|
mediumpurple: "9370db",
|
|
mediumseagreen: "3cb371",
|
|
mediumslateblue: "7b68ee",
|
|
mediumspringgreen: "00fa9a",
|
|
mediumturquoise: "48d1cc",
|
|
mediumvioletred: "c71585",
|
|
midnightblue: "191970",
|
|
mintcream: "f5fffa",
|
|
mistyrose: "ffe4e1",
|
|
moccasin: "ffe4b5",
|
|
navajowhite: "ffdead",
|
|
navy: "000080",
|
|
oldlace: "fdf5e6",
|
|
olive: "808000",
|
|
olivedrab: "6b8e23",
|
|
orange: "ffa500",
|
|
orangered: "ff4500",
|
|
orchid: "da70d6",
|
|
palegoldenrod: "eee8aa",
|
|
palegreen: "98fb98",
|
|
paleturquoise: "afeeee",
|
|
palevioletred: "db7093",
|
|
papayawhip: "ffefd5",
|
|
peachpuff: "ffdab9",
|
|
peru: "cd853f",
|
|
pink: "ffc0cb",
|
|
plum: "dda0dd",
|
|
powderblue: "b0e0e6",
|
|
purple: "800080",
|
|
rebeccapurple: "663399",
|
|
red: "f00",
|
|
rosybrown: "bc8f8f",
|
|
royalblue: "4169e1",
|
|
saddlebrown: "8b4513",
|
|
salmon: "fa8072",
|
|
sandybrown: "f4a460",
|
|
seagreen: "2e8b57",
|
|
seashell: "fff5ee",
|
|
sienna: "a0522d",
|
|
silver: "c0c0c0",
|
|
skyblue: "87ceeb",
|
|
slateblue: "6a5acd",
|
|
slategray: "708090",
|
|
slategrey: "708090",
|
|
snow: "fffafa",
|
|
springgreen: "00ff7f",
|
|
steelblue: "4682b4",
|
|
tan: "d2b48c",
|
|
teal: "008080",
|
|
thistle: "d8bfd8",
|
|
tomato: "ff6347",
|
|
turquoise: "40e0d0",
|
|
violet: "ee82ee",
|
|
wheat: "f5deb3",
|
|
white: "fff",
|
|
whitesmoke: "f5f5f5",
|
|
yellow: "ff0",
|
|
yellowgreen: "9acd32"
|
|
};
|
|
|
|
// Make it easy to access colors via `hexNames[hex]`
|
|
var hexNames = tinycolor.hexNames = flip(names);
|
|
|
|
|
|
// Utilities
|
|
// ---------
|
|
|
|
// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
|
|
function flip(o) {
|
|
var flipped = { };
|
|
for (var i in o) {
|
|
if (o.hasOwnProperty(i)) {
|
|
flipped[o[i]] = i;
|
|
}
|
|
}
|
|
return flipped;
|
|
}
|
|
|
|
// Return a valid alpha value [0,1] with all invalid values being set to 1
|
|
function boundAlpha(a) {
|
|
a = parseFloat(a);
|
|
|
|
if (isNaN(a) || a < 0 || a > 1) {
|
|
a = 1;
|
|
}
|
|
|
|
return a;
|
|
}
|
|
|
|
// Take input from [0, n] and return it as [0, 1]
|
|
function bound01(n, max) {
|
|
if (isOnePointZero(n)) { n = "100%"; }
|
|
|
|
var processPercent = isPercentage(n);
|
|
n = mathMin(max, mathMax(0, parseFloat(n)));
|
|
|
|
// Automatically convert percentage into number
|
|
if (processPercent) {
|
|
n = parseInt(n * max, 10) / 100;
|
|
}
|
|
|
|
// Handle floating point rounding errors
|
|
if ((Math.abs(n - max) < 0.000001)) {
|
|
return 1;
|
|
}
|
|
|
|
// Convert into [0, 1] range if it isn't already
|
|
return (n % max) / parseFloat(max);
|
|
}
|
|
|
|
// Force a number between 0 and 1
|
|
function clamp01(val) {
|
|
return mathMin(1, mathMax(0, val));
|
|
}
|
|
|
|
// Parse a base-16 hex value into a base-10 integer
|
|
function parseIntFromHex(val) {
|
|
return parseInt(val, 16);
|
|
}
|
|
|
|
// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
|
|
// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
|
|
function isOnePointZero(n) {
|
|
return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
|
|
}
|
|
|
|
// Check to see if string passed in is a percentage
|
|
function isPercentage(n) {
|
|
return typeof n === "string" && n.indexOf('%') != -1;
|
|
}
|
|
|
|
// Force a hex value to have 2 characters
|
|
function pad2(c) {
|
|
return c.length == 1 ? '0' + c : '' + c;
|
|
}
|
|
|
|
// Replace a decimal with it's percentage value
|
|
function convertToPercentage(n) {
|
|
if (n <= 1) {
|
|
n = (n * 100) + "%";
|
|
}
|
|
|
|
return n;
|
|
}
|
|
|
|
// Converts a decimal to a hex value
|
|
function convertDecimalToHex(d) {
|
|
return Math.round(parseFloat(d) * 255).toString(16);
|
|
}
|
|
// Converts a hex value to a decimal
|
|
function convertHexToDecimal(h) {
|
|
return (parseIntFromHex(h) / 255);
|
|
}
|
|
|
|
var matchers = (function() {
|
|
|
|
// <http://www.w3.org/TR/css3-values/#integers>
|
|
var CSS_INTEGER = "[-\\+]?\\d+%?";
|
|
|
|
// <http://www.w3.org/TR/css3-values/#number-value>
|
|
var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
|
|
|
|
// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
|
|
var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
|
|
|
|
// Actual matching.
|
|
// Parentheses and commas are optional, but not required.
|
|
// Whitespace can take the place of commas or opening paren
|
|
var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
|
|
var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
|
|
|
|
return {
|
|
CSS_UNIT: new RegExp(CSS_UNIT),
|
|
rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
|
|
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
|
|
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
|
|
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
|
|
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
|
|
hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
|
|
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
|
|
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
|
|
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
|
|
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
|
|
};
|
|
})();
|
|
|
|
// `isValidCSSUnit`
|
|
// Take in a single string / number and check to see if it looks like a CSS unit
|
|
// (see `matchers` above for definition).
|
|
function isValidCSSUnit(color) {
|
|
return !!matchers.CSS_UNIT.exec(color);
|
|
}
|
|
|
|
// `stringInputToObject`
|
|
// Permissive string parsing. Take in a number of formats, and output an object
|
|
// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
|
|
function stringInputToObject(color) {
|
|
|
|
color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase();
|
|
var named = false;
|
|
if (names[color]) {
|
|
color = names[color];
|
|
named = true;
|
|
}
|
|
else if (color == 'transparent') {
|
|
return { r: 0, g: 0, b: 0, a: 0, format: "name" };
|
|
}
|
|
|
|
// Try to match string input using regular expressions.
|
|
// Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
|
|
// Just return an object and let the conversion functions handle that.
|
|
// This way the result will be the same whether the tinycolor is initialized with string or object.
|
|
var match;
|
|
if ((match = matchers.rgb.exec(color))) {
|
|
return { r: match[1], g: match[2], b: match[3] };
|
|
}
|
|
if ((match = matchers.rgba.exec(color))) {
|
|
return { r: match[1], g: match[2], b: match[3], a: match[4] };
|
|
}
|
|
if ((match = matchers.hsl.exec(color))) {
|
|
return { h: match[1], s: match[2], l: match[3] };
|
|
}
|
|
if ((match = matchers.hsla.exec(color))) {
|
|
return { h: match[1], s: match[2], l: match[3], a: match[4] };
|
|
}
|
|
if ((match = matchers.hsv.exec(color))) {
|
|
return { h: match[1], s: match[2], v: match[3] };
|
|
}
|
|
if ((match = matchers.hsva.exec(color))) {
|
|
return { h: match[1], s: match[2], v: match[3], a: match[4] };
|
|
}
|
|
if ((match = matchers.hex8.exec(color))) {
|
|
return {
|
|
r: parseIntFromHex(match[1]),
|
|
g: parseIntFromHex(match[2]),
|
|
b: parseIntFromHex(match[3]),
|
|
a: convertHexToDecimal(match[4]),
|
|
format: named ? "name" : "hex8"
|
|
};
|
|
}
|
|
if ((match = matchers.hex6.exec(color))) {
|
|
return {
|
|
r: parseIntFromHex(match[1]),
|
|
g: parseIntFromHex(match[2]),
|
|
b: parseIntFromHex(match[3]),
|
|
format: named ? "name" : "hex"
|
|
};
|
|
}
|
|
if ((match = matchers.hex4.exec(color))) {
|
|
return {
|
|
r: parseIntFromHex(match[1] + '' + match[1]),
|
|
g: parseIntFromHex(match[2] + '' + match[2]),
|
|
b: parseIntFromHex(match[3] + '' + match[3]),
|
|
a: convertHexToDecimal(match[4] + '' + match[4]),
|
|
format: named ? "name" : "hex8"
|
|
};
|
|
}
|
|
if ((match = matchers.hex3.exec(color))) {
|
|
return {
|
|
r: parseIntFromHex(match[1] + '' + match[1]),
|
|
g: parseIntFromHex(match[2] + '' + match[2]),
|
|
b: parseIntFromHex(match[3] + '' + match[3]),
|
|
format: named ? "name" : "hex"
|
|
};
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function validateWCAG2Parms(parms) {
|
|
// return valid WCAG2 parms for isReadable.
|
|
// If input parms are invalid, return {"level":"AA", "size":"small"}
|
|
var level, size;
|
|
parms = parms || {"level":"AA", "size":"small"};
|
|
level = (parms.level || "AA").toUpperCase();
|
|
size = (parms.size || "small").toLowerCase();
|
|
if (level !== "AA" && level !== "AAA") {
|
|
level = "AA";
|
|
}
|
|
if (size !== "small" && size !== "large") {
|
|
size = "small";
|
|
}
|
|
return {"level":level, "size":size};
|
|
}
|
|
|
|
// Node: Export function
|
|
if (typeof module !== "undefined" && module.exports) {
|
|
module.exports = tinycolor;
|
|
}
|
|
// AMD/requirejs: Define the module
|
|
else if (typeof define === 'function' && define.amd) {
|
|
define(function () {return tinycolor;});
|
|
}
|
|
// Browser: Expose to window
|
|
else {
|
|
window.tinycolor = tinycolor;
|
|
}
|
|
|
|
})(Math);
|
|
|
|
},{}],21:[function(require,module,exports){
|
|
(function (global){
|
|
/*
|
|
* Toastr
|
|
* Copyright 2012-2015
|
|
* Authors: John Papa, Hans Fjällemark, and Tim Ferrell.
|
|
* All Rights Reserved.
|
|
* Use, reproduction, distribution, and modification of this code is subject to the terms and
|
|
* conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
|
|
*
|
|
* ARIA Support: Greta Krafsig
|
|
*
|
|
* Project: https://github.com/CodeSeven/toastr
|
|
*/
|
|
/* global define */
|
|
(function (define) {
|
|
define(['jquery'], function ($) {
|
|
return (function () {
|
|
var $container;
|
|
var listener;
|
|
var toastId = 0;
|
|
var toastType = {
|
|
error: 'error',
|
|
info: 'info',
|
|
success: 'success',
|
|
warning: 'warning'
|
|
};
|
|
|
|
var toastr = {
|
|
clear: clear,
|
|
remove: remove,
|
|
error: error,
|
|
getContainer: getContainer,
|
|
info: info,
|
|
options: {},
|
|
subscribe: subscribe,
|
|
success: success,
|
|
version: '2.1.4',
|
|
warning: warning
|
|
};
|
|
|
|
var previousToast;
|
|
|
|
return toastr;
|
|
|
|
////////////////
|
|
|
|
function error(message, title, optionsOverride) {
|
|
return notify({
|
|
type: toastType.error,
|
|
iconClass: getOptions().iconClasses.error,
|
|
message: message,
|
|
optionsOverride: optionsOverride,
|
|
title: title
|
|
});
|
|
}
|
|
|
|
function getContainer(options, create) {
|
|
if (!options) { options = getOptions(); }
|
|
$container = $('#' + options.containerId);
|
|
if ($container.length) {
|
|
return $container;
|
|
}
|
|
if (create) {
|
|
$container = createContainer(options);
|
|
}
|
|
return $container;
|
|
}
|
|
|
|
function info(message, title, optionsOverride) {
|
|
return notify({
|
|
type: toastType.info,
|
|
iconClass: getOptions().iconClasses.info,
|
|
message: message,
|
|
optionsOverride: optionsOverride,
|
|
title: title
|
|
});
|
|
}
|
|
|
|
function subscribe(callback) {
|
|
listener = callback;
|
|
}
|
|
|
|
function success(message, title, optionsOverride) {
|
|
return notify({
|
|
type: toastType.success,
|
|
iconClass: getOptions().iconClasses.success,
|
|
message: message,
|
|
optionsOverride: optionsOverride,
|
|
title: title
|
|
});
|
|
}
|
|
|
|
function warning(message, title, optionsOverride) {
|
|
return notify({
|
|
type: toastType.warning,
|
|
iconClass: getOptions().iconClasses.warning,
|
|
message: message,
|
|
optionsOverride: optionsOverride,
|
|
title: title
|
|
});
|
|
}
|
|
|
|
function clear($toastElement, clearOptions) {
|
|
var options = getOptions();
|
|
if (!$container) { getContainer(options); }
|
|
if (!clearToast($toastElement, options, clearOptions)) {
|
|
clearContainer(options);
|
|
}
|
|
}
|
|
|
|
function remove($toastElement) {
|
|
var options = getOptions();
|
|
if (!$container) { getContainer(options); }
|
|
if ($toastElement && $(':focus', $toastElement).length === 0) {
|
|
removeToast($toastElement);
|
|
return;
|
|
}
|
|
if ($container.children().length) {
|
|
$container.remove();
|
|
}
|
|
}
|
|
|
|
// internal functions
|
|
|
|
function clearContainer (options) {
|
|
var toastsToClear = $container.children();
|
|
for (var i = toastsToClear.length - 1; i >= 0; i--) {
|
|
clearToast($(toastsToClear[i]), options);
|
|
}
|
|
}
|
|
|
|
function clearToast ($toastElement, options, clearOptions) {
|
|
var force = clearOptions && clearOptions.force ? clearOptions.force : false;
|
|
if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {
|
|
$toastElement[options.hideMethod]({
|
|
duration: options.hideDuration,
|
|
easing: options.hideEasing,
|
|
complete: function () { removeToast($toastElement); }
|
|
});
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function createContainer(options) {
|
|
$container = $('<div/>')
|
|
.attr('id', options.containerId)
|
|
.addClass(options.positionClass);
|
|
|
|
$container.appendTo($(options.target));
|
|
return $container;
|
|
}
|
|
|
|
function getDefaults() {
|
|
return {
|
|
tapToDismiss: true,
|
|
toastClass: 'toast',
|
|
containerId: 'toast-container',
|
|
debug: false,
|
|
|
|
showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery
|
|
showDuration: 300,
|
|
showEasing: 'swing', //swing and linear are built into jQuery
|
|
onShown: undefined,
|
|
hideMethod: 'fadeOut',
|
|
hideDuration: 1000,
|
|
hideEasing: 'swing',
|
|
onHidden: undefined,
|
|
closeMethod: false,
|
|
closeDuration: false,
|
|
closeEasing: false,
|
|
closeOnHover: true,
|
|
|
|
extendedTimeOut: 1000,
|
|
iconClasses: {
|
|
error: 'toast-error',
|
|
info: 'toast-info',
|
|
success: 'toast-success',
|
|
warning: 'toast-warning'
|
|
},
|
|
iconClass: 'toast-info',
|
|
positionClass: 'toast-top-right',
|
|
timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky
|
|
titleClass: 'toast-title',
|
|
messageClass: 'toast-message',
|
|
escapeHtml: false,
|
|
target: 'body',
|
|
closeHtml: '<button type="button">×</button>',
|
|
closeClass: 'toast-close-button',
|
|
newestOnTop: true,
|
|
preventDuplicates: false,
|
|
progressBar: false,
|
|
progressClass: 'toast-progress',
|
|
rtl: false
|
|
};
|
|
}
|
|
|
|
function publish(args) {
|
|
if (!listener) { return; }
|
|
listener(args);
|
|
}
|
|
|
|
function notify(map) {
|
|
var options = getOptions();
|
|
var iconClass = map.iconClass || options.iconClass;
|
|
|
|
if (typeof (map.optionsOverride) !== 'undefined') {
|
|
options = $.extend(options, map.optionsOverride);
|
|
iconClass = map.optionsOverride.iconClass || iconClass;
|
|
}
|
|
|
|
if (shouldExit(options, map)) { return; }
|
|
|
|
toastId++;
|
|
|
|
$container = getContainer(options, true);
|
|
|
|
var intervalId = null;
|
|
var $toastElement = $('<div/>');
|
|
var $titleElement = $('<div/>');
|
|
var $messageElement = $('<div/>');
|
|
var $progressElement = $('<div/>');
|
|
var $closeElement = $(options.closeHtml);
|
|
var progressBar = {
|
|
intervalId: null,
|
|
hideEta: null,
|
|
maxHideTime: null
|
|
};
|
|
var response = {
|
|
toastId: toastId,
|
|
state: 'visible',
|
|
startTime: new Date(),
|
|
options: options,
|
|
map: map
|
|
};
|
|
|
|
personalizeToast();
|
|
|
|
displayToast();
|
|
|
|
handleEvents();
|
|
|
|
publish(response);
|
|
|
|
if (options.debug && console) {
|
|
console.log(response);
|
|
}
|
|
|
|
return $toastElement;
|
|
|
|
function escapeHtml(source) {
|
|
if (source == null) {
|
|
source = '';
|
|
}
|
|
|
|
return source
|
|
.replace(/&/g, '&')
|
|
.replace(/"/g, '"')
|
|
.replace(/'/g, ''')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>');
|
|
}
|
|
|
|
function personalizeToast() {
|
|
setIcon();
|
|
setTitle();
|
|
setMessage();
|
|
setCloseButton();
|
|
setProgressBar();
|
|
setRTL();
|
|
setSequence();
|
|
setAria();
|
|
}
|
|
|
|
function setAria() {
|
|
var ariaValue = '';
|
|
switch (map.iconClass) {
|
|
case 'toast-success':
|
|
case 'toast-info':
|
|
ariaValue = 'polite';
|
|
break;
|
|
default:
|
|
ariaValue = 'assertive';
|
|
}
|
|
$toastElement.attr('aria-live', ariaValue);
|
|
}
|
|
|
|
function handleEvents() {
|
|
if (options.closeOnHover) {
|
|
$toastElement.hover(stickAround, delayedHideToast);
|
|
}
|
|
|
|
if (!options.onclick && options.tapToDismiss) {
|
|
$toastElement.click(hideToast);
|
|
}
|
|
|
|
if (options.closeButton && $closeElement) {
|
|
$closeElement.click(function (event) {
|
|
if (event.stopPropagation) {
|
|
event.stopPropagation();
|
|
} else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {
|
|
event.cancelBubble = true;
|
|
}
|
|
|
|
if (options.onCloseClick) {
|
|
options.onCloseClick(event);
|
|
}
|
|
|
|
hideToast(true);
|
|
});
|
|
}
|
|
|
|
if (options.onclick) {
|
|
$toastElement.click(function (event) {
|
|
options.onclick(event);
|
|
hideToast();
|
|
});
|
|
}
|
|
}
|
|
|
|
function displayToast() {
|
|
$toastElement.hide();
|
|
|
|
$toastElement[options.showMethod](
|
|
{duration: options.showDuration, easing: options.showEasing, complete: options.onShown}
|
|
);
|
|
|
|
if (options.timeOut > 0) {
|
|
intervalId = setTimeout(hideToast, options.timeOut);
|
|
progressBar.maxHideTime = parseFloat(options.timeOut);
|
|
progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;
|
|
if (options.progressBar) {
|
|
progressBar.intervalId = setInterval(updateProgress, 10);
|
|
}
|
|
}
|
|
}
|
|
|
|
function setIcon() {
|
|
if (map.iconClass) {
|
|
$toastElement.addClass(options.toastClass).addClass(iconClass);
|
|
}
|
|
}
|
|
|
|
function setSequence() {
|
|
if (options.newestOnTop) {
|
|
$container.prepend($toastElement);
|
|
} else {
|
|
$container.append($toastElement);
|
|
}
|
|
}
|
|
|
|
function setTitle() {
|
|
if (map.title) {
|
|
var suffix = map.title;
|
|
if (options.escapeHtml) {
|
|
suffix = escapeHtml(map.title);
|
|
}
|
|
$titleElement.append(suffix).addClass(options.titleClass);
|
|
$toastElement.append($titleElement);
|
|
}
|
|
}
|
|
|
|
function setMessage() {
|
|
if (map.message) {
|
|
var suffix = map.message;
|
|
if (options.escapeHtml) {
|
|
suffix = escapeHtml(map.message);
|
|
}
|
|
$messageElement.append(suffix).addClass(options.messageClass);
|
|
$toastElement.append($messageElement);
|
|
}
|
|
}
|
|
|
|
function setCloseButton() {
|
|
if (options.closeButton) {
|
|
$closeElement.addClass(options.closeClass).attr('role', 'button');
|
|
$toastElement.prepend($closeElement);
|
|
}
|
|
}
|
|
|
|
function setProgressBar() {
|
|
if (options.progressBar) {
|
|
$progressElement.addClass(options.progressClass);
|
|
$toastElement.prepend($progressElement);
|
|
}
|
|
}
|
|
|
|
function setRTL() {
|
|
if (options.rtl) {
|
|
$toastElement.addClass('rtl');
|
|
}
|
|
}
|
|
|
|
function shouldExit(options, map) {
|
|
if (options.preventDuplicates) {
|
|
if (map.message === previousToast) {
|
|
return true;
|
|
} else {
|
|
previousToast = map.message;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function hideToast(override) {
|
|
var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;
|
|
var duration = override && options.closeDuration !== false ?
|
|
options.closeDuration : options.hideDuration;
|
|
var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;
|
|
if ($(':focus', $toastElement).length && !override) {
|
|
return;
|
|
}
|
|
clearTimeout(progressBar.intervalId);
|
|
return $toastElement[method]({
|
|
duration: duration,
|
|
easing: easing,
|
|
complete: function () {
|
|
removeToast($toastElement);
|
|
clearTimeout(intervalId);
|
|
if (options.onHidden && response.state !== 'hidden') {
|
|
options.onHidden();
|
|
}
|
|
response.state = 'hidden';
|
|
response.endTime = new Date();
|
|
publish(response);
|
|
}
|
|
});
|
|
}
|
|
|
|
function delayedHideToast() {
|
|
if (options.timeOut > 0 || options.extendedTimeOut > 0) {
|
|
intervalId = setTimeout(hideToast, options.extendedTimeOut);
|
|
progressBar.maxHideTime = parseFloat(options.extendedTimeOut);
|
|
progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;
|
|
}
|
|
}
|
|
|
|
function stickAround() {
|
|
clearTimeout(intervalId);
|
|
progressBar.hideEta = 0;
|
|
$toastElement.stop(true, true)[options.showMethod](
|
|
{duration: options.showDuration, easing: options.showEasing}
|
|
);
|
|
}
|
|
|
|
function updateProgress() {
|
|
var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;
|
|
$progressElement.width(percentage + '%');
|
|
}
|
|
}
|
|
|
|
function getOptions() {
|
|
return $.extend({}, getDefaults(), toastr.options);
|
|
}
|
|
|
|
function removeToast($toastElement) {
|
|
if (!$container) { $container = getContainer(); }
|
|
if ($toastElement.is(':visible')) {
|
|
return;
|
|
}
|
|
$toastElement.remove();
|
|
$toastElement = null;
|
|
if ($container.children().length === 0) {
|
|
$container.remove();
|
|
previousToast = undefined;
|
|
}
|
|
}
|
|
|
|
})();
|
|
});
|
|
}(typeof define === 'function' && define.amd ? define : function (deps, factory) {
|
|
if (typeof module !== 'undefined' && module.exports) { //Node
|
|
module.exports = factory((typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null));
|
|
} else {
|
|
window.toastr = factory(window.jQuery);
|
|
}
|
|
}));
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],22:[function(require,module,exports){
|
|
if (typeof Object.create === 'function') {
|
|
// implementation from standard node.js 'util' module
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
ctor.super_ = superCtor
|
|
ctor.prototype = Object.create(superCtor.prototype, {
|
|
constructor: {
|
|
value: ctor,
|
|
enumerable: false,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
});
|
|
};
|
|
} else {
|
|
// old school shim for old browsers
|
|
module.exports = function inherits(ctor, superCtor) {
|
|
ctor.super_ = superCtor
|
|
var TempCtor = function () {}
|
|
TempCtor.prototype = superCtor.prototype
|
|
ctor.prototype = new TempCtor()
|
|
ctor.prototype.constructor = ctor
|
|
}
|
|
}
|
|
|
|
},{}],23:[function(require,module,exports){
|
|
module.exports = function isBuffer(arg) {
|
|
return arg && typeof arg === 'object'
|
|
&& typeof arg.copy === 'function'
|
|
&& typeof arg.fill === 'function'
|
|
&& typeof arg.readUInt8 === 'function';
|
|
}
|
|
},{}],24:[function(require,module,exports){
|
|
(function (process,global){
|
|
// Copyright Joyent, Inc. and other Node contributors.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
var formatRegExp = /%[sdj%]/g;
|
|
exports.format = function(f) {
|
|
if (!isString(f)) {
|
|
var objects = [];
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
objects.push(inspect(arguments[i]));
|
|
}
|
|
return objects.join(' ');
|
|
}
|
|
|
|
var i = 1;
|
|
var args = arguments;
|
|
var len = args.length;
|
|
var str = String(f).replace(formatRegExp, function(x) {
|
|
if (x === '%%') return '%';
|
|
if (i >= len) return x;
|
|
switch (x) {
|
|
case '%s': return String(args[i++]);
|
|
case '%d': return Number(args[i++]);
|
|
case '%j':
|
|
try {
|
|
return JSON.stringify(args[i++]);
|
|
} catch (_) {
|
|
return '[Circular]';
|
|
}
|
|
default:
|
|
return x;
|
|
}
|
|
});
|
|
for (var x = args[i]; i < len; x = args[++i]) {
|
|
if (isNull(x) || !isObject(x)) {
|
|
str += ' ' + x;
|
|
} else {
|
|
str += ' ' + inspect(x);
|
|
}
|
|
}
|
|
return str;
|
|
};
|
|
|
|
|
|
// Mark that a method should not be used.
|
|
// Returns a modified function which warns once by default.
|
|
// If --no-deprecation is set, then it is a no-op.
|
|
exports.deprecate = function(fn, msg) {
|
|
// Allow for deprecating things in the process of starting up.
|
|
if (isUndefined(global.process)) {
|
|
return function() {
|
|
return exports.deprecate(fn, msg).apply(this, arguments);
|
|
};
|
|
}
|
|
|
|
if (process.noDeprecation === true) {
|
|
return fn;
|
|
}
|
|
|
|
var warned = false;
|
|
function deprecated() {
|
|
if (!warned) {
|
|
if (process.throwDeprecation) {
|
|
throw new Error(msg);
|
|
} else if (process.traceDeprecation) {
|
|
console.trace(msg);
|
|
} else {
|
|
console.error(msg);
|
|
}
|
|
warned = true;
|
|
}
|
|
return fn.apply(this, arguments);
|
|
}
|
|
|
|
return deprecated;
|
|
};
|
|
|
|
|
|
var debugs = {};
|
|
var debugEnviron;
|
|
exports.debuglog = function(set) {
|
|
if (isUndefined(debugEnviron))
|
|
debugEnviron = process.env.NODE_DEBUG || '';
|
|
set = set.toUpperCase();
|
|
if (!debugs[set]) {
|
|
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
|
var pid = process.pid;
|
|
debugs[set] = function() {
|
|
var msg = exports.format.apply(exports, arguments);
|
|
console.error('%s %d: %s', set, pid, msg);
|
|
};
|
|
} else {
|
|
debugs[set] = function() {};
|
|
}
|
|
}
|
|
return debugs[set];
|
|
};
|
|
|
|
|
|
/**
|
|
* Echos the value of a value. Trys to print the value out
|
|
* in the best way possible given the different types.
|
|
*
|
|
* @param {Object} obj The object to print out.
|
|
* @param {Object} opts Optional options object that alters the output.
|
|
*/
|
|
/* legacy: obj, showHidden, depth, colors*/
|
|
function inspect(obj, opts) {
|
|
// default options
|
|
var ctx = {
|
|
seen: [],
|
|
stylize: stylizeNoColor
|
|
};
|
|
// legacy...
|
|
if (arguments.length >= 3) ctx.depth = arguments[2];
|
|
if (arguments.length >= 4) ctx.colors = arguments[3];
|
|
if (isBoolean(opts)) {
|
|
// legacy...
|
|
ctx.showHidden = opts;
|
|
} else if (opts) {
|
|
// got an "options" object
|
|
exports._extend(ctx, opts);
|
|
}
|
|
// set default options
|
|
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
|
if (isUndefined(ctx.depth)) ctx.depth = 2;
|
|
if (isUndefined(ctx.colors)) ctx.colors = false;
|
|
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
|
if (ctx.colors) ctx.stylize = stylizeWithColor;
|
|
return formatValue(ctx, obj, ctx.depth);
|
|
}
|
|
exports.inspect = inspect;
|
|
|
|
|
|
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
|
inspect.colors = {
|
|
'bold' : [1, 22],
|
|
'italic' : [3, 23],
|
|
'underline' : [4, 24],
|
|
'inverse' : [7, 27],
|
|
'white' : [37, 39],
|
|
'grey' : [90, 39],
|
|
'black' : [30, 39],
|
|
'blue' : [34, 39],
|
|
'cyan' : [36, 39],
|
|
'green' : [32, 39],
|
|
'magenta' : [35, 39],
|
|
'red' : [31, 39],
|
|
'yellow' : [33, 39]
|
|
};
|
|
|
|
// Don't use 'blue' not visible on cmd.exe
|
|
inspect.styles = {
|
|
'special': 'cyan',
|
|
'number': 'yellow',
|
|
'boolean': 'yellow',
|
|
'undefined': 'grey',
|
|
'null': 'bold',
|
|
'string': 'green',
|
|
'date': 'magenta',
|
|
// "name": intentionally not styling
|
|
'regexp': 'red'
|
|
};
|
|
|
|
|
|
function stylizeWithColor(str, styleType) {
|
|
var style = inspect.styles[styleType];
|
|
|
|
if (style) {
|
|
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
|
'\u001b[' + inspect.colors[style][1] + 'm';
|
|
} else {
|
|
return str;
|
|
}
|
|
}
|
|
|
|
|
|
function stylizeNoColor(str, styleType) {
|
|
return str;
|
|
}
|
|
|
|
|
|
function arrayToHash(array) {
|
|
var hash = {};
|
|
|
|
array.forEach(function(val, idx) {
|
|
hash[val] = true;
|
|
});
|
|
|
|
return hash;
|
|
}
|
|
|
|
|
|
function formatValue(ctx, value, recurseTimes) {
|
|
// Provide a hook for user-specified inspect functions.
|
|
// Check that value is an object with an inspect function on it
|
|
if (ctx.customInspect &&
|
|
value &&
|
|
isFunction(value.inspect) &&
|
|
// Filter out the util module, it's inspect function is special
|
|
value.inspect !== exports.inspect &&
|
|
// Also filter out any prototype objects using the circular check.
|
|
!(value.constructor && value.constructor.prototype === value)) {
|
|
var ret = value.inspect(recurseTimes, ctx);
|
|
if (!isString(ret)) {
|
|
ret = formatValue(ctx, ret, recurseTimes);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// Primitive types cannot have properties
|
|
var primitive = formatPrimitive(ctx, value);
|
|
if (primitive) {
|
|
return primitive;
|
|
}
|
|
|
|
// Look up the keys of the object.
|
|
var keys = Object.keys(value);
|
|
var visibleKeys = arrayToHash(keys);
|
|
|
|
if (ctx.showHidden) {
|
|
keys = Object.getOwnPropertyNames(value);
|
|
}
|
|
|
|
// IE doesn't make error fields non-enumerable
|
|
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
|
|
if (isError(value)
|
|
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
|
return formatError(value);
|
|
}
|
|
|
|
// Some type of object without properties can be shortcutted.
|
|
if (keys.length === 0) {
|
|
if (isFunction(value)) {
|
|
var name = value.name ? ': ' + value.name : '';
|
|
return ctx.stylize('[Function' + name + ']', 'special');
|
|
}
|
|
if (isRegExp(value)) {
|
|
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
|
}
|
|
if (isDate(value)) {
|
|
return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
|
}
|
|
if (isError(value)) {
|
|
return formatError(value);
|
|
}
|
|
}
|
|
|
|
var base = '', array = false, braces = ['{', '}'];
|
|
|
|
// Make Array say that they are Array
|
|
if (isArray(value)) {
|
|
array = true;
|
|
braces = ['[', ']'];
|
|
}
|
|
|
|
// Make functions say that they are functions
|
|
if (isFunction(value)) {
|
|
var n = value.name ? ': ' + value.name : '';
|
|
base = ' [Function' + n + ']';
|
|
}
|
|
|
|
// Make RegExps say that they are RegExps
|
|
if (isRegExp(value)) {
|
|
base = ' ' + RegExp.prototype.toString.call(value);
|
|
}
|
|
|
|
// Make dates with properties first say the date
|
|
if (isDate(value)) {
|
|
base = ' ' + Date.prototype.toUTCString.call(value);
|
|
}
|
|
|
|
// Make error with message first say the error
|
|
if (isError(value)) {
|
|
base = ' ' + formatError(value);
|
|
}
|
|
|
|
if (keys.length === 0 && (!array || value.length == 0)) {
|
|
return braces[0] + base + braces[1];
|
|
}
|
|
|
|
if (recurseTimes < 0) {
|
|
if (isRegExp(value)) {
|
|
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
|
} else {
|
|
return ctx.stylize('[Object]', 'special');
|
|
}
|
|
}
|
|
|
|
ctx.seen.push(value);
|
|
|
|
var output;
|
|
if (array) {
|
|
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
|
} else {
|
|
output = keys.map(function(key) {
|
|
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
|
});
|
|
}
|
|
|
|
ctx.seen.pop();
|
|
|
|
return reduceToSingleString(output, base, braces);
|
|
}
|
|
|
|
|
|
function formatPrimitive(ctx, value) {
|
|
if (isUndefined(value))
|
|
return ctx.stylize('undefined', 'undefined');
|
|
if (isString(value)) {
|
|
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
|
.replace(/'/g, "\\'")
|
|
.replace(/\\"/g, '"') + '\'';
|
|
return ctx.stylize(simple, 'string');
|
|
}
|
|
if (isNumber(value))
|
|
return ctx.stylize('' + value, 'number');
|
|
if (isBoolean(value))
|
|
return ctx.stylize('' + value, 'boolean');
|
|
// For some reason typeof null is "object", so special case here.
|
|
if (isNull(value))
|
|
return ctx.stylize('null', 'null');
|
|
}
|
|
|
|
|
|
function formatError(value) {
|
|
return '[' + Error.prototype.toString.call(value) + ']';
|
|
}
|
|
|
|
|
|
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
|
var output = [];
|
|
for (var i = 0, l = value.length; i < l; ++i) {
|
|
if (hasOwnProperty(value, String(i))) {
|
|
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
|
String(i), true));
|
|
} else {
|
|
output.push('');
|
|
}
|
|
}
|
|
keys.forEach(function(key) {
|
|
if (!key.match(/^\d+$/)) {
|
|
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
|
key, true));
|
|
}
|
|
});
|
|
return output;
|
|
}
|
|
|
|
|
|
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
|
var name, str, desc;
|
|
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
|
if (desc.get) {
|
|
if (desc.set) {
|
|
str = ctx.stylize('[Getter/Setter]', 'special');
|
|
} else {
|
|
str = ctx.stylize('[Getter]', 'special');
|
|
}
|
|
} else {
|
|
if (desc.set) {
|
|
str = ctx.stylize('[Setter]', 'special');
|
|
}
|
|
}
|
|
if (!hasOwnProperty(visibleKeys, key)) {
|
|
name = '[' + key + ']';
|
|
}
|
|
if (!str) {
|
|
if (ctx.seen.indexOf(desc.value) < 0) {
|
|
if (isNull(recurseTimes)) {
|
|
str = formatValue(ctx, desc.value, null);
|
|
} else {
|
|
str = formatValue(ctx, desc.value, recurseTimes - 1);
|
|
}
|
|
if (str.indexOf('\n') > -1) {
|
|
if (array) {
|
|
str = str.split('\n').map(function(line) {
|
|
return ' ' + line;
|
|
}).join('\n').substr(2);
|
|
} else {
|
|
str = '\n' + str.split('\n').map(function(line) {
|
|
return ' ' + line;
|
|
}).join('\n');
|
|
}
|
|
}
|
|
} else {
|
|
str = ctx.stylize('[Circular]', 'special');
|
|
}
|
|
}
|
|
if (isUndefined(name)) {
|
|
if (array && key.match(/^\d+$/)) {
|
|
return str;
|
|
}
|
|
name = JSON.stringify('' + key);
|
|
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
|
name = name.substr(1, name.length - 2);
|
|
name = ctx.stylize(name, 'name');
|
|
} else {
|
|
name = name.replace(/'/g, "\\'")
|
|
.replace(/\\"/g, '"')
|
|
.replace(/(^"|"$)/g, "'");
|
|
name = ctx.stylize(name, 'string');
|
|
}
|
|
}
|
|
|
|
return name + ': ' + str;
|
|
}
|
|
|
|
|
|
function reduceToSingleString(output, base, braces) {
|
|
var numLinesEst = 0;
|
|
var length = output.reduce(function(prev, cur) {
|
|
numLinesEst++;
|
|
if (cur.indexOf('\n') >= 0) numLinesEst++;
|
|
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
|
}, 0);
|
|
|
|
if (length > 60) {
|
|
return braces[0] +
|
|
(base === '' ? '' : base + '\n ') +
|
|
' ' +
|
|
output.join(',\n ') +
|
|
' ' +
|
|
braces[1];
|
|
}
|
|
|
|
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
|
}
|
|
|
|
|
|
// NOTE: These type checking functions intentionally don't use `instanceof`
|
|
// because it is fragile and can be easily faked with `Object.create()`.
|
|
function isArray(ar) {
|
|
return Array.isArray(ar);
|
|
}
|
|
exports.isArray = isArray;
|
|
|
|
function isBoolean(arg) {
|
|
return typeof arg === 'boolean';
|
|
}
|
|
exports.isBoolean = isBoolean;
|
|
|
|
function isNull(arg) {
|
|
return arg === null;
|
|
}
|
|
exports.isNull = isNull;
|
|
|
|
function isNullOrUndefined(arg) {
|
|
return arg == null;
|
|
}
|
|
exports.isNullOrUndefined = isNullOrUndefined;
|
|
|
|
function isNumber(arg) {
|
|
return typeof arg === 'number';
|
|
}
|
|
exports.isNumber = isNumber;
|
|
|
|
function isString(arg) {
|
|
return typeof arg === 'string';
|
|
}
|
|
exports.isString = isString;
|
|
|
|
function isSymbol(arg) {
|
|
return typeof arg === 'symbol';
|
|
}
|
|
exports.isSymbol = isSymbol;
|
|
|
|
function isUndefined(arg) {
|
|
return arg === void 0;
|
|
}
|
|
exports.isUndefined = isUndefined;
|
|
|
|
function isRegExp(re) {
|
|
return isObject(re) && objectToString(re) === '[object RegExp]';
|
|
}
|
|
exports.isRegExp = isRegExp;
|
|
|
|
function isObject(arg) {
|
|
return typeof arg === 'object' && arg !== null;
|
|
}
|
|
exports.isObject = isObject;
|
|
|
|
function isDate(d) {
|
|
return isObject(d) && objectToString(d) === '[object Date]';
|
|
}
|
|
exports.isDate = isDate;
|
|
|
|
function isError(e) {
|
|
return isObject(e) &&
|
|
(objectToString(e) === '[object Error]' || e instanceof Error);
|
|
}
|
|
exports.isError = isError;
|
|
|
|
function isFunction(arg) {
|
|
return typeof arg === 'function';
|
|
}
|
|
exports.isFunction = isFunction;
|
|
|
|
function isPrimitive(arg) {
|
|
return arg === null ||
|
|
typeof arg === 'boolean' ||
|
|
typeof arg === 'number' ||
|
|
typeof arg === 'string' ||
|
|
typeof arg === 'symbol' || // ES6 symbol
|
|
typeof arg === 'undefined';
|
|
}
|
|
exports.isPrimitive = isPrimitive;
|
|
|
|
exports.isBuffer = require('./support/isBuffer');
|
|
|
|
function objectToString(o) {
|
|
return Object.prototype.toString.call(o);
|
|
}
|
|
|
|
|
|
function pad(n) {
|
|
return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
|
}
|
|
|
|
|
|
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
|
'Oct', 'Nov', 'Dec'];
|
|
|
|
// 26 Feb 16:19:34
|
|
function timestamp() {
|
|
var d = new Date();
|
|
var time = [pad(d.getHours()),
|
|
pad(d.getMinutes()),
|
|
pad(d.getSeconds())].join(':');
|
|
return [d.getDate(), months[d.getMonth()], time].join(' ');
|
|
}
|
|
|
|
|
|
// log is just a thin wrapper to console.log that prepends a timestamp
|
|
exports.log = function() {
|
|
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
|
};
|
|
|
|
|
|
/**
|
|
* Inherit the prototype methods from one constructor into another.
|
|
*
|
|
* The Function.prototype.inherits from lang.js rewritten as a standalone
|
|
* function (not on Function.prototype). NOTE: If this file is to be loaded
|
|
* during bootstrapping this function needs to be rewritten using some native
|
|
* functions as prototype setup using normal JavaScript does not work as
|
|
* expected during bootstrapping (see mirror.js in r114903).
|
|
*
|
|
* @param {function} ctor Constructor function which needs to inherit the
|
|
* prototype.
|
|
* @param {function} superCtor Constructor function to inherit prototype from.
|
|
*/
|
|
exports.inherits = require('inherits');
|
|
|
|
exports._extend = function(origin, add) {
|
|
// Don't do anything if add isn't an object
|
|
if (!add || !isObject(add)) return origin;
|
|
|
|
var keys = Object.keys(add);
|
|
var i = keys.length;
|
|
while (i--) {
|
|
origin[keys[i]] = add[keys[i]];
|
|
}
|
|
return origin;
|
|
};
|
|
|
|
function hasOwnProperty(obj, prop) {
|
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
}
|
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./support/isBuffer":23,"_process":18,"inherits":22}],25:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var templateLoader=require("./template-loader.js"),console=require('console-browserify'),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null);require("./ko-bindings.js");var performanceAwareCaller=require("./timed-call.js").timedCall,addUndoStackExtensionMaker=require("./undomanager/undomain.js"),colorPlugin=require("./ext/color.js"),utilPlugin=require("./ext/util.js"),inlinerPlugin=require("./ext/inliner.js"),localStorageLoader=require("./ext/localstorage.js");if(void 0===ko)throw"Cannot find knockout.js library!";if(void 0===$)throw"Cannot find jquery library!";function _canonicalize(e){var i=global.document.createElement("div");return i.innerHTML="<a></a>",i.firstChild.href=e,i.innerHTML=i.innerHTML,i.firstChild.href}function _appendUrlParameters(e,i){var a=-1==e.indexOf("?")?"?":"&",t=e;for(var n in i)i.hasOwnProperty(n)&&(t+=a+n+"="+encodeURIComponent(i[n]),a="&");return t}var applyBindingOptions=function(e,i){i.bindingHandlers.wysiwygSrc.convertedUrl=function(i,a,t,n){var r=e.imgProcessorBackend?e.imgProcessorBackend:"./upload",o=r.match(/^(https?:\/\/[^\/]*\/).*$/),l=i.match(/^(https?:\/\/[^\/]*\/).*$/);if(null===o||null!==l&&o[1]==l[1])return-1==r.indexOf("?")?"?":"&",_appendUrlParameters(r,{src:i,method:a,params:t+","+n});console.log("Cannot apply backend image resizing to non-local resources ",i,a,t,n,o,l);var s={method:a,width:t};return null!==n&&(s.height=n),_appendUrlParameters(i,s)},i.bindingHandlers.wysiwygSrc.placeholderUrl=function(i,a,t){return _appendUrlParameters(e.imgProcessorBackend?e.imgProcessorBackend:"./upload",{method:"placeholder",params:i+","+a})},e&&e.tinymceConfig&&(i.bindingHandlers.wysiwyg.standardOptions=e.tinymceConfig),e&&e.tinymceConfigFull&&(i.bindingHandlers.wysiwyg.fullOptions=e.tinymceConfigFull)},start=function(e,i,a,t,n){templateLoader.fixPageEvents();var r=[function(i){e&&e.strings&&(i.t=function(a,t){var n=e.strings[a];return void 0===n&&(console.warn("Missing translation string for",a,": using default string"),n=a),i.tt(n,t)})},addUndoStackExtensionMaker(performanceAwareCaller),colorPlugin,utilPlugin,inlinerPlugin];if(void 0!==n)for(var o=0;o<n.length;o++)r.push(n[o]);r.push(function(i){var a={messages:{unknownError:i.t("Unknown error"),uploadedBytes:i.t("Uploaded bytes exceed file size"),maxNumberOfFiles:i.t("Maximum number of files exceeded"),acceptFileTypes:i.t("File type not allowed"),maxFileSize:i.t("File is too large"),minFileSize:i.t("File is too small"),post_max_size:i.t("The uploaded file exceeds the post_max_size directive in php.ini"),max_file_size:i.t("File is too big"),min_file_size:i.t("File is too small"),accept_file_types:i.t("Filetype not allowed"),max_number_of_files:i.t("Maximum number of files exceeded"),max_width:i.t("Image exceeds maximum width"),min_width:i.t("Image requires a minimum width"),max_height:i.t("Image exceeds maximum height"),min_height:i.t("Image requires a minimum height"),abort:i.t("File upload aborted"),image_resize:i.t("Failed to resize image"),generic:i.t("Unexpected upload error")}};e&&e.fileuploadConfig&&(a=$.extend(!0,a,e.fileuploadConfig)),ko.bindingHandlers.fileupload.extendOptions=a});var l=e.fileuploadConfig?e.fileuploadConfig.url:"/upload/";applyBindingOptions(e,ko),$("\x3c!-- ko template: 'main' --\x3e\x3c!-- /ko --\x3e").appendTo(global.document.body),void 0===i&&void 0!==a&&(i=a.template),templateLoader.load(performanceAwareCaller,i,a,t,r,l)},initFromLocalStorage=function(e,i,a){try{var t=localStorageLoader(i,e.emailProcessorBackend),n=void 0!==a?a:[];n.push(t.extension);var r=_canonicalize(t.metadata.template);start(e,r,t.metadata,t.model,n)}catch(e){console.error("TODO not found ",i,e)}},init=function(e,i){var a=global.location.hash?global.location.href.split("#")[1]:void 0;if(e&&(e.template||e.data))if(e.data){var t=JSON.parse(e.data);start(e,void 0,t.metadata,t.content,i)}else start(e,e.template,void 0,void 0,i);else if(a&&7==a.length)initFromLocalStorage(e,a,i);else{if(!a)return!1;start(e,_canonicalize(a),void 0,void 0,i)}return!0};module.exports={isCompatible:templateLoader.isCompatible,init:init,start:start};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./ext/color.js":57,"./ext/inliner.js":58,"./ext/localstorage.js":59,"./ext/util.js":60,"./ko-bindings.js":61,"./template-loader.js":62,"./timed-call.js":63,"./undomanager/undomain.js":64,"console-browserify":3}],26:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify'),addScriptTemplate=function(t,e,n){var o=t.createElement("script");return o.setAttribute("type","text/html"),o.setAttribute("id",e),o.text=n,t.body.appendChild(o),o};ko.bindingHandlers.bindIframe={tpl:'<!DOCTYPE html>\r\n<html>\r\n<head>\r\n</head>\r\n<body><div data-bind="block: content"></div></body>\r\n</html>\r\n',init:function(t,e){!function(n){try{var o=t.contentDocument;o.open(),o.write(ko.bindingHandlers.bindIframe.tpl),o.close();try{var r=o.body;if(r){for(var i=t.contentWindow.parent.document.getElementsByTagName("script"),a=0;a<i.length;a++)"text/html"==i[a].getAttribute("type")&&i[a].getAttribute("id")&&addScriptTemplate(o,i[a].getAttribute("id"),i[a].innerHTML);var d=o.getElementsByTagName("HTML");ko.utils.domNodeDisposal.addDisposeCallback(t,function(){ko.cleanNode(d[0]||r)}),ko.applyBindings(e(),d[0]||r)}else console.log("no iframedoc",n)}catch(t){throw console.log("error reading iframe.body",t,n),t}}catch(t){throw console.log("error reading iframe contentDocument",t,n),t}}("first call")}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],27:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');ko.bindingHandlers.withProperties={init:function(e,n,o,t,l){var a=l.createChildContext(l.$rawData,null,function(e){ko.utils.extend(e,n())});return ko.applyBindingsToDescendants(a,e),{controlsDescendantBindings:!0}}},ko.virtualElements.allowedBindings.withProperties=!0,ko.bindingHandlers.log={init:function(e,n,o,t,l){console.log("log",n())}},ko.bindingHandlers.block={templateExists:function(e){return!!global.document.getElementById(e)},_chooseTemplate:function(e,n,o,t){var l=n+"-"+o;if(ko.bindingHandlers.block.templateExists(l))return l;if(void 0!==t&&null!==t)return ko.bindingHandlers.block._chooseTemplate(e,n,t);var a=e?"array":"object-"+o;if(ko.bindingHandlers.block.templateExists(a))return a;throw"cannot find template for "+l+"/"+a},_displayMode:function(e,n){var o=void 0!==e.type?ko.utils.unwrapObservable(e.type):"notablock-"+typeof e,t=void 0!==e.splice,l=n.templateMode?n.templateMode:"show";return ko.bindingHandlers.block._chooseTemplate(t,o,l,n.templateModeFallback)},_makeTemplateValueAccessor:function(e,n){return function(){var o,t,l=e(),a=ko.utils.peekObservable(l);if(!a||"object"!=typeof a.data&&"function"!=typeof a.data)o=l;else if(o=a.data,void 0!==a.template){var i=ko.utils.unwrapObservable(a.template),r=n.templateMode?n.templateMode:"show";t=ko.bindingHandlers.block._chooseTemplate(!1,i,r,n.templateModeFallback)}var s=ko.utils.unwrapObservable(o);if(ko.isObservable(s)&&console.log("doubleObservable",s),void 0===t)if(void 0===o)t="empty";else try{t=ko.bindingHandlers.block._displayMode(s,n)}catch(e){throw console.log(e,s,n.$data,n.templateMode),e}return{name:t,data:o,templateEngine:ko.nativeTemplateEngine.instance}}},init:function(e,n,o,t,l){void 0===n()&&console.log("found a null block: check ending commas in arrays defs in IE");var a=ko.bindingHandlers.block._makeTemplateValueAccessor(n,l);return ko.bindingHandlers.template.init(e,a)},update:function(e,n,o,t,l){var a=ko.bindingHandlers.block._makeTemplateValueAccessor(n,l);return ko.bindingHandlers.template.update(e,a,o,t,l)}},ko.expressionRewriting.bindingRewriteValidators.block=!1,ko.virtualElements.allowedBindings.block=!0;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],28:[function(require,module,exports){
|
|
"use strict";module.exports=require("./string-template.js");
|
|
|
|
},{"./string-template.js":42}],29:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";require('evol.colorpicker/js/evol.colorpicker.min.js');var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),kojqui=(typeof window !== "undefined" ? window['kojqui'] : typeof global !== "undefined" ? global['kojqui'] : null),ColorPicker=function(){kojqui.BindingHandler.call(this,"colorpicker")};ColorPicker.prototype=kojqui.utils.createObject(kojqui.BindingHandler.prototype),ColorPicker.prototype.constructor=ColorPicker,ColorPicker.prototype.init=function(o,r,e){var i=r(),t=i.color,c=ko.computed({read:t,write:t,disposeWhenNodeIsRemoved:o});ko.bindingHandlers.value.init(o,function(){return c},e);var n=function(o,r){void 0!==r&&c(r)};$(o).on("change.color",n),ko.computed({read:function(){var r={color:ko.utils.unwrapObservable(c),showOn:"button"};for(var e in i)"color"!==e&&i.hasOwnProperty(e)&&(r[e]=ko.utils.unwrapObservable(i[e]));$(o).colorpicker(r)},disposeWhenNodeIsRemoved:o}),ko.utils.domNodeDisposal.addDisposeCallback(o,function(){$(o).off("change.color",n),$(o).colorpicker("destroy")})},kojqui.utils.register(ColorPicker);
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"evol.colorpicker/js/evol.colorpicker.min.js":5}],30:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null);ko.bindingHandlers.cssText={update:function(e,t,n){var r=ko.utils.unwrapObservable(t());try{e.innerText=r}catch(t){e.styleSheet||(e.innerHTML="a{}"),e.styleSheet.cssText=r}}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],31:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null);!function(e,t){e.utils.unwrapObservable;var o=e.utils.domData.get;e.utils.domData.set,e.bindingHandlers.droppable={init:function(a,n,d,i,l){var r,s=t(a),p=e.utils.unwrapObservable(n())||{},u={};t.extend(!0,u,e.bindingHandlers.droppable),p.data?(p.options&&u.options&&(e.utils.extend(u.options,p.options),delete p.options),e.utils.extend(u,p)):u.data=p,r=u.options.drop,s.droppable(e.utils.extend(u.options,{drop:function(e,t){var a=t.draggable[0],n=o(a,"ko_sortItem")||o(a,"ko_dragItem");n&&(n.clone&&(n=n.clone()),u.dragged&&(n=u.dragged.call(this,n,e,t)||n),u.data&&u.data(n)),r&&r.apply(this,arguments)}})),void 0!==u.isEnabled&&e.computed({read:function(){s.droppable(e.utils.unwrapObservable(u.isEnabled)?"enable":"disable")},disposeWhenNodeIsRemoved:a})},update:function(e,t,o,a,n){},targetIndex:null,afterMove:null,beforeMove:null,options:{}}}(ko,$);
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],32:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require('console-browserify');ko.bindingHandlers.focusable={focus:function(){},blur:function(){},init:function(o){ko.utils.domNodeDisposal.addDisposeCallback(o,function(){$(o).off("focusin",ko.bindingHandlers.focusable.focus),$(o).off("focusout",ko.bindingHandlers.focusable.blur)}),$(o).on("focusin",ko.bindingHandlers.focusable.focus),$(o).on("focusout",ko.bindingHandlers.focusable.blur)}},ko.bindingHandlers.scrollable={scroll:function(){},init:function(o){ko.utils.domNodeDisposal.addDisposeCallback(o,function(){$(o).off("scroll",ko.bindingHandlers.scrollable.scroll)}),$(o).on("scroll",ko.bindingHandlers.scrollable.scroll)}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],33:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null);ko.extenders.paging=function(e,t){var n=ko.observable(t||10),r=ko.observable(1);return e.pageSize=ko.computed({read:n,write:function(e){n(e>0?e:10)}}),e.currentPage=ko.computed({read:r,write:function(t){t>e.pageCount()?r(e.pageCount()):r(t<=0?1:t)}}),e.pageCount=ko.computed(function(){return Math.ceil(e().length/e.pageSize())||1}),e.currentPageData=ko.computed(function(){var t=n(),o=r(),u=t*(o-1),a=t*o;return e().slice(u,a)}),e.moveFirst=function(){e.currentPage(1)},e.movePrevious=function(){e.currentPage(e.currentPage()-1)},e.moveNext=function(){e.currentPage(e.currentPage()+1)},e.moveLast=function(){e.currentPage(e.pageCount())},e};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],34:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),sortable=(typeof window !== "undefined" ? window['jQuery']['ui']['sortable'] : typeof global !== "undefined" ? global['jQuery']['ui']['sortable'] : null),draggable=(typeof window !== "undefined" ? window['jQuery']['ui']['draggable'] : typeof global !== "undefined" ? global['jQuery']['ui']['draggable'] : null),console=require('console-browserify');if(require("knockout-sortable"),void 0===sortable)throw"Cannot find jquery-ui sortable widget dependency!";if(void 0===draggable)throw"Cannot find jquery-ui sortable widget dependency!";var isDraggingHelper=function(e,r){e()?r.type==e()+"stop"&&e(!1):"dragstart"!=r.type&&"sortstart"!=r.type||e(r.type.substring(0,4))},makeExtendedValueAccessor=function(e){return function(){var r=e();ko.utils.peekObservable(r);ko.utils.unwrapObservable(r),"undefined"==r.options&&(r.options={});var n=r.options.start;r.options.start=function(e,i){if(void 0!==r.dragging&&ko.isWritableObservable(r.dragging)&&isDraggingHelper(r.dragging,e),void 0!==r.dropContainer&&(r.scrollInterval=global.setInterval(function(){var e=$(r.dropContainer).scrollTop();$(r.dropContainer).scrollTop(e+r.adding)},20)),void 0!==n)return n(e,i)};var i=r.options.stop;r.options.stop=function(e,n){if(void 0!==r.dragging&&ko.isWritableObservable(r.dragging)&&isDraggingHelper(r.dragging,e),void 0!==r.dropContainer&&global.clearInterval(r.scrollInterval),void 0!==i)return i(e,n)};var o=r.options.drag;return r.options.drag=function(e,n){if(void 0!==r.dropContainer){var i=e.pageY-$(r.dropContainer).offset().top,t=i-$(r.dropContainer).height();r.adding=i<-20?-20:i<0?-10:i<10?-5:t>20?20:t>0?10:t>-10?5:0}if(void 0!==o)return o(e,n)},r}};ko.bindingHandlers.extsortable={init:function(e,r,n,i,o){return ko.bindingHandlers.sortable.init(e,makeExtendedValueAccessor(r),n,i,o)},update:function(e,r,n,i,o){return ko.bindingHandlers.sortable.update(e,makeExtendedValueAccessor(r),n,i,o)}},ko.bindingHandlers.extdraggable={init:function(e,r,n,i,o){return ko.bindingHandlers.draggable.init(e,makeExtendedValueAccessor(r),n,i,o)},update:function(e,r,n,i,o){return ko.bindingHandlers.draggable.update(e,makeExtendedValueAccessor(r),n,i,o)}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3,"knockout-sortable":11}],35:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');ko.bindingHandlers.preloader={init:function(e,i){var o=i();if(void 0===o.preloaded){o.preloaded=ko.observable("");var r=function(e){if(e!=o.preloaded())if(""!==e){var i=new Image;i.onload=function(){o.preloaded(e)},i.onerror=function(){o.preloaded(e)},i.src=e}else o.preloaded(e)};o.subscribe(r),r(o())}}},ko.bindingHandlers.advattr={init:function(e,i,o,r,l){var a=ko.utils.unwrapObservable(i()||{});ko.utils.objectForEach(a,function(i,o){var r=e.getAttribute(i);if(ko.isWriteableObservable(o)){var l=o();l!=r&&(o(r),null!==l&&console.log("AdvAttr found a value different from the default",i,l,r))}})},update:function(e,i,o){var r=ko.utils.unwrapObservable(i())||{};ko.utils.objectForEach(r,function(i,o){!1===(o=ko.utils.unwrapObservable(o))||null===o||void 0===o?e.removeAttribute(i):e.setAttribute(i,o.toString())})}},ko.bindingHandlers.advstyle={init:function(e,i,o,r,l){var a=ko.utils.unwrapObservable(i()||{});ko.utils.objectForEach(a,function(i,o){var r;if(i.match(/Px$/)?(i=i.substr(0,i.length-2),(r=e.style[i]).match(/px$/)?r=r.replace(/px$/,""):console.log("AdvStyle binding found an unexpected default value",i,r,e)):r=e.style[i],ko.isWriteableObservable(o)){var l=o();l!=r&&(o(r),null!==l&&console.log("AdvStyle found a value different from the default",i,l,r))}})},update:function(e,i){var o=ko.utils.unwrapObservable(i()||{});ko.utils.objectForEach(o,function(i,o){null!==(o=ko.utils.unwrapObservable(o))&&void 0!==o&&!1!==o||(o=""),i.match(/Px$/)&&(i=i.substr(0,i.length-2),o+="px"),e.style[i]=o})}},ko.bindingHandlers.domlog={init:function(e,i){console.log("initialized",e),ko.utils.domNodeDisposal.addDisposeCallback(e,function(){console.log("disposed",e)})}},ko.bindingHandlers.fudroppable={init:function(e,i){var o=i()||{},r={},l=function(e,i,o,r,l,a){e[i]?global.clearTimeout(e[i]):(void 0!==r&&o.classList.add(r),ko.isWriteableObservable(l)&&!l()&&l(!0));var t=function(){e[i]=null,void 0!==r&&o.classList.remove(r),ko.isWriteableObservable(l)&&l()&&l(!1)};"dragleave"==a.type?t():e[i]=global.setTimeout(t,500)};(o.active||o.activeClass)&&ko.utils.registerEventHandler(global,"dragover",l.bind(void 0,r,"activeTimeout",e,o.activeClass,o.active)),o.hoverClass&&ko.utils.registerEventHandler(e,"dragover dragenter dragleave",l.bind(void 0,r,"hoverTimeout",e,o.hoverClass,void 0))}},ko.bindingHandlers.fileupload={extendOptions:{},remoteFilePreprocessor:function(e){return e},init:function(e,i){ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).fileupload("destroy")}),global.webkitURL?$(e).attr("title"," "):$(e).attr("title","")},update:function(e,i){var o=i()||{},r=$(e),l=r.parents(".uploadzone"),a=o.data;o.data=void 0;var t=o.canvasPreview;ko.utils.extend(o,{url:"/upload/",dataType:"json",dropZone:l.find(".mo-uploadzone")[0],autoUpload:!0,acceptFileTypes:/(\.|\/)(gif|jpe?g|png)$/i,maxFileSize:1048576,disableImageResize:/Android(?!.*Chrome)|Opera/.test(global.navigator.userAgent),previewMaxWidth:200,previewMaxHeight:200,previewCrop:!1,replaceFileInput:!1,messages:{unknownError:"Unknown error",uploadedBytes:"Uploaded bytes exceed file size",maxNumberOfFiles:"Maximum number of files exceeded",acceptFileTypes:"File type not allowed",maxFileSize:"File is too large",minFileSize:"File is too small",post_max_size:"The uploaded file exceeds the post_max_size directive in php.ini",max_file_size:"File is too big",min_file_size:"File is too small",accept_file_types:"Filetype not allowed",max_number_of_files:"Maximum number of files exceeded",max_width:"Image exceeds maximum width",min_width:"Image requires a minimum width",max_height:"Image exceeds maximum height",min_height:"Image requires a minimum height",abort:"File upload aborted",image_resize:"Failed to resize image",generic:"Unexpected upload error"}}),ko.utils.extend(o,ko.bindingHandlers.fileupload.extendOptions);var n=0,s="",d=function(){0==--n&&(a&&a(s),s="",t&&(l.find("img").show(),l.find("canvas").remove()),l.removeClass("uploading"),l.find(".progress-bar").css("width",0))},u=function(e){if("object"==typeof o.messages&&null!==o.messages){var i=e.match(/^([^ ]+)(.*)$/);if(i&&void 0!==o.messages[i[1]])return o.messages[i[1]]+i[2]}return e};r.fileupload(o);for(var p=["fileuploadadd","fileuploadprocessalways","fileuploadprogressall","fileuploaddone","fileuploadfail"],f=function(e,i){if("fileuploadadd"==e.type&&n++,"fileuploadfail"==e.type&&(console.log("fileuploadfail",e,i),o.onerror&&(""===i.errorThrown&&"error"==i.textStatus?o.onerror(u("generic")):o.onerror(u("generic ("+i.errorThrown+")"))),d()),"fileuploaddone"==e.type)if(void 0!==i.result.files[0].url){if(o.onfile)for(var r=0;r<i.result.files.length;r++)i.result.files[r]=ko.bindingHandlers.fileupload.remoteFilePreprocessor(i.result.files[r]),o.onfile(i.result.files[r]);if(""===s&&(s=i.result.files[0].url),t){var a=new Image;a.onload=d,a.onerror=d,a.src=i.result.files[0].url}else d()}else void 0!==i.result.files[0].error?(console.log("remote error",e,i),o.onerror&&o.onerror(u(i.result.files[0].error)),d()):(console.log("unexpected error",e,i),o.onerror&&o.onerror(u("generic (Unexpected Error retrieving uploaded file)")),d());if("fileuploadprocessalways"==e.type){var p=i.index,f=i.files[p];if(f.preview&&0===p&&0===l.find("canvas").length){if(t){var c=$(f.preview).css("width","100%");l.find("img").hide(),l.prepend(c)}l.addClass("uploading"),l.find(".progress-bar").css("width",0)}f.error&&(o.onerror&&o.onerror(u(f.error)),d())}if("fileuploadprogressall"==e.type){var v=parseInt(i.loaded/i.total*100,10);l.find(".progress-bar").css("width",v+"%")}},c=p.length-1;c>=0;c--){var v=p[c];r.on(v,f)}$.support.fileInput||r.prop("disabled",!0).parent().addClass("disabled")}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],36:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var beforeSubscriptionProp,afterSubscriptionProp,ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');if(ko.bindingHandlers.ifSubs={cloneNodes:function(o,e){for(var i=0,r=o.length,n=[];i<r;i++){var s=o[i].cloneNode(!0);n.push(e?ko.cleanNode(s):s)}return n},init:function(o,e,i,r,n){var s,t,u=e();return void 0===u.data.subsCount&&ko.extenders.subscriptionsCount(u.data),ko.computed(function(){var i,r,b=ko.utils.unwrapObservable(e().data.subsCount),p=!t;r=-(void 0!==e().gutter?e().gutter:1),i=b+(s?r:0)>=ko.utils.unwrapObservable(u.threshold),void 0!==e().not&&e().not&&(i=!i),(p||i!==s)&&(p&&ko.computedContext.getDependenciesCount()&&(t=ko.bindingHandlers.ifSubs.cloneNodes(ko.virtualElements.childNodes(o),!0)),i?(p||ko.virtualElements.setDomNodeChildren(o,ko.bindingHandlers.ifSubs.cloneNodes(t)),ko.applyBindingsToDescendants(n,o)):ko.virtualElements.emptyNode(o),s=i)},null,{disposeWhenNodeIsRemoved:o}),{controlsDescendantBindings:!0}}},ko.virtualElements.allowedBindings.ifSubs=!0,"function"==typeof ko.subscription&&void 0!==ko.isWritableObservable)beforeSubscriptionProp="beforeSubscriptionAdd",afterSubscriptionProp="afterSubscriptionRemove";else if("3.2.0"==ko.version)beforeSubscriptionProp="va",afterSubscriptionProp="nb";else if("3.3.0"==ko.version)beforeSubscriptionProp="ja",afterSubscriptionProp="ua";else if("3.4.0"==ko.version)beforeSubscriptionProp="sa",afterSubscriptionProp="Ia";else if("3.4.1"==ko.version)beforeSubscriptionProp="sa",afterSubscriptionProp="Ia";else if("3.4.2"==ko.version)beforeSubscriptionProp="ua",afterSubscriptionProp="Ka";else{if("3.5.0-beta"!=ko.version)throw"Unsupported minimized Knockout version "+ko.version+" (supported DEBUG or minimized 3.2.0 ... 3.5.0-beta)";beforeSubscriptionProp="Pa",afterSubscriptionProp="ab"}ko.extenders.subscriptionsCount=function(o,e,i){if(void 0===o.subsCount){o.subsCount=ko.observable(o.getSubscriptionsCount()).extend({notify:"always"});var r=o[beforeSubscriptionProp],n=o[afterSubscriptionProp];o[beforeSubscriptionProp]=function(n){r&&r.call(o,n);var s=o.getSubscriptionsCount()+1;void 0!==e&&s!=e&&void 0!==i&&s!=i||o.subsCount(s)},o[afterSubscriptionProp]=function(r){n&&n.call(o,r);var s=o.getSubscriptionsCount();void 0!==e&&s!=e&&void 0!==i&&s!=i||o.subsCount(s)}}else console.log("already applied subscriptionCount to observable");return null};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],37:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),spinner=(typeof window !== "undefined" ? window['jQuery']['ui']['spinner'] : typeof global !== "undefined" ? global['jQuery']['ui']['spinner'] : null),console=require('console-browserify');if(void 0===spinner)throw"Cannot find jquery-ui spinner widget dependency!";$.widget("ui.spinner",spinner,{_adjustValue:function(i){this._super(i);var e=this.options;return i=parseFloat(i.toFixed(this._precision())),null!==e.max&&i>e.max?e.max:null!==e.min&&i<e.min?e.min:i}});
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],38:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require('console-browserify'),tabs=(typeof window !== "undefined" ? window['jQuery']['ui']['tabs'] : typeof global !== "undefined" ? global['jQuery']['ui']['tabs'] : null);if(void 0===tabs)throw"Cannot find jquery-ui tabs widget dependency!";$.widget("ui.tabs",tabs,{_isLocal:function(e){return"true"==e.getAttribute("data-local")||this._superApply(arguments)}});
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],39:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";function pushTemplate(e,t){var n=global.document.createElement("script");n.setAttribute("type","text/html"),n.setAttribute("id",e),n.text=t,global.document.body.appendChild(n)}function removeTemplate(e){var t=global.document.getElementById(e);t&&t.parentNode.removeChild(t)}function init(){}function getTemplateContent(e){var t=global.document.getElementById(e);return t?t.innerHTML:void 0}module.exports={init:init,addTemplate:pushTemplate,removeTemplate:removeTemplate,getTemplateContent:getTemplateContent};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],40:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var timeout,ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require('console-browserify'),tinymce=(typeof window !== "undefined" ? window['tinymce'] : typeof global !== "undefined" ? global['tinymce'] : null),render=function(){if(timeout=void 0,void 0!==tinymce.activeEditor&&null!==tinymce.activeEditor&&void 0!==tinymce.activeEditor.theme&&null!==tinymce.activeEditor.theme&&void 0!==tinymce.activeEditor.theme.panel&&null!==tinymce.activeEditor.theme.panel){(void 0!==tinymce.activeEditor.theme.panel._visible&&tinymce.activeEditor.theme.panel._visible&&tinymce.activeEditor.theme.panel._fixed||void 0!==tinymce.activeEditor.theme.panel.state&&tinymce.activeEditor.theme.panel.state.get("visible")&&tinymce.activeEditor.theme.panel.state.get("fixed"))&&tinymce.activeEditor.theme.panel.fixed(!1);var e=void 0!==tinymce.activeEditor.bodyElement?tinymce.activeEditor.bodyElement:tinymce.activeEditor.dom.settings.root_element;null!==e&&void 0!==e.classList&&e.classList.contains("mce-edit-focus")&&(tinymce.activeEditor.nodeChanged(),tinymce.activeEditor.theme.panel.visible(!0),tinymce.activeEditor.theme.panel.layoutRect().y<=40&&tinymce.activeEditor.theme.panel.moveBy(0,40-tinymce.activeEditor.theme.panel.layoutRect().y))}};ko.bindingHandlers.wysiwygScrollfix={scroll:function(e){timeout&&global.clearTimeout(timeout),timeout=global.setTimeout(render,50)},init:function(e){ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).off("scroll",ko.bindingHandlers.wysiwygScrollfix.scroll)}),$(e).on("scroll",ko.bindingHandlers.wysiwygScrollfix.scroll)}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],41:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify'),_scrollIntoView=function(o,e,l,r){var n=l.scrollTop(),t=n-r-(e?20:-20);if(void 0!==l[0].nodeType){var i={scrollTop:Math.round(t)+"px"},s=Math.round(Math.abs(t-n));l.stop().animate(i,s)}else l.scrollTop(t)};ko.bindingHandlers.scrollIntoView={update:function(o,e,l,r,n){if(ko.utils.unwrapObservable(e()))try{for(;8===o.nodeType;)o=o.nextSibling;if(8!==o.nodeType){var t,i=$(o).scrollParent(),s=!1;9==i[0].nodeType?(i=$(i[0].defaultView),t=0,s=!0):t=i.offset().top;var c=i.height(),a=i.scrollTop(),p=t+c,u=$(o),d=u.offset().top;s&&(d-=a);var f=u.height(),w=d+f;d>t&&d+f<p||(f<c?(d<t&&_scrollIntoView(o,!0,i,t-d),w>p&&_scrollIntoView(o,!1,i,p-w)):(d<t&&w<p&&_scrollIntoView(o,!1,i,p-w),d>t&&w>p&&_scrollIntoView(o,!0,i,t-d)))}}catch(o){console.log("TODO exception scrolling into view",o)}}},ko.virtualElements.allowedBindings.scrollIntoView=!0;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],42:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),origTemplateSystem=require("./script-template.js"),templates={};function createStringTemplateEngine(e){var t=e.makeTemplateSource;return e.makeTemplateSource=function(e){return void 0!==templates[e]?new ko.templateSources.stringTemplate(e,templates[e]):t(e)},e}function pushTemplate(e,t){templates[e]=t}function removeTemplate(e){void 0!==templates[e]?templates[e]=void 0:origTemplateSystem.removeTemplate(e)}function init(){ko.setTemplateEngine(createStringTemplateEngine(new ko.nativeTemplateEngine))}function getTemplateContent(e){return void 0!==templates[e]?templates[e]:origTemplateSystem.getTemplateContent(e)}ko.templateSources.stringTemplate=function(e,t){this.templateName=e,this.template=t,this._data={}},ko.utils.extend(ko.templateSources.stringTemplate.prototype,{data:function(e,t){if(1===arguments.length)return this._data[e];this._data[e]=t},text:function(e){if(0===arguments.length)return this.template;this.template=e}}),module.exports={init:init,addTemplate:pushTemplate,removeTemplate:removeTemplate,getTemplateContent:getTemplateContent};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./script-template.js":39}],43:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),kojqui=(typeof window !== "undefined" ? window['kojqui'] : typeof global !== "undefined" ? global['kojqui'] : null),console=require('console-browserify'),extendValueAccessor=function(o,i){return function(){return ko.utils.extend(i,o()),i}},options={show:{delay:500},track:!0,items:'[title][title!=""][title!=" "]'};ko.bindingHandlers.tooltips={init:function(o,i,t,e,n){if(void 0!==$.fn.tooltip&&void 0!==ko.bindingHandlers.tooltip)return ko.bindingHandlers.tooltip.init(o,extendValueAccessor(i,options),t,e,n)},update:function(o,i,t,e,n){if(void 0!==$.fn.tooltip&&void 0!==ko.bindingHandlers.tooltip)return ko.bindingHandlers.tooltip.update(o,extendValueAccessor(i,options),t,e,n)}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],44:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');ko.bindingHandlers.validatedValue={init:function(e,i,n){var t=i;if(void 0!==e.pattern){var a=new RegExp("^(?:"+e.pattern+")$"),o=ko.computed({read:function(){var n=ko.utils.unwrapObservable(i());return null===n||""===n||a.test(n)?e.classList.remove("invalid"):e.classList.add("invalid"),n},write:ko.isWriteableObservable(i())&&function(n){ko.selectExtensions.writeValue(e,n);var t=ko.selectExtensions.readValue(e);i()(t)},disposeWhenNodeIsRemoved:e});t=function(){return o}}ko.bindingHandlers.value.init(e,t,n)}},ko.expressionRewriting._twoWayBindings.validatedValue=!0;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],45:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');ko.bindingHandlers.uniqueId={currentIndex:0,init:function(e,t){var n=ko.utils.unwrapObservable(t())||{};if(""===n.id()){var i,l,r;r="ko_"+(void 0!==n.type?ko.utils.unwrapObservable(n.type):"block");do{i=r+"_"+ ++ko.bindingHandlers.uniqueId.currentIndex,l=global.document.getElementById(i)}while(l);n.id(i)}}},ko.virtualElements.allowedBindings.uniqueId=!0,ko.bindingHandlers.virtualAttr={update:function(e,t){8!==e.nodeType&&ko.bindingHandlers.attr.update(e,t)}},ko.virtualElements.allowedBindings.virtualAttr=!0,ko.bindingHandlers.virtualAttrStyle={update:function(e,t,n,i,l){if(8!==e.nodeType){var r=["style"];(void 0===l.templateMode||"wysiwyg"!=l.templateMode)&&r.push("replacedstyle");for(var o=ko.utils.unwrapObservable(t()),a=0;a<r.length;a++){var d=r[a];!1===o||null===o||void 0===o?e.removeAttribute(d):e.setAttribute(d,o.toString())}}}},ko.virtualElements.allowedBindings.virtualAttrStyle=!0,ko.bindingHandlers.virtualStyle={update:function(e,t){8!==e.nodeType&&ko.bindingHandlers.style.update(e,t)}},ko.virtualElements.allowedBindings.virtualStyle=!0,ko.bindingHandlers.virtualHtml={init:ko.bindingHandlers.html.init,update:function(e,t){if(8===e.nodeType){var n=ko.utils.unwrapObservable(t());if(ko.virtualElements.emptyNode(e),null!==n&&void 0!==n){"string"!=typeof n&&(n=n.toString());var i=ko.utils.parseHtmlFragment(n);if(i)for(var l=e.nextSibling,r=0,o=i.length;r<o;r++)l.parentNode.insertBefore(i[r],l)}}else ko.bindingHandlers.html.update(e,t);return{controlsDescendantBindings:!0}}},ko.virtualElements.allowedBindings.virtualHtml=!0;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],46:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var tinymce=(typeof window !== "undefined" ? window['tinymce'] : typeof global !== "undefined" ? global['tinymce'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');require("./eventable.js"),ko.bindingHandlers.wysiwygOrHtml={init:function(e,t,i,n,o){return void 0===o.templateMode||"wysiwyg"!=o.templateMode?ko.bindingHandlers.virtualHtml.init():ko.bindingHandlers.wysiwyg.init(e,t,i,n,o)},update:function(e,t,i,n,o){if(void 0===o.templateMode||"wysiwyg"!=o.templateMode)return ko.bindingHandlers.virtualHtml.update(e,t,i,n,o)}},ko.virtualElements.allowedBindings.wysiwygOrHtml=!0,ko.bindingHandlers.wysiwygHref={init:function(e,t,i,n,o){if(8!==e.nodeType){t();if(void 0===o.templateMode||"wysiwyg"!=o.templateMode)e.setAttribute("target","_new");else void 0!==i().wysiwygOrHtml?e.setAttribute("href","javascript:void(0)"):(e.removeAttribute("href"),e.setAttribute("disabledhref","#"))}},update:function(e,t,i,n,o){if(8!==e.nodeType){var l=void 0===o.templateMode||"wysiwyg"!=o.templateMode,r=ko.utils.unwrapObservable(t());l&&(!1===r||null===r||void 0===r?e.removeAttribute("href"):e.setAttribute("href",r.toString()))}}},ko.virtualElements.allowedBindings.wysiwygHref=!0,ko.bindingHandlers.wysiwygSrc={convertedUrl:function(e,t,i,n){return e+(-1==e.indexOf("?")?"?":"&")+"method="+t+"&width="+i+(null!==n?"&height="+n:"")},placeholderUrl:function(e,t,i){},update:function(e,t,i,n,o){var l=ko.utils.unwrapObservable(t()),r=ko.utils.unwrapObservable(l.src),s=ko.utils.unwrapObservable(l.placeholder),a=ko.utils.unwrapObservable(l.width),d=ko.utils.unwrapObservable(l.height);if(!1===r||null===r||void 0===r||""===r)"object"==typeof s&&null!==s?e.setAttribute("src",ko.bindingHandlers.wysiwygSrc.placeholderUrl(s.width,s.height,s.text)):e.removeAttribute("src");else{var u=ko.utils.unwrapObservable(l.method);u||(u=a>0&&d>0?"cover":"resize");var g=ko.bindingHandlers.wysiwygSrc.convertedUrl(r.toString(),u,a,d);e.setAttribute("src",g)}void 0!==a&&null!==a?e.setAttribute("width",a):e.removeAttribute("width"),void 0!==d&&null!==d?e.setAttribute("height",d):e.removeAttribute("height")}},ko.bindingHandlers.wysiwygId={init:function(e,t,i,n,o){void 0===o.templateMode||"wysiwyg"!=o.templateMode||e.setAttribute("id",ko.utils.unwrapObservable(t()))},update:function(e,t,i,n,o){void 0===o.templateMode||"wysiwyg"!=o.templateMode||e.setAttribute("id",ko.utils.unwrapObservable(t()))}},ko.virtualElements.allowedBindings.wysiwygId=!0,ko.bindingHandlers.wysiwygClick={init:function(e,t,i,n,o){void 0===o.templateMode||"wysiwyg"!=o.templateMode||ko.bindingHandlers.click.init(e,t,i,n,o)}},ko.virtualElements.allowedBindings.wysiwygClick=!0,ko.bindingHandlers.wysiwygCss={update:function(e,t,i,n,o){void 0===o.templateMode||"wysiwyg"!=o.templateMode||ko.bindingHandlers.css.update(e,t,i,n,o)}},ko.virtualElements.allowedBindings.wysiwygCss=!0,ko.bindingHandlers.wysiwygImg={makeTemplateValueAccessor:function(e,t){return function(){var i=void 0!==t.templateMode&&"wysiwyg"==t.templateMode,n=e(),o=ko.utils.peekObservable(n);return ko.utils.unwrapObservable(n),{name:i?o._editTemplate:o._template,templateEngine:ko.nativeTemplateEngine.instance}}},init:function(e,t,i,n,o){return ko.bindingHandlers.template.init(e,ko.bindingHandlers.wysiwygImg.makeTemplateValueAccessor(t,o))},update:function(e,t,i,n,o){return o=o.extend(t()),ko.bindingHandlers.template.update(e,ko.bindingHandlers.wysiwygImg.makeTemplateValueAccessor(t,o),i,n,o)}},ko.virtualElements.allowedBindings.wysiwygImg=!0,ko.bindingHandlers.wysiwyg={currentIndex:0,standardOptions:{},fullOptions:{toolbar1:"bold italic forecolor backcolor hr styleselect removeformat | link unlink | pastetext code",plugins:["link hr paste lists textcolor code"]},init:function(e,t,i,n,o){ko.bindingHandlers.focusable.init(e),ko.utils.domNodeDisposal.addDisposeCallback(e,function(){tinymce.remove("#"+e.getAttribute("id"))});var l=t();if(!ko.isObservable(l))throw"Wysiwyg binding called with non observable";if(8===e.nodeType)throw"Wysiwyg binding called on virtual node, ignoring...."+e.innerHTML;var r=e.getAttribute("id");r||(r="wysiwyg_"+ ++ko.bindingHandlers.wysiwyg.currentIndex,e.setAttribute("id",r));var s,a="DIV"==e.tagName||"TD"==e.tagName,d=!1,u=!1,g={selector:"#"+r,inline:!0,hidden_input:!1,plugins:["paste"],toolbar1:"bold italic",toolbar2:"",preview_styles:!1,paste_as_text:!0,language:"en",schema:"html5",extended_valid_elements:"strong/b,em/i,*[*]",menubar:!1,skin:"gray-flat",setup:function(e){e.on("change redo undo",function(){d||(u=!0,l(e.getContent({format:"raw"})),u=!1)}),e.on("focus",function(){e.nodeChanged(),e.getElement().click()}),e.on("BeforeSetContent",function(e){e.initial&&(e.format="raw")}),s=e}};return ko.utils.extend(g,ko.bindingHandlers.wysiwyg.standardOptions),a&&ko.utils.extend(g,ko.bindingHandlers.wysiwyg.fullOptions),global.setTimeout(function(){tinymce.init(g)}),ko.computed(function(){var i=ko.utils.unwrapObservable(t());if(!u){try{d=!0,void 0!==s?s.setContent(i,{format:"raw"}):ko.utils.setHtml(e,i)}catch(e){console.log("TODO exception setting content to editable element",typeof s,e)}d=!1}},null,{disposeWhenNodeIsRemoved:e}),{controlsDescendantBindings:!0}}};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./eventable.js":32,"console-browserify":3}],47:[function(require,module,exports){
|
|
"use strict";var console=require('console-browserify'),checkModel=function(e,o,t,n,l){var i,f,r,a=0;if(void 0===l&&(l=!1),void 0!==o&&"function"==typeof o.splice)for(i={},f=0;f<o.length;f++)i[o[f].type]=o[f];else i=o;for(var p in e)if(e.hasOwnProperty(p))if(r=void 0!==n?n+"."+p:p,t.hasOwnProperty(p))if(typeof t[p]!=typeof e[p])null!==t[p]&&null!==e[p]&&("string"==typeof t[p]?String(e[p])!=e[p]&&(console.log("TODO Different type 1 ",r,typeof t[p],typeof e[p],t[p],e[p]),a=Math.max(a,2)):"number"==typeof t[p]?Number(e[p])!=e[p]&&(console.log("TODO Different type 2 ",r,typeof t[p],typeof e[p],t[p],e[p]),a=Math.max(a,2)):(console.log("TODO Different type 3 ",r,typeof t[p],typeof e[p],t[p],e[p]),a=Math.max(a,2)));else if("object"==typeof e[p])if(null!==e[p])if(void 0!==e[p].splice){if(e[p].length>0)if(t[p].length>0){var c=0;for(f=0;f<t[p].length;f++)if("string"==typeof t[p][f].type){for(;c<e[p].length&&e[p][c].type!==t[p][f].type;)console.log("ignoring ",r,e[p][c].type," block type in reference not found in model"),c++;if(c>=e[p].length){console.log("WARN cannot find ",r,t[p][f].type," block in reference"),a=Math.max(a,2);break}a=Math.max(a,checkModel(e[p][c],void 0,t[p][f],r+"["+f+"."+t[p][f].type+"]"))}}else for(f=0;f<e[p].length;f++)"string"!=typeof e[p][f].type?(console.log("TODO found an object with no type",r,e[p][f]),a=Math.max(a,2)):i.hasOwnProperty(e[p][f].type)?a=Math.max(a,checkModel(i[e[p][f].type],i,e[p][f],r+"["+f+"."+e[p][f].type+"]")):(console.warn("TODO the model uses a block type not defined by the template. REMOVING IT!!",r,e[p][f]),e[p].splice(f,1),f--,a=Math.max(a,2))}else null===t[p]?l?(console.log("WARN Null object in model ",r,"instead of",e[p],"deleting it"),a=Math.max(a,2),delete e[p]):(console.log("INFO Null object in model ",r,"instead of",e[p],"cloning it from the reference"),a=Math.max(a,1),t[p]=e[p]):a=Math.max(a,checkModel(e[p],i,t[p],r,l));else null!==t[p]&&(console.log("TODO Null in reference but not null in model",r,t[p]),a=Math.max(a,2));else"string"!=typeof e[p]&&"boolean"!=typeof e[p]&&"number"!=typeof e[p]&&(console.log("TODO unsupported type",r,typeof e[p]),a=Math.max(a,2));else l?(console.warn("WARN Property ",r,"found in model is not defined by template: removing it!"),a=Math.max(a,2),delete e[p]):(console.log("INFO Property ",r,"missing in model, cloning from reference!"),a=Math.max(a,1),t[p]=e[p]);return l||(a=Math.max(a,checkModel(t,o,e,void 0!==n?n+"!R":"!R",!0))),a};module.exports=checkModel;
|
|
|
|
},{"console-browserify":3}],48:[function(require,module,exports){
|
|
"use strict";var converterUtils=require("./utils.js"),cssParse=require("mensch/lib/parser.js"),console=require('console-browserify'),domutils=require("./domutils.js"),_declarationValueLookup=function(e,t,r){for(var l=e.length-1;l>=0;l--)if("property"==e[l].type&&e[l].name==t)return _declarationValueUrlPrefixer(e[l].value,r);return null},_propToCamelCase=function(e){return e.replace(/-([a-z])/g,function(e,t,r,l){return t.toUpperCase()})},_declarationValueUrlPrefixer=function(e,t){return e.match(/url\(.*\)/)?e.replace(/(url\()([^\)]*)(\))/g,function(e,r,l,i){var n=l.trim(),o=l.trim().charAt(0);"'"==o||'"'==o?n=n.substr(1,n.length-2):o="";var a=t(n);return null!==a?r+o+a+o+i:e}):e},elaborateDeclarations=function(e,t,r,l,i,n,o){var a="object"==typeof n&&null!==n?n:{},u=null,s=0;void 0===t&&(t=cssParse("#{\n"+e+"}",{comments:!0,position:!0}).stylesheet.rules[0].declarations,s=1);for(var v=t.length-1;v>=0;v--)if("property"==t[v].type)if(!0===o&&"display"==t[v].name&&"none"==t[v].value)null===u&&(u=e),u=converterUtils.removeStyle(u,t[v].position.start,t[v].position.end,s,0,0,"");else{var d=t[v].name.match(/^-ko-(bind-|attr-)?([a-z0-9-]*?)(-if|-ifnot)?$/);if(null!==d){null===u&&void 0!==e&&(u=e);var c,f,p,m="attr-"==d[1],y="bind-"==d[1],h=d[2],b="-if"==d[3]||"-ifnot"==d[3];if(b){if(c=t[v].name.substr(0,t[v].name.length-d[3].length),null===_declarationValueLookup(t,c,r))throw"Unable to find declaration "+c+" for "+t[v].name}else{if((m||y)&&void 0===i&&void 0!==e)throw"Attributes and bind declarations are only allowed in inline styles!";var S,g=!0;if(m?(p=domutils.getAttribute(i,h),g=!1,S="virtualAttr"):y?(S=null,"text"==h?void 0!==i?p=domutils.getInnerText(i):g=!1:"html"==h&&void 0!==i?p=domutils.getInnerHtml(i):g=!1):((g=void 0!==e)&&(p=_declarationValueLookup(t,h,r)),S="virtualStyle"),g&&null===p)throw console.error("Cannot find default value for",t[v].name,t),"Cannot find default value for "+t[v].name+": "+t[v].value+" in "+i+" ("+typeof e+"/"+h+")";var w=p,U=y||m?-1!=h.indexOf("-")?"'"+h+"'":h:_propToCamelCase(h);try{f=converterUtils.expressionBinding(t[v].value,l,w)}catch(e){throw console.error("Model ensure path failed",e.stack,"name",t[v].name,"value",t[v].value,"default",p,"element",i),e}null!==S&&void 0===a[S]&&(a[S]={}),"virtualAttr"==S&&"href"==U&&(S=null,U="wysiwygHref",void 0!==i&&null!==i&&domutils.removeAttribute(i,"href"));var x=_declarationValueLookup(t,t[v].name+"-if",r),_=!1;if(null===x)x=_declarationValueLookup(t,t[v].name+"-ifnot",r),_=!0;else if(null!==_declarationValueLookup(t,t[v].name+"-ifnot",r))throw"Unexpected error: cannot use both -if and -ifnot property conditions";if(null!==x)try{var A=converterUtils.conditionBinding(x,l);f=(_?"!":"")+"("+A+") ? "+f+" : null"}catch(e){throw console.error("Unable to deal with -ko style binding condition",x,t[v].name),e}null!==S?a[S][U]=f:a[U]=f}if(null!==u)try{if(void 0!==i&&null!==i)u=converterUtils.removeStyle(u,t[v].position.start,t[v].position.end,s,0,0,"");else{var k="";b||(k=h+": \x3c!-- ko text: "+f+" --\x3e"+p+"\x3c!-- /ko --\x3e"),u=converterUtils.removeStyle(u,t[v].position.start,t[v].position.end,s,0,0,k)}}catch(e){throw console.warn("Remove style failed",e,"name",t[v]),e}}else{var C=_declarationValueUrlPrefixer(t[v].value,r);if(C!=t[v].value&&(null===u&&void 0!==e&&(u=e),null!==u))try{u=converterUtils.removeStyle(u,t[v].position.start,t[v].position.end,s,0,0,t[v].name+": "+C)}catch(e){throw console.log("Remove style failed replacing url",e,"name",t[v]),e}var V=_propToCamelCase(t[v].name),P="virtualAttrStyle",j=void 0!==a.virtualStyle?a.virtualStyle[V]:void 0,z=" ";void 0===a[P]&&(a[P]="''",z=""),void 0!==j?(a[P]="'"+t[v].name+": '+("+j+")+';"+z+"'+"+a[P],delete a.virtualStyle[V]):a[P]="'"+t[v].name+": "+converterUtils.addSlashes(C)+";"+z+"'+"+a[P]}}if(void 0!==i&&null!==i){for(var L in a.virtualStyle)if(a.virtualStyle.hasOwnProperty(L))throw console.log("Unexpected virtualStyle binding after conversion to virtualAttr.style",L,a.virtualStyle[L],e),"Unexpected virtualStyle binding after conversion to virtualAttr.style for "+L;delete a.virtualStyle;var q=domutils.getAttribute(i,"data-bind"),O=(null!==q?q+", ":"")+_bindingSerializer(a);domutils.setAttribute(i,"data-bind",O)}if(void 0===e){var T=!1;for(var B in a.virtualStyle)if(a.virtualStyle.hasOwnProperty(B)){T=!0;break}if(T){if(void 0!==a.virtualAttrStyle){var D=a.virtualAttrStyle;delete a.virtualAttrStyle,a.virtualAttrStyle=D}}else delete a.virtualStyle;return _bindingSerializer(a)}return u},_bindingSerializer=function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&("object"==typeof e[r]?t.push(r+": { "+_bindingSerializer(e[r])+" }"):t.push(r+": "+e[r]));return t.reverse().join(", ")};module.exports=elaborateDeclarations;
|
|
|
|
},{"./domutils.js":49,"./utils.js":55,"console-browserify":3,"mensch/lib/parser.js":16}],49:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null);function _extend(e,t){if(t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}var objExtend=function(e,t){return"function"==typeof $.extend?$.extend(!0,e,t):_extend(e,JSON.parse(JSON.stringify(t)))},getAttribute=function(e,t){var n=$(e).attr(t);return void 0===n&&(n=null),n},setAttribute=function(e,t,n){$(e).attr(t,n)},removeAttribute=function(e,t){$(e).removeAttr(t)},getInnerText=function(e){return $(e).text()},getInnerHtml=function(e){return $(e).html()},getLowerTagName=function(e){return""===e.tagName&&"string"==typeof e.name?e.name.toLowerCase():""!==e.tagName?e.tagName.toLowerCase():$(e).prop("tagName").toLowerCase()},setContent=function(e,t){$(e).html(t)},replaceHtml=function(e,t){$(e).replaceWith(t)},removeElements=function(e,t){t&&void 0!==e.detach&&e.detach(),e.remove()};module.exports={getAttribute:getAttribute,setAttribute:setAttribute,removeAttribute:removeAttribute,getInnerText:getInnerText,getInnerHtml:getInnerHtml,getLowerTagName:getLowerTagName,setContent:setContent,replaceHtml:replaceHtml,removeElements:removeElements,objExtend:objExtend};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],50:[function(require,module,exports){
|
|
"use strict";var console=require('console-browserify'),elaborateDeclarations=require("./declarations.js"),utils=require("./utils.js"),modelDef=require("./model.js"),_getOptionsObject=function(e){for(var t=e.split("|"),o={},i=0;i<t.length;i++){var l=t[i].split("=");o[l[0]]=l.length>1?l[1]:l[0]}return o},_filterProps=function(e,t,o){var i=[];for(var l in e)if(!l.match(/^customStyle$/)&&!l.match(/^_/)&&e.hasOwnProperty(l)){var a=null!==e[l]&&void 0!==e[l]._category&&"style"==e[l]._category;if("id"==l||"type"==l||l.match(/Blocks$/));else if("styler"==t)(a||o>0)&&i.push(l);else if("edit"==t){null!==e[l]&&void 0!==e[l]._category&&"content"==e[l]._category&&(void 0===e[l]._context||"block"!=e[l]._context)&&i.push(l)}else void 0===t&&i.push(l)}return i},_propInput=function(e,t,o,i,l){var a,n="";if(null!==e&&void 0!==e._widget&&(a=e._widget),void 0===a)throw"Unknown data type for "+t;var s="focusable: true";if("edit"==i&&(s+=", event: { focus: function(ui, event) { $($element).click(); } } "),n+='<label class="data-'+a+'"'+("boolean"==a?" data-bind=\"event: { mousedown: function(ui, evt) { if (evt.button == 0) { var input = $($element).find('input'); var ch = input.prop('checked'); setTimeout(function() { input.click(); input.prop('checked', !ch); input.trigger('change'); }, 0); } } }, click: function(ui, evt) { evt.preventDefault(); }, clickBubble: false\"":"")+">",void 0!==l&&void 0!==l[a]){var d=l[a],r={};if(void 0!==d.parameters)for(var c in d.parameters)d.parameters.hasOwnProperty(c)&&void 0!==e["_"+c]&&(r[c]=e["_"+c]);n+=d.html(o,s,r)}else if("boolean"==a)n+='<input type="checkbox" value="nothing" data-bind="checked: '+o+", "+s+'" />',n+='<span class="checkbox-replacer" ></span>';else if("color"==a)n+='<input size="7" type="text" data-bind="colorpicker: { color: '+o+", strings: $root.t('Theme Colors,Standard Colors,Web Colors,Theme Colors,Back to Palette,History,No history yet.') }, , "+s+'" />';else if("select"==a){if(void 0!==e._options){var p=_getOptionsObject(e._options);for(var v in n+='<select data-bind="value: '+o+", "+s+'">',p)p.hasOwnProperty(v)&&(n+='<option value="'+v+"\" data-bind=\"text: $root.ut('template', '"+utils.addSlashes(p[v])+"')\">"+p[v]+"</option>");n+="</select>"}}else if("font"==a)n+='<select type="text" data-bind="value: '+o+", "+s+'">',n+='<optgroup label="Sans-Serif Fonts">',n+='<option value="Arial,Helvetica,sans-serif">Arial</option>',n+="<option value=\"'Comic Sans MS',cursive,sans-serif\">Comic Sans MS</option>",n+='<option value="Impact,Charcoal,sans-serif">Impact</option>',n+="<option value=\"'Trebuchet MS',Helvetica,sans-serif\">Trebuchet MS</option>",n+='<option value="Verdana,Geneva,sans-serif">Verdana</option>',n+="</optgroup>",n+='<optgroup label="Serif Fonts">',n+='<option value="Georgia,serif">Georgia</option>',n+="<option value=\"'Times New Roman',Times,serif\">Times New Roman</option>",n+="</optgroup>",n+='<optgroup label="Monospace Fonts">',n+="<option value=\"'Courier New',Courier,monospace\">Courier New</option>",n+="</optgroup>",n+="</select>";else if("url"==a)n+='<div class="ui-textbutton">',n+='<input class="ui-textbutton-input" size="7" type="url" pattern="(mailto:.+@.+|https?://.+\\..+|\\[.*\\].*)" value="nothing" data-bind="css: { withButton: typeof $root.linkDialog !== \'undefined\' }, validatedValue: '+o+", "+s+'" />',n+="<a class=\"ui-textbutton-button\" data-bind=\"visible: typeof $root.linkDialog !== 'undefined', click: typeof $root.linkDialog !== 'undefined' ? $root.linkDialog.bind($element.previousSibling) : false, button: { icons: { primary: 'fa fa-fw fa-ellipsis-h' }, label: 'Opzioni', text: false }\">Opzioni</a>",n+="</div>";else if("integer"==a){var u=0,b=1e3;null!==e&&void 0!==e._max&&(b=e._max),null!==e&&void 0!==e._min&&(u=e._min);var f=b-u>=100?10:1;n+='<input class="number-spinner" size="7" step="'+f+'" type="number" value="-1" data-bind="spinner: { min: '+u+", max: "+b+", page: "+5*f+", value: "+o+" }, valueUpdate: ['change', 'spin'], "+s+'" />'}else n+='<input size="7" type="text" value="nothing" data-bind="value: '+o+", "+s+'" />';return n+="</label>"},_getGlobalStyleProp=function(e,t,o,i){var l;return"object"==typeof t&&null!==t&&void 0===t._widget||void 0!==o&&void 0!==i&&i.length>0&&"object"==typeof e&&void 0!==e[i]&&(l=e[i]),l},_propEditor=function(e,t,o,i,l,a,n,s,d,r,c,p,v,u,b){if(void 0===d&&(d=0),void 0!==n&&"object"==typeof i&&null!==i&&void 0===i._usecount)return console.log("TODO EDITOR ignoring",a,"property because it is not used by the template","prop:",n,"type:",s,"level:",d,e._templateName),"";var f,h=void 0!==p?n+"._defaultComputed":n,m="",g=h,_=1,k=1;if("object"==typeof i&&null!==i&&void 0===i._widget||void 0===p&&(_+=1),void 0===p&&void 0!==r&&(k+=r),void 0!==n&&v&&(m+="\x3c!-- ko ifSubs: { data: "+g+", threshold: "+k+", gutter: "+_+" } --\x3e"),void 0===n||null!==i&&void 0!==i._name||console.log("TODO WARN Missing label for property ",n),void 0===n&&null!==i&&void 0===i._name&&console.log("TODO WARN Missing label for object ",i.type),"object"==typeof i&&null!==i&&void 0===i._widget){var y=_filterProps(i,s,d),x="styler"==s&&null!==i&&void 0!==i.customStyle&&void 0!==p,S="",w="";void 0!==n&&"edit"==s&&(S=", click: function(obj, evt) { $root.selectItem("+n+", $data); return false }, clickBubble: false, css: { selecteditem: $root.isSelectedItem("+n+") }, scrollIntoView: $root.isSelectedItem("+n+"), ",w+=" selectable"),x&&(w+=" supportsCustomStyles"),m+='<div class="objEdit level'+d+w+'" data-bind="tooltips: {}'+S+'">';var $,D,j,B=null!==i&&void 0!==i._name?i._name:void 0!==n?"["+n+"]":"";if(x){var E="Stile";void 0!==l&&null!==l&&void 0!==l._name?E=l._name:console.log("TODO missing label for theme section ",n,null!==i?i.type:"-"),B="<span class=\"blockSelectionMethod\" data-bind=\"text: customStyle() ? $root.ut('template', '"+utils.addSlashes(B)+"') : $root.ut('template', '"+utils.addSlashes(E)+"')\">Block</span>"}else B="<span data-bind=\"text: $root.ut('template', '"+utils.addSlashes(B)+"')\">"+B+"</span>";if(m+="<span"+(f=null!==i&&void 0!==i._help?' title="'+utils.addSlashes(i._help)+"\" data-bind=\"attr: { title: $root.ut('template', '"+utils.addSlashes(i._help)+"') }\"":"")+' class="objLabel level'+d+'">'+B+"</span>","edit"==s&&void 0!==i._blockDescription&&(m+="<div class=\"blockDescription\" data-bind=\"html: $root.ut('template', '"+utils.addSlashes(i._blockDescription)+"')\">"+i._blockDescription+"</div>"),x&&(m+='<label class="data-boolean blockCheck" data-bind="tooltips: { }">',m+='<input type="checkbox" value="nothing" data-bind="focusable: true, checked: customStyle" />',m+='<span title="Switch between global and block level styles editing" data-bind="attr: { title: $root.t(\'Switch between global and block level styles editing\') }" class="checkbox-replacer checkbox-replacer-onoff"></span>',m+="</label>",m+="\x3c!-- ko template: { name: 'customstyle', if: customStyle } --\x3e\x3c!-- /ko --\x3e"),void 0!==n)if(m+="\x3c!-- ko with: "+n+" --\x3e",1==d&&void 0!==n)if(void 0!==i._previewBindings&&void 0!==e)void 0!==u&&(m+='\x3c!-- ko with: $root.content() --\x3e<div class="objPreview" data-bind="'+u+'"></div>\x3c!-- /ko --\x3e'),void 0!==b&&(m+='\x3c!-- ko with: $parent --\x3e<div class="objPreview" data-bind="'+b+'"></div>\x3c!-- /ko --\x3e'),m+='<div class="objPreview"><div class="objPreviewInner" data-bind="'+elaborateDeclarations(void 0,i._previewBindings,o,e.bind(this,a+"."))+'"></div></div>';0===d&&void 0!==i._previewBindings&&($=elaborateDeclarations(void 0,i._previewBindings,o,e.bind(this,a.length>0?a+".":"")));var O,T=m.length;for(D=0;D<y.length;D++)j=a.length>0?a+"."+y[D]:y[D],"object"==typeof i[y[D]]&&null!==i[y[D]]&&void 0===i[y[D]]._widget||(O=void 0,0===d&&"theme"==y[D]?m+=_propEditor(e,t,o,i[y[D]],void 0,j,y[D],s,0,r,void 0,void 0,v,u):(O=_getGlobalStyleProp(c,i[y[D]],y[D],j),m+=_propEditor(e,t,o,i[y[D]],void 0,j,y[D],s,d+1,r,c,O,v,u,$)));for(D=0;D<y.length;D++)j=a.length>0?a+"."+y[D]:y[D],"object"==typeof i[y[D]]&&null!==i[y[D]]&&void 0===i[y[D]]._widget&&(O=void 0,0===d&&"theme"==y[D]?m+=_propEditor(e,t,o,i[y[D]],void 0,j,y[D],s,0,r,void 0,void 0,v,u):(O=_getGlobalStyleProp(c,i[y[D]],y[D],j),m+=_propEditor(e,t,o,i[y[D]],void 0,j,y[D],s,d+1,r,c,O,v,u,$)));if(0===m.length-T){if("object"==typeof i&&null!==i&&"template"==i._context)return"";m+='<div class="objEmpty" data-bind="html: $root.t(\'Selected element has no editable properties\')">Selected element has no editable properties</div>'}void 0!==n&&(m+="\x3c!-- /ko --\x3e"),m+="</div>"}else{var C=!0;if(void 0===c&&(C=!1),null===i||"object"!=typeof i||void 0!==i._widget){var I=[];void 0!==p&&I.push("css: { notnull: "+n+"() !== null }"),(f=null!==i&&void 0!==i._help?' title="'+utils.addSlashes(i._help)+"\" data-bind=\"attr: { title: $root.ut('template', '"+utils.addSlashes(i._help)+"') }\"":"").length>0&&I.push("tooltips: {}");var P=I.length>0?'data-bind="'+utils.addSlashes(I.join())+'"':"";m+='<div class="propEditor '+(C?"checkboxes":"")+'"'+P+">";var N=null!==i&&void 0!==i._name?i._name:void 0!==n?"["+n+"]":"";m+="<span"+f+' class="propLabel">'+(N="<span data-bind=\"text: $root.ut('template', '"+utils.addSlashes(N)+"')\">"+N+"</span>")+"</span>",m+='<div class="propInput '+(void 0!==c?"local":"")+'" data-bind="css: { default: '+n+'() === null }">',m+=_propInput(i,n,h,s,t),m+="</div>",void 0!==p&&(m+='<div class="propInput global" data-bind="css: { overridden: '+n+'() !== null }">',m+=_propInput(i,n,p,s,t),m+="</div>",C&&(m+='<div class="propCheck"><label data-bind="tooltips: {}"><input type="checkbox" data-bind="focusable: true, click: function(evt, obj) { $root.localGlobalSwitch('+n+", "+p+"); return true; }, checked: "+n+'() !== null">',m+='<span class="checkbox-replacer" data-bind="css: { checked: '+n+"() !== null }, attr: { title: $root.t('This style is specific for this block: click here to remove the custom style and revert to the theme value') }\"></span>",m+="</label></div>")),m+="</div>"}else m+=null===i||"object"!=typeof i?'<div class="propEditor unknown">[A|'+n+"|"+typeof i+"]</div>":'<div class="propEditor unknown">[B|'+n+"|"+typeof i+"]</div>"}return void 0!==n&&v&&(m+="\x3c!-- /ko --\x3e",m+="\x3c!-- ko ifSubs: { not: true, data: "+g+", threshold: "+k+", gutter: 0 } --\x3e",m+='<span class="label notused">('+n+")</span>",m+="\x3c!-- /ko --\x3e"),m},createBlockEditor=function(e,t,o,i,l,a,n,s,d,r,c,p){void 0===c&&(c=!0);var v,u=modelDef.getDef(e,a),b=modelDef.getDef(e,l);void 0!==b._previewBindings&&"thaeme"!=a&&"styler"==n&&(v=elaborateDeclarations(void 0,b._previewBindings,i,modelDef.getBindValue.bind(void 0,e,o,l,l,"")));var f,h=void 0!==r&&r?e[a]._globalStyles:void 0,m=void 0!==r&&r?e[a]._globalStyle:void 0;void 0!==m&&(f=modelDef.getDef(e,"theme")[m.replace(/^(\$theme|_theme_)\./,"")]);var g=modelDef.getBindValue.bind(void 0,e,o,l,a);g._templateName=a;var _='<div class="editor">';_+='<div class="blockType'+(void 0!==h?" withdefaults":"")+'">'+u.type+"</div>";var k=_propEditor(g,t,i,u,f,"",void 0,n,p,d,h,m,c,v);k.length>0&&(_+=k),s(_+="</div>",a,n)},createBlockEditors=function(e,t,o,i,l,a,n,s){createBlockEditor(e,t,o,i,l,a,"edit",n,s),createBlockEditor(e,t,o,i,l,a,"styler",n,s,!0)},generateEditors=function(e,t,o,i,l){var a,n=e._defs,s=e.templateName,d=e._blocks,r=[];for(a=0;a<d.length;a++)void 0!==d[a].container&&r.push(modelDef.generateModel(n,d[a].block)),createBlockEditors(n,t,void 0,o,d[a].root,d[a].block,i,l);return void 0!==n.theme&&createBlockEditor(n,t,void 0,o,s,"theme","styler",i,void 0,!1,!1,-1),r};module.exports=generateEditors;
|
|
|
|
},{"./declarations.js":48,"./model.js":52,"./utils.js":55,"console-browserify":3}],51:[function(require,module,exports){
|
|
"use strict";var modelDef=require("./model.js"),wrappedResultModel=function(e){var r=e._defs,t=e.templateName,l=modelDef.getDef(r,t),a=modelDef.generateResultModel(e);return require("./wrapper.js")(a,l,r)},translateTemplate=function(){var e=require("./parser.js");return e.apply(e,arguments)},generateEditors=function(){var e=require("./editor.js");return e.apply(e,arguments)},checkModel=function(){var e=require("./checkmodel.js");return e.apply(e,arguments)};module.exports={translateTemplate:translateTemplate,wrappedResultModel:wrappedResultModel,generateResultModel:modelDef.generateResultModel,generateEditors:generateEditors,checkModel:checkModel};
|
|
|
|
},{"./checkmodel.js":47,"./editor.js":50,"./model.js":52,"./parser.js":53,"./wrapper.js":56}],52:[function(require,module,exports){
|
|
"use strict";var objExtend=require("./domutils.js").objExtend,console=require('console-browserify'),_valueSet=function(e,t,o,l){var r=o.indexOf(".");if(-1==r)if(void 0===t[o])console.log("Undefined prop "+o+" while setting value "+l+" in model._valueSet");else if(null===t[o])"object"==typeof l&&null!==l&&void 0===l.push&&console.log("nullpropobjectvalue",o,l),t[o]=l;else if("object"==typeof t[o]&&"function"==typeof t[o].push){var n;if("string"==typeof l){var i=l.match(/^\[(.*)\]$/);if(null===i)throw"Unexpected default value for array property "+o+": "+l;n=i[1].split(",")}else{if("object"!=typeof l||void 0===l.push)throw"Unexpected default value for array property "+o+": "+l+" typeof "+typeof l;n=l}for(var a=[],d=0;d<n.length;d++)"@"==n[d].substr(0,1)?a.push(_generateModel(e,n[d].substr(1))):n[d].length>0&&a.push(n[d]);t[o]=a}else"string"==typeof t[o]||"boolean"==typeof t[o]?t[o]=l:"object"==typeof t[o]&&null!==t[o]&&void 0!==t[o]._widget?("object"==typeof l&&null!==l&&console.log("objectvalue",o,t[o]._widget,l),t[o]=l):console.log("setting",typeof t[o],t[o],o,l);else{var f=o.substr(0,r);_valueSet(e,t[f],o.substr(r+1),l)}},_modelCreateOrUpdateBlockDef=function(e,t,o,l){if(void 0!==e[t]&&e[t]._initialized&&!e[t]._writeable)throw console.log("_modelCreateOrUpdateBlockDef",e,t,o,l),"Trying to alter non writeable model: "+t+" / "+o;if(void 0===e[t]&&(e[t]={_writeable:!0},void 0===l&&(l={}),void 0===l.category&&void 0===e[t]._category&&(t.match(/(^t|.T)heme$/)||t.match(/(^s|.S)tyle$/)||t.match(/(^c|.C)olor$/)||t.match(/(^r|.R)adius$/)?l.category="style":l.category="content")),void 0!==l){if(void 0!==l.name&&(e[t]._name=l.name),void 0!==l.themeOverride&&(e[t]._themeOverride=l.themeOverride),void 0!==l.globalStyle){e[t]._globalStyle=l.globalStyle;var r=l.globalStyle.replace(/^(\$theme|_theme_)\./,""),n=r.indexOf("."),i=-1!=n?r.substr(0,n):r;_modelCreateOrUpdateBlockDef(e,"theme",i),(void 0===e[t]._themeOverride||e[t]._themeOverride)&&_modelCreateOrUpdateBlockDef(e,t,"customStyle=false")}void 0!==l.contextName&&(e[t]._context=l.contextName,"block"==l.contextName&&void 0===e[t]._globalStyle&&(e[t]._globalStyle="_theme_.bodyTheme",_modelCreateOrUpdateBlockDef(e,"theme","bodyTheme"),(void 0===e[t]._themeOverride||e[t]._themeOverride)&&_modelCreateOrUpdateBlockDef(e,t,"customStyle=false"))),void 0!==l.extend&&(e[t].type=l.extend)}for(var a in l)l.hasOwnProperty(a)&&void 0!==l[a]&&-1==["name","extend","contextName","globalStyle","themeOverride"].indexOf(a)&&(e[t]["_"+a]=l[a]);void 0!==o&&o.length>0&&(e[t]._props=void 0!==e[t]._props&&e[t]._props.length>0?e[t]._props+" "+o:o)},_removePrefix=function(e){var t=e.match(/^[^A-Z]+([A-Z])(.*)$/);return null!==t?t[1].toLowerCase()+t[2]:null},_generateModelFromDef=function(e,t){var o={};for(var l in e)if(!l.match(/^_.*/)&&e.hasOwnProperty(l)){var r=e[l];if("object"==typeof r&&null!==r&&void 0!==r._complex&&r._complex)o[l]=_generateModelFromDef(r,t);else if("type"==l)o[l]=r;else{if("object"!=typeof r)throw console.error("Unexpected model def",l,r,e),"Unexpected model def ["+l+"]="+r;o[l]=null}}if(void 0!==e._defaultValues){var n=e._defaultValues;for(var i in n)n.hasOwnProperty(i)&&_valueSet(t,o,i,n[i])}return o},_generateModel=function(e,t){var o=_getModelDef(e,t,!1,!0);return _generateModelFromDef(o,e)},_getDef=function(e,t){return _getModelDef(e,t,!1,!0)},_getModelDef=function(e,t,o,l){if(void 0===e[t]){if(-1!=t.indexOf(" "))return null;var r=_removePrefix(t);return null!==r?_getModelDef(e,r,o,l):null}var n=e[t];if("object"!=typeof n)throw"Block definition must be an object: found "+n+" for "+t;if(void 0===n._initialized){if(void 0===n.type&&(-1==t.indexOf(" ")?n.type=t:n.type=t.substr(t.indexOf(" ")+1)),n.type!=t&&void 0===n._widget){var i=_getModelDef(e,n.type,!0);n=objExtend(i,n),e[t]=n}else void 0===n._widget&&void 0===n._props&&n._complex;n._writeable=!0,n._initialized=!0}if(void 0!==n._props){var a=n._props;if((a=a.split(" ")).length>0&&void 0===n._writeable)throw console.error("Altering a non writable object ",t,a,n),"Altering a non writable object: "+t+" def: "+a;void 0===n._processedDefs&&(n._processedDefs={}),void 0===n._globalStyles&&(n._globalStyles={}),void 0===n._defaultValues&&(n._defaultValues={});for(var d=0;d<a.length;d++){var f=a[d];if(0!==f.length){var s=f,u=null,c=f.match(/^([^=\[\]]+)(\[\])?(=?)(.*)$/);if(null!==c&&(f=c[1],"[]"==c[2]&&(void 0===n[f]&&(n[f]=[]),u=[]),"="==c[3]&&(u=f.match(/(^v|V)isible$/)?"true"==String(c[4]).toLowerCase():f.match(/^customStyle$/)?"true"==String(c[4]).toLowerCase():c[4])),null!==u&&void 0===n._defaultValues[f]&&(n._defaultValues[f]=u),void 0===n[f]){var _=_getModelDef(e,t+" "+f,!0);null===_&&(_=_getModelDef(e,f,!0)),n[f]=_}n._processedDefs[f]=s,n._complex=!0}}delete n._props}if(o)return n._writeable=!1,objExtend({},n);if(l)return n._writeable=!1,n;if(void 0===n._writeable||!1===n._writeable)throw"Retrieving non writeable object definition: "+t;return n},_increaseUseCount=function(e,t){if(e){if(void 0===t._usecount)throw console.error("ERROR trying to bind an unused property while readonly",t),"ERROR trying to bind an unused property"}else void 0===t._usecount&&(t._usecount=0),t._usecount++},ensureGlobalStyle=function(e,t,o,l,r,n,i,a){var d=o(n,i,a);if(void 0===e[l]._globalStyles[r]){if(t)throw"Cannot find _globalStyle for "+r+" in "+l+"!";(-1!=r.indexOf(".")||"object"==typeof e[l][r]&&void 0!==e[l][r]._widget)&&(e[l]._globalStyles[r]=d)}else if(e[l]._globalStyles[r]!=d)throw"Unexpected conflicting globalStyle [2] for "+l+"/"+r+": old="+e[l]._globalStyles[r]+" new="+d},modelEnsurePathAndGetBindValue=function(e,t,o,l,r,n,i,a,d,f){var s,u,c;if("$"==i.substr(0,1)){console.warn("DEPRECATED $ in bindingProvider: ",i,r);var _=i.indexOf(".");if(-1==_)throw"Unexpected fullPath: "+i+"/"+n+"/"+r+"/"+a+"/"+d;if(s=i.substr(1,_-1),c=i.substr(_+1),"theme"!=s)throw"Unexpected $ sequence: "+s+" in "+i;var v=c.indexOf(".");u="$root.content().theme()."+(s=c.substr(0,v))+"()."+(c=c.substr(v+1)).replace(new RegExp("\\.","g"),"().")}else if("#"==i.substr(0,1))console.warn("DEPRECATED # in bindingProvider: ",i,r),s=l,u="$root.content()."+(c=i.substr(1)).replace(new RegExp("\\.","g"),"().");else if("_theme_."==i.substr(0,8)){var p=i.indexOf(".",8);u="$root.content().theme()."+(s=i.substr(8,p-8))+"()."+(c=i.substr(p+1)).replace(new RegExp("\\.","g"),"().")}else"_root_."==i.substr(0,7)?(s=l,u="$root.content()."+(c=i.substr(7)).replace(new RegExp("\\.","g"),"().")):(s=r,c=n+i,u=i.replace(new RegExp("\\.","g"),"()."));if(void 0===t[s])throw"Cannot find model def for ["+s+"]";var g,b=c.indexOf("."),h=-1==b?c:c.substr(0,b);if(-1!=s.indexOf("-"))throw console.error("ERROR cannot use - for block names",s),"ERROR unexpected char in block name: "+s;if(-1!=h.indexOf("-"))throw console.error("ERROR cannot use - for property names",h),"ERROR unexpected char in property name: "+s;if(e)return void 0!==t[s]._globalStyle&&void 0!==t[s][h]&&"style"==t[s][h]._category&&(u+="._defaultComputed"),u;if(e){if(void 0!==a)throw"Cannot use defaultValue in readonly mode!";if(d)throw"Cannot use overrideDefault in readonly mode for "+s+"/"+c+"/"+d+"!";if(void 0!==f)throw"Cannot set category for "+s+"/"+c+"/"+f+" in readonly mode!";g=_getModelDef(t,s,!1,!0)}else!1===t[s]._writeable&&console.log("TODO debug use cases for this condition",s,c),g=_getModelDef(t,s,!1===t[s]._writeable);if(null===g)throw"Unexpected model for ["+s+"]";if(void 0===g[h]){if(e)throw"Cannot find path "+h+" for "+s+"!";_modelCreateOrUpdateBlockDef(t,s,h),g=_getModelDef(t,s,!1)}void 0!==t[s]._globalStyle&&void 0!==t[s][h]&&null!==t[s][h]&&"style"==t[s][h]._category&&(u+="._defaultComputed");var y=g;try{if(_increaseUseCount(e,y),-1!=b){var m=c;do{var w=m.substr(0,b);if(void 0===y[w])throw"Found an unexpected prop "+w+" for model "+s+" for "+c;y=y[w],_increaseUseCount(e,y),b=(m=m.substr(b+1)).indexOf(".")}while(-1!=b);if(void 0===y[m]||null===y[m])throw"Found an unexpected path termination "+m+" for model "+s+" for "+c;y=y[m]}else y=y[c];if(void 0===y||null===y)throw"Unexpected null model for "+s+"/"+n+"/"+i;void 0!==f&&(y._category=f),_increaseUseCount(e,y)}catch(e){throw console.error("TODO ERROR Property lookup exception",e,s,c,r,i,t),e}if(void 0!==t[s]._globalStyle&&"object"==typeof t[s][h]&&null!==t[s][h]&&void 0!==t[s][h]._category&&"style"==t[s][h]._category){var x=modelEnsurePathAndGetBindValue.bind(void 0,e,t,o,l,r,""),O=-1!=c.indexOf(".")?c.substr(c.indexOf(".")):"";if(-1!=O.indexOf(".",1))throw"TODO unsupported object nesting! "+c;var D=t[s]._globalStyle+"."+h;"object"==typeof t[s][h]&&null!==t[s][h]&&void 0!==t[s][h]._globalStyle&&(D=t[s][h]._globalStyle),ensureGlobalStyle(t,e,x,s,h,D,void 0,!1);var S=D+O;if(void 0===a&&null!==t[s]._defaultValues[c]&&(a=t[s]._defaultValues[c]),ensureGlobalStyle(t,e,x,s,c,S,a,d),void 0!==a){if(e)throw console.error("Cannot set a new theme default value",S.substr(7),a,"while in readonly mode"),"Cannot set a new theme default value ("+a+") for "+S.substr(7)+" while in readonly mode!";o("default",S.substr(7),a)}a=null}if(void 0!==a)if(void 0===t[s]._defaultValues[c]||void 0!==d&&d){if(e)throw"Cannot set new _defaultValues [1] for "+c+" in "+s+"!";t[s]._defaultValues[c]=a}else if(null===a){if(e&&null!==t[s]._defaultValues[c])throw"Cannot set new _defaultValues [2] for "+c+" in "+s+"!";t[s]._defaultValues[c]=null}else if(t[s]._defaultValues[c]!=a)throw console.error("TODO error!!! Trying to set a new default value for "+s+" "+c+" while it already exists (current: "+t[s]._defaultValues[c]+", new: "+a+")"),"Trying to set a new default value for "+s+" "+c+" while it already exists (current: "+t[s].defaultValues[c]+", new: "+a+")";return u},generateResultModel=function(e){var t=e._defs,o=e.templateName,l=_generateModel(t,o);return void 0!==t.theme&&(l.theme=_generateModel(t,"theme")),l};module.exports={ensurePathAndGetBindValue:modelEnsurePathAndGetBindValue.bind(void 0,!1),getBindValue:modelEnsurePathAndGetBindValue.bind(void 0,!0),generateModel:_generateModel,generateResultModel:generateResultModel,getDef:_getDef,createOrUpdateBlockDef:_modelCreateOrUpdateBlockDef};
|
|
|
|
},{"./domutils.js":49,"console-browserify":3}],53:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require('console-browserify'),converterUtils=require("./utils.js"),elaborateDeclarations=require("./declarations.js"),processStylesheetRules=require("./stylesheet.js"),modelDef=require("./model.js"),domutils=require("./domutils.js"),wrapElementWithCondition=function(t,e,o){var a=domutils.getAttribute(e,t);try{var i=converterUtils.conditionBinding(a,o);$(e).before("\x3c!-- ko if: "+i+" --\x3e"),$(e).after("\x3c!-- /ko --\x3e"),domutils.removeAttribute(e,t)}catch(o){throw console.warn("Model ensure path failed in if/variant",e,a,t),o}},replacedAttributes=function(t,e){domutils.setAttribute(t,e,domutils.getAttribute(t,"replaced"+e))},processStyle=function(t,e,o,a){var i,r=domutils.getAttribute(t,"replacedstyle"),l=null;a&&(i={uniqueId:"$data",attr:{id:"id"}});var d=null!==domutils.getAttribute(t,"data-ko-display");null===(l=elaborateDeclarations(r,void 0,e,o,t,i,d))?l=r:domutils.removeAttribute(t,"replacedstyle"),null!==l&&(l.trim().length>0?domutils.setAttribute(t,"style",l):domutils.removeAttribute(t,"style"))},_fixRelativePath=function(t,e,o,a){var i=e(domutils.getAttribute(a,t));null!==i&&domutils.setAttribute(a,t,i)},processBlock=function(t,e,o,a,i,r,l,d,s,c){try{var n;if("block"==r)n=domutils.getAttribute(t,"data-ko-block"),domutils.removeAttribute(t,"data-ko-block");else{if("template"!=r)throw"Unexpected context name while processing block: "+r;n=l}$("[data-ko-remove]",t).remove();for(var u=$("[data-ko-block]",t).replaceWith("<replacedblock>"),m=["href","src","data-ko-placeholder-src","background"],h=0;h<m.length;h++){var p=_fixRelativePath.bind(void 0,m[h],i);$("["+m[h]+"]",t).each(p)}var b=domutils.getAttribute(t,"data-ko-properties");null===b&&(b=""),$("[data-ko-properties]",t).each(function(t,e){b.length>0&&(b+=" "),b+=domutils.getAttribute(e,"data-ko-properties"),domutils.removeAttribute(e,"data-ko-properties")}),modelDef.createOrUpdateBlockDef(e,n,b,{contextName:r});var v=modelDef.ensurePathAndGetBindValue.bind(void 0,e,o,l,n,"");"block"==r&&v("id",""),$("style",t).each(function(t,a){var r=domutils.getInnerHtml(a),d=modelDef.createOrUpdateBlockDef.bind(void 0,e),s=modelDef.ensurePathAndGetBindValue.bind(void 0,e,o,l),u=processStylesheetRules(r,void 0,s,d,o,i,l,n);if(u!=r)if(""!==u.trim()){var m=c(u);domutils.setAttribute(a,"data-bind","template: { name: '"+m+"' }"),domutils.setContent(a,"")}else domutils.removeElements($(a))}),processStyle(t,i,v,s);for(var k=["data-ko-display","data-ko-editable","data-ko-wrap","href"],f=0;f<k.length;f++){if(domutils.getAttribute(t,k[f]))throw console.warn("ERROR: Unsupported "+k[f]+" used together with data-ko-block",t),"ERROR: Unsupported "+k[f]+" used together with data-ko-block"}return $("[data-ko-link]",t).each(function(t,e){var o=domutils.getAttribute(e,"data-ko-link"),a=domutils.getAttribute(e,"replacedstyle");void 0!==a&&null!==a||(a=""),a=""!==a?"-ko-attr-href: @"+o+"; "+a:"-ko-attr-href: @"+o,domutils.setAttribute(e,"replacedstyle",a),domutils.setAttribute(e,"data-ko-wrap",o),domutils.removeAttribute(e,"data-ko-link")}),$("[replacedstyle]",t).each(function(t,e){processStyle(e,i,v,!1)}),$("[replacedhttp-equiv]",t).each(function(t,e){replacedAttributes(e,"http-equiv")}),$("[data-ko-display]",t).each(function(t,e){wrapElementWithCondition("data-ko-display",e,v)}),$("[data-ko-editable]",t).each(function(t,e){var o,a,i,r,l,d,s=domutils.getAttribute(e,"data-ko-editable");if(s.lastIndexOf(".")>0){var n=s.substr(0,s.lastIndexOf("."));l=v(n)}else l=v(s);if(d="wysiwygClick: function(obj, evt) { $root.selectItem("+l+", $data); return false }, clickBubble: false, wysiwygCss: { selecteditem: $root.isSelectedItem("+l+") }, scrollIntoView: $root.isSelectedItem("+l+")","img"!=domutils.getLowerTagName(e)){a=domutils.getInnerHtml(e);var u=v(s,a,!0,"wysiwyg");if(o="",domutils.getAttribute(e,"id")||(o+="wysiwygId: id()+'_"+s.replace(".","_")+"', "),void 0!==d&&(o+=d+", "),o+="wysiwygOrHtml: "+u,"td"==domutils.getLowerTagName(e)){var m=$('<div data-ko-wrap="false" style="width: 100%; height: 100%"></div>')[0];domutils.setAttribute(m,"data-bind",o);var h=domutils.getInnerHtml($("<div></div>").append(m));domutils.setContent(e,h)}else r=(null!==(i=domutils.getAttribute(e,"data-bind"))?i+", ":"")+o,domutils.setAttribute(e,"data-bind",r),domutils.setContent(e,"");domutils.removeAttribute(e,"data-ko-editable")}else{var p=domutils.getAttribute(e,"width");if(""===p&&(p=null),null===p)throw console.error("ERROR: data-ko-editable images must declare a WIDTH attribute!",e),"ERROR: data-ko-editable images must declare a WIDTH attribute!";var b=domutils.getAttribute(e,"height");""===b&&(b=null);var k=domutils.getAttribute(e,"align"),f=(i=domutils.getAttribute(e,"data-bind"))&&i.match(/virtualAttr: {[^}]* height: ([^,}]*)[,}]/);f&&(b=f[1]);var g=i&&i.match(/virtualAttr: {[^}]* width: ([^,}]*)[,}]/);g&&(p=g[1]);var w,A,y="";(a=domutils.getAttribute(e,"data-ko-placeholder-src"))?y=domutils.getAttribute(e,"src"):a=domutils.getAttribute(e,"src"),p&&b?w=p+"+'x'+"+b:b?p||(w="'h'+"+b+"+''"):w="'w'+"+p+"+''";var x=b||domutils.getAttribute(e,"data-ko-placeholder-height"),_=p||domutils.getAttribute(e,"data-ko-placeholder-width");if(domutils.removeAttribute(e,"src"),domutils.removeAttribute(e,"data-ko-editable"),domutils.removeAttribute(e,"data-ko-placeholder-height"),domutils.removeAttribute(e,"data-ko-placeholder-width"),domutils.removeAttribute(e,"data-ko-placeholder-src"),a&&(A="{ width: "+_+", height: "+x+", text: "+w+"}"),!_||!x)throw console.error("IMG data-ko-editable must declare width and height attributes, or their placeholder counterparts data-ko-placeholder-width/data-ko-placeholder-height",e),"ERROR: IMG data-ko-editable MUST declare width and height attributes, or their placeholder counterparts data-ko-placeholder-width/data-ko-placeholder-height";var D=v(s,y,!1,"wysiwyg");o="wysiwygSrc: { width: "+p+", height: "+b+", src: "+D+", placeholder: "+A+" }",r=(null!==i?i+", ":"")+o,domutils.setAttribute(e,"data-bind",r);var R=c(e),B="{ width: "+p;"left"==k?B+=", float: 'left'":"right"==k?B+=", float: 'right'":"center"==k?console.log("non so cosa fa align=center su una img e quindi non so come simularne l'editing"):"top"==k?B+=", verticalAlign: 'top'":"middle"==k?B+=", verticalAlign: 'middle'":"bottom"==k&&(B+=", verticalAlign: 'bottom'"),B+="}",$(e).before("\x3c!-- ko wysiwygImg: { _data: $data, _item: "+l+", _template: '"+R+"', _editTemplate: 'img-wysiwyg', _src: "+D+", _width: "+p+", _height: "+b+", _align: "+(null===k?void 0:"'"+k+"'")+", _size: "+w+", _method: "+void 0+", _placeholdersrc: "+A+", _stylebind: "+B+" } --\x3e"),$(e).after("\x3c!-- /ko --\x3e")}}),$("[href]",t).each(function(t,e){var o=domutils.getAttribute(e,"href"),a="wysiwygHref: '"+converterUtils.addSlashes(o)+"'",i=domutils.getAttribute(e,"data-bind"),r=(null!==i?i+", ":"")+a;domutils.setAttribute(e,"data-bind",r)}),$("replacedblock",t).each(function(t,r){var s=u[t],m=processBlock(s,e,o,a,i,"block",n,d,!0,c),h=modelDef.ensurePathAndGetBindValue(e,o,l,n,"",m);$(r).before("\x3c!-- ko block: { data: "+converterUtils.addSlashes(h)+", template: 'block' } --\x3e"),$(r).after("\x3c!-- /ko --\x3e"),$(r).remove()}),$($("[data-ko-wrap]",t).get().reverse(),t).each(function(t,e){var o=domutils.getAttribute(e,"data-ko-wrap");if(void 0===o||""===o||"true"===o)throw"Unsupported empty value for data-ko-wrap: use false value if you want to always remove the tag";var a,i,r=converterUtils.conditionBinding(o,v),l=domutils.getAttribute(e,"data-bind");if(""!==l&&null!==l&&l.match(/(block|wysiwygOrHtml):/)){var d="\x3c!-- ko "+l+" --\x3e"+domutils.getInnerHtml(e)+"\x3c!-- /ko --\x3e";a=c(d),domutils.removeAttribute(e,"data-ko-wrap"),i=c(e),domutils.replaceHtml(e,"\x3c!-- ko template: /* special */ (typeof templateMode != 'undefined' && templateMode == 'wysiwyg') || "+r+" ? '"+i+"' : '"+a+"' --\x3e\x3c!-- /ko --\x3e")}else a=c(domutils.getInnerHtml(e)),domutils.removeAttribute(e,"data-ko-wrap"),domutils.setContent(e,"\x3c!-- ko template: '"+a+"' --\x3e\x3c!-- /ko --\x3e"),i=c(e),domutils.replaceHtml(e,"\x3c!-- ko template: (typeof templateMode != 'undefined' && templateMode == 'wysiwyg') || "+r+" ? '"+i+"' : '"+a+"' --\x3e\x3c!-- /ko --\x3e")}),c(t,n,"show"),a(l,n,r,d),n}catch(e){throw console.error("Exception while parsing the template",e,t),e}};function conditional_replace(t){return t.replace(/<!--\[if ([^\]]*)\]>((?:(?!--)[\s\S])*?)<!\[endif\]-->/g,function(t,e,o){var a="\x3c!-- cc:start --\x3e";a+=o.replace(/<([A-Za-z:]+)/g,"\x3c!-- cc:bo:$1 --\x3e<cc").replace(/<\/([A-Za-z:]+)>/g,"\x3c!-- cc:bc:$1 --\x3e</cc>\x3c!-- cc:ac:$1 --\x3e").replace(/\/>/g,"/>\x3c!-- cc:sc --\x3e"),a+="\x3c!-- cc:end --\x3e";var i='<replacedcc condition="'+e+'" style="display: none">';return i+=$("<div>").append($(a)).html().replace(/^<!-- cc:start -->/,"").replace(/<!-- cc:end -->$/,""),i+="</replacedcc>"})}var translateTemplate=function(t,e,o,a){var i={},r=conditional_replace(e.replace(/(<[^>]+\s)(style|http-equiv)(="[^"]*"[^>]*>)/gi,function(t,e,o,a){return e+"replaced"+o+a})),l=$(r),d=l[0],s=[],c=function(t,e,o,a){s.push({root:t,block:e,context:o,container:a})},n=function(t,e,o){if(void 0===i.themes&&(i.themes={}),void 0===i.themes[t]&&(i.themes[t]={}),void 0===i.themes[t][e]||null===i.themes[t][e])i.themes[t][e]=o;else if(void 0!==o&&null!==o){var a=i.themes[t][e];a!=o&&console.log("Error setting a new default for property "+e+" in theme "+t+". old:"+a+" new:"+o+"!")}},u={};$("[data-ko-container]",l).each(function(t,e){var o=domutils.getAttribute(e,"data-ko-container")+"Blocks";domutils.removeAttribute(e,"data-ko-container"),domutils.setAttribute(e,"data-bind","block: "+o);var a=$("> [data-ko-block]",e);domutils.removeElements(a,!0),u[o]=a}),modelDef.createOrUpdateBlockDef(i,"id"),modelDef.createOrUpdateBlockDef(i,"bodyTheme"),modelDef.createOrUpdateBlockDef(i,"blocks","blocks[]"),modelDef.createOrUpdateBlockDef(i,"text"),processBlock(d,i,n,c,o,"template",t,void 0,!1,a);var m=function(e,r,l){processBlock(l,i,n,c,o,"block",t,e,!0,a)};for(var h in u)if(u.hasOwnProperty(h)){var p=u[h],b=h;modelDef.ensurePathAndGetBindValue(i,n,t,t,"",b+".blocks","[]"),p.each(m.bind(void 0,b))}var v={_defs:i,templateName:t,_blocks:s};return void 0!==i[t]._version&&(v.version=i[t]._version),v};module.exports=translateTemplate;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./declarations.js":48,"./domutils.js":49,"./model.js":52,"./stylesheet.js":54,"./utils.js":55,"console-browserify":3}],54:[function(require,module,exports){
|
|
"use strict";var cssParse=require("mensch/lib/parser.js"),console=require('console-browserify'),converterUtils=require("./utils.js"),elaborateDeclarations=require("./declarations.js"),_processStyleSheetRules_processBlockDef=function(e,t){for(var o,s,r,l=0;l<t.length;l++)if("rule"==t[l].type){for(var n=t[l].selectors,a=!1,i=!1,c=0;c<n.length;c++)n[c].match(/:preview$/)?i=!0:a=!0;if(i&&a)throw console.log("cannot mix selectors type (:preview and declarations) in @supports -ko-blockdefs ",n),"Cannot mix selectors type (:preview and declarations) in @supports -ko-blockdefs";if(!i&&!a)throw console.log("cannot find known selectors in @supports -ko-blockdefs ",n),"Cannot find known selectors in @supports -ko-blockdefs";if(a){o="",s={},r=t[l].declarations;for(var p=0;p<r.length;p++)"property"==r[p].type&&("label"==r[p].name?s.name=r[p].value:"context"==r[p].name?s.contextName=r[p].value:"properties"==r[p].name?o=r[p].value:"theme"==r[p].name?s.globalStyle="_theme_."+r[p].value:"themeOverride"==r[p].name?s.themeOverride="true"==String(r[p].value).toLowerCase():s[r[p].name]=r[p].value);for(var u=0;u<n.length;u++)e(n[u],o,s)}if(i)for(var d=0;d<n.length;d++){e(n[d].substr(0,n[d].indexOf(":")),void 0,{previewBindings:t[l].declarations})}}},processStylesheetRules=function(e,t,o,s,r,l,n,a){var i,c=e,p=null;if(void 0===t){var u=cssParse(e,{comments:!0,position:!0});if("stylesheet"!=u.type||void 0===u.stylesheet)throw console.log("unable to process styleSheet",u),"Unable to parse stylesheet";t=u.stylesheet.rules}for(var d=t.length-1;d>=0;d--){if("supports"==t[d].type&&"-ko-blockdefs"==t[d].name)_processStyleSheetRules_processBlockDef(s,t[d].rules),c=converterUtils.removeStyle(c,t[d].position.start,p,0,0,0,"");else if("media"==t[d].type||"supports"==t[d].type)c=processStylesheetRules(c,t[d].rules,o,s,r,l,n,a);else if("comment"==t[d].type);else if("rule"==t[d].type){for(var v=t[d].selectors,f="",h=null,y=0;y<v.length;y++){f.length>0&&(f+=", ");var m=v[y].match(/\[data-ko-block=([^ ]*)\]/);if(null!==m){if(null!==h&&h!=m[1])throw"Found multiple block-match attribute selectors: cannot translate it ("+h+" vs "+m[1]+")";h=m[1]}f+="\x3c!-- ko text: templateMode =='wysiwyg' ? '#main-wysiwyg-area ' : '' --\x3e\x3c!-- /ko --\x3e"+v[y]}if(h){var k="\x3c!-- ko foreach: $root.findObjectsOfType($data, '"+h+"') --\x3e",x=p,g=" ";t[d].declarations.length>0&&(t[d].declarations[0].position.start.line!=t[d].position.end.line&&(g="\n"+new Array(t[d].position.start.col).join(" ")),x=t[d].declarations[t[d].declarations.length-1].position.end),null===x?c+=g+"\x3c!-- /ko --\x3e":c=x==p?converterUtils.removeStyle(c,x,p,0,0,0,g+"\x3c!-- /ko --\x3e"):converterUtils.removeStyle(c,x,p,0,0,0,g+"}"+g+"\x3c!-- /ko --\x3e"),f=k+g+f.replace(new RegExp("\\[data-ko-block="+h+"\\]","g"),"\x3c!-- ko text: '#'+id() --\x3e"+h+"\x3c!-- /ko --\x3e"),s(h,"",{contextName:"block"})}var b=h||a;i=o.bind(this,b,"");var w=elaborateDeclarations(c,t[d].declarations,l,i);null!==w&&(c=w),c=converterUtils.removeStyle(c,t[d].position.start,t[d].position.end,0,0,0,f)}else console.log("Unknown rule type",t[d].type,"while parsing <style> rules");p=t[d].position.start}return c};module.exports=processStylesheetRules;
|
|
|
|
},{"./declarations.js":48,"./utils.js":55,"console-browserify":3,"mensch/lib/parser.js":16}],55:[function(require,module,exports){
|
|
"use strict";var console=require('console-browserify'),jsep=require("jsep");jsep.addBinaryOp("or",1),jsep.addBinaryOp("and",2),jsep.addBinaryOp("eq",6),jsep.addBinaryOp("neq",6),jsep.addBinaryOp("lt",7),jsep.addBinaryOp("lte",7),jsep.addBinaryOp("gt",7),jsep.addBinaryOp("gte",7);var addSlashes=function(e){return e.replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")},removeStyle=function(e,r,n,t,o,i,a){for(var s=e.split("\n"),p=o,l=i,u=1+t;u<r.line;u++)p+=s[u-1-t].length+1;if(p+=r.col,null!==n){for(var d=1+t;d<n.line;d++)l+=s[d-1-t].length+1;l+=n.col}else l+=e.length+1;return e.substr(0,p-1)+a+e.substr(l-1)},expressionGenerator=function(e,r,n){return function e(r,n,t,o){if(void 0===t&&(t=!0),void 0!==o&&"Identifier"!==r.type&&"MemberExpression"!==r.type&&console.log("Cannot apply default value to variable when using expressions"),"BinaryExpression"===r.type||"LogicalExpression"===r.type)return"("+e(r.left,n,t)+" "+function(e){switch(e){case"or":return"||";case"and":return"&&";case"lt":return"<";case"lte":return"<=";case"gt":return">";case"gte":return">=";case"eq":return"==";case"neq":return"!=";default:return e}}(r.operator)+" "+e(r.right,n,t)+")";if("CallExpression"===r.type){var i=r.arguments.map(function(r){return e(r,n,t)});return e(r.callee,n,t)+"("+i.join(", ")+")"}if("UnaryExpression"===r.type)return r.operator+e(r.argument,n,t);if("MemberExpression"==r.type&&r.computed)throw"Unexpected computed member expression";if("MemberExpression"!=r.type||r.computed){if("Literal"===r.type)return r.raw;if("Identifier"===r.type){var a=r.name;return t?n(a,o)+"()":a}if("ConditionalExpression"===r.type)return"("+e(r.test,n,t)+" ? "+e(r.consequent,n,t)+" : "+e(r.alternate,n,t)+")";throw"Compound"===r.type?"Syntax error in expression: operator expected after "+e(r.body[0],n,!1):"Found an unsupported expression type: "+r.type}var s=e(r.object,n,!1)+"."+e(r.property,n,!1);return t&&"Math"!==r.object.name&&"Color"!==r.object.name&&"Util"!==r.object.name?n(s,o)+"()":s}(e,r,void 0,n)},expressionBinding=function(e,r,n){var t;if(void 0!==n&&null!==n){var o=e.trim().replace(/@\[([^\]]+)\]|@([a-zA-Z0-9\._]+)\b/g,"###var###");if("###var###"==(o=o.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")))t=[null,n];else if(o="^"+o.replace(/###var###/g,"(.+)")+"$",!(t=n.trim().match(new RegExp(o))))throw console.log("Cannot find matches",t,"for",n,e,o,e),"Cannot find default value for "+e+" in "+n}try{var i=0,a="'"+e.replace(/@\[([^\]]+)\]|@([a-zA-Z0-9\._]+)\b|(')/g,function(e,n,o,a){if(a)return"\\"+a;i++;var s,p=n||o;if(t&&(void 0!==t[i]?s=t[i].trim():console.log("ABZZZ Cannot find default value for",p,"in",t,"as",i)),n){var l=jsep(n);return"'+"+expressionGenerator(l,r,s)+"+'"}return"'+"+r(p,s)+"()+'"})+"'";return a=a.replace(/(^|[^\\])''\+/g,"$1").replace(/\+''/g,""),0===i&&"false"!==a&&"true"!==a&&console.error("Unexpected expression with no valid @variable references",e),a}catch(r){throw"Exception parsing expression "+e+" "+r}},conditionBinding=function(e,r){var n=jsep(e);return expressionGenerator(n,r)};module.exports={addSlashes:addSlashes,removeStyle:removeStyle,conditionBinding:conditionBinding,expressionBinding:expressionBinding};
|
|
|
|
},{"console-browserify":3,"jsep":6}],56:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify');function wrap(e){var t=typeof e;if("object"===t&&(e?e.constructor==Date?t="date":"[object Array]"==Object.prototype.toString.call(e)&&(t="array"):t="null"),"array"==t){var n=ko.observableArray();if(!e||0===e.length)return n;for(var o=0,r=e.length;o<r;++o)n.push(wrap(e[o]));return n}if("object"==t){var a={};for(var i in e){var l=e[i];a[i]=wrap(l)}return ko.observable(a)}if("function"==t)return e;var s=ko.observable();return s(e),s}var _getOptionsObject=function(e){for(var t=e.split("|"),n={},o=0;o<t.length;o++){var r=t[o].split("=");n[r[0]]=r.length>1?r[1]:r[0]}return n},_makeComputed=function(e,t,n,o,r,a){return ko.computed({read:function(){var n=e();if(null===n){var i=ko.utils.unwrapObservable(o);return void 0===i||"custom"==i?ko.utils.unwrapObservable(t):a[i][r]}return n},write:function(i){var l,s=ko.utils.unwrapObservable(o);if(l=void 0===s||"custom"==s?ko.utils.peekObservable(t):a[s][r],n)e(i==l?null:i);else{var u=ko.utils.peekObservable(e);i==l&&null===u||e(i)}}})},_nextVariantFunction=function(e,t,n){for(var o=e.utils.unwrapObservable(t),r=0;r<n.length&&e.utils.peekObservable(n[r])!=o;r++);r==n.length&&(console.warn("Didn't find a variant!",t,o,n),r=n.length-1);var a=r+1;a==n.length&&(a=0),t(e.utils.peekObservable(n[a]))},_getVariants=function(e){var t=e._variant;if("object"!=typeof e[t]||void 0===e[t]._widget||"string"!=typeof e[t]._options&&"boolean"!==e[t]._widget)throw console.error("Unexpected variant declaration",t,e[t]),"Unexpected variant declaration: cannot find property "+t+" or its _options string and it is not a boolean";return"string"==typeof e[t]._options?Object.keys(_getOptionsObject(e[t]._options)):[!0,!1]},_makeComputedFunction=function(e,t,n,o,r,a,i){if(void 0===e){if(void 0===o.utils.unwrapObservable(i).type)throw console.log("TODO ERROR Found a non-typed def ",e,i),"Found a non-typed def "+e;var l=o.utils.unwrapObservable(o.utils.unwrapObservable(i).type);"object"!=typeof(e=t[l])&&console.log("TODO ERROR Found a non-object def ",e,"for",l)}void 0===r&&void 0!==a&&a&&(r=i);var s="$root.content().",u=e._globalStyles;if(void 0!==u)for(var p in u)if(u.hasOwnProperty(p)){var b,c,v,d="$root.content().theme().scheme";if(u[p].substr(0,s.length)!=s)throw"UNEXPECTED globalStyle path ("+u[p]+") outside selfPath ("+s+")";v=u[p].substr(s.length),c=r,d.substr(0,s.length)==s?b=d.substr(s.length):(console.log("IS THIS CORRECT?",d,s),b=d);for(var f=c,h=v.split("()."),_="",k=!0,g=0;g<h.length;g++)c=o.utils.unwrapObservable(c)[h[g]],k?"theme"==h[g]&&(k=!1):(_.length>0&&(_+="."),_+=h[g]);for(var m=b.split("()."),w=0;w<m.length;w++)f=o.utils.unwrapObservable(f)[m[w]];for(var O=p.split("."),y=i,R=0;R<O.length;R++)y=o.utils.unwrapObservable(y)[O[R]];if(!o.isObservable(y))throw"Unexpected non observable target "+p+"/"+_;y._defaultComputed=_makeComputed(y,c,!0,f,_,n)}if(void 0!==e._variant){for(var j=e._variant.split("."),F=i,S=o.utils.unwrapObservable(i),C=0;C<j.length;C++)F=o.utils.unwrapObservable(F)[j[C]];if(void 0!==F._defaultComputed&&(console.log("Found variant on a style property: beware variants should be only used on content properties because they don't match the theme fallback behaviour",e._variant),F=F._defaultComputed),void 0===F)throw console.log("ERROR looking for variant target",e._variant,i),"ERROR looking for variant target "+e._variant;S._nextVariant=_nextVariantFunction.bind(F,o,F,_getVariants(e))}for(var x in e)if(e.hasOwnProperty(x)){var P=e[x];if("object"==typeof P&&null!==P&&void 0!==P._context&&"block"==P._context){var B=r[x](),E=_makeComputedFunction(t[x],t,n,o,r,a,B);i[x](E)}else if("object"==typeof P&&null!==P&&"blocks"==P.type){for(var D,I,T,A=r[x](),V=A.blocks(),U=0;U<V.length;U++)D=o.utils.unwrapObservable(V[U]),I=o.utils.unwrapObservable(D.type),T=_makeComputedFunction(t[I],t,n,o,r,a,D),V[U](T);var W=A.blocks;_augmentBlocksObservable(W,_blockInstrumentFunction.bind(A,void 0,t,n,o,void 0,r,a)),r[x]._wrap=_makeBlocksWrap.bind(r[x],W._instrumentBlock),r[x]._unwrap=_unwrap.bind(r[x])}}return i},_augmentBlocksObservable=function(e,t){e._instrumentBlock=t,void 0===e.origPush&&(e.origPush=e.push,e.push=_makePush.bind(e),e.origSplice=e.splice,e.splice=_makeSplice.bind(e))},_makeBlocksWrap=function(e,t){var n=ko.toJS(t),o=n.blocks;n.blocks=[];var r=wrap(n)();_augmentBlocksObservable(r.blocks,e);for(var a=0;a<o.length;a++){var i=ko.toJS(o[a]);i.id="block_"+a,r.blocks.push(i)}this(r)},_makePush=function(){if(arguments.length>1)throw"Array push with multiple arguments not implemented";if(arguments.length>0&&ko.isObservable(arguments[0])&&("function"==typeof arguments[0]._unwrap?arguments[0]=arguments[0]._unwrap():console.log("WARN: pushing observable with no _unwrap function (TODO remove me, expected condition)")),ko.isObservable(arguments[0]))return this.origPush.apply(this,arguments);var e=this._instrumentBlock(arguments[0]);return this.origPush.apply(this,[e])},_makeSplice=function(){if(arguments.length>3)throw"Array splice with multiple objects not implemented";if(arguments.length>2&&ko.isObservable(arguments[2])&&("function"==typeof arguments[2]._unwrap?arguments[2]=arguments[2]._unwrap():console.log("WARN: splicing observable with no _unwrap function (TODO remove me, expected condition)")),arguments.length>2&&!ko.isObservable(arguments[2])){var e=this._instrumentBlock(arguments[2]);return this.origSplice.apply(this,[arguments[0],arguments[1],e])}return this.origSplice.apply(this,arguments)},_blockInstrumentFunction=function(e,t,n,o,r,a,i,l){void 0===r&&(r=l);var s=wrap(r);return s(_makeComputedFunction(e,t,n,o,a,i,s())),s._unwrap=_unwrap.bind(s),s},_wrap=function(e,t){this(ko.utils.unwrapObservable(e(ko,t,void 0,!0)))},_unwrap=function(){return ko.toJS(this)},_modelInstrument=function(e,t,n){var o=_blockInstrumentFunction.bind(void 0,t,n,n.themes),r=o(ko,e,void 0,!0);return r._wrap=_wrap.bind(r,o),r._unwrap=_unwrap.bind(r),r};module.exports=_modelInstrument;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],57:[function(require,module,exports){
|
|
(function (global){
|
|
var tinycolor=require('tinycolor2');function Color(t){this.getBrightness=function(n){return t(n).getBrightness()},this.isLight=function(n){return t(n).isLight()},this.isDark=function(n){return t(n).isDark()},this.getLuminance=function(n){return t(n).getLuminance()},this.lighten=function(n,i){return t(n).lighten(i).toHexString()},this.brighten=function(n,i){return t(n).brighten(i).toHexString()},this.darken=function(n,i){return t(n).darken(i).toHexString()},this.desaturate=function(n,i){return t(n).desaturate(i).toHexString()},this.saturate=function(n,i){return t(n).saturate(i).toHexString()},this.greyscale=function(n){return t(n).greyscale().toHexString()},this.spin=function(n,i){return t(n).spin(i).toHexString()},this.complement=function(n){return t(n).complement().toHexString()},this.mix=t.mix,this.readability=t.readability,this.isReadable=t.isReadable,this.mostReadable=t.mostReadable}var colorPlugin=function(t){global.Color=new Color(tinycolor)};module.exports=colorPlugin;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"tinycolor2":20}],58:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var console=require('console-browserify'),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),inlineDocument=require("juice/lib/inline")({}).inlineDocument,inlinerPlugin=function(e){e.inline=function(e){$("[style]:not([replacedstyle])",e).each(function(e,n){var t=$(n);t.attr("replacedstyle",t.attr("style"))});var n=[];$('style[data-inline="true"]',e).each(function(e,t){var i=$(t).html();i=(i=i.replace(/<!-- ko ((?!--).)*? -->/g,"")).replace(/<!-- \/ko -->/g,""),n.push(i),$(t).removeAttr("data-inline")});var t=n.join("\n"),i=function(n,t){return void 0===t&&(t=e),$(n,t)};i.root=function(){return $(":root",e)},inlineDocument(i,t,{styleAttributeName:"replacedstyle"})}};module.exports=inlinerPlugin;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3,"juice/lib/inline":7}],59:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var console=require('console-browserify'),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),lsLoader=function(e,t){var a=global.localStorage.getItem("metadata-"+e);if(null!==a){var o,l=global.localStorage.getItem("template-"+e);null!==l&&(o=JSON.parse(l));var n=JSON.parse(a);return{metadata:n,model:o,extension:lsCommandPluginFactory(n,t)}}throw"Cannot find stored data for "+e},lsCommandPluginFactory=function(e,t){return function(e,a,o){var l={name:"Save",enabled:ko.observable(!0),execute:function(){l.enabled(!1),o.metadata.changed=Date.now(),void 0===o.metadata.key&&(console.warn("Unable to find key in metadata object...",o.metadata),o.metadata.key=e),global.localStorage.setItem("metadata-"+e,o.exportMetadata()),global.localStorage.setItem("template-"+e,o.exportJSON()),l.enabled(!0)}},n={name:"Test",enabled:ko.observable(!0)},r={name:"Download",enabled:ko.observable(!0)};n.execute=function(){n.enabled(!1);var l=global.localStorage.getItem("testemail");if(null!==l&&"null"!=l||(l=o.t("Insert here the recipient email address")),(l=global.prompt(o.t("Test email address"),l)).match(/@/)){global.localStorage.setItem("testemail",l),console.log("TODO testing...",l);var r=t||"/dl/",d=$.post(r,{action:"email",rcpt:l,subject:"[test] "+e+" - "+a,html:o.exportHTML()},null,"html");d.fail(function(){console.log("fail",arguments),o.notifier.error(o.t("Unexpected error talking to server: contact us!"))}),d.success(function(){console.log("success",arguments),o.notifier.success(o.t("Test email sent..."))}),d.always(function(){n.enabled(!0)})}else global.alert(o.t("Invalid email address")),n.enabled(!0)},r.execute=function(){r.enabled(!1),o.notifier.info(o.t("Downloading...")),o.exportHTMLtoTextarea("#downloadHtmlTextarea");var e=t||"/dl/";global.document.getElementById("downloadForm").setAttribute("action",e),global.document.getElementById("downloadForm").submit(),r.enabled(!0)},o.save=l,o.test=n,o.download=r}.bind(void 0,e.key,e.name)};module.exports=lsLoader;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],60:[function(require,module,exports){
|
|
(function (global){
|
|
var utilPlugin=function(e){global.Util={decodeURI:decodeURI,encodeURI:encodeURI,decodeURIComponent:decodeURIComponent,encodeURIComponent:encodeURIComponent}};module.exports=utilPlugin;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{}],61:[function(require,module,exports){
|
|
"use strict";require("knockout-sortable"),require("./bindings/jqueryui-spinner.js"),require("./bindings/jqueryui-tabs.js"),require("./bindings/colorpicker.js"),require("./bindings/blocks.js"),require("./bindings/csstext.js"),require("./bindings/bind-iframe.js"),require("./bindings/droppable.js"),require("./bindings/fileupload.js"),require("./bindings/virtuals.js"),require("./bindings/wysiwygs.js"),require("./bindings/scrollfix.js"),require("./bindings/if-subs.js"),require("./bindings/extsortables.js"),require("./bindings/eventable.js"),require("./bindings/tooltips.js"),require("./bindings/extender-pagination.js"),require("./bindings/validated-value.js"),require("./bindings/scrollintoview.js");
|
|
|
|
},{"./bindings/bind-iframe.js":26,"./bindings/blocks.js":27,"./bindings/colorpicker.js":29,"./bindings/csstext.js":30,"./bindings/droppable.js":31,"./bindings/eventable.js":32,"./bindings/extender-pagination.js":33,"./bindings/extsortables.js":34,"./bindings/fileupload.js":35,"./bindings/if-subs.js":36,"./bindings/jqueryui-spinner.js":37,"./bindings/jqueryui-tabs.js":38,"./bindings/scrollfix.js":40,"./bindings/scrollintoview.js":41,"./bindings/tooltips.js":43,"./bindings/validated-value.js":44,"./bindings/virtuals.js":45,"./bindings/wysiwygs.js":46,"knockout-sortable":11}],62:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),kojqui=(typeof window !== "undefined" ? window['kojqui'] : typeof global !== "undefined" ? global['kojqui'] : null),templateConverter=require("./converter/main.js"),console=require('console-browserify'),initializeViewmodel=require("./viewmodel.js"),templateSystem=require("./bindings/choose-template.js"),pluginsCall=function(e,t,n,o){var a,i,r,d,l;l=[],void 0!==o&&o?(a=e.length-1,i=0,r=-1):(a=0,i=e.length-1,r=1);for(var s=a;s!=i+r;s+=r)void 0!==e[s][t]&&void 0!==(d=e[s][t].apply(e[s],n))&&l.push(d);return l},origDisposeCallback=ko.utils.domNodeDisposal.addDisposeCallback;ko.utils.domNodeDisposal.addDisposeCallback=function(e,t){origDisposeCallback(e,function(e){try{t(e)}catch(e){console.warn("Caught unexpected dispose callback exception",e)}})};var bindingPluginMaker=function(e){return{viewModel:function(t){try{e("applyBindings",ko.applyBindings.bind(void 0,t))}catch(e){throw console.warn(e,e.stack),e}},dispose:function(){try{e("unapplyBindings",ko.cleanNode.bind(this,global.document.body))}catch(e){throw console.warn(e,e.stack),e}}}},templateCreator=function(e,t,n,o){var a=n;for(void 0!==n&&void 0!==o&&("object"==typeof t&&"replacedhtml"==t.tagName.toLowerCase()||(a+="-"+o));void 0===a||null===a||e.exists(a);)a="anonymous-"+Math.floor(1e5*Math.random()+1);if("object"==typeof t&&"replacedhtml"==t.tagName.toLowerCase()){var i=$(t),r=$("replacedhead",i),d=$("replacedbody",i);e.adder(a+"-head",r.html()||""),e.adder(a+"-show",d.html()||""),e.adder(a+"-preview",i.html()),e.adder(a+"-wysiwyg",i.html()),r.children().detach(),r.html("\x3c!-- ko block: content --\x3e\x3c!-- /ko --\x3e"),r.before("\x3c!-- ko withProperties: { templateMode: 'head' } --\x3e"),r.after("\x3c!-- /ko --\x3e"),d.html("\x3c!-- ko block: content --\x3e\x3c!-- /ko --\x3e"),e.adder(a+"-iframe",i[0].outerHTML)}else"object"==typeof t?e.adder(a,t.outerHTML):e.adder(a,t);return a};function _viewModelPluginInstance(e){var t;return{viewModel:function(n){t=e(n)},init:function(){void 0!==t&&void 0!==t.init&&t.init()},dispose:function(){void 0!==t&&void 0!==t.dispose&&t.dispose()}}}var _templateUrlConverter=function(e,t){return t.match(/^[^\/]*:/)||t.match(/^\//)||t.match(/^\[/)||t.match(/^#?$/)?null:e+t},templateLoader=function(e,t,n,o,a,i){var r="string"==typeof t?t:n.template,d="./",l=r.lastIndexOf("/");-1!=l&&(d=r.substr(0,l+1));var s,c=_templateUrlConverter.bind(void 0,d);s=void 0===n?{template:r,name:"No name",created:Date.now()}:n,$.get(r,function(t){templateCompiler(e,c,"template",t,o,s,a,i).init()})},templateCompiler=function(e,t,n,o,a,i,r,d){var l=o.match(/^([\S\s]*)([<]html[^>]*>[\S\s]*<\/html>)([\S\s]*)$/i);if(null===l)throw"Unable to find <html> opening and closing tags in the template";var s=l[1],c={"<html":0,"<head":0,"<body":0,"</html":0,"</body":0,"</head":0},m=l[2].replace(/(<\/?)(html|head|body)([^>]*>)/gi,function(e,t,n,o){return c[(t+n).toLowerCase()]+=1,t+"replaced"+n+o});for(var u in c)if(c.hasOwnProperty(u)&&1!=c[u]){if(0===c[u])throw"ERROR: missing mandatory element "+u+">";if(c[u]>1)throw"ERROR: multiple element "+u+"> occourences are not supported (found "+c[u]+" occourences)"}var p=l[3],h=[],b=[];if(void 0!==r)for(var v=0;v<r.length;v++)"function"==typeof r[v]?b.push(_viewModelPluginInstance(r[v])):b.push(r[v]);var g=[],f={adder:function(e,t){if("string"!=typeof t)throw"Template system: cannot create new template "+e;var n=t.match(/(data)?-ko-[^ =:]*/g);n&&console.error("ERROR: found unexpected -ko- attribute in compiled template",e,", you probably mispelled it:",n),templateSystem.addTemplate(e,t),g.push(e)},exists:function(e){return void 0!==templateSystem.getTemplateContent(e)},dispose:function(){for(var e=g.length-1;e>=0;e--)templateSystem.removeTemplate(g[e])}};ko.bindingHandlers.block.templateExists=f.exists;for(var y=templateCreator.bind(void 0,f),k=e("translateTemplate",templateConverter.translateTemplate.bind(void 0,n,m,t,y)),w=e("generateModel",templateConverter.wrappedResultModel.bind(void 0,k)),C={},x=pluginsCall(b,"widget",[$,ko,kojqui]),S=0;S<x.length;S++)C[x[S].widget]=x[S];h.push.apply(h,e("generateEditors",templateConverter.generateEditors.bind(void 0,k,C,t,y,"+$root.contentListeners()")));var E=!1;if(void 0!==a&&null!==a){var M;M="string"==typeof a?ko.utils.parseJson(a):a,2==e("checkModel",templateConverter.checkModel.bind(void 0,w._unwrap(),h,M))&&(console.error("Trying to compile an incompatible template version!",w._unwrap(),h,M),E=!0);try{w._wrap(M)}catch(e){console.error("Unable to inject model content!",e),E=!0}}var T=s+templateSystem.getTemplateContent(n+"-iframe").replace(/(<\/?)replaced(html|head|body)([^>]*>)/gi,function(e,t,n,o){return t+n+o})+p,L=ko.bindingHandlers.bindIframe.tpl;ko.bindingHandlers.bindIframe.tpl=T;var I={dispose:function(){ko.bindingHandlers.bindIframe.tpl=L}};b.push(I),b.push(f);var D=e("initializeViewmodel",initializeViewmodel.bind(this,w,h,t,d));D.metadata=i;return void 0!==D.metadata.editorversion&&"0.16.0"!==D.metadata.editorversion&&console.warn("The model being loaded has been created with an older editor version",D.metadata.editorversion,"vs","0.16.0"),D.metadata.editorversion="0.16.0",void 0!==k.version&&(void 0!==D.metadata.templateversion&&D.metadata.templateversion!==k.version&&console.error("The model being loaded has been created with a different template version",k.version,"vs",D.metadata.templateversion),D.metadata.templateversion=k.version),templateSystem.init(),b.push(bindingPluginMaker(e)),pluginsCall(b,"viewModel",[D]),E&&$("#incompatible-template").dialog({modal:!0,appendTo:"#mo-body",buttons:{Ok:function(){$(this).dialog("close")}}}),{model:D,init:function(){pluginsCall(b,"init",void 0,!0)},dispose:function(){pluginsCall(b,"dispose",void 0,!0)}}},checkFeature=function(e,t){if(!t())throw console.warn("Missing feature",e),"Missing feature "+e},isCompatible=function(){try{return checkFeature("matchMedia",function(){return void 0!==global.matchMedia}),checkFeature("XMLHttpRequest 2",function(){return"XMLHttpRequest"in global&&"withCredentials"in new global.XMLHttpRequest}),checkFeature("ES5 strict",function(){return function(){return void 0===this}()}),checkFeature("CSS borderRadius",function(){return void 0!==global.document.body.style.borderRadius}),checkFeature("CSS boxShadow",function(){return void 0!==global.document.body.style.boxShadow}),checkFeature("CSS boxSizing",function(){return void 0!==global.document.body.style.boxSizing}),checkFeature("CSS backgroundSize",function(){return void 0!==global.document.body.style.backgroundSize}),checkFeature("CSS backgroundOrigin",function(){return void 0!==global.document.body.style.backgroundOrigin}),checkBadBrowserExtensions(),!0}catch(e){return!1}},checkBadBrowserExtensions=function(){var e="checkbadbrowsersframe",t=ko.bindingHandlers.bindIframe.tpl;ko.bindingHandlers.bindIframe.tpl='<!DOCTYPE html>\r\n<html>\r\n<head><title>A</title>\r\n</head>\r\n<body><p style="color: blue" align="right" data-bind="style: { color: \'red\' }">B</p><div data-bind="text: content"></div></body>\r\n</html>\r\n',$("body").append('<iframe id="'+e+'" data-bind="bindIframe: $data"></iframe>');var n=global.document.getElementById(e);ko.applyBindings({content:"dummy content"},n);var o=n.contentWindow.document.doctype,a="<!DOCTYPE "+o.name+(o.publicId?' PUBLIC "'+o.publicId+'"':"")+(!o.publicId&&o.systemId?" SYSTEM":"")+(o.systemId?' "'+o.systemId+'"':"")+">"+"\n"+n.contentWindow.document.documentElement.outerHTML;ko.cleanNode(n),ko.removeNode(n),ko.bindingHandlers.bindIframe.tpl=t;var i='<!DOCTYPE html>\n<html><head><title>A</title>\n</head>\n<body><p align="right" style="color: red;" data-bind="style: { color: \'red\' }">B</p><div data-bind="text: content">dummy content</div>\n\n</body></html>',r='<!DOCTYPE html>\n<html><head><title>A</title>\n</head>\n<body><p style="color: red;" data-bind="style: { color: \'red\' }" align="right">B</p><div data-bind="text: content">dummy content</div>\n\n</body></html>',d='<!DOCTYPE html>\n<html><head><title>A</title>\n</head>\n<body><p style="color: red;" align="right" data-bind="style: { color: \'red\' }">B</p><div data-bind="text: content">dummy content</div>\n\n</body></html>';if(i!==a&&r!==a&&d!==a)throw console.info("BadBrowser.FrameContentCheck",a.length,i.length,r.length,d.length,a==i,a==r,a==d),console.info(a),"Unexpected frame content. Misbehaving browser: "+a.length+"/"+i.length+"/"+r.length+"/"+d.length},fixPageEvents=function(){global.addEventListener&&(global.addEventListener("drag",function(e){(e=e||global.event).preventDefault()},!1),global.addEventListener("dragstart",function(e){(e=e||global.event).preventDefault()},!1),global.addEventListener("dragover",function(e){(e=e||global.event).preventDefault()},!1),global.addEventListener("drop",function(e){(e=e||global.event).preventDefault()},!1),global.document.body.addEventListener("drop",function(e){e.preventDefault()},!1)),global.document.ondragstart&&(global.document.ondragstart=function(){return!1})};module.exports={compile:templateCompiler,load:templateLoader,isCompatible:isCompatible,fixPageEvents:fixPageEvents};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./bindings/choose-template.js":28,"./converter/main.js":51,"./viewmodel.js":67,"console-browserify":3}],63:[function(require,module,exports){
|
|
"use strict";var console=require('console-browserify'),_call=function(e){return e()},logs=[],_timedCall=function(e,o){var l,t=(new Date).getTime();"object"==typeof console&&console.time&&console.time(e),l=_call(o),"object"==typeof console&&console.time&&console.timeEnd(e);var n=(new Date).getTime()-t;return"object"!=typeof console||console.time||console.log(e,"took",n,"ms"),logs.push({name:e,time:n}),logs.length>100&&logs.unshift(),l};module.exports={timedCall:_timedCall,logs:logs};
|
|
|
|
},{"console-browserify":3}],64:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),undoManager=require("./undomanager.js"),undoserializer=require("./undoserializer.js"),addUndoStackExtensionMaker=function(e){return function(n){n.contentListeners(n.contentListeners()+2);var o=undoManager(n.content,{levels:100,undoLabel:ko.computed(function(){return n.t("Undo (#COUNT#)")}),redoLabel:ko.computed(function(){return n.t("Redo")})});return n.undo=o.undoCommand,n.undo.execute=e.bind(n,"undo",n.undo.execute),n.redo=o.redoCommand,n.redo.execute=e.bind(n,"redo",n.redo.execute),n.undoReset=e.bind(n,"undoReset",o.reset),n.setUndoModeMerge=o.setModeMerge,n.setUndoModeOnce=o.setModeOnce,o.setModeIgnore(),o.setUndoActionMaker(undoserializer.makeUndoAction.bind(void 0,n.content)),undoserializer.watchEnabled(!0),{pause:function(){o.setModeIgnore()},run:function(){o.setModeOnce()},init:function(){o.setModeOnce()},dispose:function(){n.contentListeners(n.contentListeners()-2),undoserializer.watchEnabled(!1),o.dispose()}}}};module.exports=addUndoStackExtensionMaker;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./undomanager.js":65,"./undoserializer.js":66}],65:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),reactor=require('ko-reactor/dist/ko-reactor.min.js'),console=require('console-browserify'),undoManager=function(e,o){var t,n=ko.observableArray(),r=ko.observableArray(),i=0,d=0,u={levels:100,undoLabel:"undo (#COUNT#)",redoLabel:"redo (#COUNT#)"};o="object"==typeof o?ko.utils.extend(u,o):u;var l=function(e){1==i?c(e,r):2==i?c(e,n):0==i&&(c(e,n),r.removeAll())},c=function(e,n){if(n().length>0){var r=(i=n()[n().length-1],d=e,void 0!==i.mergedAction?i.mergedAction(d):null);if(null!==r)return void(n()[n().length-1]=r)}var i,d;n().length>=o.levels&&n.shift(),t=n,n.push(e)},a=function(e,o,n){return{name:ko.computed(function(){return ko.utils.unwrapObservable(e).replace(/#COUNT#/,n().length)}),enabled:ko.computed(function(){return 0!==n().length}),execute:function(){var e=n.pop();if(e){var r=i;i=o;var u=d;d=3,e(),s(t),d=u,i=r}return!0}}},s=function(e){if(void 0===e)throw"Unexpected operation: stack cleaner called with undefined stack";e().length>0&&void 0!==e()[e().length-1].mergedAction&&delete e()[e().length-1].mergedAction},f=function(e,o){var t=function(e,o){e(),o()}.bind(void 0,e,o);return void 0!==e.mergedAction&&(t.mergedAction=e.mergedAction),t},m=function(e,o,t){if(void 0!==o)e(o);else{if(!t)throw"Unexpected condition: no item and no child.oldValues!";if("deleted"==t.status)e.splice(t.index,0,t.value);else{if("added"!=t.status)throw"Unsupported item.status: "+t.status;e.splice(t.index,1)}}},v=function(e,o,t,n,r){return e.bind(void 0,t,n,r)},g=("function"==typeof reactor?reactor:ko.watch)(e,{depth:-1,oldValues:1,mutable:!0,tagFields:!0},function(e,o,t){var n=void 0!==o.oldValues?o.oldValues[0]:void 0,r=v(m,e,o,n,t);1!=d&&(3==d?void 0!==r&&(r.mergedAction=function(e){return void 0!==e.mergeMe&&e.mergeMe?f(e,this):null},r.mergeMe=!0):void 0!==r&&(o.oldValues&&2==d&&(r.mergedAction=function(e,o,t){return"object"==typeof t.mergeableAction&&e==t.mergeableAction.child?this:null}.bind(r,o,t),r.mergeableAction={child:o,item:t}),t&&"deleted"==t.status?r.mergedAction=function(e,o,t){return"object"==typeof t.mergeableMove&&o.value==t.mergeableMove.item.value?f(t,this):null}.bind(r,o,t):t&&"added"==t.status?r.mergeableMove={child:o,item:t}:t&&console.warn("Unsupported item.status",t.status)),void 0!==r&&l(r))},{});return{push:l,undoCommand:a(o.undoLabel,1,n),redoCommand:a(o.redoLabel,2,r),reset:function(){n.removeAll(),r.removeAll()},setModeOnce:function(){d=2,s(n)},setModeMerge:function(){d=3,s(n)},setModeNormal:function(){d=0,s(n)},setModeIgnore:function(){d=1,s(n)},setUndoActionMaker:function(e){v=e},dispose:function(){g.dispose()}}};module.exports=undoManager;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3,"ko-reactor/dist/ko-reactor.min.js":12}],66:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var listener,watchEnabled,ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify'),_reference=function(e,n){for(var t,r,o=0,a=e;o<n.length;)switch(n.charAt(o)){case"(":")"==n.charAt(o+1)&&(a=a()),o+=2;break;case"[":r=n.indexOf("]",o),a=a[n.substring(o+1,r)],o=r+1;break;case".":-1==(t=n.indexOf("(",o))&&(t=n.length),-1==(r=n.indexOf("[",o))&&(r=n.length),r=Math.min(t,r),a=a[n.substring(o+1,r)],o=r}return a},_getPath=function(e,n){for(var t,r="",o=0;o<=e.length;o++)if(t=o<e.length?e[o]:n,ko.isObservable(t)&&(r+="()"),void 0!==t._fieldName)r+="."+t._fieldName;else{if(!(o>0&&"function"==typeof e[o-1].pop))throw console.error("Unexpected parent with no _fieldName and no parent array",o,e),"Unexpected parent with no _fieldName and no parent array";var a=ko.isObservable(e[o-1])?ko.utils.peekObservable(e[o-1]):e[o-1],i=ko.utils.arrayIndexOf(a,t);if(-1==i)throw console.error("Unexpected object not found in parent array",a,t,o,e.length,ko.toJS(a),ko.utils.unwrapObservable(t)),"Unexpected object not found in parent array";r+="["+i+"]"}return r},makeDereferencedUndoAction=function(e,n,t,r,o){e(_reference(n,t),r,o)},_setListener=function(e){listener=e},makeUndoActionDereferenced=function(e,n,t,r,o,a){try{var i=_getPath(t,r);if("object"!=typeof o&&"function"!=typeof o||(o=ko.toJS(o)),void 0!==a&&("object"==typeof a.value||"function"==typeof a.value))a=ko.toJS(a);if(void 0!==listener)try{listener(i,r,o,a)}catch(e){console.log("Undoserializer ignoring exception in listener callback")}return makeDereferencedUndoAction.bind(void 0,n,e,i,o,a)}catch(e){console.error("Exception processing undo",e,t,r,a)}},_watchEnabled=function(e){if(void 0===e)return watchEnabled;watchEnabled=e};module.exports={dereference:_getPath,reference:_reference,makeUndoAction:makeUndoActionDereferenced,setListener:_setListener,watchEnabled:_watchEnabled};
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"console-browserify":3}],67:[function(require,module,exports){
|
|
(function (global){
|
|
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require('console-browserify'),performanceAwareCaller=require("./timed-call.js").timedCall,toastr=require("toastr");function initializeEditor(e,o,t,l){var r={galleryRecent:ko.observableArray([]).extend({paging:16}),galleryRemote:ko.observableArray([]).extend({paging:16}),selectedBlock:ko.observable(null),selectedItem:ko.observable(null),selectedTool:ko.observable(0),selectedImageTab:ko.observable(0),dragging:ko.observable(!1),draggingImage:ko.observable(!1),galleryLoaded:ko.observable(!1),showPreviewFrame:ko.observable(!1),previewMode:ko.observable("mobile"),showToolbox:ko.observable(!0),showTheme:ko.observable(!1),showGallery:ko.observable(!1),debug:ko.observable(!1),contentListeners:ko.observable(0),logoPath:"dist/img/mosaico32.png",logoUrl:".",logoAlt:"mosaico"};return r.content=e,r.blockDefs=o,r.notifier=toastr,r.tt=function(e,o){if(void 0!==o)for(var t in o)o.hasOwnProperty(t)&&(e=e.replace(new RegExp("__"+t+"__","g"),o[t]));return e},r.t=r.tt,r.ut=function(e,o){return o},r.templatePath=t,r.remoteUrlProcessor=function(e){return e},r.remoteFileProcessor=function(e){return void 0!==e.url&&(e.url=r.remoteUrlProcessor(e.url)),void 0!==e.thumbnailUrl&&(e.thumbnailUrl=r.remoteUrlProcessor(e.thumbnailUrl)),e},r.loadGallery=function(){r.galleryLoaded("loading");var e=l||"/upload/";$.getJSON(e,function(e){for(var o=0;o<e.files.length;o++)e.files[o]=r.remoteFileProcessor(e.files[o]);r.galleryLoaded(e.files.length),r.galleryRemote(e.files.reverse())}).fail(function(){r.galleryLoaded(!1),r.notifier.error(r.t("Unexpected error listing files"))})},r.fileToImage=function(e,o,t){return e.url},r.removeBlock=function(e,o){ko.utils.unwrapObservable(r.selectedBlock)==ko.utils.unwrapObservable(e)&&r.selectBlock(null,!0);var t=o.blocks.remove(e);return r.notifier.info(r.t("Block removed: use undo button to restore it...")),t},r.duplicateBlock=function(e,o){var t=ko.utils.unwrapObservable(e),l=ko.toJS(ko.utils.unwrapObservable(o.blocks)[t]);void 0!==l.id&&(l.id=""),o.blocks.splice(t+1,0,l)},r.moveBlock=function(e,o,t){var l=ko.utils.unwrapObservable(e),n=ko.utils.unwrapObservable(o.blocks);if(t&&l>0||!t&&l<n.length-1){var a=l+(t?-1:1),c=n[a];r.startMultiple(),o.blocks.splice(a,1),o.blocks.splice(l,0,c),r.stopMultiple()}},r.loadDefaultBlocks=function(){var e=ko.toJS(r.content().mainBlocks);e.blocks=[];for(var o=ko.utils.unwrapObservable(r.blockDefs),t=0;t<o.length;t++){var l=ko.toJS(o[t]);l.id="block_"+t,e.blocks.push(l)}performanceAwareCaller("setMainBlocks",r.content().mainBlocks._wrap.bind(r.content().mainBlocks,e))},r.addImage=function(e){var o=$("#main-wysiwyg-area .selectable-img.selecteditem");return 1==o.length&&"object"==typeof e&&void 0!==e.url&&(ko.contextFor(o[0])._src(e.url),!0)},r.addBlock=function(e,o){var t,l,n=r.selectedBlock();if(null!==n)for(var a=r.content().mainBlocks().blocks().length-1;a>=0;a--)if(r.content().mainBlocks().blocks()[a]()==n){t=a;break}void 0!==t?(l=t+1,r.content().mainBlocks().blocks.splice(l,0,e),r.notifier.info(r.t("New block added after the selected one (__pos__)",{pos:l}))):(r.content().mainBlocks().blocks.push(e),l=r.content().mainBlocks().blocks().length-1,r.notifier.info(r.t("New block added at the model bottom (__pos__)",{pos:l})));var c=r.content().mainBlocks().blocks()[l]();return r.selectBlock(c,!0),!1},r.findObjectsOfType=function(e,o){var t=[],l=ko.utils.unwrapObservable(e);for(var r in l)if(l.hasOwnProperty(r)){var n=ko.utils.unwrapObservable(l[r]);if(r.match(/Blocks$/))for(var a=ko.utils.unwrapObservable(n.blocks),c=0;c<a.length;c++){var i=ko.utils.unwrapObservable(a[c]);null!==o&&ko.utils.unwrapObservable(i.type)!=o||t.push(i)}else"object"==typeof n&&null!==n&&(null!==o&&ko.utils.unwrapObservable(n.type)!=o||t.push(n))}return t},r.placeholderHelper={element:function(e){return $(e[0].outerHTML).removeClass("ui-draggable").addClass("sortable-placeholder").css("display","block").css("position","relative").css("width","100%").css("height","auto").css("opacity",".8")[0]},update:function(e,o){}},r.startMultiple=function(){void 0!==r.setUndoModeMerge&&r.setUndoModeMerge()},r.stopMultiple=function(){void 0!==r.setUndoModeOnce&&r.setUndoModeOnce()},r.localGlobalSwitch=function(e,o){return e(null===e()?o():null),!1},r.selectItem=function(e,o,t){var l=ko.utils.peekObservable(e);return void 0!==t&&r.selectBlock(t,!1,!0),l!=o&&(e(o),null!==o&&0===r.selectedTool()&&r.selectedTool(1)),!1}.bind(r,r.selectedItem),r.isSelectedItem=function(e){return r.selectedItem()==e},r.selectBlock=function(e,o,t,l){var n=ko.utils.peekObservable(e);l||r.selectItem(null),n!=o&&(e(o),r.showGallery(!1),null===o||t||0!==r.selectedTool()||r.selectedTool(1))}.bind(r,r.selectedBlock),r.countSubscriptions=function(e,o){var t=0;for(var l in e)if(e.hasOwnProperty(l)){var n=e[l];if(ko.isObservable(n)&&(void 0!==n._defaultComputed&&(void 0!==o&&console.log(o+"/"+l+"/_",n._defaultComputed.getSubscriptionsCount()),t+=n._defaultComputed.getSubscriptionsCount()),void 0!==o&&console.log(o+"/"+l+"/-",n.getSubscriptionsCount()),t+=n.getSubscriptionsCount(),n=ko.utils.unwrapObservable(n)),"object"==typeof n&&null!==n){var a=r.countSubscriptions(n,void 0!==o?o+"/"+l+"@":void 0);void 0!==o&&console.log(o+"/"+l+"@",a),t+=a}}return t},r.loopSubscriptionsCount=function(){var e=r.countSubscriptions(r.content());global.document.getElementById("subscriptionsCount").innerHTML=e,global.setTimeout(r.loopSubscriptionsCount,1e3)},r.export=function(){return performanceAwareCaller("exportHTML",r.exportHTML)},r.exportHTML=function(){var e="exportframe";$("body").append('<iframe id="'+e+'" data-bind="bindIframe: $data"></iframe>');var o=global.document.getElementById(e);ko.applyBindings(r,o),ko.cleanNode(o),r.inline&&r.inline(o.contentWindow.document);var t=o.contentWindow.document.doctype,l="<!DOCTYPE "+t.name+(t.publicId?' PUBLIC "'+t.publicId+'"':"")+(!t.publicId&&t.systemId?" SYSTEM":"")+(t.systemId?' "'+t.systemId+'"':"")+">"+"\n"+o.contentWindow.document.documentElement.outerHTML;ko.removeNode(o),l=(l=(l=(l=(l=(l=(l=(l=(l=(l=(l=l.replace(/<script ([^>]* )?type="text\/html"[^>]*>[\s\S]*?<\/script>/gm,"")).replace(/<!-- ko ((?!--).)*? -->/g,"")).replace(/<!-- \/ko -->/g,"")).replace(/ data-bind="[^"]*"/gm,"")).replace(/ data-mce-(href|src|style)="[^"]*"/gm,"")).replace(/ style="[^"]*"([^>]*) replaced(style="[^"]*")/gm,"$1 $2")).replace(/ replaced(style="[^"]*")([^>]*) style="[^"]*"/gm," $1$2")).replace(/ replaced(style="[^"]*")/gm," $1")).replace(/ http-equiv="[^"]*"([^>]*) replaced(http-equiv="[^"]*")/gm,"$1 $2")).replace(/ replaced(http-equiv="[^"]*")([^>]*) http-equiv="[^"]*"/gm," $1$2")).replace(/ replaced(http-equiv="[^"]*")/gm," $1");var n=(l=l.replace(/<replacedcc[^>]* condition="([^"]*)"[^>]*>([\s\S]*?)<\/replacedcc>/g,function(e,o,t){var l="\x3c!--[if "+o.replace(/&/,"&")+"]>";return l+=t.replace(/<!-- cc:bc:([A-Za-z:]*) -->(<\/cc>)?<!-- cc:ac:\1 -->/g,"</$1>").replace(/><\/cc><!-- cc:sc -->/g,"/>").replace(/<!-- cc:bo:([A-Za-z:]*) --><cc/g,"<$1").replace(/^.*<!-- cc:start -->/,"").replace(/<!-- cc:end -->.*$/,""),l+="<![endif]--\x3e"})).match(/ data-[^ =]+(="[^"]+")? /)||l.match(/ replaced([^= ]*=)/);return n&&console.warn("Output HTML contains unexpected data- attributes or replaced attributes",n),l},r.exportHTMLtoTextarea=function(e){$(e).val(r.exportHTML())},r.exportJSONtoTextarea=function(e){$(e).val(r.exportJSON())},r.importJSONfromTextarea=function(e){r.importJSON($(e).val())},r.exportMetadata=function(){return ko.toJSON(r.metadata)},r.exportJSON=function(){return ko.toJSON(r.content)},r.exportJS=function(){return ko.toJS(r.content)},r.importJSON=function(e){var o=ko.utils.parseJson(e);r.content._wrap(o)},r.exportTheme=function(){var e={},o=r.content().theme(),t=function(e,o,l){for(var r in l)if(l.hasOwnProperty(r)){var n=ko.utils.unwrapObservable(l[r]);null!==n&&"object"==typeof n?t(r+".",o,n):o[e+r]=n}};t("",e,o);var l="";for(var n in e)e.hasOwnProperty(n)&&"type"!=n&&(l+=n+": "+e[n]+";\n");return l},r.loadImage=function(e){r.galleryRecent.unshift(e),r.selectedImageTab(0)},r.dialog=function(e,o){$(e).dialog(o)},r.log=function(e,o){},r.selectedImageTab.subscribe(function(e){1==e&&!1===r.galleryLoaded()&&r.loadGallery()},r,"change"),r}toastr.options={closeButton:!1,debug:!1,positionClass:"toast-bottom-full-width",target:"#mo-body",onclick:null,showDuration:"300",hideDuration:"1000",timeOut:"5000",extendedTimeOut:"1000",showEasing:"swing",hideEasing:"linear",showMethod:"fadeIn",hideMethod:"fadeOut"},module.exports=initializeEditor;
|
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
|
|
},{"./timed-call.js":63,"console-browserify":3,"toastr":21}]},{},[25,1])(25)
|
|
});
|
|
//# sourceMappingURL=mosaico.min.js.map
|