ep_codepad
Version:
Turn etherpad into a realtime collaborative development environment
196 lines (159 loc) • 7.99 kB
JavaScript
// search in all files - and offer a replace
var eejs = require('ep_etherpad-lite/node/eejs');
var padManager = require('ep_etherpad-lite/node/db/PadManager');
var padMessageHandler = require("ep_etherpad-lite/node/handler/PadMessageHandler");
var exec = require("child_process").exec;
var settings = require('ep_etherpad-lite/node/utils/Settings');
// abs - absolute part of the files path - the project path
var abs = '/tmp/';
// theme from settings
var theme = 'Default';
var cif = '';
if (settings.ep_codepad) {
if (settings.ep_codepad.project_path) {
abs = settings.ep_codepad.project_path;
}
if (settings.ep_codepad.theme) {
theme = settings.ep_codepad.theme;
}
if (settings.ep_codepad.installation_folder) {
cif = settings.ep_codepad.installation_folder;
}
}
function zeroPad(num, places) {
var zero = places - num.toString().length + 1;
return Array(+(zero > 0 && zero)).join(" ") + '#' + num;
}
exports.expressCreateSearchServer = function(hook_name, args, cb) {
args.app.get('/sr', function(req, res) {
var search_term = req.query.search;
//check params
if (search_term === '' || typeof search_term === 'undefined') {
res.send("Error. No search term.");
return;
}
var offer_term = '';
var hasOffer = false;
if (req.query.offer !== '' && typeof req.query.offer !== 'undefined') {
hasOffer = true;
offer_term = req.query.offer;
}
var doReplace = false;
var replace_file = '';
var replace_term = '';
if (req.query.replace !== '' && typeof req.query.replace !== 'undefined' && req.query.file !== '' && typeof req.query.file !== 'undefined') {
replace_file = req.query.file;
replace_term = req.query.replace;
offer_term = req.query.replace;
doReplace = true;
hasOffer = true;
}
// do some things in the pads
if (doReplace)
padManager.getPad(replace_file, null, function(err, value) {
if (err) {
//console.log('sr-err: ', err);
}
var text = value.atext.text;
var rex = new RegExp(search_term, 'g');
var matches = text.match(rex);
//console.log("[REPLACE IN PAD]: " + text);
value.setText(text.replace(rex, replace_term));
padMessageHandler.updatePadClients(value, cb);
var msg = {
type: 'COLLABROOM',
data: {
type: "CUSTOM",
payload: {
padId: replace_file,
from: "codepad",
errors: "Replaced " + search_term + " to " + replace_term
}
}
};
padMessageHandler.handleCustomObjectMessage(msg, undefined, cb);
});
var execterm = '';
// replace in files
if (doReplace) execterm = "sed -i 's/" + search_term + "/" + replace_term + "/g' " + abs + "/" + replace_file + " && ";
execterm += "cd " + abs + " && find . | grep -irnF '" + search_term + "' *";
console.log("CODEPAD SEARCH " + execterm);
exec(execterm, function(err, data, stderr) {
//exec(' grep -rnw ' + abs + ' -e "' + search_term + '"', function(err, data, stderr) {
if (err) {
console.log('CODEPAD SEARCH sr-err: ', err);
}
//Print stdout/stderr to console
//console.log(stdout);
//console.log(stderr);
//res.write(stdout);
//res.end();
// we assemble the html here and send it directly.
var res_send = ''; //'
res_send += '<!DOCTYPE html><head><title>log</title>';
res_send += '<script src="' + cif + '/static/plugins/ep_codepad/static/js/cookies.js" type="text/javascript"></script>';
res_send += '<link href="' + cif + '/static/plugins/ep_codepad/static/css/logcolors.css" rel="stylesheet" type="text/css" media="screen" />';
res_send += '<script type="text/javascript">';
res_send += 'window.onload=toBottom;';
res_send += 'function toBottom(){window.scrollTo(0, document.body.scrollHeight);}';
res_send += 'var theme = "' + theme + '";';
res_send += 'if (getCookie("codepad_theme") != "") theme = getCookie("codepad_theme");';
res_send += 'document.write(\'<link rel="stylesheet" type="text/css" href="' + cif + '/static/plugins/ep_codepad/static/css/theme/\'+theme+\'.css">\');';
res_send += '</script></head><body>';
var lines = data.split('\n');
if (lines.length === '0') res_send += "<b>" + search_term + " not found.</b>";
var i_s = 0;
if (lines.length > 350) {
i_s = lines.length - 250;
res_send += lines.length + " matches. Truncated ...<br />";
}
// current folder+file
var c = '';
var link = '';
for (var i = i_s; i < lines.length; i++) {
// current line
var l = lines[i];
if (l.length < 2) continue;
// index of folder+file|#+text seperation
var v = l.indexOf(':');
// index of line-counter
var w = l.substring(v + 1).indexOf(':');
// index of folder|filename seperaion
var g = l.substring(0, v).lastIndexOf('/');
// skip binary files (where line number is NaN)
if (isNaN(parseInt(l.substring(v + 1, v + w + 2)))) continue;
// actual folder+file
var ff = l.substring(0, v);
// actual linenumber
var no = parseInt(l.substring(v + 1, v + w + 2));
// line indicator
link = cif + '/p/' + ff + '?line=' + no;
var tt = '<b><a href="' + link + '" onclick="JavaScript:top.document.getElementById(\'fileView\').src=\'' + link + '\'" style="text-decoration: none">' + zeroPad(no, 5) + '</a> </b>';
//current text
var re = new RegExp(search_term, 'g');
var sw = '<b><span class="term">' + search_term + '</span></b>';
var t = l.substring(v + w + 2, 250).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(re, sw);
if (c !== ff) {
link = cif + '/v/' + ff;
res_send += '<br /><a href="' + link + '" onclick="JavaScript:top.document.getElementById(\'fileView\').src=\'' + link + '\'">' + ff.substring(0, g) + '<b>' + ff.substring(g) + '</b></a> - ' + sw;
// offer_term the replace action
if (hasOffer) res_send += ' - <a href="' + cif + '/sr?&search=' + search_term + '&replace=' + offer_term + '&file=' + ff + '">REPLACE ALL TO:</a> <span class="term">' + offer_term + '</span>';
res_send += '<br /><br />' + tt + t + '<br />';
c = ff;
} else {
res_send += tt + t + '<br />';
}
}
res_send += "<br /><br /> " + lines.length + " matches.";
if (lines.length > 350) {
res_send += " Truncated.";
}
// ITT TARTUNK EZ A JÓ ... erre kell cserélni a sima herefeket
//res_send += '<a href="/p/test.html" onclick="JavaScript:top.document.getElementById(\'fileView\').src=\'/p/test.html\'">TEST</a>';
res_send += '</div></body></html>';
res.send(res_send);
//res.end();
});
//res.send("req.query: " + search_term);
});
};