├── photoshop ├── export2EdgeAnimate │ ├── exportToEdgeAnimateTest.jsx │ ├── exportToEdgeAnimate.jsx │ ├── readme.md │ └── exportToEdgeAnimate.jsxbin ├── export2easelJS │ ├── readme.md │ ├── exportToEaselJS.jsx │ └── exportToEaselJSPanel.jsx ├── template1.txt ├── template2.txt ├── replaceAllSmartObjectContents.jsx ├── generative-art-examples │ ├── strips.jsx │ └── polygon.jsx ├── PhotoshopCommons.jsx ├── PrimitiveShapes.jsx ├── LayerExporter.jsx ├── LayerDataExtractor.jsx ├── EaselJSExporter.jsx └── SpriteExporter.jsx ├── illustrator ├── removeEmpyLayers │ ├── remove.png │ ├── readme.md │ └── removeEmptyLayers.jsx ├── randomizeColors │ ├── screenshot.png │ ├── readme.md │ └── randomizeColors.jsx ├── newLayerFromSel │ ├── readme.md │ └── newLayerFromSel.jsx ├── distribSelection2Layers │ ├── readme.md │ └── distribSelectionToLayers.jsx ├── export2EdgeAnimate │ ├── export2AnimateTest.jsx │ ├── readme.md │ ├── export2Animate.jsx │ └── export2Animate.jsxbin ├── export-layers-v1 │ ├── readme.md │ ├── export-layers-panelscript.jsx │ ├── export-layers.jsx │ ├── LayerExporter.jsx │ └── LayerDataExtractor.jsx ├── export-layers-v2 │ ├── readme.md │ ├── tester.jsx │ ├── Renamer.jsx │ ├── ExportLayersAndData.jsx │ ├── HTMLExporter.jsx │ ├── AltLayerExporter.jsx │ ├── DataExtractor.jsx │ └── ExportLayersAndData.jsxbin ├── fillArtboardWithShape │ ├── readme.md │ └── fillArtboardWithShape.jsx └── savelayerstoai │ ├── readme.md │ └── savelayerstoai.jsx ├── .gitignore ├── readme.md ├── flash-pro └── createJS │ ├── README.md │ ├── easeljs-json.plugin.jsfl │ └── easeljs2.plugin.jsfl ├── edgeanimate └── EdgeAnimateImporter.jsx └── common ├── Utils.jsx └── json2.js /photoshop/export2EdgeAnimate/exportToEdgeAnimateTest.jsx: -------------------------------------------------------------------------------- 1 | #include "exportToEdgeAnimate.jsx" $.level = 0; export2Animate(); -------------------------------------------------------------------------------- /illustrator/removeEmpyLayers/remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidderaedt/CSscripts/HEAD/illustrator/removeEmpyLayers/remove.png -------------------------------------------------------------------------------- /illustrator/randomizeColors/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidderaedt/CSscripts/HEAD/illustrator/randomizeColors/screenshot.png -------------------------------------------------------------------------------- /illustrator/newLayerFromSel/readme.md: -------------------------------------------------------------------------------- 1 | # New Layer From Selection 2 | 3 | Creates a new layer, and moves all selected elements to this new layer. -------------------------------------------------------------------------------- /illustrator/distribSelection2Layers/readme.md: -------------------------------------------------------------------------------- 1 | # Distribute selection to layers 2 | 3 | Simply distribute the currently selected items across new layers -------------------------------------------------------------------------------- /illustrator/export2EdgeAnimate/export2AnimateTest.jsx: -------------------------------------------------------------------------------- 1 | // This file is intended to test the EdgeAnimate exporter 2 | // outside the panel context 3 | 4 | #include "export2Animate.jsxbin" 5 | 6 | var useSVG = true; 7 | 8 | doExport(useSVG); -------------------------------------------------------------------------------- /photoshop/export2easelJS/readme.md: -------------------------------------------------------------------------------- 1 | # Export To EaselJS 2 | 3 | Exports a naming-convention based PSD file to a spritesheet for use with EaselJS projects. 4 | 5 | Please refer to the CreateJS utils repo for downloads and for more informations. 6 | -------------------------------------------------------------------------------- /photoshop/template1.txt: -------------------------------------------------------------------------------- 1 | //EaselJS Spritesheet 2 | if (!window.@{libName}) { window.@{libName} = {}; } 3 | (function(scope) { 4 | var spritesheetPath='@{folder}/@{imageName}.png'; 5 | 6 | @{sprites} 7 | 8 | // Endofspritesdef 9 | }(window.@{libName})); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | photoshop/LiveCoding.jsx 3 | 4 | photoshop/test-ignore/ 5 | illustrator/test-ignore/ 6 | 7 | # OS generated files # 8 | ###################### 9 | .DS_Store 10 | .DS_Store? 11 | ._* 12 | .Spotlight-V100 13 | .Trashes 14 | Icon? 15 | ehthumbs.db 16 | Thumbs.db -------------------------------------------------------------------------------- /illustrator/export-layers-v1/readme.md: -------------------------------------------------------------------------------- 1 | # Export layers (Deprecated) 2 | 3 | This folder holds the previous methods I used for extracting data and exporting images from layers. It is now deprecated. 4 | 5 | Please use the new version, export-layers-v2, which is used for the Layer Exporter panel. -------------------------------------------------------------------------------- /illustrator/removeEmpyLayers/readme.md: -------------------------------------------------------------------------------- 1 | # Remove empty layers 2 | 3 | Clean your AI file by recursively removing empty layers, or sublayers. 4 | 5 | [Download JSX file here](https://raw.github.com/davidderaedt/CSscripts/master/illustrator/removeEmpyLayers/removeEmptyLayers.jsx) 6 | 7 | ![image](remove.png) -------------------------------------------------------------------------------- /illustrator/randomizeColors/readme.md: -------------------------------------------------------------------------------- 1 | # Randomize Colors 2 | 3 | Randomly applies fill and stroke colors from the selected swatches to all selected items. 4 | 5 | [Download](https://raw.github.com/davidderaedt/CSscripts/master/illustrator/randomizeColors/randomizeColors.jsx) 6 | 7 | ![image](screenshot.png) -------------------------------------------------------------------------------- /illustrator/newLayerFromSel/newLayerFromSel.jsx: -------------------------------------------------------------------------------- 1 | #target illustrator 2 | 3 | var doc = app.activeDocument; 4 | var items = doc.selection; 5 | 6 | var n = items.length; 7 | 8 | var layer = doc.layers.add(); 9 | 10 | for ( var i = n-1 ; i >=0 ; i--) { 11 | var item = items[i]; 12 | item.move(layer,ElementPlacement.PLACEATBEGINNING); 13 | } 14 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/readme.md: -------------------------------------------------------------------------------- 1 | #Layer Exporter 2 | 3 | Scripts used for Illustrator layer data extraction and image export. 4 | 5 | They were meant to be used in the context of the Layer Exporter Panel, loaded in their compiled JSXBIN form (see the panel source repo for more informations). 6 | 7 | However, it can still be used directly if you carefully respect the dependency tree. See tester.jsx for a sample. -------------------------------------------------------------------------------- /illustrator/fillArtboardWithShape/readme.md: -------------------------------------------------------------------------------- 1 | # Fill artboard with shape 2 | 3 | Duplicates the selected item so that it completely covers the current artboard. 4 | Consider this as a simpler alternative to patterns, where shape remain directly accessible in the current layer. 5 | 6 | [Download JSX file here](https://raw.github.com/davidderaedt/CSscripts/master/illustrator/fillArtboardWithShape/fillArtboardWithShape.jsx) 7 | 8 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | Creative Cloud Scripts 2 | --------- 3 | 4 | Various scripts for Creative Cloud (fka Creative Suite) tools organized in a very simple framework. 5 | 6 | Scripts are organized by software (Photoshop, Illustrator, Flash Pro…). Inside each folder is a series of utilities declared as top-level object, usually defined inside function closures. 7 | 8 | Subfolders contain ready-to-use scripts. When available, end users should *always* use the compiled `jsxbin` version of the scripts since it includes dependencies. 9 | 10 | -------------------------------------------------------------------------------- /illustrator/distribSelection2Layers/distribSelectionToLayers.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. 2 | // author David Deraedt 3 | 4 | // Distributes selected items across new layers 5 | 6 | #target illustrator 7 | 8 | var doc = app.activeDocument; 9 | var items = doc.selection; 10 | 11 | var n = items.length; 12 | 13 | for ( var i = n-1 ; i >=0 ; i--) { 14 | 15 | var item = items[i]; 16 | var layer = doc.layers.add(); 17 | item.move(layer,ElementPlacement.PLACEATBEGINNING); 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/tester.jsx: -------------------------------------------------------------------------------- 1 | #include ExportLayersAndData.jsx 2 | 3 | var imageParams = { 4 | precision: 1, 5 | svgFont: false, 6 | jpgQuality: 100, 7 | embedImages: true, 8 | svgCssPropLoc:0 // 0 = presentation att, 1 = style el, 2 = style att 9 | }; 10 | 11 | var outputParams = { 12 | createJSON:true, 13 | toHTML:true, 14 | sepCss:true, 15 | toEdgeAnimate:false 16 | }; 17 | 18 | var data = $.exportLayersAndData(imageParams, outputParams); 19 | 20 | //makeLog("IllustratorLayerExporter"); 21 | -------------------------------------------------------------------------------- /photoshop/template2.txt: -------------------------------------------------------------------------------- 1 | // @{spriteName} 2 | var @{spriteName} = function() {this.initialize();} 3 | @{spriteName}._SpriteSheet = new createjs.SpriteSheet( 4 | { 5 | images: [spritesheetPath], 6 | frames:@{frameData}, 7 | animations: @{animationData} 8 | }); 9 | 10 | var @{spriteName}_p = @{spriteName}.prototype = new createjs.BitmapAnimation(); 11 | @{spriteName}_p.BitmapAnimation_initialize = @{spriteName}_p.initialize; 12 | @{spriteName}_p.initialize = function() { 13 | this.BitmapAnimation_initialize(@{spriteName}._SpriteSheet); 14 | this.paused = false; 15 | } 16 | scope.@{spriteName} = @{spriteName}; -------------------------------------------------------------------------------- /illustrator/savelayerstoai/readme.md: -------------------------------------------------------------------------------- 1 | # Save Layers to ai files 2 | 3 | This script saves each layer of an .ai file to its own, separate .ai file. By default, the content (aka page items) of the original layer will be transformed to layers itself in the new file, so that this script can be used recursively. 4 | 5 | This script can be useful in integration processes where only top level layers are considered (such as when working between AfterEffects and Illustrator or using Illustrator Layer Exporter). 6 | 7 | [Download JSX](https://raw.githubusercontent.com/davidderaedt/CSscripts/master/illustrator/savelayerstoai/savelayerstoai.jsx) -------------------------------------------------------------------------------- /flash-pro/createJS/README.md: -------------------------------------------------------------------------------- 1 | Flash Pro CS6 EaselJS Plugins 2 | ================= 3 | 4 | 5 | Install flash pro plugins simply by copying the JSFL files in 6 | */Applications/Adobe Flash CS6/Common/Configuration/Sprite Sheet Plugins* 7 | …or the equivalent path on Windows. 8 | 9 | `easeljs2` works just like the original exporter, except that it stores classes in an object (`myGame`, by default) rather than in the global `window` object and it exposes the spritesheet folder as a variable named `spritesheetPath` in the generated JS file. 10 | 11 | The JSFL file exposes various options at the top of the file, such as the default destination folder for the spritesheet, or the ability to get rid of methods which expose animations (see comments for more informations). 12 | 13 | 14 | `easeljs-json` simply exports all data in JSON format rather than in a javascript file. 15 | 16 | -------------------------------------------------------------------------------- /photoshop/export2EdgeAnimate/exportToEdgeAnimate.jsx: -------------------------------------------------------------------------------- 1 | #include "../LayerDataExtractor.jsx" #include "../LayerExporter.jsx" #include "../../edgeanimate/EdgeAnimateImporter.jsx" #target photoshop function export2Animate(){ if ( app.documents.length == 0 ) return; var doc = app.activeDocument; // Switch to pixel units var strtRulerUnits = app.preferences.rulerUnits; if (strtRulerUnits != Units.PIXELS) { app.preferences.rulerUnits = Units.PIXELS; } var itemsData = LayerDataExtractor.exportLayersData(doc, "PNG"); inspectArray(itemsData); var anFile = File.openDialog ("Select the .an file of the destination Edge Animate project."); if(!anFile) return; var destFolder = anFile.parent; var imgFolder = new Folder(destFolder.path +"/"+ destFolder.name + "/images/"); if(!imgFolder.exists) imgFolder.create(); LayerExporter.exportDocLayers(doc, imgFolder); EdgeAnimateImporter.doImport(anFile, itemsData); app.preferences.rulerUnits = strtRulerUnits; } -------------------------------------------------------------------------------- /photoshop/export2easelJS/exportToEaselJS.jsx: -------------------------------------------------------------------------------- 1 | // Test script for SpriteExporter and EaselJSExporter 2 | 3 | // enable double clicking from the Macintosh Finder or the Windows Explorer 4 | #target photoshop 5 | 6 | #include "../EaselJSExporter.jsx" 7 | #include "../SpriteExporter.jsx" 8 | 9 | // in case we double clicked the file 10 | app.bringToFront(); 11 | 12 | // debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning) 13 | $.level = 1; 14 | 15 | 16 | 17 | var libFileName = "spriteLib.js"; 18 | 19 | // Check if we have a doc to work with 20 | if (app.documents.length == 0){ 21 | alert ("No document opened"); 22 | } 23 | else { 24 | 25 | // Let the user select its destination and save 26 | var destF = Folder.selectDialog ("Select Destination"); 27 | 28 | if(destF){ 29 | var folderName = destF.absoluteURI+"/"; 30 | var fileDest = folderName + libFileName; 31 | SpriteExporter.doExport(app.activeDocument, EaselJSExporter, folderName, fileDest); 32 | } 33 | } 34 | 35 | 36 | -------------------------------------------------------------------------------- /photoshop/replaceAllSmartObjectContents.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | function replaceCurrentSO(filePath){ 4 | 5 | var idplacedLayerReplaceContents = stringIDToTypeID( "placedLayerReplaceContents" ); 6 | var desc = new ActionDescriptor(); 7 | var idnull = charIDToTypeID( "null" ); 8 | desc.putPath( idnull, new File(filePath) ); 9 | executeAction( idplacedLayerReplaceContents, desc, DialogModes.NO ); 10 | } 11 | 12 | 13 | function replaceAllSmartObjects(filePath) { 14 | 15 | var doc = app.activeDocument; 16 | 17 | var layers = doc.artLayers; 18 | 19 | var i; 20 | for (i = 0; i < layers.length; i++) { 21 | var l = layers[i]; 22 | if (l.kind == LayerKind.SMARTOBJECT) { 23 | //log(l.name + ' is a smartObject'); 24 | doc.activeLayer = l; 25 | replaceCurrentSO(filePath); 26 | } 27 | } 28 | } 29 | 30 | 31 | var path = "/Users/dderaedt/Creative Cloud Files/paperjs.png"; 32 | 33 | replaceAllSmartObjects(path); 34 | -------------------------------------------------------------------------------- /illustrator/export-layers-v1/export-layers-panelscript.jsx: -------------------------------------------------------------------------------- 1 | #include "LayerExporter.jsx" 2 | 3 | #target illustrator 4 | 5 | function exportLayers(exportType, destFolderPath) { 6 | 7 | if ( app.documents.length > 0 ) { 8 | 9 | var doc = app.activeDocument; 10 | var docFile = doc.fullName; 11 | 12 | if(!doc.saved){ 13 | Window.alert("This script needs to modify your document. Please save it before running this script."); 14 | return; 15 | } 16 | 17 | var destFolder; 18 | if(!destFolderPath) destFolder = Folder.selectDialog ("Select Destination Folder"); 19 | else destFolder = new Folder (destFolderPath); 20 | 21 | if(!destFolder) return; 22 | 23 | 24 | LayerExporter.exportLayers(doc, destFolder, exportType); 25 | 26 | // Close and reopen original 27 | // necessary since the script needs to modify the original file 28 | doc.close(SaveOptions.DONOTSAVECHANGES); 29 | doc = null; 30 | app.open(docFile); 31 | 32 | } 33 | 34 | } 35 | 36 | $.exportLayers = exportLayers; -------------------------------------------------------------------------------- /photoshop/export2easelJS/exportToEaselJSPanel.jsx: -------------------------------------------------------------------------------- 1 | // Test script for SpriteExporter and EaselJSExporter // enable double clicking from the Macintosh Finder or the Windows Explorer #target photoshop #include "../EaselJSExporter.jsx" #include "../SpriteExporter.jsx" // in case we double clicked the file app.bringToFront(); // debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning) $.level = 1; $.cjs_xport={}; $.cjs_xport.doExport = function (pPath) { var libFileName = "spriteLib.js"; // Check if we have a doc to work with if (app.documents.length == 0){ alert ("No document opened"); } else { // Let the user select its destination and save var destF = new Folder(pPath) || Folder.selectDialog ("Select Destination"); if(destF){ var folderName = destF.absoluteURI+"/"; var fileDest = folderName + libFileName; SpriteExporter.doExport(app.activeDocument, EaselJSExporter, folderName, fileDest); } } } -------------------------------------------------------------------------------- /illustrator/export-layers-v1/export-layers.jsx: -------------------------------------------------------------------------------- 1 | #include "LayerExporter.jsx" 2 | 3 | #include "LayerDataExtractor.jsx" 4 | 5 | 6 | #target illustrator 7 | 8 | function exportLayers(exportType) { 9 | 10 | if ( app.documents.length > 0 ) { 11 | 12 | var doc = app.activeDocument; 13 | var docFile = doc.fullName; 14 | 15 | if(!doc.saved){ 16 | Window.alert("This script needs to modify your document. Please save it before running this script."); 17 | return; 18 | } 19 | 20 | var destFolder = Folder.selectDialog ("Select Destination Folder"); 21 | if(!destFolder) return; 22 | 23 | /* 24 | var ldata = LayerDataExtractor.exportLayersData(doc, exportType); 25 | $.writeln(ldata); 26 | */ 27 | LayerExporter.exportLayers(doc, destFolder, exportType); 28 | 29 | // Close and reopen original 30 | // necessary since the script needs to modify the original file 31 | doc.close(SaveOptions.DONOTSAVECHANGES); 32 | doc = null; 33 | app.open(docFile); 34 | 35 | } 36 | 37 | } 38 | 39 | exportLayers(ExportType.SVG); -------------------------------------------------------------------------------- /photoshop/export2EdgeAnimate/readme.md: -------------------------------------------------------------------------------- 1 | # Photoshop To Edge Animate Exporter 2 | 3 | 4 | >WARNING: This is an early preview for an upcoming (unofficial) panel / extension. This script will modify the original .an file so please backup and use at you own risk! 5 | 6 | Feeling adventurous? You can try the panel here: 7 | 8 | [DOWNLOAD EDGE ANIMATE EXTENSION PREVIEW](https://dl.dropbox.com/u/112869/panel-and-testfiles.zip) 9 | 10 | ## Description 11 | 12 | This script exports the active Photoshop document to an Edge Animate project. Each layer is converted to a PNG file placed in the project's "images" folder. The project's `xxx_edge.js` dom array will also be modified to properly place each image onto the project's stage. 13 | 14 | The script is recursive, meaning that layer groups will be correctly parsed and converted to a corresponding group (div) in the Edge Animate project. 15 | 16 | ##Known issues 17 | 18 | * Adjustement layers are not supported 19 | * Text is always rasterized 20 | * Edge animate groups are placed in the top left corner of the stage and artificially scaled at 500px * 500px. Items should however be correctly positionned -------------------------------------------------------------------------------- /photoshop/generative-art-examples/strips.jsx: -------------------------------------------------------------------------------- 1 | #target photoshop 2 | 3 | 4 | (function (){ 5 | 6 | if (app.documents.length==0) return; 7 | 8 | var doc = app.activeDocument; 9 | doc.artLayers.add(); 10 | 11 | var docW = doc.width.value; 12 | var docH = doc.height.value; 13 | 14 | var colWidth = 6; 15 | 16 | var n = docW / colWidth; 17 | 18 | var opacity = 100; 19 | 20 | for ( var i = 0 ; i < n ; i ++){ 21 | 22 | var x = i*colWidth; 23 | var red = Math.ceil(Math.random()*255); 24 | var light = (red/2) + Math.ceil(Math.random()*red/2); 25 | var sh = docH; 26 | drawRect(x, 0, colWidth, sh, [red, light, light, opacity]); 27 | 28 | } 29 | 30 | doc.selection.deselect(); 31 | 32 | function drawRect(x, y, w, h, color){ 33 | 34 | $.writeln (color); 35 | var region = [[x, y], [x+w, y], [x+w, y+h], [x, y+h]]; 36 | doc.selection.select(region); 37 | var fillColor = new SolidColor(); 38 | fillColor.rgb.red = color[0]; 39 | fillColor.rgb.green = color[1]; 40 | fillColor.rgb.blue = color[2]; 41 | doc.selection.fill(fillColor, ColorBlendMode.NORMAL, color[3], false); 42 | } 43 | 44 | 45 | })(); -------------------------------------------------------------------------------- /illustrator/removeEmpyLayers/removeEmptyLayers.jsx: -------------------------------------------------------------------------------- 1 | var logStr=""; 2 | function log(pStr){ 3 | logStr+=pStr+"
"; 4 | } 5 | 6 | var removable; 7 | 8 | function main(){ 9 | 10 | if ( app.documents.length == 0 ) { 11 | return; 12 | } 13 | 14 | doStuff(); 15 | 16 | return logStr; 17 | } 18 | 19 | 20 | 21 | 22 | function doStuff() { 23 | 24 | var doc = app.activeDocument; 25 | var docLayers = doc.layers; 26 | 27 | removable = []; 28 | markAsRemovableIn(docLayers); 29 | removeLayers(removable); 30 | } 31 | 32 | 33 | function markAsRemovableIn(layers) { 34 | 35 | var lCount = layers.length; 36 | 37 | var i; 38 | for ( i = 0 ; i < lCount; i++){ 39 | 40 | var layer = layers[i]; 41 | 42 | if(layer.layers.length > 0){ 43 | markAsRemovableIn(layer.layers); 44 | } else if(layer.pageItems.length==0) { 45 | removable.push(layer); 46 | } 47 | 48 | } 49 | 50 | } 51 | 52 | function removeLayers(layers) { 53 | 54 | var lCount = layers.length; 55 | 56 | var i; 57 | for ( i = 0 ; i < lCount; i++) { 58 | var layer = layers[i]; 59 | layer.remove(); 60 | 61 | } 62 | } 63 | 64 | 65 | 66 | 67 | main(); 68 | -------------------------------------------------------------------------------- /illustrator/randomizeColors/randomizeColors.jsx: -------------------------------------------------------------------------------- 1 | var logStr=""; 2 | function log(pStr){ 3 | logStr+=pStr+"
"; 4 | } 5 | 6 | function main(){ 7 | 8 | if ( app.documents.length == 0 ) { 9 | return; 10 | } 11 | 12 | doStuff(); 13 | 14 | return logStr; 15 | } 16 | 17 | 18 | function doStuff() { 19 | 20 | var doc = app.activeDocument; 21 | var canRect = doc.artboards[0].artboardRect; 22 | var boardW = canRect[2]; 23 | var boardH = -canRect[3]; 24 | 25 | var swatches = doc.swatches.getSelected(); 26 | 27 | if(doc.selection.length==0) { 28 | alert("No items selected"); 29 | } else if(swatches.length == 0) { 30 | alert("Please select swatches"); 31 | } else { 32 | randomizeColor(doc.selection, swatches); 33 | } 34 | 35 | } 36 | 37 | function randomizeColor (items, swatches) { 38 | 39 | var count = items.length; 40 | 41 | for (i = 0; i < count ; i++) { 42 | var c = items[i]; 43 | var swatchIndex = Math.round( Math.random() * ( swatches.length - 1 ) ); 44 | c.fillColor = swatches[ swatchIndex ].color; 45 | 46 | var swatchIndex2 = Math.round( Math.random() * ( swatches.length - 1 ) ); 47 | c.strokeColor = swatches[ swatchIndex2 ].color; 48 | } 49 | } 50 | 51 | main(); 52 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/Renamer.jsx: -------------------------------------------------------------------------------- 1 | function appendToSelNames(suffix) { 2 | 3 | 4 | var items = app.selection; 5 | var n = items.length; 6 | 7 | for ( var i = 0; i < n ; i ++) { 8 | var item = items[i]; 9 | var index = item.name.lastIndexOf("."); 10 | 11 | if (index == -1){ 12 | item.name += suffix; 13 | } 14 | else { 15 | var firstPart = item.name.substr(0, index); 16 | //log += firstPart + suffix+", "; 17 | item.name = firstPart + suffix; 18 | } 19 | 20 | } 21 | 22 | // forces refresh 23 | app.selection=[]; 24 | } 25 | 26 | 27 | function appendToAllLayers(suffix){ 28 | 29 | var doc = app.activeDocument; 30 | var n = doc.layers.length; 31 | for ( var i = 0; i < n ; i ++) { 32 | 33 | var layer = doc.layers[i]; 34 | var index = layer.name.lastIndexOf("."); 35 | 36 | if (index == -1){ 37 | layer.name += suffix; 38 | } 39 | else { 40 | var firstPart = layer.name.substr(0, index); 41 | //log += firstPart + suffix+", "; 42 | layer.name = firstPart + suffix; 43 | } 44 | } 45 | 46 | 47 | } 48 | 49 | //appendToSelNames(".svg"); 50 | //appendToAllLayers(""); -------------------------------------------------------------------------------- /illustrator/export2EdgeAnimate/readme.md: -------------------------------------------------------------------------------- 1 | Illustrator to Edge Animate exporter 2 | --------- 3 | 4 | >WARNING: This script is meant to be used by an upcoming (unofficial) panel / extension. If you are not a developer, you probably want to use the extension directly: 5 | 6 | [DOWNLOAD THE PANEL HERE](https://dl.dropbox.com/u/112869/IllustratorEdgeAnimateExporter.zxp) 7 | 8 | The underlying script exports the active Illustrator document to an Edge Animate project. Each layer is converted to a SVG or PNG file placed in the project's "images" folder. The project's `xxx_edge.js` dom array will also be modified to properly place each image onto the project's stage. 9 | 10 | Note that only top level layers are exported. Each layer's content is flattened to a bitmap (PNG24) or vector (SVG) data, whatever its content. If your file doesn't use layers, consider using my `distributeSelectionToLayers.jsx` script which does exaclty that. 11 | 12 | 13 | Known Issues 14 | 15 | * Hidden layers will be ignored by the animate project but still exported in the image folder 16 | * SVG export is slow, much slower than PNG. 17 | 18 | Possible roadmap 19 | 20 | * Symbols conversion (AI symbol to Animate symbol) 21 | * Optionnaly export artboard size to stage size 22 | * Optionnaly export in a div/group 23 | * Allow sub-layers / sub-items grouped into divs/groups 24 | * … your idea go here ! 25 | -------------------------------------------------------------------------------- /illustrator/export2EdgeAnimate/export2Animate.jsx: -------------------------------------------------------------------------------- 1 | #include "../../edgeanimate/EdgeAnimateImporter.jsx" 2 | #include "../export-layers-v1/LayerDataExtractor.jsx" 3 | #include "../export-layers-v1/LayerExporter.jsx" 4 | 5 | #target illustrator 6 | 7 | function doExport(useSVG) { 8 | 9 | if ( app.documents.length > 0 ) { 10 | 11 | var doc = app.activeDocument; 12 | var docFile = doc.fullName; 13 | 14 | if(!doc.saved){ 15 | Window.alert("This script needs to modify your document. Please save it before running this script."); 16 | return; 17 | } 18 | 19 | var anFile = File.openDialog ("Select the .an file of the destination Edge Animate project."); 20 | if(!anFile) return; 21 | 22 | 23 | var exportType = useSVG ? ExportType.SVG : ExportType.PNG24; 24 | 25 | 26 | var itemsData = LayerDataExtractor.exportLayersData(doc, exportType); 27 | $.writeln(itemsData); 28 | 29 | var destFolder = anFile.parent; 30 | var imgFolder = new Folder(destFolder.path +"/"+ destFolder.name + "/images/"); 31 | if(!imgFolder.exists) imgFolder.create(); 32 | var dest = imgFolder.absoluteURI+"/"; 33 | 34 | LayerExporter.exportLayers(doc, imgFolder, exportType); 35 | 36 | EdgeAnimateImporter.doImport(anFile, itemsData); 37 | 38 | 39 | // Close and reopen original 40 | // (necessary since the script needs to modify the original file) 41 | doc.close(SaveOptions.DONOTSAVECHANGES); 42 | doc = null; 43 | app.open(docFile); 44 | 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /illustrator/fillArtboardWithShape/fillArtboardWithShape.jsx: -------------------------------------------------------------------------------- 1 | var logStr=""; 2 | function log(pStr){ 3 | logStr+=pStr+"
"; 4 | } 5 | 6 | function main(){ 7 | 8 | if ( app.documents.length == 0 ) { 9 | $.writeln("No active doc"); 10 | return; 11 | } 12 | 13 | drawStuff(); 14 | 15 | return logStr; 16 | } 17 | 18 | 19 | function drawStuff() { 20 | 21 | var doc = app.activeDocument; 22 | var canRect = doc.artboards[doc.artboards.getActiveArtboardIndex()].artboardRect; 23 | var boardW = canRect[2] - canRect[0]; 24 | var boardH = -canRect[3] + canRect[1]; 25 | 26 | 27 | if(doc.selection.length == 0) { 28 | alert("Nothing selected"); 29 | } else { 30 | fillWithItem(app.activeDocument.selection[0], boardW, boardH); 31 | } 32 | 33 | } 34 | 35 | 36 | function fillWithItem(shape, width, height) { 37 | 38 | var itemWidth = shape.width; 39 | var itemHeight = shape.height; 40 | 41 | var col; 42 | var row; 43 | var colCount = Math.ceil(width / itemWidth) ; 44 | var rowCount = Math.ceil(height / itemHeight) ; 45 | 46 | var count = 0; 47 | 48 | 49 | for (col = 0; col < colCount ; col++) { 50 | 51 | for (row = 0; row < rowCount ; row++) { 52 | 53 | var c = shape.duplicate(app.activeDocument, ElementPlacement.PLACEATEND); 54 | 55 | var xpos = col * itemWidth; 56 | var ypos = (row * itemHeight) * -1; 57 | 58 | c.position = [xpos, ypos]; 59 | 60 | count++; 61 | } 62 | } 63 | log( count + " shapes created"); 64 | } 65 | 66 | 67 | main(); 68 | -------------------------------------------------------------------------------- /photoshop/PhotoshopCommons.jsx: -------------------------------------------------------------------------------- 1 | function selectVisibleIn(layer){ var idsetd = charIDToTypeID( "setd" ); var desc2 = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref1 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idfsel = charIDToTypeID( "fsel" ); ref1.putProperty( idChnl, idfsel ); desc2.putReference( idnull, ref1 ); var idT = charIDToTypeID( "T " ); var ref2 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idChnl = charIDToTypeID( "Chnl" ); var idTrsp = charIDToTypeID( "Trsp" ); ref2.putEnumerated( idChnl, idChnl, idTrsp ); var idLyr = charIDToTypeID( "Lyr " ); ref2.putName( idLyr, layer.name ); desc2.putReference( idT, ref2 ); executeAction( idsetd, desc2, DialogModes.NO ); } function selectVisibleInVector(layer) { var idsetd = charIDToTypeID( "setd" ); var desc29 = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref30 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idfsel = charIDToTypeID( "fsel" ); ref30.putProperty( idChnl, idfsel ); desc29.putReference( idnull, ref30 ); var idT = charIDToTypeID( "T " ); var ref31 = new ActionReference(); var idPath = charIDToTypeID( "Path" ); var idPath = charIDToTypeID( "Path" ); var idvectorMask = stringIDToTypeID( "vectorMask" ); ref31.putEnumerated( idPath, idPath, idvectorMask ); var idLyr = charIDToTypeID( "Lyr " ); ref31.putName( idLyr, layer.name ); desc29.putReference( idT, ref31 ); var idVrsn = charIDToTypeID( "Vrsn" ); desc29.putInteger( idVrsn, 1 ); var idvectorMaskParams = stringIDToTypeID( "vectorMaskParams" ); desc29.putBoolean( idvectorMaskParams, true ); executeAction( idsetd, desc29, DialogModes.NO ); } -------------------------------------------------------------------------------- /photoshop/generative-art-examples/polygon.jsx: -------------------------------------------------------------------------------- 1 | #target photoshop 2 | 3 | #include "../PrimitiveShapes.jsx" 4 | 5 | (function (){ 6 | 7 | if (app.documents.length==0) return; 8 | 9 | var doc = app.activeDocument; 10 | var l = doc.artLayers.add(); 11 | 12 | var docW = doc.width.value; 13 | var docH = doc.height.value; 14 | 15 | var colWidth = 6; 16 | 17 | var n = 10; 18 | 19 | 20 | var x1 = 0; 21 | var y1 = 0; 22 | var x2 = 0; 23 | var y2 = 0; 24 | var coords=[]; 25 | 26 | for ( var i = 0 ; i < n ; i ++){ 27 | 28 | x1 = x2; 29 | y1 = y2; 30 | x2 = Math.random() * docW; 31 | y2 = Math.random() * docH; 32 | 33 | //drawLine(doc, "p"+i, [x1, y1], [x2, y2]); 34 | 35 | 36 | var p = [x2, y2]; 37 | var pt = new PathPointInfo(); 38 | pt.anchor = p; 39 | pt.leftDirection = p; 40 | pt.rightDirection = p; 41 | pt.kind = PointKind.CORNERPOINT; 42 | coords.push(pt); 43 | 44 | } 45 | 46 | 47 | var p = drawPolygon(doc, "poly", {r:255, g:255, b:255, a:100}, coords); 48 | 49 | pathtoVectorMask() ; 50 | })(); 51 | 52 | 53 | function pathtoVectorMask() { 54 | function cTID(s) { return app.charIDToTypeID(s); }; 55 | function sTID(s) { return app.stringIDToTypeID(s); }; 56 | 57 | var desc27 = new ActionDescriptor(); 58 | var ref11 = new ActionReference(); 59 | ref11.putClass( cTID('Path') ); 60 | desc27.putReference( cTID('null'), ref11 ); 61 | var ref12 = new ActionReference(); 62 | ref12.putEnumerated( cTID('Path'), cTID('Path'), sTID('vectorMask') ); 63 | desc27.putReference( cTID('At '), ref12 ); 64 | var ref13 = new ActionReference(); 65 | ref13.putEnumerated( cTID('Path'), cTID('Ordn'), cTID('Trgt') ); 66 | desc27.putReference( cTID('Usng'), ref13 ); 67 | executeAction( cTID('Mk '), desc27, DialogModes.NO ); 68 | }; -------------------------------------------------------------------------------- /photoshop/PrimitiveShapes.jsx: -------------------------------------------------------------------------------- 1 | function drawLine(doc, name, start, stop) { 2 | 3 | var startPoint = new PathPointInfo(); 4 | startPoint.anchor = start; 5 | startPoint.leftDirection = start; 6 | startPoint.rightDirection = start; 7 | startPoint.kind = PointKind.CORNERPOINT; 8 | 9 | var stopPoint = new PathPointInfo(); 10 | stopPoint.anchor = stop; 11 | stopPoint.leftDirection = stop; 12 | stopPoint.rightDirection = stop; 13 | stopPoint.kind = PointKind.CORNERPOINT; 14 | 15 | 16 | var spi = new SubPathInfo(); 17 | spi.closed = false; 18 | spi.operation = ShapeOperation.SHAPEADD; 19 | spi.entireSubPath = [startPoint, stopPoint]; 20 | var line = doc.pathItems.add(name, [spi]); 21 | line.strokePath(ToolType.PENCIL); 22 | line.remove(); 23 | } 24 | 25 | 26 | function drawPolygon(doc, name, color, coords){ 27 | 28 | var spi = new SubPathInfo(); 29 | spi.closed = false; 30 | spi.operation = ShapeOperation.SHAPEADD; 31 | spi.entireSubPath = coords; 32 | var poly = doc.pathItems.add(name, [spi]); 33 | poly.strokePath(ToolType.PENCIL); 34 | var c = new SolidColor(); 35 | c.rgb.red = color.r; 36 | c.rgb.green = color.g; 37 | c.rgb.blue = color.b; 38 | poly.fillPath (c, ColorBlendMode.NORMAL, color.a, false, 0, true, true); 39 | //poly.remove(); 40 | return poly; 41 | } 42 | 43 | 44 | function drawRect(doc, name, color, x, y, w, h){ 45 | 46 | var tl = createCornerPoint([x, y]); 47 | var tr = createCornerPoint([x+w, y]); 48 | var br = createCornerPoint([x+w, y+h]); 49 | var bl = createCornerPoint([x, y+h]); 50 | var coords = [tl, tr, br, bl]; 51 | 52 | drawPolygon(doc, name, color, coords); 53 | 54 | function createCornerPoint(pAnchor){ 55 | var p = new PathPointInfo(); 56 | p.rightDirection = p.leftDirection = p.anchor = pAnchor; 57 | p.kind = PointKind.CORNERPOINT; 58 | return p; 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /photoshop/LayerExporter.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. // author David Deraedt #include "../common/Utils.jsx" var LayerExporter = (function () { /** Exports all layers of a given document to properly sized PNG files @public @param {Document} doc The document to export @param {Folder} destFolder The destination folder for the image files */ function exportDocLayers(doc, destFolder){ var destPath = destFolder.path +"/"+ destFolder.name+"/"; var docName = normalizeName(getFileNamePart(doc.name)); exportLayers(doc.layers, destPath, docName); } function exportLayers(layers, destPath, prefix){ var n = layers.length; var j; for ( j = 0 ; j < n ; j++){ var l = layers[j]; var fileName = prefix + "-" + normalizeName(l.name); log(l.name); // ignore invisible if(l.visible == false) continue; //groups if(l instanceof ArtLayer==false) { exportLayers(l.layers, destPath, prefix); continue; } if(l.kind == LayerKind.SOLIDFILL) { l.rasterize (RasterizeType.SHAPE); } // ignore adjustment layers and other weird stuffs I don't get else if(l.kind != LayerKind.NORMAL && l.kind != LayerKind.TEXT) { log(l.name + " ignored because kind is " + l.kind); continue; } // ignore empty if(l.bounds[2]==0) continue; app.activeDocument.activeLayer = l; exportImage(app.activeDocument, l, destPath, fileName); } } function exportImage(doc, l, destPath, fileName) { selectVisibleIn (l); doc.selection.copy(); var bounds = doc.selection.bounds; var x = bounds[0].value; var y = bounds[1].value; var w = bounds[2].value - x; var h = bounds[3].value - y; var newDoc = app.documents.add(w, h, 72, l.name, NewDocumentMode.RGB, DocumentFill.TRANSPARENT); newDoc.paste(); var pngSaveOptions = new PNGSaveOptions(); var saveFile = new File (destPath + fileName + ".png"); newDoc.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE); newDoc.close(SaveOptions.DONOTSAVECHANGES); newDoc = null; } var obj = {}; obj.exportDocLayers = exportDocLayers; return obj; }()); -------------------------------------------------------------------------------- /photoshop/LayerDataExtractor.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. // author David Deraedt #include "../common/Utils.jsx" #include "PhotoshopCommons.jsx" var LayerDataExtractor = (function () { /** Exports all layers data of a given document to an array of objects describing items and positions @public @param {Document} doc The document to export @param {String} exportType Determines if layers should be converted to JPG or PNG files (This value should use ExportType constants) */ var docName=""; var exportType; function exportLayersData(doc, exportType){ docName = normalizeName(getFileNamePart(doc.name)); exportType = exportType; var itemsData = processLayers(doc.layers, doc); return itemsData; } function processLayers(layers, doc) { var itemsData = []; var n = layers.length; var j; for ( j = n-1 ; j >= 0 ; j--){ var l = layers[j]; // ignore invisible if(l.visible == false) continue; log(l.name + "is art layers? " + (l instanceof ArtLayer)); //groups if(l instanceof ArtLayer==false) { var groupData = processGroup(l); itemsData.push(groupData); groupData.items = processLayers(l.layers, doc); continue; } // ignore adjustment layers if(l.kind != LayerKind.NORMAL && l.kind != LayerKind.TEXT && l.kind != LayerKind.SOLIDFILL) continue; // ignore empty if(l.bounds[2]==0) continue; var itemData = processLayer(l, doc); itemsData.push(itemData); } return itemsData; } function processLayer(l, doc) { doc.activeLayer = l; var fileName = docName + "-" + normalizeName(l.name); if(l.kind == LayerKind.SOLIDFILL) selectVisibleInVector (l); else selectVisibleIn (l); var sel = doc.selection; var px = sel.bounds[0].value; var py = sel.bounds[1].value; var pw = sel.bounds[2].value - px; var ph = sel.bounds[3].value - py; var itemData = { x: px, y: py, width: pw, height: ph, name: fileName, ext: "png" }; return itemData; } function processGroup(l) { var name = normalizeName(l.name); var groupData = { x: 0, y: 0, width: 500, height: 500, name: name, ext: null, items:[] }; return groupData; } var obj = {}; obj.exportLayersData = exportLayersData; return obj; }()); -------------------------------------------------------------------------------- /illustrator/export-layers-v2/ExportLayersAndData.jsx: -------------------------------------------------------------------------------- 1 | #include AltLayerExporter.jsx 2 | #include DataExtractor.jsx 3 | #include ../../common/Utils.jsx 4 | #include ../../common/json2.js 5 | #include "../../edgeanimate/EdgeAnimateImporter.jsx" 6 | #include HTMLExporter.jsx 7 | 8 | $.exportLayersAndData = function (imageParams, outputParams, destFolder, ignoreHidden, doc) { 9 | 10 | if(!doc) doc = app.activeDocument; 11 | if(!ignoreHidden) ignoreHidden=true; 12 | 13 | if(!destFolder) destFolder = Folder.selectDialog ("Select Destination Folder"); 14 | if(!destFolder) return; 15 | 16 | if(!outputParams){ 17 | outputParams = { 18 | createJSON:false, 19 | toHTML:false, 20 | sepCss:false, 21 | toEdgeAnimate:false 22 | } 23 | } 24 | 25 | //safe naming 26 | var reg = new RegExp("\\s", "g"); 27 | var namingFunc = function(lname) { 28 | return lname.replace(reg, "-"); 29 | }; 30 | 31 | // name-to-file-type logic 32 | function readLayerParams(lName) { 33 | 34 | var obj = { 35 | name:lName, 36 | exportType: null, 37 | svgFont: imageParams.svgFont, 38 | jpgQuality: imageParams.jpgQuality, 39 | precision: imageParams.precision, 40 | embedImages: imageParams.embedImages, 41 | svgCssPropLoc: imageParams.svgCssPropLoc 42 | }; 43 | 44 | var nameParts = lName.split("."); 45 | 46 | if(nameParts.length > 1) obj.exportType = nameParts[1]; 47 | 48 | obj.name = namingFunc(nameParts[0]); 49 | 50 | return obj; 51 | } 52 | 53 | 54 | AltLayerExporter.exportLayers(app.activeDocument, destFolder, ignoreHidden, readLayerParams); 55 | 56 | var data = DataExtractor.getLayersCoords(doc, readLayerParams, ignoreHidden); 57 | 58 | if(outputParams.createJSON){ 59 | var text = JSON.stringify(data, null, '\t'); 60 | var filepath = destFolder.absoluteURI + "/data.json"; 61 | saveTextFile(text, filepath); 62 | } 63 | 64 | if(outputParams.toHTML){ 65 | var htmlFolder = destFolder.parent; 66 | HTMLExporter.generateFrom(data, htmlFolder, destFolder.name, outputParams.sepCss); 67 | } 68 | 69 | if(outputParams.toEdgeAnimate){ 70 | var anFile = File.openDialog ("Select the .an file of the destination Edge Animate project."); 71 | if(anFile) EdgeAnimateImporter.doImport(anFile, data.layers); 72 | } 73 | 74 | return data; 75 | } 76 | -------------------------------------------------------------------------------- /illustrator/savelayerstoai/savelayerstoai.jsx: -------------------------------------------------------------------------------- 1 | var doc = app.activeDocument; 2 | 3 | //params 4 | promoteToLayers = true; // will transform each item to a layer 5 | 6 | if (documents.length > 0){ 7 | 8 | var saveOpts = new IllustratorSaveOptions(); 9 | 10 | saveOpts.embedLinkedFiles = true; 11 | saveOpts.fontSubsetThreshold = 0.0 12 | saveOpts.pdfCompatible = false; 13 | 14 | var count = doc.layers.length; 15 | 16 | var originalFilePath = doc.path; 17 | var originalFile = new File(originalFilePath); 18 | 19 | 20 | var fileList = []; 21 | 22 | // duplicate as many docs as layers 23 | for (i=0; i < count; i++){ 24 | 25 | var index = i; 26 | var layer = doc.layers[i]; 27 | 28 | if(layer.locked) layer.locked = false; 29 | if(!layer.visible) layer.visible = true; 30 | 31 | docName = layer.name+".ai"; 32 | var newFile = new File ( doc.path + "/" + docName ); 33 | doc.saveAs( newFile, saveOpts ); 34 | fileList.push(newFile); 35 | 36 | } 37 | 38 | // open the docs 39 | for(var j = 0 ; j < count ; j++){ 40 | 41 | var file = fileList[j]; 42 | app.open (file); 43 | 44 | var curDoc = app.activeDocument; 45 | var layerKillList = []; 46 | 47 | // mark all layers but the one we want to keep 48 | for( var k = 0 ; k < count ; k++){ 49 | if(k!=j) layerKillList.push(curDoc.layers[k]); 50 | } 51 | // remove them 52 | for( var l = 0 ; l < layerKillList.length ; l++) { 53 | layerKillList[l].remove(); 54 | } 55 | 56 | if(promoteToLayers) { 57 | // promote items to layers 58 | promoteItemsToLayers(curDoc, curDoc.layers[0]); 59 | // remove the last (empty) layer 60 | curDoc.layers[curDoc.layers.length-1].remove(); 61 | } 62 | 63 | curDoc.save(); 64 | 65 | } 66 | 67 | alert("done!"); 68 | } 69 | 70 | 71 | function promoteItemsToLayers(doc, layer){ 72 | 73 | var items = layer.pageItems; 74 | 75 | var n = items.length; 76 | 77 | for ( var a = n-1 ; a >=0 ; a--) { 78 | 79 | var item = items[a]; 80 | var wasLocked = item.locked; 81 | var wasHidden = item.hidden; 82 | 83 | if(wasLocked) item.locked = false; 84 | if(wasHidden) item.hidden = false; 85 | 86 | var newlayer = doc.layers.add(); 87 | item.move(newlayer,ElementPlacement.PLACEATBEGINNING); 88 | 89 | if(wasLocked) newlayer.locked = true; 90 | if(wasHidden) newlayer.visible = false; 91 | 92 | newlayer.name = item.name; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /illustrator/export-layers-v1/LayerExporter.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. 2 | // author David Deraedt 3 | 4 | #include "../../common/Utils.jsx" 5 | 6 | var LayerExporter = (function () { 7 | 8 | /** 9 | Exports all layers of a given document to properly sized PNG or SVG files 10 | Warning: this script will modify the original file! 11 | @public 12 | @param {Document} doc The document to export 13 | @param {Folder} destFolder The destination folder for the image files 14 | @param {String} exportType Determines if layers should be converted to SVG or PNG files 15 | (This value should use ExportType constants) 16 | @param {Rect} customBounds A rectangle which determines the output file size. 17 | If null, the layer visible bounds are used. 18 | */ 19 | 20 | function exportLayers(doc, destFolder, defaultExportType, customBounds){ 21 | 22 | var destPath = destFolder.path +"/"+ destFolder.name+"/"; 23 | 24 | var artboard = doc.artboards[0]; 25 | var originRect = artboard.artboardRect; 26 | 27 | var docName = normalizeName(getFileNamePart(doc.name)); 28 | 29 | var n = doc.layers.length; 30 | 31 | var j; 32 | 33 | setLayersVisibility(doc, false); 34 | 35 | for ( j = 0 ; j < n ; j++){ 36 | 37 | var l = doc.layers[j]; 38 | 39 | l.visible = true; 40 | l.locked = false; 41 | 42 | //ignore empty layers 43 | if(l.pageItems.length==0) continue; 44 | // also ignore items which width==0 (points etc) 45 | if(doc.visibleBounds[0] == doc.visibleBounds[2]) continue; 46 | 47 | 48 | if(customBounds) artboard.artboardRect = customBounds; 49 | else artboard.artboardRect = doc.visibleBounds; 50 | 51 | var fileName = docName + "-" + normalizeName(l.name); 52 | 53 | var exportType = defaultExportType; 54 | var nameEnd = l.name.substr(l.name.length-4); 55 | if(nameEnd ==".png") exportType = ExportType.PNG24; 56 | if(nameEnd ==".svg") exportType = ExportType.SVG; 57 | 58 | 59 | exportImage(doc, destPath + fileName, exportType); 60 | 61 | l.visible = false; 62 | } 63 | 64 | artboard.artboardRect = originRect; 65 | 66 | setLayersVisibility(doc, true); 67 | } 68 | 69 | 70 | 71 | function exportImage(doc, dest, exportType) { 72 | 73 | var options; 74 | 75 | if(exportType == ExportType.SVG) { 76 | options = new ExportOptionsSVG(); 77 | options.embedRasterImages = true; 78 | } 79 | else if (exportType == ExportType.PNG24){ 80 | options = new ExportOptionsPNG24(); 81 | } 82 | 83 | var fileSpec = new File(dest); 84 | 85 | doc.exportFile( fileSpec, exportType, options ); 86 | 87 | } 88 | 89 | 90 | var obj = {}; 91 | obj.exportLayers = exportLayers; 92 | return obj; 93 | 94 | }()); 95 | -------------------------------------------------------------------------------- /edgeanimate/EdgeAnimateImporter.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. 2 | // author David Deraedt 3 | 4 | #include "../common/Utils.jsx" 5 | 6 | var EdgeAnimateImporter = (function () { 7 | 8 | 9 | /** 10 | Imports the given itemsData array to a given EdgeAnimate project 11 | The project's xxx_edge.js dom array will also be modified to properly place 12 | each image onto the project's stage. 13 | Warning: this script will modify the original an file 14 | @public 15 | @param {File} anFile The destination Edge Animate project file 16 | @param {Array} itemsData Array of item objects as exported by LayerDataExtractor 17 | */ 18 | 19 | function importToAnimate(anFile, itemsData){ 20 | 21 | var destFolder = anFile.parent; 22 | 23 | var anName = getFileNamePart(anFile.name); 24 | 25 | var imgFolder = new Folder(destFolder.path +"/"+ destFolder.name + "/images/"); 26 | if(!imgFolder.exists) imgFolder.create(); 27 | var dest = imgFolder.absoluteURI+"/"; 28 | 29 | var outputTxt = processItems(itemsData); 30 | 31 | // edge animate code generation 32 | //log("OUTPUT: " + outputTxt); 33 | var edgeFile = new File(destFolder.absoluteURI+"/" + anName + "_edge.js"); 34 | var edgeFileString = getFileString(edgeFile.absoluteURI); 35 | var newFileString = edgeFileString.replace("dom: [", "dom: [" + outputTxt); 36 | saveTextFile(newFileString, edgeFile); 37 | 38 | } 39 | 40 | 41 | function processItems(itemsData){ 42 | 43 | var outputTxt = ""; 44 | 45 | var n = itemsData.length; 46 | 47 | for ( var j = n-1 ; j >= 0 ; j--){ 48 | 49 | var item = itemsData[j]; 50 | 51 | if ( (!item.filename) && item.items) { 52 | // TODO: correct group coords 53 | outputTxt += outputGroupData(item.name, item.x, item.y, item.width, item.height); 54 | outputTxt += processItems(item.items); 55 | outputTxt += "]},"; 56 | } 57 | else outputTxt += addItemData(item); 58 | } 59 | 60 | return outputTxt; 61 | } 62 | 63 | 64 | function addItemData(item){ 65 | 66 | var txt = ""; 67 | 68 | txt += "\t\t{\n\t\t\tid:'" + item.name + "',\n"; 69 | txt += "\t\t\ttype:'image',\n"; 70 | txt += "\t\t\trect:[" + "'" + item.x + "', '" + item.y + "', '" + item.width + "px', '" + item.height + "px', " + "'auto','auto'],\n"; 71 | txt += "\t\t\tfill:[\"rgba(0,0,0,0)\",im+\"" + item.filename +"\",'0px','0px'" + "]\n"; 72 | txt += "\t\t},\n"; 73 | return txt; 74 | } 75 | 76 | 77 | function outputGroupData(name, x, y, w, h){ 78 | 79 | var txt = ""; 80 | 81 | txt += "\t\t{\n\t\t\tid:'" + name + "',\n"; 82 | txt += "\t\t\ttype:'group',\n"; 83 | txt += "\t\t\trect:[" + "'" + x + "', '" + y + "', '" + w + "px', '" + h + "px', " + "'auto','auto'],\n"; 84 | txt += "\t\tc:[\n"; 85 | return txt; 86 | } 87 | 88 | 89 | var obj = {}; 90 | obj.doImport = importToAnimate; 91 | return obj; 92 | 93 | }()); 94 | 95 | -------------------------------------------------------------------------------- /illustrator/export-layers-v1/LayerDataExtractor.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. 2 | // author David Deraedt 3 | 4 | #include "../../common/Utils.jsx" 5 | 6 | var LayerDataExtractor = (function () { 7 | 8 | /** 9 | Exports all layers data of a given document to an array of objects 10 | describing items and positions 11 | Warning: this script will modify the original file! 12 | @public 13 | @param {Document} doc The document to export 14 | @param {String} exportType Determines if layers should be converted to SVG or PNG files 15 | (This value should use ExportType constants) 16 | */ 17 | 18 | function exportLayersData(doc, exportType){ 19 | 20 | 21 | var docName = normalizeName(getFileNamePart(doc.name)); 22 | 23 | var itemsData = []; 24 | 25 | var n = doc.layers.length; 26 | 27 | var j; 28 | 29 | for ( j = n-1 ; j >= 0 ; j--){ 30 | 31 | var l = doc.layers[j]; 32 | 33 | l.locked = false; 34 | 35 | if(l.pageItems.length==0) continue; 36 | // TODO : ignoring invisible should be optional 37 | if(l.visible == false) continue; 38 | 39 | var fileName = docName + "-" + normalizeName(l.name); 40 | 41 | // In order to group items, we need to select them 42 | l.hasSelectedArtwork = true; 43 | 44 | // Need to group since there is no way to get the position of an item collection 45 | if(doc.selection.length>1) { 46 | item = groupSelection(l); 47 | // TODO ungroup 48 | } else { 49 | item = doc.selection[0]; 50 | } 51 | 52 | // unselect 53 | doc.selection = null; 54 | 55 | 56 | var itemData = getItemData(item, fileName, exportType); 57 | 58 | itemsData.push(itemData); 59 | } 60 | 61 | 62 | return itemsData; 63 | 64 | } 65 | 66 | 67 | 68 | function groupSelection(layer){ 69 | 70 | var sel = app.activeDocument.selection; 71 | var newGroup = layer.groupItems.add(); 72 | //log(layer.name + ':' + sel.length); 73 | for ( i = 0; i < sel.length; i++ ) { 74 | var newItem = sel[i]; 75 | newItem.moveToEnd( newGroup ); 76 | } 77 | return newGroup; 78 | } 79 | 80 | 81 | 82 | 83 | function getItemData(item, name, exportType){ 84 | 85 | var pos = item.position; 86 | 87 | if(app.coordinateSystem == CoordinateSystem.DOCUMENTCOORDINATESYSTEM){ 88 | pos = app.activeDocument.convertCoordinate (item.position, CoordinateSystem.DOCUMENTCOORDINATESYSTEM, CoordinateSystem.ARTBOARDCOORDINATESYSTEM); 89 | } 90 | 91 | var ext = "png"; 92 | if (exportType==ExportType.SVG) ext = "svg"; 93 | 94 | return { 95 | x: (pos[0]).toFixed(2), 96 | y: (pos[1]).toFixed(2)*-1, 97 | width: item.width.toFixed(2), 98 | height: item.height.toFixed(2), 99 | name: name, 100 | ext: ext 101 | }; 102 | } 103 | 104 | 105 | var obj = {}; 106 | obj.exportLayersData = exportLayersData; 107 | return obj; 108 | 109 | }()); 110 | -------------------------------------------------------------------------------- /common/Utils.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2012 Adobe Systems, Inc. All rights reserved. 2 | // Written by David Deraedt 3 | 4 | function clog(pText){ 5 | $.writeln(pText); 6 | } 7 | 8 | 9 | var _logtxt=""; 10 | function flog(pText){ 11 | _logtxt+=pText+"\n"; 12 | } 13 | function makeLog(pAppName){ 14 | var supportDir = new Folder(Folder.userData.absoluteURI+"/"+pAppName); 15 | if(!supportDir.exists) supportDir.create(); 16 | var _logFile = new File(supportDir.absoluteURI+"/log.txt"); 17 | saveTextFile(_logtxt, _logFile); 18 | } 19 | 20 | function inspectObj(obj){ 21 | var txt = ""; 22 | for (var z in obj) { 23 | txt += z + ":" + obj[z] + "\n"; 24 | } 25 | return txt; 26 | } 27 | 28 | 29 | function inspectArray(pArray){ 30 | 31 | var n = pArray.length; 32 | 33 | for ( var i = 0 ; i < n ; i ++){ 34 | var obj = pArray[i]; 35 | log(inspectObj(obj)); 36 | log("***"); 37 | } 38 | 39 | } 40 | 41 | 42 | function processTemplate(template, rep) { 43 | 44 | var txt = template; 45 | 46 | for( var z in rep) { 47 | 48 | var reg = new RegExp("@{"+z+"}", "g"); 49 | txt = txt.replace (reg, rep[z]); 50 | } 51 | 52 | return txt; 53 | } 54 | 55 | 56 | 57 | function normalizeName(name){ 58 | 59 | var reg = new RegExp("\\s", "g"); 60 | return name.replace(reg, "_"); 61 | } 62 | 63 | 64 | function setLayersVisibility(doc, visible) { 65 | 66 | var n = doc.layers.length; 67 | for ( var i = 0 ; i < n ; i++){ 68 | var l = doc.layers[i]; 69 | l.visible = visible; 70 | } 71 | } 72 | 73 | 74 | /* 75 | 76 | FILE UTILS 77 | */ 78 | 79 | function getFileString(path){ 80 | 81 | var txt ="" ; 82 | var file = new File(path); 83 | if(!file.exists){ 84 | alert("no such file"); 85 | } 86 | else{ 87 | file.open("r"); 88 | txt = file.read(); 89 | file.close(); 90 | return txt; 91 | } 92 | } 93 | 94 | function getFileNamePart(filename){ 95 | var index = filename.lastIndexOf ("."); 96 | return filename.substring (0, index); 97 | 98 | } 99 | 100 | function getFileNameExtPart(filename){ 101 | var index = filename.lastIndexOf ("."); 102 | return filename.substring (index+1); 103 | } 104 | 105 | 106 | 107 | // hack to get the script parent 108 | function getParentDir() { 109 | var where; 110 | try { 111 | var FORCEERROR = FORCERRROR; 112 | } 113 | catch( err ) { 114 | where = File(err.fileName); 115 | } 116 | return where.parent; 117 | } 118 | 119 | 120 | function saveTextFile(pText, filepath) { 121 | 122 | // get OS specific linefeed 123 | var fileLineFeed; 124 | if ($.os.search(/windows/i) != -1) { 125 | fileLineFeed = "Windows"; 126 | } else { 127 | fileLineFeed = "Unix"; 128 | } 129 | 130 | 131 | fileOut = new File(filepath); 132 | fileOut.lineFeed = fileLineFeed; 133 | fileOut.open("w", "TEXT", "????"); 134 | fileOut.write(pText); 135 | fileOut.close(); 136 | } 137 | 138 | 139 | -------------------------------------------------------------------------------- /photoshop/EaselJSExporter.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2012 Adobe Systems, Inc. All rights reserved. 2 | // Written by David Deraedt 3 | 4 | #include "../common/Utils.jsx" 5 | 6 | // An EASELJS data exporter for use with SpriteExporter 7 | 8 | var EaselJSExporter = (function () { 9 | 10 | // Default frequency for all animations 11 | var defaultFrequency = 4; 12 | 13 | // Path to the folder containing the spriteSheets, relative to the HTML page 14 | var spriteSheetFolder = "sprites"; 15 | 16 | // Library name (the object holding sprite classes in the window object). 17 | var libName = "spriteLib"; 18 | 19 | 20 | var le = "\n"; 21 | var spriteName =""; 22 | var animsTxt = ""; 23 | var frameTxt = ""; 24 | var outputTxt = ""; 25 | var spritesTxt =""; 26 | var imageName=""; 27 | 28 | var exporter={}; 29 | 30 | var template1; 31 | var template2; 32 | 33 | 34 | exporter.beginExport = function (pImageName){ 35 | 36 | imageName = pImageName; 37 | 38 | var where; 39 | try { 40 | var FORCEERROR = FORCERRROR; 41 | } 42 | catch( err ) { 43 | where = File(err.fileName); 44 | } 45 | var dir = where.parent; 46 | 47 | template1 = getFileString(dir + "/template1.txt"); 48 | template2 = getFileString(dir + "/template2.txt"); 49 | 50 | } 51 | 52 | 53 | exporter.addSprite = function(name){ 54 | spriteName=name; 55 | animsTxt = ""; 56 | framesTxt = ""; 57 | } 58 | 59 | exporter.addAnimation = function(name){ 60 | 61 | animsTxt += le+"\t" + name + ":{ frames:["; 62 | } 63 | 64 | exporter.addFrame = function(frameCount, name, destx, desty, w, h){ 65 | // Add frames : x, y, width, height, imageIndex, regX, regY 66 | framesTxt += le+"\t[" + destx + ", " + desty + ", " + w + ", " + h + ", 0, 0, 0],"; 67 | 68 | // Add frame index to animation data 69 | animsTxt += frameCount + ", "; 70 | 71 | // Multiply frames as specified by the name 72 | var sepIndex = name.indexOf(" x"); 73 | if(sepIndex>-1) { 74 | var repeat = Number(name.slice(sepIndex+2)); 75 | for (var j = 0 ; j < repeat-1 ; j++) animsTxt += frameCount + ", "; 76 | } 77 | } 78 | 79 | 80 | exporter.endAnimation = function(){ 81 | animsTxt += "], frequency:" + defaultFrequency + ", next:true},"; 82 | } 83 | 84 | 85 | exporter.exportSprite = function(){ 86 | 87 | var data={ 88 | spriteName: spriteName, 89 | frameData: "[" + framesTxt + "]", 90 | animationData: "{" + animsTxt + "}" 91 | }; 92 | 93 | spritesTxt += processTemplate(template2, data) + le; 94 | 95 | } 96 | 97 | 98 | exporter.endExport = function () { 99 | 100 | var data = { 101 | libName: libName, 102 | imageName: imageName, 103 | folder: spriteSheetFolder, 104 | sprites: spritesTxt 105 | }; 106 | 107 | outputTxt = processTemplate(template1, data); 108 | } 109 | 110 | exporter.getOutput = function(){ 111 | return outputTxt; 112 | } 113 | 114 | return exporter; 115 | 116 | }()); 117 | -------------------------------------------------------------------------------- /flash-pro/createJS/easeljs-json.plugin.jsfl: -------------------------------------------------------------------------------- 1 | /* 2 | This FlashPro plugin will export spritesheet 3 | data for createJS as JSON file 4 | */ 5 | 6 | function getPluginInfo(lang) 7 | { 8 | pluginInfo = new Object(); 9 | pluginInfo.id = "easeljs-json"; 10 | pluginInfo.name = "easeljs-json"; 11 | pluginInfo.ext = "json"; 12 | pluginInfo.capabilities = new Object(); 13 | pluginInfo.capabilities.canRotate = false; 14 | pluginInfo.capabilities.canTrim = true; 15 | pluginInfo.capabilities.canShapePad = true; 16 | pluginInfo.capabilities.canBorderPad = true; 17 | pluginInfo.capabilities.canStackDuplicateFrames = true; 18 | return pluginInfo; 19 | } 20 | 21 | var helperFunctions = null; 22 | var symbolItem = null; 23 | var symbolName = null; 24 | var globalMeta = null; 25 | var frameData = ""; 26 | var firstSymbol = true; 27 | 28 | function initializeVars() 29 | { 30 | helperFunctions = null; 31 | symbolItem = null; 32 | symbolName = null; 33 | frameData = ""; 34 | } 35 | 36 | function DetermineAnimationData() 37 | { 38 | var labelLayer = null; 39 | var controlLayer = null; 40 | var layers = symbolItem.timeline.layers; 41 | 42 | var i; 43 | for (i = 0; i < layers.length; i++) 44 | { 45 | cmpName = layers[i].name.toLowerCase(); 46 | if (cmpName == "labels") 47 | labelLayer = layers[i]; 48 | 49 | if (cmpName == "control") 50 | controlLayer = layers[i]; 51 | } 52 | 53 | helperFunctions = null; 54 | 55 | if (labelLayer == null) 56 | return "" 57 | 58 | var labelFrame = null; 59 | var controlFrame = null; 60 | var labelIndex = 0; 61 | var controlIndex = 0; 62 | var frameNumber = 0; 63 | var hitSpan = false; 64 | var endFrameNumber = 0; 65 | 66 | var s = ""; 67 | 68 | while (labelIndex < labelLayer.frames.length) 69 | { 70 | labelFrame = labelLayer.frames[labelIndex++]; 71 | if (controlLayer) 72 | controlFrame = controlLayer.frames[controlIndex++]; 73 | 74 | 75 | if (labelFrame.name != null) 76 | { 77 | if (hitSpan) 78 | s += ", \n"; 79 | else 80 | s += "{\n"; 81 | 82 | endFrameNumber = frameNumber + labelFrame.duration - 1; 83 | beginFrame = frameNumber; 84 | endFrame = endFrameNumber; 85 | s += '"'+labelFrame.name + "\":[" + beginFrame + "," + endFrame; 86 | 87 | if (controlFrame != null && controlFrame.name != null && controlFrame.name.length != 0) { 88 | s += ", " + "\"" + controlFrame.name + "\"]"; 89 | } 90 | else { 91 | s += ", true]"; 92 | } 93 | 94 | 95 | frameNumber = endFrameNumber + 1; 96 | labelIndex = frameNumber; 97 | controlIndex = labelIndex; 98 | 99 | if (!hitSpan) 100 | helperFunctions = ""; 101 | 102 | hitSpan = true; 103 | } 104 | } 105 | 106 | if (hitSpan) 107 | s += "\n}"; 108 | 109 | 110 | return s; 111 | } 112 | 113 | function endSymbol(meta) 114 | { 115 | var s = ""; 116 | if (symbolItem != null) 117 | { 118 | symbolName = symbolName.replace(/\s+/g,"_"); 119 | 120 | if(firstSymbol==false) { 121 | s += ",\n"; 122 | } 123 | firstSymbol=false; 124 | 125 | s += '\n"'+symbolName+'":{'; 126 | 127 | 128 | var animationData = DetermineAnimationData(); 129 | 130 | s += "\"images\": [\"" + meta.image + "\"],\n " 131 | if (animationData != null && animationData.length != 0) 132 | { 133 | s += "\"frames\": [\n" + frameData + "],\n "; 134 | s += "\"animations\":" + animationData + "\n"; 135 | } 136 | else 137 | { 138 | s += "\"frames\": [" + frameData + "]\n"; 139 | } 140 | 141 | s+='\n}\n'; 142 | 143 | // cleanup 144 | initializeVars(); 145 | } 146 | return s; 147 | } 148 | 149 | function beginExport(meta) 150 | { 151 | initializeVars(); 152 | startFrameNumber = 0; 153 | globalMeta = meta; 154 | return "{\n"; 155 | } 156 | 157 | function frameExport(frame) 158 | { 159 | var s = ""; 160 | if (symbolName != frame.symbolName) 161 | { 162 | s = endSymbol(globalMeta); 163 | 164 | symbolItem = frame.symbol; 165 | symbolName = frame.symbolName; 166 | } 167 | else 168 | { 169 | frameData += ",\n"; 170 | } 171 | 172 | frameData += "[" + frame.frame.x + "," + frame.frame.y + "," + frame.frame.w + "," + frame.frame.h + ",0,"; 173 | if (frame.trimmed) 174 | { 175 | frameData += (frame.registrationPoint.x - frame.offsetInSource.x) + "," + (frame.registrationPoint.y - frame.offsetInSource.y); 176 | } 177 | else 178 | { 179 | frameData += frame.registrationPoint.x + "," + frame.registrationPoint.y; 180 | } 181 | frameData += "]"; 182 | 183 | return s; 184 | } 185 | 186 | function endExport(meta) 187 | { 188 | var s = endSymbol(globalMeta); 189 | 190 | globalMeta = null; 191 | 192 | s += "}\n\n"; 193 | 194 | return s; 195 | } 196 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/HTMLExporter.jsx: -------------------------------------------------------------------------------- 1 | var HTMLExporter = (function () { 2 | 3 | 4 | var le = "\n"; 5 | var tab = "\t"; 6 | var imgFolderName="images"; 7 | var createSizeProps=true; 8 | var separateCSS; 9 | 10 | 11 | function generateFrom(compData, destFolder, pImgFolderName, pSepCSS){ 12 | 13 | imgFolderName = pImgFolderName; 14 | separateCSS = pSepCSS; 15 | 16 | output = processData(compData); 17 | 18 | 19 | var htmlFile = new File(destFolder.absoluteURI+"/index.html"); 20 | saveTextFile(output.html, htmlFile); 21 | 22 | if(pSepCSS){ 23 | var cssFile = new File(destFolder.absoluteURI+"/styles.css"); 24 | saveTextFile(output.css, cssFile); 25 | } 26 | 27 | } 28 | 29 | 30 | function processData(data){ 31 | 32 | var itemsData = data.layers; 33 | var compName = data.name.split(".")[0]; 34 | 35 | var txtData = processItems(itemsData, ""); 36 | 37 | var htmlTxt=""; 38 | var mainDiv = '
' + le + txtData.html + le + "
" + le; 39 | 40 | if(separateCSS){ 41 | htmlTxt=""+le+""+le+""+le+""+le+""+le+""+le+mainDiv+le+""+le+""; 42 | } 43 | else { 44 | htmlTxt=""+le+""+le+""+le+""+le+mainDiv+le+""+le+""; 45 | } 46 | 47 | return { 48 | html:htmlTxt, 49 | css:txtData.css 50 | } 51 | } 52 | 53 | 54 | function processItems(itemsData, stab){ 55 | 56 | var htmltxt = ""; 57 | var cssTx = ""; 58 | 59 | for (var i=itemsData.length-1; i>=0 ; i--){ 60 | 61 | var item = itemsData[i]; 62 | var isDiv = (item.type=="div"); 63 | var isText = (item.type =="txt"); 64 | if(!item.visible) continue; 65 | 66 | if (isDiv) { 67 | htmltxt += stab + '\t
' ; 68 | if(item.items.length>0){ 69 | var subData = processItems(item.items, stab+tab); 70 | htmltxt += le + subData.html + tab + "
" + le; 71 | cssTx += subData.css + le; 72 | } 73 | else htmltxt += stab + "" + le; 74 | } else if (isText) { 75 | var find = '\r'; 76 | var re = new RegExp(find, 'g'); 77 | var htmlTxt = item.text.replace(re, "
"); 78 | htmltxt += stab + tab + '

' + htmlTxt + '

' + le; 79 | } 80 | 81 | else { 82 | htmltxt += stab + tab + '' + le; 83 | } 84 | 85 | 86 | // CSS 87 | cssTx += getCSS(item, isDiv, isText); 88 | } 89 | 90 | 91 | return {html:htmltxt, css:cssTx}; 92 | 93 | } 94 | 95 | function getCSS(item, isDiv, isText){ 96 | var cssTxt =""; 97 | cssTxt += "#" + item.name + "{" + le; 98 | cssTxt += tab + "position:absolute;" + le; 99 | cssTxt += tab + "left:"+ Math.round(item.x) + "px;" + le; 100 | cssTxt += tab + "top:" + Math.round(item.y) + "px;" + le; 101 | 102 | if(createSizeProps){ 103 | cssTxt += tab + "width:" + Math.round(item.width) + "px;" + le; 104 | cssTxt += tab + "height:" + Math.round(item.height) + "px;" + le; 105 | } 106 | 107 | if(item.bgdColor){ 108 | cssTxt += tab + "background-color:" + item.bgdColor + ";" + le; 109 | if(item.opacity) cssTxt += tab + "opacity:" + item.opacity + ";" + le; 110 | } 111 | 112 | 113 | if(isText) { 114 | cssTxt += tab + "font-family:" + item.fontFamily + ";" + le; 115 | cssTxt += tab + "font-size:" + item.fontSize + ";" + le; 116 | cssTxt += tab + "color:" + item.fontColor + ";" + le; 117 | cssTxt += tab + "font-weight:" + item.fontStyle + ";" + le; 118 | if(item.align !="left") cssTxt += tab + "text-align:" + item.align + ";" + le; 119 | cssTxt += tab + "margin:0px;" + le; 120 | } 121 | 122 | 123 | cssTxt += "}" + le + le; 124 | 125 | return cssTxt; 126 | 127 | } 128 | 129 | var obj = {}; 130 | obj.generateFrom = generateFrom; 131 | return obj; 132 | 133 | }()); -------------------------------------------------------------------------------- /photoshop/SpriteExporter.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2012 Adobe Systems, Inc. All rights reserved. 2 | // Written by David Deraedt 3 | // PHOTOSHOP SPRITESHEET EXPORTER 4 | 5 | #include "../common/Utils.jsx" 6 | 7 | 8 | var SpriteExporter = (function () { 9 | 10 | 11 | var layerIndex = 0 ; 12 | var totalFrames = 0; 13 | var exporter; 14 | 15 | /** 16 | * Parses a phothoshop document to create spritesheets 17 | * using a data exporter object 18 | * @srcDoc photoshop document to parse 19 | * @pExporter data exporter 20 | * @imgFolderDestination path to the folder of the image file to be created 21 | * @dataFileDestination path to the data file to be created 22 | */ 23 | 24 | function doExport (srcDoc, pExporter, imgFolderDestination, dataFileDestination) { 25 | 26 | exporter = pExporter; 27 | 28 | // Switch to pixel units 29 | var strtRulerUnits = app.preferences.rulerUnits; 30 | if (strtRulerUnits != Units.PIXELS) { 31 | app.preferences.rulerUnits = Units.PIXELS; 32 | } 33 | 34 | // Sprite size 35 | var w = srcDoc.width ; 36 | var h = srcDoc.height ; 37 | 38 | // Get the total number of layers 39 | getTotalLayers(srcDoc.layers); 40 | //$.writeln("totalFrames: " + totalFrames); 41 | 42 | // Compute Sheet size 43 | var cols = Math.ceil(Math.sqrt(totalFrames)); 44 | var rows = Math.ceil(totalFrames/cols); 45 | //$.writeln("total rows: " + rows); 46 | 47 | // Create a copy of the current doc 48 | var destDoc = srcDoc.duplicate("tmp", false); 49 | 50 | // Make it the size of the sprite 51 | destDoc.resizeCanvas (cols*w, rows*h, AnchorPosition.TOPLEFT); 52 | 53 | // Select this new doc 54 | app.activeDocument = destDoc; 55 | 56 | // Get the spriteSheet name from the document name 57 | var imageName = srcDoc.name.split(".")[0]; 58 | 59 | // Start data output 60 | exporter.beginExport(imageName); 61 | 62 | 63 | // Process each sprite 64 | for (var i = 0 ; i < destDoc.layerSets.length ; i++) { 65 | var spriteSet = destDoc.layerSets[i]; 66 | //$.writeln("set: " + i + "> " + spriteSet.allLocked); 67 | if(spriteSet.allLocked) spriteSet.allLocked = false; 68 | if(spriteSet.visible == false) spriteSet.visible = true; 69 | 70 | var destName = spriteSet.name; 71 | processSprite(destDoc, spriteSet.layerSets, destName, cols, rows, w, h); 72 | } 73 | 74 | // End data output 75 | exporter.endExport(); 76 | 77 | // save the image file 78 | savePng(destDoc, imgFolderDestination + imageName + ".png" ); 79 | 80 | // save the data file 81 | saveTextFile(exporter.getOutput(), dataFileDestination ); 82 | 83 | // Close doc 84 | destDoc.close(SaveOptions.DONOTSAVECHANGES); 85 | 86 | // Release refs 87 | srcDoc = null; 88 | destDoc = null; 89 | 90 | // Restore orginal unit preferences 91 | if (strtRulerUnits != app.preferences.rulerUnits) { 92 | app.preferences.rulerUnits = strtRulerUnits; 93 | } 94 | 95 | } 96 | 97 | 98 | 99 | function getTotalLayers(layerList){ 100 | 101 | for (var i = 0 ; i < layerList.length ; i++) { 102 | var layer = layerList[i]; 103 | 104 | if(layer.typename=="LayerSet") { 105 | getTotalLayers(layer.layers); 106 | } 107 | else { 108 | totalFrames++; 109 | } 110 | } 111 | 112 | return totalFrames; 113 | } 114 | 115 | 116 | function processSprite(doc, layerSets, destName, cols, rows, w, h) { 117 | 118 | // stores the frame count for this sprite 119 | var frameCount = 0 ; 120 | 121 | exporter.addSprite(destName); 122 | 123 | // Parse all animation layer sets 124 | for( var n = 0 ; n < layerSets.length ; n++){ 125 | 126 | var set = layerSets[n]; 127 | set.allLocked=false; 128 | var setName = set.name; 129 | //$.writeln("Set: " + setName); 130 | 131 | exporter.addAnimation(setName); 132 | 133 | // Parse all frame layers 134 | for( var i = 0 ; i < set.layers.length ; i++){ 135 | 136 | var layer = set.layers[i]; 137 | //$.writeln("layer: " + layer.name); 138 | 139 | // discard text layers 140 | if (layer.kind == LayerKind.TEXT) { 141 | layerIndex++; 142 | frameCount++; 143 | continue; 144 | } 145 | 146 | // select the next layer 147 | doc.activeLayer = layer; 148 | doc.activeLayer.allLocked=false; 149 | 150 | // move the sprite layer 151 | var destx = (layerIndex % cols) * w; 152 | var desty = (Math.floor(layerIndex/cols)) * h; 153 | doc.activeLayer.translate(destx, desty); 154 | 155 | // export frame data 156 | exporter.addFrame(frameCount, layer.name, Number(destx), Number(desty), Number(w), Number(h)); 157 | 158 | layerIndex++; 159 | frameCount++; 160 | } 161 | 162 | exporter.endAnimation(); 163 | } 164 | 165 | // add Data to exporter 166 | exporter.exportSprite(); 167 | } 168 | 169 | 170 | 171 | function savePng(doc, filepath) { 172 | 173 | var pngFile = new File(filepath); 174 | var pngFileOptions = new PNGSaveOptions(); 175 | doc.saveAs (pngFile, pngFileOptions, true, Extension.LOWERCASE); 176 | } 177 | 178 | 179 | return {doExport:doExport}; 180 | 181 | }()); 182 | 183 | 184 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/AltLayerExporter.jsx: -------------------------------------------------------------------------------- 1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved. 2 | // author David Deraedt 3 | 4 | var AltLayerExporter = (function () { 5 | 6 | /** 7 | Exports all layers of a given document to properly sized PNG, JPEG or SVG files 8 | @public 9 | @param {Document} doc The document to export 10 | @param {Folder} destFolder The destination folder for the image files 11 | @param {String} exportType Determines if layers should be converted to SVG, JPG or PNG files 12 | @param {Boolean} ignoreInvisible Determines if invisible layers should be ignored 13 | @param {Function} getLayerParams function taking the layer name as a parameter and returning export params 14 | */ 15 | 16 | function exportLayers(doc, destFolder, ignoreInvisible, getExportParams) { 17 | 18 | var n = doc.layers.length; 19 | 20 | var j; 21 | 22 | var destDoc = app.documents.add(DocumentColorSpace.RGB); 23 | 24 | for ( j = 0; j < n; j++){ 25 | 26 | var l = doc.layers[j]; 27 | 28 | if (ignoreInvisible && l.visible == false) continue; 29 | 30 | var isLocked = l.locked; 31 | if(isLocked) l.locked = false; 32 | 33 | //ignore empty layers 34 | if(l.pageItems.length==0) continue; 35 | 36 | // also ignore items which width==0 (points etc) 37 | if(doc.visibleBounds[0] == doc.visibleBounds[2]) continue; 38 | 39 | 40 | var exportParams = getExportParams(l.name); 41 | 42 | // export the layer itself if an eportType was specified 43 | if (exportParams && exportParams.exportType){ 44 | copyLayer(l, destDoc); 45 | destDoc.artboards[0].artboardRect = destDoc.visibleBounds; 46 | exportImage(destDoc, destFolder, exportParams); 47 | destDoc.activeLayer.pageItems.removeAll(); 48 | } 49 | 50 | 51 | // parse items 52 | for (var i = 0 ; i < l.pageItems.length ; i++){ 53 | var item = l.pageItems[i]; 54 | //flog("Processing " + item.name + " data"); 55 | if (ignoreInvisible && item.hidden) continue; 56 | exportParams = getExportParams(item.name); 57 | // export item if an eportType was specified 58 | if(exportParams && exportParams.exportType){ 59 | item.duplicate(destDoc.activeLayer, ElementPlacement.PLACEATEND); 60 | destDoc.artboards[0].artboardRect = destDoc.visibleBounds; 61 | exportImage(destDoc, destFolder, exportParams); 62 | destDoc.activeLayer.pageItems.removeAll(); 63 | } 64 | } 65 | 66 | 67 | if(isLocked) l.locked = true; 68 | 69 | } 70 | 71 | destDoc.close(SaveOptions.DONOTSAVECHANGES); 72 | 73 | } 74 | 75 | 76 | function copyLayer( l, destDoc) { 77 | 78 | var n = l.pageItems.length; 79 | for (var i = 0; i < n; i++){ 80 | l.pageItems[i].duplicate(destDoc.activeLayer, ElementPlacement.PLACEATEND); 81 | } 82 | 83 | } 84 | 85 | 86 | 87 | function exportImage(doc, destFolder, exportParams) { 88 | 89 | var dest = destFolder.path + "/" + destFolder.name + "/" + exportParams.name + "." + exportParams.exportType; 90 | 91 | var options; 92 | var exportType = exportParams.exportType.toLowerCase(); 93 | var eType; 94 | 95 | if(exportType == "svg") { 96 | eType = ExportType.SVG; 97 | options = new ExportOptionsSVG(); 98 | options.coordinatePrecision = exportParams.precision; // 3 by default 99 | options.embedRasterImages = exportParams.embedImages; 100 | options.fontType = SVGFontType.OUTLINEFONT; 101 | if(exportParams.svgFont) { 102 | options.fontType = SVGFontType.SVGFONT; 103 | options.fontSubsetting = SVGFontSubsetting.None; 104 | } 105 | if(doc.variables.length>0) { 106 | options.includeVariablesAndDatasets = true; 107 | } 108 | var cssPropLoc = SVGCSSPropertyLocation.PRESENTATIONATTRIBUTES; 109 | if(exportParams.svgCssPropLoc == 1 ) cssPropLoc =SVGCSSPropertyLocation.STYLEELEMENTS; 110 | else if (exportParams.svgCssPropLoc == 2 ) cssPropLoc =SVGCSSPropertyLocation.STYLEATTRIBUTES; 111 | options.cssProperties = cssPropLoc; 112 | options.documentEncoding = SVGDocumentEncoding.UTF8; 113 | 114 | } else if (exportType == "png") { 115 | eType = ExportType.PNG24; 116 | options = new ExportOptionsPNG24(); 117 | options.artBoardClipping=true; 118 | 119 | } else if (exportType == "jpg") { 120 | eType = ExportType.JPEG; 121 | options = new ExportOptionsJPEG(); 122 | options.qualitySetting = exportParams.jpgQuality; 123 | options.artBoardClipping=true; 124 | } else { 125 | // unsupported exportTypes are ignored 126 | return; 127 | } 128 | 129 | var fileSpec = new File(dest); 130 | 131 | doc.exportFile( fileSpec, eType, options ); 132 | } 133 | 134 | 135 | var obj = {}; 136 | obj.exportLayers = exportLayers; 137 | return obj; 138 | 139 | }()); 140 | 141 | -------------------------------------------------------------------------------- /flash-pro/createJS/easeljs2.plugin.jsfl: -------------------------------------------------------------------------------- 1 | /*Options*/ 2 | 3 | // The directory where your sheets are stored, relative to your HTML file 4 | var imageDirectory="sprites/"; 5 | // Whether or not you want to expose animations as functions 6 | var useHelperFunctions = true; 7 | // The global object in which to store sprite classes. 8 | // e.g. window.myGame.DarkKnight, where DarkKnight is your MovieClip 9 | var libObjName = "myGame"; 10 | 11 | /*End of options*/ 12 | 13 | function getPluginInfo(lang) 14 | { 15 | pluginInfo = new Object(); 16 | pluginInfo.id = "easeljs2"; 17 | pluginInfo.name = "easeljs2"; 18 | pluginInfo.ext = "js"; 19 | pluginInfo.capabilities = new Object(); 20 | pluginInfo.capabilities.canRotate = false; 21 | pluginInfo.capabilities.canTrim = true; 22 | pluginInfo.capabilities.canShapePad = true; 23 | pluginInfo.capabilities.canBorderPad = true; 24 | pluginInfo.capabilities.canStackDuplicateFrames = true; 25 | return pluginInfo; 26 | } 27 | var helperFunctions = null; 28 | var symbolItem = null; 29 | var symbolName = null; 30 | var globalMeta = null; 31 | var frameData = ""; 32 | 33 | function initializeVars() 34 | { 35 | helperFunctions = null; 36 | symbolItem = null; 37 | symbolName = null; 38 | frameData = ""; 39 | } 40 | 41 | function DetermineAnimationData() 42 | { 43 | var labelLayer = null; 44 | var controlLayer = null; 45 | var layers = symbolItem.timeline.layers; 46 | 47 | var i; 48 | for (i = 0; i < layers.length; i++) 49 | { 50 | cmpName = layers[i].name.toLowerCase(); 51 | if (cmpName == "labels") 52 | labelLayer = layers[i]; 53 | 54 | if (cmpName == "control") 55 | controlLayer = layers[i]; 56 | } 57 | 58 | helperFunctions = null; 59 | 60 | if (labelLayer == null) 61 | return "" 62 | 63 | var labelFrame = null; 64 | var controlFrame = null; 65 | var labelIndex = 0; 66 | var controlIndex = 0; 67 | var frameNumber = 0; 68 | var hitSpan = false; 69 | var endFrameNumber = 0; 70 | 71 | var s = ""; 72 | 73 | while (labelIndex < labelLayer.frames.length) 74 | { 75 | labelFrame = labelLayer.frames[labelIndex++]; 76 | if (controlLayer) 77 | controlFrame = controlLayer.frames[controlIndex++]; 78 | 79 | 80 | if (labelFrame.name != null) 81 | { 82 | if (hitSpan) 83 | s += ", "; 84 | else 85 | s += "{"; 86 | 87 | endFrameNumber = frameNumber + labelFrame.duration - 1; 88 | beginFrame = frameNumber; 89 | endFrame = endFrameNumber; 90 | s += labelFrame.name + ":[" + beginFrame + "," + endFrame; 91 | if (controlFrame != null && controlFrame.name != null && controlFrame.name.length != 0) 92 | s += ", " + "\"" + controlFrame.name + "\"]"; 93 | else 94 | s += ", true]"; 95 | 96 | frameNumber = endFrameNumber + 1; 97 | labelIndex = frameNumber; 98 | controlIndex = labelIndex; 99 | 100 | if (!hitSpan) 101 | helperFunctions = ""; 102 | 103 | if(useHelperFunctions) { 104 | helperFunctions += symbolName + "_p." + labelFrame.name + " = function(){\n"; 105 | helperFunctions += "\tthis.gotoAndPlay(\""+labelFrame.name+"\");\n"; 106 | helperFunctions += "}\n"; 107 | } 108 | 109 | hitSpan = true; 110 | } 111 | } 112 | 113 | if (hitSpan) 114 | s += "}"; 115 | 116 | 117 | return s; 118 | } 119 | 120 | function endSymbol(meta) 121 | { 122 | var s = ""; 123 | if (symbolItem != null) 124 | { 125 | symbolName = symbolName.replace(/\s+/g,"_"); 126 | 127 | var animationData = DetermineAnimationData(); 128 | var proto = symbolName + "_p"; 129 | 130 | s += "\nvar "+symbolName + " = function() {\n"; 131 | s += "\tthis.initialize();\n" 132 | s += "}\n"; 133 | 134 | s += symbolName + "._SpriteSheet = new createjs.SpriteSheet({images: [spritesheetPath], " 135 | if (animationData != null && animationData.length != 0) 136 | { 137 | s += "frames: [" + frameData + "], "; 138 | s += " animations: " + animationData + "});\n"; 139 | } 140 | else 141 | { 142 | s += "frames: [" + frameData + "]});\n"; 143 | } 144 | 145 | s += "var " + proto + " = " + symbolName + ".prototype = new createjs.BitmapAnimation();\n"; 146 | s += "" + proto + ".BitmapAnimation_initialize = " + proto + ".initialize;\n"; 147 | s += "" + proto + ".initialize = function() {\n" 148 | s += "\tthis.BitmapAnimation_initialize(" + symbolName + "._SpriteSheet);\n"; 149 | s += "\tthis.paused = false;\n"; 150 | s += "}\n"; 151 | 152 | if (helperFunctions != null) 153 | s += helperFunctions; 154 | 155 | s += "scope." + symbolName + " = " + symbolName + ";\n"; 156 | 157 | // cleanup 158 | initializeVars(); 159 | } 160 | return s; 161 | } 162 | 163 | function beginExport(meta) 164 | { 165 | initializeVars(); 166 | startFrameNumber = 0; 167 | globalMeta = meta; 168 | 169 | var str = "if (!window."+libObjName+") { window."+libObjName+" = {}; }\n(function(scope) {\n"; 170 | str += "var spritesheetPath = \""+imageDirectory+meta.image+"\";\n"; 171 | 172 | return str; 173 | } 174 | 175 | function frameExport(frame) 176 | { 177 | var s = ""; 178 | if (symbolName != frame.symbolName) 179 | { 180 | s = endSymbol(globalMeta); 181 | 182 | symbolItem = frame.symbol; 183 | symbolName = frame.symbolName; 184 | } 185 | else 186 | { 187 | frameData += ","; 188 | } 189 | 190 | frameData += "[" + frame.frame.x + "," + frame.frame.y + "," + frame.frame.w + "," + frame.frame.h + ",0,"; 191 | if (frame.trimmed) 192 | { 193 | frameData += (frame.registrationPoint.x - frame.offsetInSource.x) + "," + (frame.registrationPoint.y - frame.offsetInSource.y); 194 | } 195 | else 196 | { 197 | frameData += frame.registrationPoint.x + "," + frame.registrationPoint.y; 198 | } 199 | frameData += "]"; 200 | 201 | return s; 202 | } 203 | 204 | function endExport(meta) 205 | { 206 | var s = endSymbol(globalMeta); 207 | 208 | globalMeta = null; 209 | 210 | s += "}(window."+libObjName+"));\n\n"; 211 | 212 | return s; 213 | } 214 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/DataExtractor.jsx: -------------------------------------------------------------------------------- 1 | var DataExtractor = (function () { 2 | 3 | 4 | function convertPos(point) { 5 | if (app.coordinateSystem === CoordinateSystem.DOCUMENTCOORDINATESYSTEM) { 6 | point = app.activeDocument.convertCoordinate(point, CoordinateSystem.DOCUMENTCOORDINATESYSTEM, CoordinateSystem.ARTBOARDCOORDINATESYSTEM); 7 | } 8 | return point; 9 | } 10 | 11 | 12 | 13 | function getItemCoords(item) { 14 | 15 | //flog("getItemCoords() " + item.name); 16 | 17 | var vb = item.visibleBounds; 18 | 19 | 20 | var p1 = convertPos([vb[0], vb[1]]); 21 | var p2 = convertPos([vb[2], vb[3]]); 22 | 23 | var coords = { 24 | x: (p1[0]).toFixed(2), 25 | y: (p1[1] * -1).toFixed(2), 26 | r: (p2[0]).toFixed(2), 27 | b: (p2[1] * -1).toFixed(2) 28 | }; 29 | coords.width = (item.width).toFixed(2);//(coords.r-coords.x).toFixed(2);// 30 | coords.height = (item.height).toFixed(2);//(coords.b-coords.y).toFixed(2); 31 | 32 | return coords; 33 | } 34 | 35 | 36 | function getItemsCoords(items) { 37 | 38 | var coords = getItemCoords(items[0]); 39 | 40 | var gcoords = coords; 41 | 42 | var maxRight = right; 43 | var maxBottom = bottom; 44 | 45 | var count = items.length; 46 | 47 | for (var i = 1; i < count; i++) { 48 | 49 | coords = getItemCoords(items[i]); 50 | 51 | var right = coords.x + coords.width; 52 | var bottom = coords.y + coords.height; 53 | //logtxt += coords.x + " vs " + gcoords.x +"\n" ; 54 | if(parseFloat(coords.x) < parseFloat(gcoords.x)) gcoords.x = coords.x; 55 | if(parseFloat(coords.y) < parseFloat(gcoords.y)) gcoords.y = coords.y; 56 | 57 | if(parseFloat(coords.r) > parseFloat(gcoords.r)) gcoords.r = coords.r; 58 | if(parseFloat(coords.b) > parseFloat(gcoords.b)) gcoords.b = coords.b; 59 | } 60 | 61 | 62 | gcoords.width = (gcoords.r - gcoords.x).toFixed(2); 63 | gcoords.height = (gcoords.b - gcoords.y).toFixed(2); 64 | 65 | 66 | return gcoords; 67 | 68 | } 69 | 70 | 71 | function getLayersCoords(doc, getLayerParams, ignoreHidden) { 72 | 73 | var i = doc.artboards.getActiveArtboardIndex(); 74 | var artb = doc.artboards[i]; 75 | 76 | var data = { 77 | name:doc.name, 78 | width: Math.ceil(artb.artboardRect[2] - artb.artboardRect[0]), 79 | height: Math.ceil(artb.artboardRect[1] - artb.artboardRect[3]), 80 | layers:[] 81 | }; 82 | 83 | var count = doc.layers.length; 84 | 85 | for (var i = 0 ; i < count ; i++){ 86 | 87 | var l = doc.layers[i]; 88 | 89 | if(ignoreHidden && l.visible ==false) continue; 90 | 91 | var params = getLayerParams(l.name); 92 | 93 | if(params == null) continue; 94 | if(l.pageItems.length==0) continue; 95 | 96 | var d = getItemsCoords(l.pageItems); 97 | d.layername = l.name; 98 | d.name = params.name; 99 | 100 | if(params.exportType){ 101 | d.type = params.exportType; 102 | d.filename = params.name + "." + params.exportType; 103 | } else{ 104 | d.type="div"; 105 | } 106 | 107 | d.visible = l.visible; 108 | 109 | // export items data 110 | d.items=[]; 111 | for ( var j = 0 ; j < l.pageItems.length ; j++){ 112 | 113 | var item = l.pageItems[j]; 114 | 115 | if(ignoreHidden && item.hidden) continue; 116 | 117 | // image file (aka normal) items 118 | if(item.name.indexOf(".")>0){ 119 | 120 | var itemParams = getLayerParams(item.name); 121 | 122 | var it = getItemCoords(item); 123 | it.x -= d.x; 124 | it.y -= d.y; 125 | it.layername = item.name; 126 | it.name = itemParams.name; 127 | it.type = itemParams.exportType; 128 | it.filename = itemParams.name + "." + itemParams.exportType; 129 | it.visible = ! item.hidden; 130 | d.items.push(it); 131 | 132 | } 133 | 134 | // other (aka special) items 135 | else { 136 | 137 | // "background" items are just meant to specify the background color of the parent layer 138 | if(item.name =="#bgd") { 139 | var col ; 140 | if(item.fillColor.typename =="SpotColor") col = item.fillColor.spot.color; 141 | else col = item.fillColor; 142 | d.bgdColor = colTohex(col); 143 | if(item.opacity<100) d.opacity = item.opacity /100; 144 | } 145 | 146 | // text items carry text info over to the desc file 147 | else if (item.name.indexOf("=text")>0) { 148 | var it = getItemCoords(item); 149 | it.type="txt"; 150 | it.name = item.name.split("=")[0]; 151 | it.x -= d.x; 152 | it.y -= d.y; 153 | var tf = item; 154 | var tr = tf.textRange; 155 | var ca = tr.characterAttributes; 156 | it.fontSize = ca.size; 157 | 158 | var col ; 159 | if(ca.fillColor.typename =="SpotColor") col = ca.fillColor.spot.color; 160 | else col = ca.fillColor 161 | 162 | it.fontColor = colTohex(col); 163 | it.fontFamily = ca.textFont.family; 164 | it.fontStyle = ca.textFont.style; 165 | var align ="left"; 166 | if( tr.paragraphAttributes.justification==Justification.RIGHT) align = "right"; 167 | if( tr.paragraphAttributes.justification==Justification.CENTER) align = "center"; 168 | it.align = align; 169 | it.text=tf.contents; 170 | d.items.push(it); 171 | } 172 | } 173 | } 174 | 175 | data.layers.push(d); 176 | } 177 | 178 | return data; 179 | 180 | } 181 | 182 | function colTohex(col){ 183 | 184 | function toHex(c) { 185 | var rhex = c.toString(16); 186 | return rhex.length === 1 ? "0" + rhex : rhex; 187 | } 188 | return "#" + toHex(col.red) + toHex(col.green) + toHex(col.blue); 189 | } 190 | 191 | var o = {}; 192 | o.getLayersCoords = getLayersCoords; 193 | o.getItemsCoords = getItemsCoords; 194 | 195 | return o; 196 | 197 | }()); 198 | 199 | -------------------------------------------------------------------------------- /illustrator/export2EdgeAnimate/export2Animate.jsxbin: -------------------------------------------------------------------------------- 1 | @JSXBIN@ES@2.0@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 FdAVhIfAffAChK40BhAhI40BiABBAhMAiYMiabyBn0ACJibnAShIAEXhJfVhKfBRBFeBhOffnftZicn AEXhLfVhKfBRBCGVhIfAnndBffAChK40BhAhI40BiABBAhNAidMjCbyBn0ACgjEbyBn0ABJjFnAShOB jhPfnftABnhQnbyBn0ABJjInAShRyBEjgffRBXhSfjhQfffnffZjKnAXhTfVhRf0AChO4B0AiAhR40B iAACAhUAjLMjObyBn0AGOjSbyjTn0ABJjTnAShVAneHiXjJjOjEjPjXjTffAChWEXhXfXhYfjCfRBYH jXjJjOjEjPjXjTBjJffnndyBbyjVn0ABJjVnAShVAneEiVjOjJjYffJjZnABjhZfEjgffRBVhafCftn fJjanABXhbfjhZfVhVfAnfJjbnAEXhEfjhZfRDFeBjXFeEiUiFiYiUFeEhfhfhfhfffJjcnAEXhcfjh ZfRBVDfBffJjdnAEXhGfjhZfnfADhV40BiAha4B0AhAD40BhACBAhdAjeMGbyBn0ABOIbKn0ARJKnAS gaAXzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUhefjzDjBjQjQhffnftJLnASzHjEjPjDiGjJjMjFiABXzI jGjVjMjMiOjBjNjFiBfVgafAnftONbOn0ACJOnAEXhBfjzGiXjJjOjEjPjXiCfRBFeiViUjIjJjThAj TjDjSjJjQjUhAjOjFjFjEjThAjUjPhAjNjPjEjJjGjZhAjZjPjVjShAjEjPjDjVjNjFjOjUhOhAiQjM jFjBjTjFhAjTjBjWjFhAjJjUhAjCjFjGjPjSjFhAjSjVjOjOjJjOjHhAjUjIjJjThAjTjDjSjJjQjUh OffZPnAnAhhCXzFjTjBjWjFjEiDfVgafAnJSnASzGjBjOiGjJjMjFiECEXzKjPjQjFjOiEjJjBjMjPj HiFfjgffRBFehciTjFjMjFjDjUhAjUjIjFhAhOjBjOhAjGjJjMjFhAjPjGhAjUjIjFhAjEjFjTjUjJj OjBjUjJjPjOhAiFjEjHjFhAiBjOjJjNjBjUjFhAjQjSjPjKjFjDjUhOffnftOTZTnAnAhhCViEfCnJW nASzKjFjYjQjPjSjUiUjZjQjFiGDdVzGjVjTjFiTiWiHiHfIXzDiTiWiHiIfjzKiFjYjQjPjSjUiUjZ jQjFiJfXzFiQiOiHhShUiKfjiJfnftJZnASzJjJjUjFjNjTiEjBjUjBiLEEXzQjFjYjQjPjSjUiMjBj ZjFjSjTiEjBjUjBiMfjzSiMjBjZjFjSiEjBjUjBiFjYjUjSjBjDjUjPjSiNfRCVgafAViGfDffnftJg anAEXBfjCfRBViLfEffJgcnASzKjEjFjTjUiGjPjMjEjFjSiOFXhTfViEfCnftJgdnASzJjJjNjHiGj PjMjEjFjSiPGEjzGiGjPjMjEjFjSiQfRBCGCGCGXhAfViOfFnneBhPXXfViOfFnnnneIhPjJjNjBjHj FjThPftnftOgeJgenAEXzGjDjSjFjBjUjFiRfViPfGnfAhhCXhDfViPfGnJgfnASzEjEjFjTjUiSHCG XzLjBjCjTjPjMjVjUjFiViSiJiTfViPfGnneBhPnftJhBnAEXzMjFjYjQjPjSjUiMjBjZjFjSjTiUfj zNiMjBjZjFjSiFjYjQjPjSjUjFjSiVfRDVgafAViPfGViGfDffJhDnAEXzIjEjPiJjNjQjPjSjUiWfj zTiFjEjHjFiBjOjJjNjBjUjFiJjNjQjPjSjUjFjSiXfRCViEfCViLfEffJhInAEXhGfVgafARBXzQiE iPiOiPiUiTiBiWiFiDiIiBiOiHiFiTiYfjzLiTjBjWjFiPjQjUjJjPjOjTiZfffJhJnASgaAnbffJhK nAEXhEfjhffRBViAfBffACzBheiaXMfXzJjEjPjDjVjNjFjOjUjTibfjhffnndAnAJiH40BhAiA4B0A iAiE4C0AiAiL4E0AiAiO4F0AiAiP4G0AiAiS4H0AiAiG4D0AiAga40BiABIAzIjEjPiFjYjQjPjSjUi cAhODJFnASiXyBENyBnAMFbyBnAEMSbyBn0AKJUnASiOAXhTfViEfInftJWnASzGjBjOiOjBjNjFidB EjhMfRBXXfViEfIffnftJYnASiPCEjiQfRBCGCGCGXhAfViOfAnneBhPXXfViOfAnnnneIhPjJjNjBj HjFjThPftnftOZJZnAEXiRfViPfCnfAhhCXhDfViPfCnJganASiSDCGXiTfViPfCnneBhPnftJgcnAS zJjPjVjUjQjVjUiUjYjUieEEjzMjQjSjPjDjFjTjTiJjUjFjNjTiffRBViLfJffnftJhAnASzIjFjEj HjFiGjJjMjFjAFEjgffRBCGCGCGXiTfViOfAnneBhPVidfBnnnneIifjFjEjHjFhOjKjTftnftJhBnA SzOjFjEjHjFiGjJjMjFiTjUjSjJjOjHjBGEjhHfRBXiTfVjAfFffnftJhCnASzNjOjFjXiGjJjMjFiT jUjSjJjOjHjCHEXUfVjBfGRCFeGjEjPjNhahAibCGnViefEeGjEjPjNhahAibnffnftJhDnAEjhdfRC VjCfHVjAfFffAKiE40BhAiL4B0AhAiO40BiAid4B0AiAiP4C0AiAie4E0AiAjA4F0AiAiS4D0AiAjB4 G0AiAjC4H0AiACIAzPjJjNjQjPjSjUiUjPiBjOjJjNjBjUjFjDAhFMhIbyBn0AEJhKnASieAneAftJh MnASLBXMfViLfEnftahObhQn0ACJhQnASzEjJjUjFjNjEDQIfViLfEVzBjKjFfCnftOhSbhUn0ADJhU nASieACGnEjzPjPjVjUjQjVjUiHjSjPjVjQiEjBjUjBjGfRFXXfVjEfDFdAFdAFd2nUBFd2nUBffnnn tfJhVnASieACGnEjiffRBXzFjJjUjFjNjTjHfVjEfDffnnntfJhWnASieACGnnneDidjdhMntfAXjHf VjEfDJhYnASieACGnEjzLjBjEjEiJjUjFjNiEjBjUjBjIfRBVjEfDffnnntfAVjFfCAVLfBByBPZhbn AVief0AFjE4D0AiAjF4C0AiAiL40BhAie40BiAL4B0AiABEAifAhcMhfbyBn0AHJiBnASFAneAftJiD nASFACGnCGCGnXXfVjEfBeLJJjbKJJJjJjEhahHnnneDhHhMKnnntfJiEnASFACGnnneRJJJjUjZjQj FhahHjJjNjBjHjFhHhMKntfJiFnASFACGnCGCGCGCGCGCGCGCGCGnXzBjYjJfVjEfBeKJJJjSjFjDjU haibhHnnneEhHhMhAhHXzBjZjKfVjEfBnnnneEhHhMhAhHXzFjXjJjEjUjIjLfVjEfBnnnneGjQjYhH hMhAhHXzGjIjFjJjHjIjUjMfVjEfBnnnneFjQjYhHhMhAnneQhHjBjVjUjPhHhMhHjBjVjUjPhHidhM KnnntfJiGnASFACGnCGCGCGCGCGnXXfVjEfBegdJJJjGjJjMjMhaibhCjSjHjCjBhIhQhMhQhMhQhMh QhJhChMjJjNhLhCnnneBhOXzDjFjYjUjNfVjEfBnnnneNhChMhHhQjQjYhHhMhHhQjQjYhHnneCidKn nntfJiHnASFACGnnneFJJjdhMKntfZiInAVFf0ACjE40BhAF40BiABBAjIAiJMiMbyBn0AGJiOnASFA neAftJiQnASFACGnCGCGnVXfBeLJJjbKJJJjJjEhahHnnneDhHhMKnnntfJiRnASFACGnnneRJJJjUj ZjQjFhahHjHjSjPjVjQhHhMKntfJiSnASFACGnCGCGCGCGCGCGCGCGCGnVjJfCeKJJJjSjFjDjUhaib hHnnneEhHhMhAhHVjKfDnnnneEhHhMhAhHVzBjXjOfEnnnneGjQjYhHhMhAhHVzBjIjPfFnnnneFjQj YhHhMhAnneQhHjBjVjUjPhHhMhHjBjVjUjPhHidhMKnnntfJiTnASFACGnnneGJJjDhaibKntfZiUnA VFf0AGjP4E0AhAjJ4B0AhAX40BhAjO4D0AhAjK4C0AhAF40BiAFBAjGAiVDJiYnASJAWzGiPjCjKjFj DjUjQAnftJiZnABXiWfVJfAjjDfnfZianAVJf0ABJ40BiAABAICicnfnftJFnASiNyBENyBnAMFbyBn ADMRbyBn0AFJUnASzHjEjPjDiOjBjNjFjRAEjYfRBEjhMfRBXXfVgafHffffnftJWnASiLBAnnftJYn ASLCXMfXZfVgafHnftKgcbgen0AKJgenASgbEQIfXZfVgafHVjFfDnftJhAnABXzGjMjPjDjLjFjEjS fVgbfEncffOhCDhCnAIfACzChdhdjTXMfXzJjQjBjHjFiJjUjFjNjTjUfVgbfEnndAnOhEDhEnAIfAC jTXgcfVgbfEnncfnJhGnAShSFCGCGVjRfAnneBhNEjYfRBXXfVgbfEffnnnftJhJnABXzSjIjBjTiTj FjMjFjDjUjFjEiBjSjUjXjPjSjLjVfVgbfEnctfOhMbyhNn0ABJhNnABjjEfEjzOjHjSjPjVjQiTjFj MjFjDjUjJjPjOjWfRBVgbfEffnfACiaXMfXzJjTjFjMjFjDjUjJjPjOjXfVgafHnndBbyhQn0ABJhQn ABjjEfXzBhQjYfXjXfVgafHnfJhUnABXjXfVgafHnbfJhXnASzIjJjUjFjNiEjBjUjBjZGEjzLjHjFj UiJjUjFjNiEjBjUjBjafRDjjEfVhSfFViGfIffnftJhZnAEXzEjQjVjTjIjbfViLfBRBVjZfGffASjF DCzBhNjcVLfCnndBnffCzChehdjdVjFfDnndATjFDyBtZhdnAViLfBAJjZ4G0AiAjF4D0AiAhS4F0Ai AiL4B0AiAgb4E0AiAiG4B0AhAjR40BiAL4C0AiAga40BhACHAiMAhfMiDbyBn0AEJiFnASzDjTjFjMj eAXjXfXhefjhffnftJiGnASzIjOjFjXiHjSjPjVjQjfBEXzDjBjEjEkAfXzKjHjSjPjVjQiJjUjFjNj TkBfVzFjMjBjZjFjSkCfDnfnftaiIbiJn0ACJiJnASzHjOjFjXiJjUjFjNkDCQIfVjefAjOfnftJiKn AEXzJjNjPjWjFiUjPiFjOjEkEfVkDfCRBVjffBffAjOfAXMfVjefAByBPZiMnAVjffBAEkC40BhAjf4 B0AiAkD4C0AiAje40BiABDAjWAiNMiSbyBn0AFJiUnASzDjQjPjTkFAXzIjQjPjTjJjUjJjPjOkGfVj EfCnftOiWbyiXn0ABJiXnASkFAEXzRjDjPjOjWjFjSjUiDjPjPjSjEjJjOjBjUjFkHfXhefjhffRDXk GfVjEfCXzYiEiPiDiViNiFiOiUiDiPiPiSiEiJiOiBiUiFiTiZiTiUiFiNkIfjzQiDjPjPjSjEjJjOj BjUjFiTjZjTjUjFjNkJfXzYiBiSiUiCiPiBiSiEiDiPiPiSiEiJiOiBiUiFiTiZiTiUiFiNkKfjkJff fnffACjTXzQjDjPjPjSjEjJjOjBjUjFiTjZjTjUjFjNkLfjhffXkIfjkJfnnnJianASjNBneDjQjOjH ftOibJibnASjNBneDjTjWjHffACjTViGfEXiIfjiJfnnnZidnAWjQGjJEXzHjUjPiGjJjYjFjEkMfXj YfVkFfARBFdCffjKCzBhKkNEXkMfXzBhRkOfVkFfARBFdCffnndyBjLEXkMfXjLfVjEfCRBFdCffjME XkMfXjMfVjEfCRBFdCffXVXfDjNVjNfBAFX4B0AhAjE40BhAkF40BiAjN4B0AiAiG4C0AhADCAjaAjF DJjInASJAWjQAnftJjJnABXiMfVJfAjiMfnfZjKnAVJf0ABJ40BiAABAICjMnfnftJFnASiVyBENyBn AMFbyBnACMTbyBn0AJJVnASzIjEjFjTjUiQjBjUjIkPACGCGCGXhAfViOfLnneBhPXXfViOfLnnnneB hPnftJXnASzIjBjSjUjCjPjBjSjEkQBXjYfXzJjBjSjUjCjPjBjSjEjTkRfVgafKnftJYnASzKjPjSj JjHjJjOiSjFjDjUkSCXzMjBjSjUjCjPjBjSjEiSjFjDjUkTfVkQfBnftJganASjRDEjYfRBEjhMfRBX XfVgafKffffnftJgcnASLEXMfXZfVgafKnftJhAnAEjgdfRCVgafKFcfffahCbhEn0ANJhEnASgbGQI fXZfVgafKVjFfFnftJhGnABXgcfVgbfGnctfJhHnABXjSfVgbfGncffOhKDhKnAIfACjTXMfXjUfVgb fGnndAnOhMDhMnAIfACjTXjYfXzNjWjJjTjJjCjMjFiCjPjVjOjEjTkUfVgafKXzBhSkVfXkUfVgafK nnnOhPJhPnABXkTfVkQfBVzMjDjVjTjUjPjNiCjPjVjOjEjTkWfNnfAVkWfNJhQnABXkTfVkQfBXkUf VgafKnfJhSnAShSHCGCGVjRfDnneBhNEjYfRBXXfVgbfGffnnnftJhUnASiGIVzRjEjFjGjBjVjMjUi FjYjQjPjSjUiUjZjQjFkXfMnftJhVnASzHjOjBjNjFiFjOjEkYJEXzGjTjVjCjTjUjSkZfXXfVgbfGR BCjcXMfXXfVgbfGnndEffnftOhWJhWnASiGIXiKfjiJfnffACjTVkYfJnneEhOjQjOjHnOhXJhXnASi GIXiIfjiJfnffACjTVkYfJnneEhOjTjWjHnJhanAEjzLjFjYjQjPjSjUiJjNjBjHjFkafRDVgafKCGV kPfAVhSfHnnViGfIffJhcnABXgcfVgbfGncffAVjFfFAVLfEByBPJhfnABXkTfVkQfBVkSfCnfJiBnA EjgdfRCVgafKFctffAOkP40BiAjF4F0AiAhS4H0AiAiO4B0AhAkX4C0AhAgb4G0AiAkW4D0AhAkQ4B0 AiAkS4C0AiAkY4J0AiAiG4I0AiAjR4D0AiAL4E0AiAga40BhAEKAiUAiCMiGbyBn0ADOiKbiLn0ACJi LnASzHjPjQjUjJjPjOjTkbAEjzQiFjYjQjPjSjUiPjQjUjJjPjOjTiTiWiHkcfntnffJiMnABXzRjFj NjCjFjEiSjBjTjUjFjSiJjNjBjHjFjTkdfVkbfAnctfACjTViGfEXiIfjiJfnnOiObyiPn0ABJiPnAS kbAEjzSiFjYjQjPjSjUiPjQjUjJjPjOjTiQiOiHhShUkefntnffACjTViGfEXiKfjiJfnnnJiSnASzI jGjJjMjFiTjQjFjDkfBEjgffRBViSfDftnftJiUnAEXzKjFjYjQjPjSjUiGjJjMjFlAfVgafCRDVkff BViGfEVkbfAffAFkb40BiAiS4B0AhAiG4C0AhAkf4B0AiAga40BhADCAkaAiWDJiZnASJAWjQAnftJi anABXiUfVJfAjiUfnfZibnAVJf0ABJ40BiAABAICidnfnftADiX40BiAiV4C0AiAiN4B0AiAADAIByB -------------------------------------------------------------------------------- /photoshop/export2EdgeAnimate/exportToEdgeAnimate.jsxbin: -------------------------------------------------------------------------------- 1 | @JSXBIN@ES@2.0@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 iUjZjQjFiJiEhffRBFeEjTjFjUjEffnftJFnASzFjEjFjTjDhSiABEjzQiBjDjUjJjPjOiEjFjTjDjS jJjQjUjPjSiBfntnftJGnASzGjJjEjOjVjMjMiCCEjhffRBFeEjOjVjMjMffnftJHnASzEjSjFjGhRi DDEjzPiBjDjUjJjPjOiSjFjGjFjSjFjOjDjFiEfntnftJInASzGjJjEiDjIjOjMiFEEjhffRBFeEiDj IjOjMffnftJJnASzGjJjEjGjTjFjMiGFEjhffRBFeEjGjTjFjMffnftJKnAEXzLjQjVjUiQjSjPjQjF jSjUjZiHfViDfDRCViFfEViGfFffJLnAEXzMjQjVjUiSjFjGjFjSjFjOjDjFiIfViAfBRCViCfCViDf DffJMnASzDjJjEiUiJGEjhffRBFeEiUhAhAhAffnftJNnASzEjSjFjGhSiKHEjiEfntnftJOnASiFEE jhffRBFeEiDjIjOjMffnftJPnASiFEEjhffRBFeEiDjIjOjMffnftJQnASzGjJjEiUjSjTjQiLIEjhf fRBFeEiUjSjTjQffnftJRnAEXzNjQjVjUiFjOjVjNjFjSjBjUjFjEiMfViKfHRDViFfEViFfEViLfIf fJSnASzFjJjEiMjZjSiNJEjhffRBFeEiMjZjShAffnftJTnAEXzHjQjVjUiOjBjNjFiOfViKfHRCViN fJXXfVzFjMjBjZjFjSiPfKffJUnAEXiIfViAfBRCViJfGViKfHffJWnAEjzNjFjYjFjDjVjUjFiBjDj UjJjPjOiQfRDVhefAViAfBXzCiOiPiRfjzLiEjJjBjMjPjHiNjPjEjFjTiSfffALiF4E0AiAiG4F0Ai AiJ4G0AiAiK4H0AiAiL4I0AiAiN4J0AiAiP40BhAhe40BiAiA4B0AiAiC4C0AiAiD4D0AiABKAzPjTj FjMjFjDjUiWjJjTjJjCjMjFiJjOiTAXMgabyBn0AWJgcnASheAEjhffRBFeEjTjFjUjEffnftJgdnAS zGjEjFjTjDhShZiUBEjiBfntnftJgenASiCCEjhffRBFeEjOjVjMjMffnftJgfnASzFjSjFjGhThQiV DEjiEfntnftJhAnASiFEEjhffRBFeEiDjIjOjMffnftJhBnASiGFEjhffRBFeEjGjTjFjMffnftJhCn AEXiHfViVfDRCViFfEViGfFffJhDnAEXiIfViUfBRCViCfCViVfDffJhEnASiJGEjhffRBFeEiUhAhA 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 DFeBjXFeEiUiFiYiUFeEhfhfhfhfffJjcnAEXhcfjhZfRBVDfBffJjdnAEXhGfjhZfnfADD40BhAha4 B0AhAhV40BiACBAhdAjeMHbyBn0AOOKZKnAnACzChdhdifXMfXzJjEjPjDjVjNjFjOjUjTjAfjzDjBj QjQjBfnndAnJMnASgaAXzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUjCfjjBfnftJPnASzOjTjUjSjUiSjV jMjFjSiVjOjJjUjTjDBXzKjSjVjMjFjSiVjOjJjUjTjEfXzLjQjSjFjGjFjSjFjOjDjFjTjFfjjBfnf tOQbyRn0ABJRnABXjEfXjFfjjBfXzGiQiJiYiFiMiTjGfjzFiVjOjJjUjTjHfnfAChWVjDfBXjGfjjH fnnnJVnASzJjJjUjFjNjTiEjBjUjBjICEXzQjFjYjQjPjSjUiMjBjZjFjSjTiEjBjUjBjJfjzSiMjBj ZjFjSiEjBjUjBiFjYjUjSjBjDjUjPjSjKfRCVgafAFeDiQiOiHffnftJXnAEjQfRBVjIfCffJganASz GjBjOiGjJjMjFjLDEXzKjPjQjFjOiEjJjBjMjPjHjMfjgffRBFehciTjFjMjFjDjUhAjUjIjFhAhOjB jOhAjGjJjMjFhAjPjGhAjUjIjFhAjEjFjTjUjJjOjBjUjJjPjOhAiFjEjHjFhAiBjOjJjNjBjUjFhAj QjSjPjKjFjDjUhOffnftOgbZgbnAnAhhCVjLfDnJgdnASzKjEjFjTjUiGjPjMjEjFjSjNEXhTfVjLfD nftJgenASzJjJjNjHiGjPjMjEjFjSjOFEjzGiGjPjMjEjFjSjPfRBCGCGCGXhAfVjNfEnneBhPXXfVj NfEnnnneIhPjJjNjBjHjFjThPftnftOgfJgfnAEXzGjDjSjFjBjUjFjQfVjOfFnfAhhCXhDfVjOfFnJ hCnAEXzPjFjYjQjPjSjUiEjPjDiMjBjZjFjSjTjRfjzNiMjBjZjFjSiFjYjQjPjSjUjFjSjSfRCVgaf AVjOfFffJhEnAEXzIjEjPiJjNjQjPjSjUjTfjzTiFjEjHjFiBjOjJjNjBjUjFiJjNjQjPjSjUjFjSjU fRCVjLfDVjIfCffJhGnABXjEfXjFfjjBfVjDfBnfAGjD4B0AiAjN4E0AiAjI4C0AiAjL4D0AiAjO4F0 AiAga40BiAAGAzOjFjYjQjPjSjUhSiBjOjJjNjBjUjFjVAhIDJHnASjKyBENyBnAMHbyBnAEMVbyBn0 AEJXnABjzHjEjPjDiOjBjNjFjWfEjYfRBEjhMfRBXXfVgafBffffnfJYnASzKjFjYjQjPjSjUiUjZjQ jFjXCVjXfCnffJganASjIAEjzNjQjSjPjDjFjTjTiMjBjZjFjSjTjYfRCXZfVgafBVgafBffnftZgcn AVjIf0ADjX4B0AhAjI40BiAga40BhACBAjJAgdMhAbyBn0AEJhCnASjIAAnnftJhEnASLBXMfVZfGnf tKhIbhKn0AIJhKnASgbDQIfVZfGVzBjKjZfCnftOhNDhNnAIfACifXgcfVgbfDnncfnJhPnAEjEfRBC GCGXXfVgbfDnnePjJjThAjBjSjUhAjMjBjZjFjSjThfhACzKjJjOjTjUjBjOjDjFjPjGjaVgbfDjzIi BjSjUiMjBjZjFjSjbfnnnnffOhRbhTn0AEJhTnASzJjHjSjPjVjQiEjBjUjBjcEEjzMjQjSjPjDjFjT jTiHjSjPjVjQjdfRBVgbfDffnftJhUnAEXzEjQjVjTjIjefVjIfARBVjcfEffJhVnABXzFjJjUjFjNj TjffVjcfEEjjYfRCXZfVgbfDVgafHffnfDhWnAIfACifCjaVgbfDjjbfnnnncfnOhaDhanAIfAUzChG hGkAUkAChWXzEjLjJjOjEkBfVgbfDXzGiOiPiSiNiBiMkCfjzJiMjBjZjFjSiLjJjOjEkDfnnChWXkB fVgbfDXzEiUiFiYiUkEfjkDfnnnnChWXkBfVgbfDXzJiTiPiMiJiEiGiJiMiMkFfjkDfnnnnnOheDhe nAIfACifXzBhSkGfXzGjCjPjVjOjEjTkHfVgbfDnndAnJiAnASzIjJjUjFjNiEjBjUjBkIFEjzMjQjS jPjDjFjTjTiMjBjZjFjSkJfRCVgbfDVgafHffnftJiCnAEXjefVjIfARBVkIfFffASjZCCzBhNkKVLf BnndBnffCzChehdkLVjZfCnndATjZCyBtZiGnAVjIf0AIkI4F0AiAjZ4C0AiAZ40BhAgb4D0AiAjI40 BiAjc4E0AiAL4B0AiAga4B0AhACGAjYAiHMiLbyBn0AKJiNnABXzLjBjDjUjJjWjFiMjBjZjFjSkMfV gafIVgbfHnfJiPnAShSACGCGjjWfnneBhNEjYfRBXXfVgbfHffnnnftOiRJiRnAEjiefRBVgbfHffAC ifXkBfVgbfHXkFfjkDfnnJiSnAEjiTfRBVgbfHffJiUnASzDjTjFjMkNBXzJjTjFjMjFjDjUjJjPjOk OfVgafInftJiWnASzCjQjYkPCXzFjWjBjMjVjFkQfXzBhQkRfXkHfVkNfBnftJiXnASzCjQjZkSDXkQ fXzBhRkTfXkHfVkNfBnftJiYnASzCjQjXkUECkKXkQfXkGfXkHfVkNfBVkPfCnnnftJiZnASzCjQjIk VFCkKXkQfXzBhTkWfXkHfVkNfBVkSfDnnnftJicnASkIGWzGiPjCjKjFjDjUkXGzBjYkYVkPfCzBjZk ZVkSfDzFjXjJjEjUjIkaVkUfEzGjIjFjJjHjIjUkbVkVfFXVhSfAzDjFjYjUkcFeDjQjOjHnftZjGnA VkIfGAJkI4G0AiAkP4C0AiAkU4E0AiAkV4F0AiAhS40BiAgb40BhAkS4D0AiAkN4B0AiAga4B0AhACH AkJAjHMjKbyBn0ADJjMnASXAEjYfRBXXfVgbfCffnftJjOnASjcBWkXHkYFdAkZFdAkaFd2nUBkbFd2 nUBXVXfAkcFbjfAnnftZjYnAVjcfBADX40BiAgb40BhAjc4B0AiABCAjdAjaEJSnASjWAneAftJjdnA SJCWkXAnftJjenABXjJfVJfCjjJfnfZjfnAVJfCADjW40BiAjX4B0AiAJ4C0AiAADAICkBnfnftJFnA SjSyBENyBnAMFbyBnADMPbyBn0ADJRnASzIjEjFjTjUiQjBjUjIkdACGCGCGXhAfVjNfDnneBhPXXfV jNfDnnnneBhPnftJTnASjWBEjYfRBEjhMfRBXXfVgafCffffnftJVnAEjzMjFjYjQjPjSjUiMjBjZjF jSjTkefRDXZfVgafCVkdfAVjWfBffAEjN4B0AhAjW4B0AiAkd40BiAga40BhACCAjRAWMgabyBn0ACJ gdnASLAXMfVZfEnftahBbhDn0AJJhDnASgbCQIfVZfEVjZfBnftJhFnAShSDCGCGVzGjQjSjFjGjJjY kffGnneBhNEjYfRBXXfVgbfCffnnnftJhHnAEjEfRBXXfVgbfCffOhKDhKnAIfACifXgcfVgbfCnncf nOhNbhOn0ACJhOnAEjkefRDXZfVgbfCVkdfFVkffGffDhPnAIfACifCjaVgbfCjjbfnnnncfnOhTbyh Un0ABJhUnAEXzJjSjBjTjUjFjSjJjajFlAfVgbfCRBXzFiTiIiBiQiFlBfjzNiSjBjTjUjFjSjJjajF iUjZjQjFlCfffACifXkBfVgbfCXkFfjkDfnnOhYbhZn0ACJhZnAEjEfRBCGCGXXfVgbfCnneZhAjJjH jOjPjSjFjEhAjCjFjDjBjVjTjFhAjLjJjOjEhAjJjThAXkBfVgbfCnnffDhanAIfAUkAChWXkBfVgbf CXkCfjkDfnnChWXkBfVgbfCXkEfjkDfnnnnnOhfDhfnAIfACifXkGfXkHfVgbfCnndAnJiBnABXkMfX jCfjjBfVgbfCnfJiEnAEjzLjFjYjQjPjSjUiJjNjBjHjFlDfREXjCfjjBfVgbfCVkdfFVhSfDffAVjZ fBAVLfAByBPAHkf4C0AhAjZ4B0AiAhS4D0AiAZ40BhAgb4C0AiAkd4B0AhAL40BiADEAkeAiJMiNbyB n0AOJiPnAEjiTfRBVgbfJffJiQnAEXzEjDjPjQjZlEfXkOfVgafInfJiRnASkHAXkHfXkOfVgafInft JiSnASkYBXkQfXkRfVkHfAnftJiTnASkZCXkQfXkTfVkHfAnftJiUnASzBjXlFDCkKXkQfXkGfVkHfA VkYfBnnnftJiVnASzBjIlGECkKXkQfXkWfVkHfAVkZfCnnnftJiXnASzGjOjFjXiEjPjDlHFEXzDjBj EjElIfXjAfjjBfRGVlFfDVlGfEFdiIXXfVgbfJXzDiSiHiClJfjzPiOjFjXiEjPjDjVjNjFjOjUiNjP jEjFlKfXzLiUiSiBiOiTiQiBiSiFiOiUlLfjzMiEjPjDjVjNjFjOjUiGjJjMjMlMfffnftJiYnAEXzF jQjBjTjUjFlNfVlHfFnfJianASzOjQjOjHiTjBjWjFiPjQjUjJjPjOjTlOGEjzOiQiOiHiTjBjWjFiP jQjUjJjPjOjTlPfntnftJibnASzIjTjBjWjFiGjJjMjFlQHEjgffRBCGCGVkdfKVhSfLnnnneEhOjQj OjHftnftJicnAEXzGjTjBjWjFiBjTlRfVlHfFREVlQfHVlOfGFctXzJiMiPiXiFiSiDiBiTiFlSfjzJ iFjYjUjFjOjTjJjPjOlTfffJidnAEXhGfVlHfFRBXzQiEiPiOiPiUiTiBiWiFiDiIiBiOiHiFiTlUfj zLiTjBjWjFiPjQjUjJjPjOjTlVfffJienASlHFnbffAMlG4E0AiAkY4B0AiAlF4D0AiAkZ4C0AiAkH4 0BiAhS4D0AhAlO4G0AiAgb4B0AhAlQ4H0AiAlH4F0AiAkd4C0AhAga40BhAEIAlDAifDJjCnASJAWkX AnftJjDnABXjRfVJfAjjRfnfZjEnAVJf0ABJ40BiAABAICjGnfnftJFnASjUyBENyBnAMFbyBnAEMSb yBn0AKJUnASjNAXhTfVjLfInftJWnASzGjBjOiOjBjNjFlWBEjhMfRBXXfVjLfIffnftJYnASjOCEjj PfRBCGCGCGXhAfVjNfAnneBhPXXfVjNfAnnnneIhPjJjNjBjHjFjThPftnftOZJZnAEXjQfVjOfCnfA hhCXhDfVjOfCnJganASzEjEjFjTjUlXDCGXzLjBjCjTjPjMjVjUjFiViSiJlYfVjOfCnneBhPnftJgc nASzJjPjVjUjQjVjUiUjYjUlZEEjzMjQjSjPjDjFjTjTiJjUjFjNjTlafRBVjIfJffnftJhAnASzIjF jEjHjFiGjJjMjFlbFEjgffRBCGCGCGXlYfVjNfAnneBhPVlWfBnnnneIifjFjEjHjFhOjKjTftnftJh BnASzOjFjEjHjFiGjJjMjFiTjUjSjJjOjHlcGEjhHfRBXlYfVlbfFffnftJhCnASzNjOjFjXiGjJjMj FiTjUjSjJjOjHldHEXUfVlcfGRCFeGjEjPjNhahAibCGnVlZfEeGjEjPjNhahAibnffnftJhDnAEjhd fRCVldfHVlbfFffAKlc4G0AiAld4H0AiAjN40BiAlX4D0AiAjI4B0AhAjL40BhAlW4B0AiAjO4C0AiA lZ4E0AiAlb4F0AiACIAzPjJjNjQjPjSjUiUjPiBjOjJjNjBjUjFleAhFMhIbyBn0AEJhKnASlZAneAf tJhMnASLBXMfVjIfEnftahObhQn0ACJhQnASzEjJjUjFjNlfDQIfVjIfEVjZfCnftOhSbhUn0ADJhUn ASlZACGnEjzPjPjVjUjQjVjUiHjSjPjVjQiEjBjUjBmAfRFXXfVlffDFdAFdAFd2nUBFd2nUBffnnnt fJhVnASlZACGnEjlafRBXjffVlffDffnnntfJhWnASlZACGnnneDidjdhMntfAXjffVlffDJhYnASlZ ACGnEjzLjBjEjEiJjUjFjNiEjBjUjBmBfRBVlffDffnnntfAVjZfCAVLfBByBPZhbnAVlZf0AFlf4D0 AiAjZ4C0AiAjI40BhAlZ40BiAL4B0AiABEAlaAhcMhfbyBn0AHJiBnASFAneAftJiDnASFACGnCGCGn XXfVlffBeLJJjbKJJJjJjEhahHnnneDhHhMKnnntfJiEnASFACGnnneRJJJjUjZjQjFhahHjJjNjBjH jFhHhMKntfJiFnASFACGnCGCGCGCGCGCGCGCGCGnXkYfVlffBeKJJJjSjFjDjUhaibhHnnneEhHhMhA hHXkZfVlffBnnnneEhHhMhAhHXkafVlffBnnnneGjQjYhHhMhAhHXkbfVlffBnnnneFjQjYhHhMhAnn eQhHjBjVjUjPhHhMhHjBjVjUjPhHidhMKnnntfJiGnASFACGnCGCGCGCGCGnXXfVlffBegdJJJjGjJj MjMhaibhCjSjHjCjBhIhQhMhQhMhQhMhQhJhChMjJjNhLhCnnneBhOXkcfVlffBnnnneNhChMhHhQjQ jYhHhMhHhQjQjYhHnneCidKnnntfJiHnASFACGnnneFJJjdhMKntfZiInAVFf0ACF40BiAlf40BhABB AmBAiJMiMbyBn0AGJiOnASFAneAftJiQnASFACGnCGCGnVXfBeLJJjbKJJJjJjEhahHnnneDhHhMKnn ntfJiRnASFACGnnneRJJJjUjZjQjFhahHjHjSjPjVjQhHhMKntfJiSnASFACGnCGCGCGCGCGCGCGCGC GnVkYfCeKJJJjSjFjDjUhaibhHnnneEhHhMhAhHVkZfDnnnneEhHhMhAhHVlFfEnnnneGjQjYhHhMhA hHVlGfFnnnneFjQjYhHhMhAnneQhHjBjVjUjPhHhMhHjBjVjUjPhHidhMKnnntfJiTnASFACGnnneGJ JjDhaibKntfZiUnAVFf0AGlG4E0AhAkY4B0AhAX40BhAF40BiAlF4D0AhAkZ4C0AhAFBAmAAiVDJiYn ASJAWkXAnftJiZnABXjTfVJfAjlefnfZianAVJf0ABJ40BiAABAICicnfnftADjS4B0AiAjK40BiAjU 4C0AiAADAIByB -------------------------------------------------------------------------------- /common/json2.js: -------------------------------------------------------------------------------- 1 | /* 2 | json2.js 3 | 2013-05-26 4 | 5 | Public Domain. 6 | 7 | NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 8 | 9 | See http://www.JSON.org/js.html 10 | 11 | 12 | This code should be minified before deployment. 13 | See http://javascript.crockford.com/jsmin.html 14 | 15 | USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO 16 | NOT CONTROL. 17 | 18 | 19 | This file creates a global JSON object containing two methods: stringify 20 | and parse. 21 | 22 | JSON.stringify(value, replacer, space) 23 | value any JavaScript value, usually an object or array. 24 | 25 | replacer an optional parameter that determines how object 26 | values are stringified for objects. It can be a 27 | function or an array of strings. 28 | 29 | space an optional parameter that specifies the indentation 30 | of nested structures. If it is omitted, the text will 31 | be packed without extra whitespace. If it is a number, 32 | it will specify the number of spaces to indent at each 33 | level. If it is a string (such as '\t' or ' '), 34 | it contains the characters used to indent at each level. 35 | 36 | This method produces a JSON text from a JavaScript value. 37 | 38 | When an object value is found, if the object contains a toJSON 39 | method, its toJSON method will be called and the result will be 40 | stringified. A toJSON method does not serialize: it returns the 41 | value represented by the name/value pair that should be serialized, 42 | or undefined if nothing should be serialized. The toJSON method 43 | will be passed the key associated with the value, and this will be 44 | bound to the value 45 | 46 | For example, this would serialize Dates as ISO strings. 47 | 48 | Date.prototype.toJSON = function (key) { 49 | function f(n) { 50 | // Format integers to have at least two digits. 51 | return n < 10 ? '0' + n : n; 52 | } 53 | 54 | return this.getUTCFullYear() + '-' + 55 | f(this.getUTCMonth() + 1) + '-' + 56 | f(this.getUTCDate()) + 'T' + 57 | f(this.getUTCHours()) + ':' + 58 | f(this.getUTCMinutes()) + ':' + 59 | f(this.getUTCSeconds()) + 'Z'; 60 | }; 61 | 62 | You can provide an optional replacer method. It will be passed the 63 | key and value of each member, with this bound to the containing 64 | object. The value that is returned from your method will be 65 | serialized. If your method returns undefined, then the member will 66 | be excluded from the serialization. 67 | 68 | If the replacer parameter is an array of strings, then it will be 69 | used to select the members to be serialized. It filters the results 70 | such that only members with keys listed in the replacer array are 71 | stringified. 72 | 73 | Values that do not have JSON representations, such as undefined or 74 | functions, will not be serialized. Such values in objects will be 75 | dropped; in arrays they will be replaced with null. You can use 76 | a replacer function to replace those with JSON values. 77 | JSON.stringify(undefined) returns undefined. 78 | 79 | The optional space parameter produces a stringification of the 80 | value that is filled with line breaks and indentation to make it 81 | easier to read. 82 | 83 | If the space parameter is a non-empty string, then that string will 84 | be used for indentation. If the space parameter is a number, then 85 | the indentation will be that many spaces. 86 | 87 | Example: 88 | 89 | text = JSON.stringify(['e', {pluribus: 'unum'}]); 90 | // text is '["e",{"pluribus":"unum"}]' 91 | 92 | 93 | text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); 94 | // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' 95 | 96 | text = JSON.stringify([new Date()], function (key, value) { 97 | return this[key] instanceof Date ? 98 | 'Date(' + this[key] + ')' : value; 99 | }); 100 | // text is '["Date(---current time---)"]' 101 | 102 | 103 | JSON.parse(text, reviver) 104 | This method parses a JSON text to produce an object or array. 105 | It can throw a SyntaxError exception. 106 | 107 | The optional reviver parameter is a function that can filter and 108 | transform the results. It receives each of the keys and values, 109 | and its return value is used instead of the original value. 110 | If it returns what it received, then the structure is not modified. 111 | If it returns undefined then the member is deleted. 112 | 113 | Example: 114 | 115 | // Parse the text. Values that look like ISO date strings will 116 | // be converted to Date objects. 117 | 118 | myData = JSON.parse(text, function (key, value) { 119 | var a; 120 | if (typeof value === 'string') { 121 | a = 122 | /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); 123 | if (a) { 124 | return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], 125 | +a[5], +a[6])); 126 | } 127 | } 128 | return value; 129 | }); 130 | 131 | myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { 132 | var d; 133 | if (typeof value === 'string' && 134 | value.slice(0, 5) === 'Date(' && 135 | value.slice(-1) === ')') { 136 | d = new Date(value.slice(5, -1)); 137 | if (d) { 138 | return d; 139 | } 140 | } 141 | return value; 142 | }); 143 | 144 | 145 | This is a reference implementation. You are free to copy, modify, or 146 | redistribute. 147 | */ 148 | 149 | /*jslint evil: true, regexp: true */ 150 | 151 | /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, 152 | call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, 153 | getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, 154 | lastIndex, length, parse, prototype, push, replace, slice, stringify, 155 | test, toJSON, toString, valueOf 156 | */ 157 | 158 | 159 | // Create a JSON object only if one does not already exist. We create the 160 | // methods in a closure to avoid creating global variables. 161 | 162 | if (typeof JSON !== 'object') { 163 | JSON = {}; 164 | } 165 | 166 | (function () { 167 | 'use strict'; 168 | 169 | function f(n) { 170 | // Format integers to have at least two digits. 171 | return n < 10 ? '0' + n : n; 172 | } 173 | 174 | if (typeof Date.prototype.toJSON !== 'function') { 175 | 176 | Date.prototype.toJSON = function () { 177 | 178 | return isFinite(this.valueOf()) 179 | ? this.getUTCFullYear() + '-' + 180 | f(this.getUTCMonth() + 1) + '-' + 181 | f(this.getUTCDate()) + 'T' + 182 | f(this.getUTCHours()) + ':' + 183 | f(this.getUTCMinutes()) + ':' + 184 | f(this.getUTCSeconds()) + 'Z' 185 | : null; 186 | }; 187 | 188 | String.prototype.toJSON = 189 | Number.prototype.toJSON = 190 | Boolean.prototype.toJSON = function () { 191 | return this.valueOf(); 192 | }; 193 | } 194 | 195 | var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 196 | escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 197 | gap, 198 | indent, 199 | meta = { // table of character substitutions 200 | '\b': '\\b', 201 | '\t': '\\t', 202 | '\n': '\\n', 203 | '\f': '\\f', 204 | '\r': '\\r', 205 | '"' : '\\"', 206 | '\\': '\\\\' 207 | }, 208 | rep; 209 | 210 | 211 | function quote(string) { 212 | 213 | // If the string contains no control characters, no quote characters, and no 214 | // backslash characters, then we can safely slap some quotes around it. 215 | // Otherwise we must also replace the offending characters with safe escape 216 | // sequences. 217 | 218 | escapable.lastIndex = 0; 219 | return escapable.test(string) ? '"' + string.replace(escapable, function (a) { 220 | var c = meta[a]; 221 | return typeof c === 'string' 222 | ? c 223 | : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 224 | }) + '"' : '"' + string + '"'; 225 | } 226 | 227 | 228 | function str(key, holder) { 229 | 230 | // Produce a string from holder[key]. 231 | 232 | var i, // The loop counter. 233 | k, // The member key. 234 | v, // The member value. 235 | length, 236 | mind = gap, 237 | partial, 238 | value = holder[key]; 239 | 240 | // If the value has a toJSON method, call it to obtain a replacement value. 241 | 242 | if (value && typeof value === 'object' && 243 | typeof value.toJSON === 'function') { 244 | value = value.toJSON(key); 245 | } 246 | 247 | // If we were called with a replacer function, then call the replacer to 248 | // obtain a replacement value. 249 | 250 | if (typeof rep === 'function') { 251 | value = rep.call(holder, key, value); 252 | } 253 | 254 | // What happens next depends on the value's type. 255 | 256 | switch (typeof value) { 257 | case 'string': 258 | return quote(value); 259 | 260 | case 'number': 261 | 262 | // JSON numbers must be finite. Encode non-finite numbers as null. 263 | 264 | return isFinite(value) ? String(value) : 'null'; 265 | 266 | case 'boolean': 267 | case 'null': 268 | 269 | // If the value is a boolean or null, convert it to a string. Note: 270 | // typeof null does not produce 'null'. The case is included here in 271 | // the remote chance that this gets fixed someday. 272 | 273 | return String(value); 274 | 275 | // If the type is 'object', we might be dealing with an object or an array or 276 | // null. 277 | 278 | case 'object': 279 | 280 | // Due to a specification blunder in ECMAScript, typeof null is 'object', 281 | // so watch out for that case. 282 | 283 | if (!value) { 284 | return 'null'; 285 | } 286 | 287 | // Make an array to hold the partial results of stringifying this object value. 288 | 289 | gap += indent; 290 | partial = []; 291 | 292 | // Is the value an array? 293 | 294 | if (Object.prototype.toString.apply(value) === '[object Array]') { 295 | 296 | // The value is an array. Stringify every element. Use null as a placeholder 297 | // for non-JSON values. 298 | 299 | length = value.length; 300 | for (i = 0; i < length; i += 1) { 301 | partial[i] = str(i, value) || 'null'; 302 | } 303 | 304 | // Join all of the elements together, separated with commas, and wrap them in 305 | // brackets. 306 | 307 | v = partial.length === 0 308 | ? '[]' 309 | : gap 310 | ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' 311 | : '[' + partial.join(',') + ']'; 312 | gap = mind; 313 | return v; 314 | } 315 | 316 | // If the replacer is an array, use it to select the members to be stringified. 317 | 318 | if (rep && typeof rep === 'object') { 319 | length = rep.length; 320 | for (i = 0; i < length; i += 1) { 321 | if (typeof rep[i] === 'string') { 322 | k = rep[i]; 323 | v = str(k, value); 324 | if (v) { 325 | partial.push(quote(k) + (gap ? ': ' : ':') + v); 326 | } 327 | } 328 | } 329 | } else { 330 | 331 | // Otherwise, iterate through all of the keys in the object. 332 | 333 | for (k in value) { 334 | if (Object.prototype.hasOwnProperty.call(value, k)) { 335 | v = str(k, value); 336 | if (v) { 337 | partial.push(quote(k) + (gap ? ': ' : ':') + v); 338 | } 339 | } 340 | } 341 | } 342 | 343 | // Join all of the member texts together, separated with commas, 344 | // and wrap them in braces. 345 | 346 | v = partial.length === 0 347 | ? '{}' 348 | : gap 349 | ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' 350 | : '{' + partial.join(',') + '}'; 351 | gap = mind; 352 | return v; 353 | } 354 | } 355 | 356 | // If the JSON object does not yet have a stringify method, give it one. 357 | 358 | if (typeof JSON.stringify !== 'function') { 359 | JSON.stringify = function (value, replacer, space) { 360 | 361 | // The stringify method takes a value and an optional replacer, and an optional 362 | // space parameter, and returns a JSON text. The replacer can be a function 363 | // that can replace values, or an array of strings that will select the keys. 364 | // A default replacer method can be provided. Use of the space parameter can 365 | // produce text that is more easily readable. 366 | 367 | var i; 368 | gap = ''; 369 | indent = ''; 370 | 371 | // If the space parameter is a number, make an indent string containing that 372 | // many spaces. 373 | 374 | if (typeof space === 'number') { 375 | for (i = 0; i < space; i += 1) { 376 | indent += ' '; 377 | } 378 | 379 | // If the space parameter is a string, it will be used as the indent string. 380 | 381 | } else if (typeof space === 'string') { 382 | indent = space; 383 | } 384 | 385 | // If there is a replacer, it must be a function or an array. 386 | // Otherwise, throw an error. 387 | 388 | rep = replacer; 389 | if (replacer && typeof replacer !== 'function' && 390 | (typeof replacer !== 'object' || 391 | typeof replacer.length !== 'number')) { 392 | throw new Error('JSON.stringify'); 393 | } 394 | 395 | // Make a fake root object containing our value under the key of ''. 396 | // Return the result of stringifying the value. 397 | 398 | return str('', {'': value}); 399 | }; 400 | } 401 | 402 | 403 | // If the JSON object does not yet have a parse method, give it one. 404 | 405 | if (typeof JSON.parse !== 'function') { 406 | JSON.parse = function (text, reviver) { 407 | 408 | // The parse method takes a text and an optional reviver function, and returns 409 | // a JavaScript value if the text is a valid JSON text. 410 | 411 | var j; 412 | 413 | function walk(holder, key) { 414 | 415 | // The walk method is used to recursively walk the resulting structure so 416 | // that modifications can be made. 417 | 418 | var k, v, value = holder[key]; 419 | if (value && typeof value === 'object') { 420 | for (k in value) { 421 | if (Object.prototype.hasOwnProperty.call(value, k)) { 422 | v = walk(value, k); 423 | if (v !== undefined) { 424 | value[k] = v; 425 | } else { 426 | delete value[k]; 427 | } 428 | } 429 | } 430 | } 431 | return reviver.call(holder, key, value); 432 | } 433 | 434 | 435 | // Parsing happens in four stages. In the first stage, we replace certain 436 | // Unicode characters with escape sequences. JavaScript handles many characters 437 | // incorrectly, either silently deleting them, or treating them as line endings. 438 | 439 | text = String(text); 440 | cx.lastIndex = 0; 441 | if (cx.test(text)) { 442 | text = text.replace(cx, function (a) { 443 | return '\\u' + 444 | ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 445 | }); 446 | } 447 | 448 | // In the second stage, we run the text against regular expressions that look 449 | // for non-JSON patterns. We are especially concerned with '()' and 'new' 450 | // because they can cause invocation, and '=' because it can cause mutation. 451 | // But just to be safe, we want to reject all unexpected forms. 452 | 453 | // We split the second stage into 4 regexp operations in order to work around 454 | // crippling inefficiencies in IE's and Safari's regexp engines. First we 455 | // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we 456 | // replace all simple value tokens with ']' characters. Third, we delete all 457 | // open brackets that follow a colon or comma or that begin the text. Finally, 458 | // we look to see that the remaining characters are only whitespace or ']' or 459 | // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. 460 | 461 | if (/^[\],:{}\s]*$/ 462 | .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') 463 | .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') 464 | .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { 465 | 466 | // In the third stage we use the eval function to compile the text into a 467 | // JavaScript structure. The '{' operator is subject to a syntactic ambiguity 468 | // in JavaScript: it can begin a block or an object literal. We wrap the text 469 | // in parens to eliminate the ambiguity. 470 | 471 | j = eval('(' + text + ')'); 472 | 473 | // In the optional fourth stage, we recursively walk the new structure, passing 474 | // each name/value pair to a reviver function for possible transformation. 475 | 476 | return typeof reviver === 'function' 477 | ? walk({'': j}, '') 478 | : j; 479 | } 480 | 481 | // If the text is not JSON parseable, then a SyntaxError is thrown. 482 | 483 | throw new SyntaxError('JSON.parse'); 484 | }; 485 | } 486 | }()); 487 | -------------------------------------------------------------------------------- /illustrator/export-layers-v2/ExportLayersAndData.jsxbin: -------------------------------------------------------------------------------- 1 | @JSXBIN@ES@2.0@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 iTXhLfVhKfDnncfnnnJgdnASzIjJjTiMjPjDjLjFjEiUEXzGjMjPjDjLjFjEiVfVhKfDnftOgeJgenA BXiVfVhKfDncffAViUfEnOhBDhBnAWfACiTXgafXzJjQjBjHjFiJjUjFjNjTiWfVhKfDnndAnOhEDhE nAWfACiTXzBhQiXfXzNjWjJjTjJjCjMjFiCjPjVjOjEjTiYfVhJfIXzBhSiZfXiYfVhJfInnnJhHnAS zMjFjYjQjPjSjUiQjBjSjBjNjTiaFEVzPjHjFjUiFjYjQjPjSjUiQjBjSjBjNjTibfLRBXhGfVhKfDf fnftOhKbhLn0AEJhLnAEjzJjDjPjQjZiMjBjZjFjSicfRCVhKfDViKfCffJhMnABXzMjBjSjUjCjPjB jSjEiSjFjDjUidfXiXfXzJjBjSjUjCjPjBjSjEjTiefViKfCXiYfViKfCnfJhNnAEjzLjFjYjQjPjSj UiJjNjBjHjFiffRDViKfCVzKjEjFjTjUiGjPjMjEjFjSjAfJViafFffJhOnAEXzJjSjFjNjPjWjFiBj MjMjBfXiWfXzLjBjDjUjJjWjFiMjBjZjFjSjCfViKfCnfAUiRViafFXzKjFjYjQjPjSjUiUjZjQjFjD fViafFnnnahTbhUn0AEJhUnASzEjJjUjFjNjEHQWfXiWfVhKfDVgcfGnftOhWDhWnAWfAUiRViSfKXz GjIjJjEjEjFjOjFfVjEfHnnnJhXnASiaFEVibfLRBXhGfVjEfHffnffOhZbhan0AEJhanAEXzJjEjVj QjMjJjDjBjUjFjGfVjEfHRCXjCfViKfCXzKiQiMiBiDiFiBiUiFiOiEjHfjzQiFjMjFjNjFjOjUiQjM jBjDjFjNjFjOjUjIfffJhbnABXidfXiXfXiefViKfCXiYfViKfCnfJhcnAEjiffRDViKfCVjAfJViaf FffJhdnAEXjBfXiWfXjCfViKfCnfAUiRViafFXjDfViafFnnnAVgcfGAXgafXiWfVhKfDByBgeOiCJi CnABXiVfVhKfDnctfAViUfEnAViQfBAVZfAByBgeJiGnAEXhSfViKfCRBXzQiEiPiOiPiUiTiBiWiFi DiIiBiOiHiFiTjJfjzLiTjBjWjFiPjQjUjJjPjOjTjKfffAMgc4G0AiAjA4B0AhAiS4C0AhAib4D0Ah AjE4H0AiAiK4C0AiAiQ4B0AiAiU4E0AiAia4F0AiAhK4D0AiAZ40BiAhJ40BhAEIAzMjFjYjQjPjSjU iMjBjZjFjSjTjLAiIMiLbyBn0ACJiNnASZAXgafXiWfVhKfCnftaiObyiPn0ABJiPnAEXjGfQWfXiWf VhKfCVgcfBRCXjCfViKfDXjHfjjIfffAVgcfBAVZfAByBgeAEgc4B0AiAiK4B0AhAhK40BhAZ40BiAC CAicAiSMiWbyBn0AFJiYnASzEjEjFjTjUjMACGCGCGCGCGCGXhOfVjAfHnneBhPXhGfVjAfHnnnneBh PXhGfViafInnnneBhOXjDfViafInnnftJibnASjDCEXzLjUjPiMjPjXjFjSiDjBjTjFjNfXjDfViafI nfnftOiebifn0ALJifnASzFjFiUjZjQjFjODXzDiTiWiHjPfjzKiFjYjQjPjSjUiUjZjQjFjQfnffJj AnASzHjPjQjUjJjPjOjTjRBEjzQiFjYjQjPjSjUiPjQjUjJjPjOjTiTiWiHjSfntnffJjBnABXzTjDj PjPjSjEjJjOjBjUjFiQjSjFjDjJjTjJjPjOjTfVjRfBXzJjQjSjFjDjJjTjJjPjOjUfViafInfJjCnA BXzRjFjNjCjFjEiSjBjTjUjFjSiJjNjBjHjFjTjVfVjRfBXzLjFjNjCjFjEiJjNjBjHjFjTjWfViafI nfJjDnABXzIjGjPjOjUiUjZjQjFjXfVjRfBXzLiPiViUiMiJiOiFiGiPiOiUjYfjzLiTiWiHiGjPjOj UiUjZjQjFjZfnfOjEbjFn0ACJjFnABXjXfVjRfBXzHiTiWiHiGiPiOiUjafjjZfnfJjGnABXzOjGjPj OjUiTjVjCjTjFjUjUjJjOjHjbfVjRfBXzEiOjPjOjFjcfjzRiTiWiHiGjPjOjUiTjVjCjTjFjUjUjJj OjHjdfnfAXzHjTjWjHiGjPjOjUjefViafInOjIbyjJn0ABJjJnABXzgbjJjOjDjMjVjEjFiWjBjSjJj BjCjMjFjTiBjOjEiEjBjUjBjTjFjUjTjffVjRfBnctfACzBhekAXgafXzJjWjBjSjJjBjCjMjFjTkBf VhJfGnndAnJjLnASzKjDjTjTiQjSjPjQiMjPjDkCEXzWiQiSiFiTiFiOiUiBiUiJiPiOiBiUiUiSiJi CiViUiFiTkDfjzWiTiWiHiDiTiTiQjSjPjQjFjSjUjZiMjPjDjBjUjJjPjOkEfnftOjMJjMnASkCEXz NiTiUiZiMiFiFiMiFiNiFiOiUiTkFfjkEfnffACiTXzNjTjWjHiDjTjTiQjSjPjQiMjPjDkGfViafIn ndBOjNJjNnASkCEXzPiTiUiZiMiFiBiUiUiSiJiCiViUiFiTkHfjkEfnffACiTXkGfViafInndCnJjO nABXzNjDjTjTiQjSjPjQjFjSjUjJjFjTkIfVjRfBVkCfEnfJjPnABXzQjEjPjDjVjNjFjOjUiFjOjDj PjEjJjOjHkJfVjRfBXzEiViUiGhYkKfjzTiTiWiHiEjPjDjVjNjFjOjUiFjOjDjPjEjJjOjHkLfnfAC iTVjDfCnneDjTjWjHOjRbjSn0ADJjSnASjODXzFiQiOiHhShUkMfjjQfnffJjTnASjRBEjzSiFjYjQj PjSjUiPjQjUjJjPjOjTiQiOiHhShUkNfntnffJjUnABXzQjBjSjUiCjPjBjSjEiDjMjJjQjQjJjOjHk OfVjRfBnctfACiTVjDfCnneDjQjOjHOjWbjXn0AEJjXnASjODXzEiKiQiFiHkPfjjQfnffJjYnASjRB EjzRiFjYjQjPjSjUiPjQjUjJjPjOjTiKiQiFiHkQfntnffJjZnABXzOjRjVjBjMjJjUjZiTjFjUjUjJ jOjHkRfVjRfBXzKjKjQjHiRjVjBjMjJjUjZkSfViafInfJjanABXkOfVjRfBnctfACiTVjDfCnneDjK jQjHbyjdn0ABZjdnAnJkAnASzIjGjJjMjFiTjQjFjDkTFEjRfRBVjMfAftnftJkCnAEXzKjFjYjQjPj SjUiGjJjMjFkUfVhJfGRDVkTfFVjOfDVjRfBffAJjA4B0AhAkT4F0AiAia4C0AhAjD4C0AiAjR4B0Ai AjM40BiAjO4D0AiAkC4E0AiAhJ40BhADGAifAkDDJkGnASXAWzGiPjCjKjFjDjUkVAnftJkHnABXjLf VXfAjjLfnfZkInAVXf0ABX40BiAABAWCkKnfnftJAnASzNiEjBjUjBiFjYjUjSjBjDjUjPjSkWyBENy BnAMAbyBnAFMDbyBn0ACOEbyFn0ABJFnASzFjQjPjJjOjUkXAEXzRjDjPjOjWjFjSjUiDjPjPjSjEjJ jOjBjUjFkYfXzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUkZfjiNfRDVkXfAXzYiEiPiDiViNiFiOiUiDiP iPiSiEiJiOiBiUiFiTiZiTiUiFiNkafjzQiDjPjPjSjEjJjOjBjUjFiTjZjTjUjFjNkbfXzYiBiSiUi CiPiBiSiEiDiPiPiSiEiJiOiBiUiFiTiZiTiUiFiNkcfjkbfffnffACzDhdhdhdkdXzQjDjPjPjSjEj JjOjBjUjFiTjZjTjUjFjNkefjiNfXkafjkbfnnnZHnAVkXf0ABkX40BhAB0AzKjDjPjOjWjFjSjUiQj PjTkfAIMMbyBn0AHJQnASzCjWjClAAXiYfVjEfEnftJTnASzCjQhRlBBEjkffRBARCXiXfVlAfAXzBh RlCfVlAfAfffnftJUnASzCjQhSlDCEjkffRBARCXiZfVlAfAXzBhTlEfVlAfAfffnftJWnASzGjDjPj PjSjEjTlFDWkVEzBjYlGEXzHjUjPiGjJjYjFjElHfXiXfVlBfBRBFdCffzBjZlIEXlHfCzBhKlJXlCf VlBfBnndyBRBFdCffzBjSlKEXlHfXiXfVlDfCRBFdCffzBjClLEXlHfClJXlCfVlDfCnndyBRBFdCff nftJgcnABXzFjXjJjEjUjIlMfVlFfDEXlHfXlMfVjEfERBFdCffnfJgdnABXzGjIjFjJjHjIjUlNfVl FfDEXlHfXlNfVjEfERBFdCffnfZgfnAVlFfDAFjE40BhAlA40BiAlB4B0AiAlD4C0AiAlF4D0AiABEA zNjHjFjUiJjUjFjNiDjPjPjSjEjTlOAhAMhDbyBn0AJJhFnASlFAEjlOfRBXiXfVzFjJjUjFjNjTlPf IffnftJhHnASzHjHjDjPjPjSjEjTlQBVlFfAnftJhJnASzIjNjBjYiSjJjHjIjUlRCVzFjSjJjHjIjU lSfGnftJhKnASzJjNjBjYiCjPjUjUjPjNlTDVzGjCjPjUjUjPjNlUfHnftJhMnASzFjDjPjVjOjUlVE XgafVlPfInftahObhQn0AHJhQnASlFAEjlOfRBQWfVlPfIVgcfFffnffJhSnASlSGCGXlGfVlFfAXlM fVlFfAnnnftJhTnASlUHCGXlIfVlFfAXlNfVlFfAnnnftOhVJhVnABXlGfVlQfBXlGfVlFfAnfACgeE jzKjQjBjSjTjFiGjMjPjBjUlWfRBXlGfVlFfAffEjlWfRBXlGfVlQfBffnnnOhWJhWnABXlIfVlQfBX lIfVlFfAnfACgeEjlWfRBXlIfVlFfAffEjlWfRBXlIfVlQfBffnnnOhYJhYnABXlKfVlQfBXlKfVlFf AnfACkAEjlWfRBXlKfVlFfAffEjlWfRBXlKfVlQfBffnnnOhZJhZnABXlLfVlQfBXlLfVlFfAnfACkA EjlWfRBXlLfVlFfAffEjlWfRBXlLfVlQfBffnnnAVgcfFBVlVfEByBgeJhdnABXlMfVlQfBEXlHfCzB hNlXXlKfVlQfBXlGfVlQfBnnRBFdCffnfJhenABXlNfVlQfBEXlHfClXXlLfVlQfBXlIfVlQfBnnRBF dCffnfZiBnAVlQfBAJgc4F0AiAlS4G0AiAlV4E0AiAlU4H0AiAlP40BhAlF40BiAlQ4B0AiAlR4C0Ai AlT4D0AiABIAzOjHjFjUiJjUjFjNjTiDjPjPjSjEjTlYAiDMiGbyBn0AGJiInASgcAEXzWjHjFjUiBj DjUjJjWjFiBjSjUjCjPjBjSjEiJjOjEjFjYlZfXiefVhJfQnfnftJiJnASzEjBjSjUjClaBQWfXiefV hJfQVgcfAnftJiLnASzEjEjBjUjBlbCWkVEhGXhGfVhJfQlMEXzEjDjFjJjMlcfjzEiNjBjUjIldfRB ClXXiZfXidfVlafBXiXfXidfVlafBnnfflNEXlcfjldfRBClXXlCfXidfVlafBXlEfXidfVlafBnnff hIAnnftJiSnASlVDXgafXhIfVhJfQnftaiUbiWn0ANJiWnAShKEQWfXhIfVhJfQVgcfAnftOiYDiYnA WfAUiRVzMjJjHjOjPjSjFiIjJjEjEjFjOlefSCiTXhLfVhKfEnncfnnnJianASzGjQjBjSjBjNjTlfF EVzOjHjFjUiMjBjZjFjSiQjBjSjBjNjTmAfRRBXhGfVhKfEffnftOicDicnAWfACiTVlffFnnbnOidD idnAWfACiTXgafXiWfVhKfEnndAnJifnASzBjEmBGEjlYfRBXiWfVhKfEffnftJjAnABXzJjMjBjZjF jSjOjBjNjFmCfVmBfGXhGfVhKfEnfJjBnABXhGfVmBfGXhGfVlffFnfOjDbjEn0ACJjEnABXzEjUjZj QjFmDfVmBfGXjDfVlffFnfJjFnABXhWfVmBfGCGCGXhGfVlffFnneBhOXjDfVlffFnnnfAXjDfVlffF byjHn0ABJjHnABXmDfVmBfGneDjEjJjWfJjKnABXhLfVmBfGXhLfVhKfEnfJjNnABXlPfVmBfGAnnfa jObjQn0ADJjQnASjEIQWfXiWfVhKfEViQfHnftOjSDjSnAWfAUiRVlefSXjFfVjEfInnnOjVbjXn0AK JjXnASzKjJjUjFjNiQjBjSjBjNjTmEJEVmAfRRBXhGfVjEfIffnftJjZnASzCjJjUmFKEjlOfRBVjEf IffnftJjanABXlGfVmFfKClXnXlGfVmBfGnnntJjbnABXlIfVmFfKClXnXlIfVmBfGnnntJjcnABXmC fVmFfKXhGfVjEfInfJjdnABXhGfVmFfKXhGfVmEfJnfJjenABXmDfVmFfKXjDfVmEfJnfJjfnABXhWf VmFfKCGCGXhGfVmEfJnneBhOXjDfVmEfJnnnfJkAnABXhLfVmFfKhOXjFfVjEfInfJkBnAEXzEjQjVj TjImGfXlPfVmBfGRBVmFfKffACkAEXzHjJjOjEjFjYiPjGmHfXhGfVjEfIRBFeBhOffnndAbykJn0AB OkJbkKn0ADOkLJkLnASzDjDjPjMmILXzFjDjPjMjPjSmJfXzEjTjQjPjUmKfXzJjGjJjMjMiDjPjMjP jSmLfVjEfInffACiTXzIjUjZjQjFjOjBjNjFmMfXmLfVjEfInneJiTjQjPjUiDjPjMjPjSJkMnASmIL XmLfVjEfInffJkNnABXzIjCjHjEiDjPjMjPjSmNfVmBfGEjzIjDjPjMiUjPjIjFjYmOfRBVmIfLffnf OkOJkOnABXzHjPjQjBjDjJjUjZmPfVmBfGCzBhPmQXmPfVjEfInndjEnfACgeXmPfVjEfInndjEnACi TXhGfVjEfInneEhDjCjHjEOkSbkTn0ATJkTnASmFKEjlOfRBVjEfIffnftJkUnABXmDfVmFfKneDjUj YjUfJkVnABXhGfVmFfKXiXfEXzFjTjQjMjJjUmRfXhGfVjEfIRBFeBhdffnfJkWnABXlGfVmFfKClXn XlGfVmBfGnnntJkXnABXlIfVmFfKClXnXlIfVmBfGnnntJkYnASzCjUjGmSMVjEfInftJkZnASzCjUj SmTNXzJjUjFjYjUiSjBjOjHjFmUfVmSfMnftJkanASzCjDjBmVOXzTjDjIjBjSjBjDjUjFjSiBjUjUj SjJjCjVjUjFjTmWfVmTfNnftJkbnABXzIjGjPjOjUiTjJjajFmXfVmFfKXzEjTjJjajFmYfVmVfOnfO keJkenASmILXmJfXmKfXmLfVmVfOnffACiTXmMfXmLfVmVfOnneJiTjQjPjUiDjPjMjPjSJkfnASmIL XmLfVmVfOnffJlBnABXzJjGjPjOjUiDjPjMjPjSmZfVmFfKEjmOfRBVmIfLffnfJlCnABXzKjGjPjOj UiGjBjNjJjMjZmafVmFfKXzGjGjBjNjJjMjZmbfXzIjUjFjYjUiGjPjOjUmcfVmVfOnfJlDnABXzJjG jPjOjUiTjUjZjMjFmdfVmFfKXzFjTjUjZjMjFmefXmcfVmVfOnfJlEnASzFjBjMjJjHjOmfPneEjMjF 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 --------------------------------------------------------------------------------