diff --git a/Gruntfile.js b/Gruntfile.js index 56a6838..d15d126 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,7 +6,7 @@ module.exports = function(grunt) { saver: { cmd: 'casperjs', args: [ - 'src/proboard_saver.coffee', + 'src/proboard_saver.js', '--board-nr=YOUR-BOARD-NR', '--board-name=YOUR-BOARD-NAME', '--user=YOUR-USERNAME', diff --git a/src/proboard_saver.js b/src/proboard_saver.js new file mode 100644 index 0000000..493bdfa --- /dev/null +++ b/src/proboard_saver.js @@ -0,0 +1,451 @@ +// Generated by CoffeeScript 1.12.2 +(function() { + var casper, findBoards, findPages, findPosts, findThreads, findUserLinks, fs, getUser, loadImages, missingArgumentError, password, proboard, proboardName, proboardNr, proboardUrl, proboardUserUrl, readBoard, replaceHtml, user, utils; + + casper = require('casper').create({ + verbose: false, + logLevel: 'info', + pageSettings: { + webSecurityEnabled: false + } + }); + + utils = require('utils'); + + fs = require('fs'); + + casper.on('error', function(msg, trace) { + return this.echo("Error: " + msg, "ERROR"); + }); + + casper.on('page.error', function(msg, trace) { + return this.echo("Error: " + msg, "ERROR"); + }); + + casper.on('remote.message', function(msg, trace) { + if (!/Unsafe JavaScript attempt/.test(msg)) { + return this.echo("remote log: " + msg, "INFO"); + } + }); + + loadImages = function(searchString) { + var detailImage, image, imageName, imageParts, images, j, len, re; + images = searchString.match(/\[img\](.*?)\[\/img\]/g); + if (images) { + for (j = 0, len = images.length; j < len; j++) { + image = images[j]; + detailImage = image.match(/\[img\](.*?)\[\/img\]/)[1]; + imageParts = detailImage.split('/'); + imageName = imageParts[imageParts.length - 1]; + console.log("\t\tdownloading image '" + imageName + "'..."); + casper.download(detailImage, "data/images/" + imageName); + re = new RegExp("\\[img\\]" + detailImage + "\\[/img\\]", "i"); + searchString = searchString.replace(re, "[img]{{baseurl}}/images/" + imageName + "[/img]"); + } + } + return searchString; + }; + + replaceHtml = function(element) { + var attachmentIndex, bold, boldElements, colour, colourElements, cursive, cursiveElements, dummyContent, dummyElements, dummySpan, finalText, image, images, j, k, l, len, len1, len2, len3, len4, len5, len6, len7, link, linkElements, m, message, n, o, p, q, quote, quoteAvatar, quoteClear, quoteHeader, quoteHeaderNode, registeredUserNode, underlined, underlinedElements, user, video, videos; + images = Array.prototype.map.call(element.querySelectorAll('img'), function(img) { + return { + src: img.src, + alt: img.hasAttribute('alt') ? img.alt : '' + }; + }); + for (j = 0, len = images.length; j < len; j++) { + image = images[j]; + element.innerHTML = element.innerHTML.replace(/]*>/, "[img" + (image.alt ? '=' + image.alt : '') + "]" + image.src + "[/img]"); + } + videos = Array.prototype.map.call(element.querySelectorAll("iframe[title='YouTube video player']"), function(video) { + return video.src.split('/')[4].split('?')[0]; + }); + for (k = 0, len1 = videos.length; k < len1; k++) { + video = videos[k]; + element.innerHTML = element.innerHTML.replace(/