1/** 2 MIT License http://www.opensource.org/licenses/mit-license.php 3 Author Igor Vladyka <[email protected]> (https://github.com/Igor-Vladyka/leaflet.browser.print) 4**/ 5 6L.Control.BrowserPrint.Utils = { 7 8 _ignoreArray: [], 9 10 _cloneFactoryArray: [], 11 _cloneRendererArray: [], 12 _knownRenderers: {}, 13 14 cloneOptions: function(options) { 15 var utils = this; 16 var retOptions = {}; 17 for (var name in options) { 18 var item = options[name]; 19 if (item && item.clone) { 20 retOptions[name] = item.clone(); 21 } else if (item && item.onAdd) { 22 retOptions[name] = utils.cloneLayer(item); 23 } else { 24 retOptions[name] = item; 25 } 26 } 27 return retOptions; 28 }, 29 30 cloneBasicOptionsWithoutLayers: function(options) { 31 var retOptions = {}; 32 var optionNames = Object.getOwnPropertyNames(options); 33 if (optionNames.length) { 34 for (var i = 0; i < optionNames.length; i++) { 35 var optName = optionNames[i]; 36 if (optName && optName != "layers") { 37 retOptions[optName] = options[optName]; 38 } 39 } 40 41 return this.cloneOptions(retOptions); 42 } 43 44 return retOptions; 45 }, 46 47 cloneInnerLayers: function (layer) { 48 var utils = this; 49 var layers = []; 50 51 layer.eachLayer(function (inner) { 52 var l = utils.cloneLayer(inner); 53 54 if (l) { 55 layers.push(l); 56 } 57 }); 58 59 return layers; 60 }, 61 62 initialize: function () { 63 64 this._knownRenderers = {}; 65 66 // Renderers 67 this.registerRenderer(L.SVG, 'L.SVG'); 68 this.registerRenderer(L.Canvas, 'L.Canvas'); 69 70 this.registerLayer(L.TileLayer.WMS, 'L.TileLayer.WMS', function(layer, utils) { return L.tileLayer.wms(layer._url, utils.cloneOptions(layer.options)); }); 71 this.registerLayer(L.TileLayer, 'L.TileLayer', function(layer, utils) { return L.tileLayer(layer._url, utils.cloneOptions(layer.options)); }); 72 this.registerLayer(L.GridLayer, 'L.GridLayer', function(layer, utils) { return L.gridLayer(utils.cloneOptions(layer.options)); }); 73 this.registerLayer(L.ImageOverlay, 'L.ImageOverlay', function(layer, utils) { return L.imageOverlay(layer._url, layer._bounds, utils.cloneOptions(layer.options)); }); 74 this.registerLayer(L.Marker, 'L.Marker', function(layer, utils) { return L.marker(layer.getLatLng(), utils.cloneOptions(layer.options)); }); 75 this.registerLayer(L.Popup, 'L.Popup', function(layer, utils) { return L.popup(utils.cloneOptions(layer.options)).setLatLng(layer.getLatLng()).setContent(layer.getContent()); }); 76 this.registerLayer(L.Circle, 'L.Circle', function(layer, utils) { return L.circle(layer.getLatLng(), layer.getRadius(), utils.cloneOptions(layer.options)); }); 77 this.registerLayer(L.CircleMarker, 'L.CircleMarker', function(layer, utils) { return L.circleMarker(layer.getLatLng(), utils.cloneOptions(layer.options)); }); 78 this.registerLayer(L.Rectangle, 'L.Rectangle', function(layer, utils) { return L.rectangle(layer.getBounds(), utils.cloneOptions(layer.options)); }); 79 this.registerLayer(L.Polygon, 'L.Polygon', function(layer, utils) { return L.polygon(layer.getLatLngs(), utils.cloneOptions(layer.options)); }); 80 81 // MultiPolyline is removed in leaflet 1.0.0 82 this.registerLayer(L.MultiPolyline, 'L.MultiPolyline', function(layer, utils) { return L.polyline(layer.getLatLngs(), utils.cloneOptions(layer.options)); }); 83 // MultiPolygon is removed in leaflet 1.0.0 84 this.registerLayer(L.MultiPolygon, 'L.MultiPolygon', function(layer, utils) { return L.multiPolygon(layer.getLatLngs(), utils.cloneOptions(layer.options)); }); 85 86 this.registerLayer(L.Polyline, 'L.Polyline', function(layer, utils) { return L.polyline(layer.getLatLngs(), utils.cloneOptions(layer.options)); }); 87 this.registerLayer(L.GeoJSON, 'L.GeoJSON', function(layer, utils) { return L.geoJson(layer.toGeoJSON(), utils.cloneOptions(layer.options)); }); 88 89 this.registerIgnoreLayer(L.FeatureGroup, 'L.FeatureGroup'); 90 this.registerIgnoreLayer(L.LayerGroup, 'L.LayerGroup'); 91 92 // There is no point to clone tooltips here; L.tooltip(options); 93 this.registerLayer(L.Tooltip, 'L.Tooltip', function(){ return null; }); 94 }, 95 96 _register: function(array, type, identifier, builderFunction) { 97 if (type && 98 !array.filter(function(l){ return l.identifier === identifier; }).length) { 99 100 array.push({ 101 type: type, 102 identifier: identifier, 103 builder: builderFunction || function (layer) { return new type(layer.options); } 104 }); 105 } 106 }, 107 108 registerLayer: function(type, identifier, builderFunction) { 109 this._register(this._cloneFactoryArray, type, identifier, builderFunction); 110 }, 111 112 registerRenderer: function(type, identifier, builderFunction) { 113 this._register(this._cloneRendererArray, type, identifier, builderFunction); 114 }, 115 116 registerIgnoreLayer: function(type, identifier) { 117 this._register(this._ignoreArray, type, identifier); 118 }, 119 120 cloneLayer: function(layer) { 121 if (!layer) return null; 122 123 // First we check if this layer is actual renderer 124 var renderer = this.__getRenderer(layer); 125 if (renderer) { 126 return renderer; 127 } 128 129 var factoryObject; 130 if (layer._group) { // Exceptional check for L.MarkerClusterGroup 131 factoryObject = this.__getFactoryObject(layer._group, true); 132 } else { 133 factoryObject = this.__getFactoryObject(layer); 134 } 135 136 // We clone and recreate layer if it's simple overlay 137 if (factoryObject) { 138 factoryObject = factoryObject.builder(layer, this); 139 } 140 141 return factoryObject; 142 }, 143 144 getType: function(layer) { 145 if (!layer) return null; 146 147 var factoryObject = this.__getFactoryObject(layer); 148 if (factoryObject) { 149 factoryObject = factoryObject.identifier; 150 } 151 152 return factoryObject; 153 }, 154 155 __getRenderer: function(oldRenderer) { 156 var renderer = this._knownRenderers[oldRenderer._leaflet_id]; 157 if (!renderer) { 158 for (var i = 0; i < this._cloneRendererArray.length; i++) { 159 var factoryObject = this._cloneRendererArray[i]; 160 if (oldRenderer instanceof factoryObject.type) { 161 this._knownRenderers[oldRenderer._leaflet_id] = factoryObject.builder(oldRenderer.options); 162 break; 163 } 164 } 165 166 renderer = this._knownRenderers[oldRenderer._leaflet_id]; 167 } 168 169 return renderer; 170 }, 171 172 __getFactoryObject: function (layer, skipIgnore) { 173 if (!skipIgnore) { 174 for (var i = 0; i < this._ignoreArray.length; i++) {
175 var ignoreObject = this._ignoreArray[i]; 176 if (ignoreObject.type && layer instanceof ignoreObject.type) { 177 return null; 178 } 179 } 180 } 181 182 for (var i = 0; i < this._cloneFactoryArray.length; i++) { 183 var factoryObject = this._cloneFactoryArray[i]; 184 if (factoryObject.type && layer instanceof factoryObject.type) { 185 return factoryObject; 186 } 187 } 188 189 for (var i = 0; i < this._cloneRendererArray.length; i++) { 190 var factoryObject = this._cloneRendererArray[i]; 191 if (factoryObject.type && layer instanceof factoryObject.type) { 192 return null; 193 } 194 } 195 196 this.__unknownLayer__(); 197 198 return null; 199 }, 200 201 __unknownLayer__: function(){ 202 console.warn('Unknown layer, cannot clone this layer. Leaflet version: ' + L.version); 203 console.info('For additional information please refer to documentation on: https://github.com/Igor-Vladyka/leaflet.browser.print.'); 204 console.info('-------------------------------------------------------------------------------------------------------------------'); 205 } 206};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.