diff --git a/.gitignore b/.gitignore index 7c37802ad3..ae9e23ecc0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ /build/proj4js /examples/*.json /examples/*.combined.js +/examples/*.html.png /examples/example-list.js /examples/example-list.xml /test/requireall.js diff --git a/bin/example-screenshot.js b/bin/example-screenshot.js new file mode 100644 index 0000000000..29dc24dd3f --- /dev/null +++ b/bin/example-screenshot.js @@ -0,0 +1,171 @@ +/** + * This script is supposed to be executed via phantomjs. It will generate + * screenshots of the html files in the directory specified by a commandline + * option when these files are served through a webserver which can also be + * specified. The screenshots will be in the current working directory. + * + * Example usage: + * + * user@host:~/ol3/bin $ phantomjs example-screenshot.js \ + * http://localhost:8000/ol3/examples/ \ + * ../examples + * + * The above command will generate `*.png` files in `examples/` for all html + * files that are served through `http://localhost:8000/ol3/examples/`. + * + * So if there is a file `my-humpty-example.html` inside of the relative folder + * `../examples/` which is being served through the webserver so that + * `http://localhost:8000/ol3/examples/my-humpty-example.html` is a valid and + * reachable URL, this script will generate a screenshot and store it as + * `my-humpty-example.html.png`. + * + * The query string `?mode=raw` will be appended to the generated URL. + * + * Known limitations: + * + * As phantomjs doesn't support WebGL (see e.g. + * https://github.com/ariya/phantomjs/wiki/Supported-Web-Standards and + * http://code.google.com/p/phantomjs/issues/detail?id=273) This won't render + * OpenLayers maps rendered through the webglrenderer. + * + * In parts based upon this gist: https://gist.github.com/crazy4groovy/3160121 + */ +(function(){ // global closure + +var // imports + page = require('webpage').create(), + fs = require('fs'), + system = require('system'), + // arguments + baseExamplesUrl = system.args[1]; + exampleDir = system.args[2]; + // various settings + ignoreFiles = [ + 'example-list.html', + 'wms-custom-proj.html', + 'wms-single-image.html', + 'wms-tiled.html', + 'wmts.html' + ], + intervalMillisecs = 25, + renderMillisecs = 2000, + // basic variables + curDir = fs.workingDirectory, + exampleDirList = fs.list(exampleDir), + pageindex = 0, + fileName = '', + htmlFiles = [], + lenHtmlFiles = 0, + loadInProgress = false; + +// simple object with helper functions +var util = { + /** + * Returns the basename of a file given a path. + */ + baseName: function(path) { + var parts = path.split(fs.separator); + return parts[parts.length-1]; + }, + /** + * Super basic test whether a file can be considered a HTML-file. + */ + isHtmlFile: function(filename) { + return (/\.html?$/).test(filename); + }, + /** + * Appends a slash to given string if it isn't there already. + */ + appendSlash: function(str) { + return ((/\/$/).test(str)) ? str : str + "/"; + }, + /** + * generates an URL out of + */ + buildUrl: function(baseurl, path){ + var name = util.baseName(path), + mode = "raw"; + return util.appendSlash(baseurl) + name + "?mode=" + mode; + }, + /** + * Simple progressbar logger that uses our globals. + */ + logProgress: function() { + var doneSymbol = "-", + todoSymbol = " ", + str = "[", + percent = (lenHtmlFiles === 0) ? 0 :(pageindex/lenHtmlFiles*100), + i=0; + for (;i" : todoSymbol; + } + str += "]"; + if (percent < 10) { + str += " "; + } else if (percent < 100) { + str += " "; + } + str += " " + percent.toFixed(1) + " % done"; + if (fileName !== "") { + str += ", " + util.baseName(fileName) + ""; + } + console.log(str); + } +}; + +// iterate over all files in examples directory +// and find the HTML files. +for(var i = 0; i< exampleDirList.length; i++) { + var fullpath = exampleDir + fs.separator + exampleDirList[i]; + if(fs.isFile(fullpath) && util.isHtmlFile(fullpath) && + ignoreFiles.indexOf(util.baseName(fullpath)) === -1 ) { + // TODO: make this more async (i.e. pop on/off stack WHILE rending pages) + htmlFiles.push(fullpath); + } +} +lenHtmlFiles = htmlFiles.length; + +console.log("Capturing " + lenHtmlFiles + " example screenshots."); + +// The main interval function that is executed regularily and renders a page to +// a file +var interval = setInterval(function() { + if (!loadInProgress && pageindex < lenHtmlFiles) { + util.logProgress(); + fileName = htmlFiles[pageindex]; + page.viewportSize = { width: 800, height: 600 }; + page.clipRect = { + top: 0, + left: 0, + width: page.viewportSize.width, + height: page.viewportSize.width + }; + page.open(util.buildUrl(baseExamplesUrl, htmlFiles[pageindex])); + } + if (pageindex == lenHtmlFiles) { + util.logProgress(); + console.log(lenHtmlFiles + " screenshots captured."); + phantom.exit(); + } +}, intervalMillisecs); + +// set loadInProgress flag so we only process one image at time. +page.onLoadStarted = function() { + loadInProgress = true; +}; + +// When the page is loaded, render it to an image +page.onLoadFinished = function() { + var dest = exampleDir + fs.separator + util.baseName(fileName) + ".png"; + window.setTimeout(function(){ + loadInProgress = false; + page.render(dest); // actually render the page. + pageindex++; + }, renderMillisecs); +}; + + +})(); // eof global closure