updated with redo

This commit is contained in:
Martin Donnelly 2016-03-04 16:33:48 +00:00
parent a204d37d37
commit 4d46f8d6f9
7 changed files with 245 additions and 29 deletions

View File

@ -165,6 +165,7 @@ buttons {
padding-bottom: 5px;
border-bottom:1px solid #e0c0e0;
padding-right: 16px;
cursor:pointer;
}
#sidedrawer .entry:after {

View File

@ -13,10 +13,12 @@
<link href="css/read.css" rel="stylesheet" type="text/css" />
<link href="css/gist.css" rel="stylesheet" type="text/css" />
<!-- endinject -->
<script src="libs/microevent.js"></script>
<script src="//cdn.muicss.com/mui-0.4.6/js/mui.min.js"></script>
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="libs/ejs.js"></script>
<script src="libs/view.js"></script>
<link rel="apple-touch-icon" sizes="57x57" href="fav/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="fav/apple-touch-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="fav/apple-touch-icon-72x72.png">

View File

@ -15,7 +15,10 @@ $.fn.pressEnter = function (fn) {
});
};
(function () {
var Keeper = (function () {
var self = this;
console.log('GO!');
var $list = $('#listContainer');
var displayList = function (obj) {
@ -28,12 +31,37 @@ $.fn.pressEnter = function (fn) {
getRecipe(this.id);
});
}, displayPage = function (obj) {
var $bodyContents = $('#bodyContents');
var $bodyContents = $('#bodyContents');
if (obj.reduced.length > 0) {
$bodyContents.empty();
$bodyContents.append(obj.reduced);
if (obj.reduced.length > 0) {
var vdata = {
data: {
_id: obj._id,
_rev: obj._rev,
title: obj.title,
reduced: obj.reduced,
url:obj.url
}
};
var redoData = {
_id: obj._id,
_rev: obj._rev,
url: obj.url
};
var html = new EJS({url: 'partials/view.ejs'}).render(vdata);
$bodyContents.empty();
$bodyContents.append(html);
$('#redo').on('click', function () {
self.trigger('redo', redoData);
});
}
}, getRecipe = function (id) {
console.log('get recipe');
var url = '/entry/' + id;
@ -124,10 +152,40 @@ $.fn.pressEnter = function (fn) {
}
});
},
start = function () {
redo = function (d) {
console.log('redooing');
var url = '/redo';
getList();
};
$.ajax({
type: 'POST',
url: url,
data: d,
dataType: 'json',
timeout: 10000,
//contentType: ('application/json'),
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'PUT, GET, POST, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type'
},
success: function () {
// console.log(data);
// displayList(data);
},
error: function (xhr, type) {
console.log('ajax error');
console.log(xhr);
console.log(type);
}
});
},
start = function () {
getList();
};
$('#newurl').pressEnter(function () {
var url = $(this).val();
@ -146,5 +204,14 @@ $.fn.pressEnter = function (fn) {
getList();
});
this.bind('redo', function (data) {
redo(data);
});
start();
})();
});
MicroEvent.mixin(Keeper);
var keeper = new Keeper();

55
app/libs/microevent.js Normal file
View File

@ -0,0 +1,55 @@
/**
* MicroEvent - to make any js object an event emitter (server or browser)
*
* - pure javascript - server compatible, browser compatible
* - dont rely on the browser doms
* - super simple - you get it immediatly, no mistery, no magic involved
*
* - create a MicroEventDebug with goodies to debug
* - make it safer to use
*/
var MicroEvent = function(){};
MicroEvent.prototype = {
bind : function(event, fct){
this._events = this._events || {};
this._events[event] = this._events[event] || [];
this._events[event].push(fct);
},
unbind : function(event, fct){
this._events = this._events || {};
if( event in this._events === false ) return;
this._events[event].splice(this._events[event].indexOf(fct), 1);
},
trigger : function(event /* , args... */){
this._events = this._events || {};
if( event in this._events === false ) return;
for(var i = 0; i < this._events[event].length; i++){
this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
}
}
};
/**
* mixin will delegate all MicroEvent.js function in the destination object
*
* - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent
*
* @param {Object} the object which will support MicroEvent
*/
MicroEvent.mixin = function(destObject){
var props = ['bind', 'unbind', 'trigger'];
for(var i = 0; i < props.length; i ++){
if( typeof destObject === 'function' ){
destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
}else{
destObject[props[i]] = MicroEvent.prototype[props[i]];
}
}
return destObject;
}
// export in common js
if( typeof module !== "undefined" && ('exports' in module)){
module.exports = MicroEvent;
}

19
app/partials/view.ejs Normal file
View File

@ -0,0 +1,19 @@
<div class="mui-container">
<div class="mui-panel">
<div class="mui-text-headline"><%=data.title%></div>
<div style="float:right">
<span id="redo" class="mui--text-accent mui--text-button" style="cursor:pointer;">Redo</span>
<span class="mui--divider-left"><%=link_to('Link',data.url) %></span>
</div>
</div>
</div>
<div class="mui-container">
<div class="mui-panel">
<%=data.reduced%>
</div>
</div>
<h3><%=data._id%></h3>
<h3><%=data._rev%></h3>

View File

@ -18,7 +18,8 @@
"nano": "^6.2.0",
"require-dir": "^0.3.0",
"serve-favicon": "^2.3.0",
"string": "^3.3.1"
"string": "^3.3.1",
"url": "^0.11.0"
},
"devDependencies": {
"del": "^2.2.0",

View File

@ -8,6 +8,7 @@ var jsonfile = require('jsonfile'), fs = require('fs'), STRING = require('string
var zlib = require("zlib");
var log4js = require('log4js');
var logger = log4js.getLogger();
var URL = require('url');
var router = express.Router();
@ -49,14 +50,39 @@ function insertBookmark(obj) {
logger.debug('Insert done..');
}
function updateBookmark(obj,_id, _rev) {
logger.debug('Updating couch...');
var _obj = obj;
_obj._id = _id;
_obj._rev = _rev;
logger.info(util.inspect(_obj));
dbCouch.insert(_obj, function(err, body,header) {
if (err) {
logger.error('Error updating into couch');
return;
}
});
logger.debug('Update done..');
}
var doInsertBookmark = (obj) =>{
// logger.info('sendSocket: ' + JSON.stringify(obj));
insertBookmark(obj);
};
var doGetBookmark = (url) =>{
var doUpdateBookmark = (obj, _id, _rev) =>{
// logger.info('sendSocket: ' + JSON.stringify(obj));
updateBookmark(obj,_id, _rev);
};
var doGetBookmark = (obj) =>{
// logger.info('sendSocket: ' + JSON.stringify(obj));
genericGrab(url);
genericGrab(obj);
};
var doGetBookmarkRedo = (obj) =>{
// logger.info('sendSocket: ' + JSON.stringify(obj));
genericGrab(obj);
};
var doGetBookmarkRes = (url,res) =>{
@ -67,25 +93,28 @@ var doGetBookmarkRes = (url,res) =>{
// Events
busEmitter.on('saveBookmarkData', doInsertBookmark);
busEmitter.on('updateBookmarkData', doUpdateBookmark);
busEmitter.on('getBookmark', doGetBookmark);
busEmitter.on('getBookmarkRes', doGetBookmarkRes);
function processBody(body, url) {
busEmitter.on('getBookmarkRedo', doGetBookmarkRedo);
function processBody(body, url, _id, _rev) {
var obj, tdihbody, i, urlObj, urlPrefix;
var $ = cheerio.load(body);
var title = $('TITLE').text();
// try to find a body to grab
var i = 0;
i = 0;
while (($(generics[i]).length == 0) && (i < generics.length)) {
i++;
}
logger.debug(i);
var tdihbody;
var obj = {};
obj = {};
if (i < generics.length) {
tdihbody = $(generics[i]);
logger.debug(tdihbody.length);
@ -100,34 +129,53 @@ function processBody(body, url) {
logger.debug(title);
}
try
{
tdihbody.find('IMG').each(function(i, elem) {
//fruits[i] = $(this).text();
var s = 'http://image.silvrtree.co.uk/900,fit/' + $(this).attr("src");
urlObj = URL.parse(url);
urlPrefix = urlObj.protocol + '//' + urlObj.host + '/';
try {
tdihbody.find('IMG').each(function (i, elem) {
let s, src = $(this).attr("src");
if (!STRING(src).startsWith('http')) {
src = urlPrefix + STRING(src).stripLeft('/').s;
}
s = 'http://image.silvrtree.co.uk/900,fit/' + src;
$(this).attr("src", s);
});
}
catch(e)
{
catch (e) {
logger.error(e);
}
obj.url = url;
obj.html = $.html();
obj.reduced = STRING(tdihbody.html()).trim().s;
obj.title = STRING(title).collapseWhitespace().s;
busEmitter.emit("saveBookmarkData", obj);
if (_id !== null )
{
busEmitter.emit("updateBookmarkData", obj, _id, _rev);
}
else
{
busEmitter.emit("saveBookmarkData", obj);
}
return obj;
}
function genericGrab(url,res) {
function genericGrab(obj,res) {
var url = obj.url;
var _id = obj._id || null;
var _ver = obj._rev || null;
logger.info(url);
logger.info(_id);
logger.info(_ver);
request(url, function (err, resp, body) {
if (err)
throw err;
@ -155,7 +203,7 @@ function genericGrab(url,res) {
}
else
{
var b = processBody(body,url);
var b = processBody(body,url, _id, _ver);
if (res != null)
{
res.render('grabbed');
@ -164,7 +212,7 @@ function genericGrab(url,res) {
} else
{
var b = processBody(body,url);
var b = processBody(body,url, _id, _ver);
if (res != null)
{
res.render('grabbed',{data:b});
@ -206,8 +254,11 @@ router.get('/entry/:id', function (req, res) {
if (!err) {
var outJSON = {};
outJSON._id = body._id;
outJSON._rev = body._rev;
outJSON.title = body.title;
outJSON.reduced = body.reduced;
outJSON.url = body.url;
//logger.debug(util.inspect(body));
res.writeHead(200, {"ContentType": "application/json"});
res.end(JSON.stringify(outJSON));
@ -228,7 +279,7 @@ router.post('/add', function (req, res) {
if (t.hasOwnProperty('url')) {
var url = JSON.parse(t.url.toString());
logger.debug(url);
busEmitter.emit("getBookmark", url);
busEmitter.emit("getBookmark", t);
}
else {
logger.error('No data block!');
@ -238,6 +289,26 @@ router.post('/add', function (req, res) {
});
router.post('/redo', function (req, res) {
logger.debug('redoing entry..');
var t = req.body;
console.log(t);
if (t.hasOwnProperty('url')) {
var url = t.url.toString();
logger.debug(url);
busEmitter.emit("getBookmark", t);
}
else {
logger.error('No data block!');
}
res.writeHead(200, {"ContentType": "application/json"});
res.end(JSON.stringify({adding: url}));
});
router.get('/new', function (req, res) {
logger.debug('Save new');
busEmitter.emit("getBookmarkRes", req.query.url ,res);