fql-workbench
Version:
A FQL Workbench tool
133 lines (105 loc) • 3.63 kB
JavaScript
var request = require('request')
, jsdom = require("jsdom")
, permissions = require('./_permissions')
, tableEndpoint = 'http://developers.facebook.com/docs/reference/fql/'
, tableToJson
var _import = {};
// Borrowed - http://johndyer.name/html-table-to-json
tableToJson = function(table) {
var data = [], headers = [], tableRow, rowData, i, j
if (! (table && table.rows)) {
return false;
}
for (i = 0; i < table.rows[0].cells.length; i++) {
headers[i] = table.rows[0].cells[i].textContent.trim().toLowerCase().replace(/ /gi,'');
}
for (i = 1; i < table.rows.length; i++) {
tableRow = table.rows[i];
rowData = {};
for (j = 0; j < tableRow.cells.length; j++) {
rowData[ headers[j] ] = tableRow.cells[j].textContent.trim();
}
data.push(rowData);
}
return data;
}
_import.getTableDefinition = function(table) {
var cb = function(){}, url = tableEndpoint + table
//console.log(["Fetching table definition for".green, table.green, url.cyan].join(' '));
request({
url : url + '/',
followAllRedirects : true,
headers : {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.2 Safari/537.17'
}}, function(error, response, data){
jsdom.env(data, ["http://code.jquery.com/jquery.js"], function(errors, window) {
if (! (window.jQuery || window.$)) {
cb(false);
}
var $ = window.jQuery
, perms = []
, fields = tableToJson($('#bodyText table').get(0))
if (! fields) {
if (_import.debug === true) {
console.log("Couldn't read fields for ".red + table.green + "!".red)
}
cb(false);
}
// ETL
$('#bodyText p')
.filter(function(){ return this.textContent && this.textContent.match(/to\sread\sthe\s[a-z]+\stable/i) ? true : false })
.next('ul')
.children().filter(function(i, el){
var perm, type
if ((perm = $(el).find('code').html()).length) {
for (type in permissions) {
if (!!~ permissions[type].indexOf(perm.trim())) {
if (!~ perms.indexOf(perms) && perms.push(perm)) {
return true;
}
}
}
}
return false;
});
cb(fields, perms, table);
});
});
return {
done : function(callback) {
if (typeof callback === 'function') {
cb = callback;
}
}
}
};
_import.getTables = function() {
var cb = function(){}, url = 'http://developers.facebook.com/docs/reference/fql/'
//console.log(["Fetching tables from".green, url.cyan].join(' '));
request({
url : url + '/',
followAllRedirects : true,
headers : {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.2 Safari/537.17'
}},
function(error, response, data) {
jsdom.env(data, ["http://code.jquery.com/jquery.js"], function(errors, window) {
var $ = window.jQuery
, tables = []
$('#navsubsectionpages li:first-child').children('ul').children().each(function(){
if (this.textContent) {
tables.push(this.textContent);
}
});
cb({tables : tables});
});
});
return {
done : function(callback) {
if (typeof callback === 'function') {
cb = callback;
}
}
}
};
module.exports = _import;