responsive-screenshot.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * Captures the full height document even if it's not showing on the screen or captures with the provided range of screen sizes.
  3. *
  4. * A basic example for taking a screen shot using phantomjs which is sampled for https://nodejs-dersleri.github.io/
  5. *
  6. * usage : phantomjs responsive-screenshot.js {url} [output format] [doClipping]
  7. *
  8. * examples >
  9. * phantomjs responsive-screenshot.js https://nodejs-dersleri.github.io/
  10. * phantomjs responsive-screenshot.js https://nodejs-dersleri.github.io/ pdf
  11. * phantomjs responsive-screenshot.js https://nodejs-dersleri.github.io/ true
  12. * phantomjs responsive-screenshot.js https://nodejs-dersleri.github.io/ png true
  13. *
  14. * @author Salih sagdilek <salihsagdilek@gmail.com>
  15. */
  16. /**
  17. * http://phantomjs.org/api/system/property/args.html
  18. *
  19. * Queries and returns a list of the command-line arguments.
  20. * The first one is always the script name, which is then followed by the subsequent arguments.
  21. */
  22. var args = require('system').args;
  23. /**
  24. * http://phantomjs.org/api/fs/
  25. *
  26. * file system api
  27. */
  28. var fs = require('fs');
  29. /**
  30. * http://phantomjs.org/api/webpage/
  31. *
  32. * Web page api
  33. */
  34. var page = new WebPage();
  35. /**
  36. * if url address does not exist, exit phantom
  37. */
  38. if ( 1 === args.length ) {
  39. console.log('Url address is required');
  40. phantom.exit();
  41. }
  42. /**
  43. * setup url address (second argument);
  44. */
  45. var urlAddress = args[1].toLowerCase();
  46. /**
  47. * set output extension format
  48. * @type {*}
  49. */
  50. var ext = getFileExtension();
  51. /**
  52. * set if clipping ?
  53. * @type {boolean}
  54. */
  55. var clipping = getClipping();
  56. /**
  57. * setup viewports
  58. */
  59. var viewports = [
  60. {
  61. width : 1200,
  62. height : 800
  63. },
  64. {
  65. width : 1024,
  66. height : 768
  67. },
  68. {
  69. width : 768,
  70. height : 1024
  71. },
  72. {
  73. width : 480,
  74. height : 640
  75. },
  76. {
  77. width : 320,
  78. height : 480
  79. }
  80. ];
  81. page.open(urlAddress, function (status) {
  82. if ( 'success' !== status ) {
  83. console.log('Unable to load the url address!');
  84. } else {
  85. var folder = urlToDir(urlAddress);
  86. var output, key;
  87. function render(n) {
  88. if ( !!n ) {
  89. key = n - 1;
  90. page.viewportSize = viewports[key];
  91. if ( clipping ) {
  92. page.clipRect = viewports[key];
  93. }
  94. output = folder + "/" + getFileName(viewports[key]);
  95. console.log('Saving ' + output);
  96. page.render(output);
  97. render(key);
  98. }
  99. }
  100. render(viewports.length);
  101. }
  102. phantom.exit();
  103. });
  104. /**
  105. * filename generator helper
  106. * @param viewport
  107. * @returns {string}
  108. */
  109. function getFileName(viewport) {
  110. var d = new Date();
  111. var date = [
  112. d.getUTCFullYear(),
  113. d.getUTCMonth() + 1,
  114. d.getUTCDate()
  115. ];
  116. var time = [
  117. d.getHours() <= 9 ? '0' + d.getHours() : d.getHours(),
  118. d.getMinutes() <= 9 ? '0' + d.getMinutes() : d.getMinutes(),
  119. d.getSeconds() <= 9 ? '0' + d.getSeconds() : d.getSeconds(),
  120. d.getMilliseconds()
  121. ];
  122. var resolution = viewport.width + (clipping ? "x" + viewport.height : '');
  123. return date.join('-') + '_' + time.join('-') + "_" + resolution + ext;
  124. }
  125. /**
  126. * output extension format helper
  127. *
  128. * @returns {*}
  129. */
  130. function getFileExtension() {
  131. if ( 'true' != args[2] && !!args[2] ) {
  132. return '.' + args[2];
  133. }
  134. return '.png';
  135. }
  136. /**
  137. * check if clipping
  138. *
  139. * @returns {boolean}
  140. */
  141. function getClipping() {
  142. if ( 'true' == args[3] ) {
  143. return !!args[3];
  144. } else if ( 'true' == args[2] ) {
  145. return !!args[2];
  146. }
  147. return false;
  148. }
  149. /**
  150. * url to directory helper
  151. *
  152. * @param url
  153. * @returns {string}
  154. */
  155. function urlToDir(url) {
  156. var dir = url
  157. .replace(/^(http|https):\/\//, '')
  158. .replace(/\/$/, '');
  159. if ( !fs.makeTree(dir) ) {
  160. console.log('"' + dir + '" is NOT created.');
  161. phantom.exit();
  162. }
  163. return dir;
  164. }