render.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. (function() {
  2. 'use strict';
  3. var page = require('webpage').create();
  4. var args = require('system').args;
  5. var params = {};
  6. var regexp = /^([^=]+)=([^$]+)/;
  7. args.forEach(function(arg) {
  8. var parts = arg.match(regexp);
  9. if (!parts) { return; }
  10. params[parts[1]] = parts[2];
  11. });
  12. var usage = "url=<url> png=<filename> width=<width> height=<height> renderKey=<key>";
  13. if (!params.url || !params.png || !params.renderKey || !params.domain) {
  14. console.log(usage);
  15. phantom.exit();
  16. }
  17. phantom.addCookie({
  18. 'name': 'renderKey',
  19. 'value': params.renderKey,
  20. 'domain': params.domain,
  21. });
  22. page.viewportSize = {
  23. width: params.width || '800',
  24. height: params.height || '400'
  25. };
  26. var tries = 0;
  27. page.open(params.url, function (status) {
  28. // console.log('Loading a web page: ' + params.url + ' status: ' + status);
  29. page.onError = function(msg, trace) {
  30. var msgStack = ['ERROR: ' + msg];
  31. if (trace && trace.length) {
  32. msgStack.push('TRACE:');
  33. trace.forEach(function(t) {
  34. msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
  35. });
  36. }
  37. console.error(msgStack.join('\n'));
  38. };
  39. function checkIsReady() {
  40. var panelsRendered = page.evaluate(function() {
  41. if (!window.angular) { return false; }
  42. var body = window.angular.element(document.body);
  43. if (!body.injector) { return false; }
  44. if (!body.injector()) { return false; }
  45. var rootScope = body.injector().get('$rootScope');
  46. if (!rootScope) {return false;}
  47. var panels = angular.element('div.panel:visible').length;
  48. return rootScope.panelsRendered >= panels;
  49. });
  50. if (panelsRendered || tries === 1000) {
  51. var bb = page.evaluate(function () {
  52. return document.getElementsByClassName("main-view")[0].getBoundingClientRect();
  53. });
  54. page.clipRect = {
  55. top: bb.top,
  56. left: bb.left,
  57. width: bb.width,
  58. height: bb.height
  59. };
  60. page.render(params.png);
  61. phantom.exit();
  62. }
  63. else {
  64. tries++;
  65. setTimeout(checkIsReady, 10);
  66. }
  67. }
  68. setTimeout(checkIsReady, 200);
  69. });
  70. })();