This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
6.3 KiB
229 lines
6.3 KiB
// Generated by CoffeeScript 1.12.7 |
|
|
|
/* |
|
ExternalEditor |
|
Kevin Gravier <kevin@mrkmg.com> |
|
MIT |
|
*/ |
|
|
|
(function() { |
|
var ChatDet, CreateFileError, ExternalEditor, FS, IConvLite, LaunchEditorError, ReadFileError, RemoveFileError, Spawn, SpawnSync, Temp, |
|
bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; |
|
|
|
FS = require('fs'); |
|
|
|
Temp = require('tmp'); |
|
|
|
SpawnSync = require('child_process').spawnSync; |
|
|
|
Spawn = require('child_process').spawn; |
|
|
|
IConvLite = require('iconv-lite'); |
|
|
|
ChatDet = require('chardet'); |
|
|
|
CreateFileError = require('./errors/CreateFileError'); |
|
|
|
ReadFileError = require('./errors/ReadFileError'); |
|
|
|
RemoveFileError = require('./errors/RemoveFileError'); |
|
|
|
LaunchEditorError = require('./errors/LaunchEditorError'); |
|
|
|
ExternalEditor = (function() { |
|
ExternalEditor.edit = function(text) { |
|
var editor; |
|
if (text == null) { |
|
text = ''; |
|
} |
|
editor = new ExternalEditor(text); |
|
editor.run(); |
|
editor.cleanup(); |
|
return editor.text; |
|
}; |
|
|
|
ExternalEditor.editAsync = function(text, callback) { |
|
var editor; |
|
if (text == null) { |
|
text = ''; |
|
} |
|
editor = new ExternalEditor(text); |
|
return editor.runAsync(function(error_run, text) { |
|
var error_cleanup; |
|
if (!error_run) { |
|
try { |
|
editor.cleanup(); |
|
if (typeof callback === 'function') { |
|
return setImmediate(callback, null, text); |
|
} |
|
} catch (error) { |
|
error_cleanup = error; |
|
if (typeof callback === 'function') { |
|
return setImmediate(callback, error_cleanup, null); |
|
} |
|
} |
|
} else { |
|
if (typeof callback === 'function') { |
|
return setImmediate(callback, error_run, null); |
|
} |
|
} |
|
}); |
|
}; |
|
|
|
ExternalEditor.CreateFileError = CreateFileError; |
|
|
|
ExternalEditor.ReadFileError = ReadFileError; |
|
|
|
ExternalEditor.RemoveFileError = RemoveFileError; |
|
|
|
ExternalEditor.LaunchEditorError = LaunchEditorError; |
|
|
|
ExternalEditor.prototype.text = ''; |
|
|
|
ExternalEditor.prototype.temp_file = void 0; |
|
|
|
ExternalEditor.prototype.editor = { |
|
bin: void 0, |
|
args: [] |
|
}; |
|
|
|
ExternalEditor.prototype.last_exit_status = void 0; |
|
|
|
function ExternalEditor(text1) { |
|
this.text = text1 != null ? text1 : ''; |
|
this.launchEditorAsync = bind(this.launchEditorAsync, this); |
|
this.launchEditor = bind(this.launchEditor, this); |
|
this.removeTemporaryFile = bind(this.removeTemporaryFile, this); |
|
this.readTemporaryFile = bind(this.readTemporaryFile, this); |
|
this.createTemporaryFile = bind(this.createTemporaryFile, this); |
|
this.determineEditor = bind(this.determineEditor, this); |
|
this.cleanup = bind(this.cleanup, this); |
|
this.runAsync = bind(this.runAsync, this); |
|
this.run = bind(this.run, this); |
|
this.determineEditor(); |
|
this.createTemporaryFile(); |
|
} |
|
|
|
ExternalEditor.prototype.run = function() { |
|
this.launchEditor(); |
|
return this.readTemporaryFile(); |
|
}; |
|
|
|
ExternalEditor.prototype.runAsync = function(callback) { |
|
var error_launch; |
|
try { |
|
return this.launchEditorAsync((function(_this) { |
|
return function() { |
|
var error_read; |
|
try { |
|
_this.readTemporaryFile(); |
|
if (typeof callback === 'function') { |
|
return setImmediate(callback, null, _this.text); |
|
} |
|
} catch (error) { |
|
error_read = error; |
|
if (typeof callback === 'function') { |
|
return setImmediate(callback, error_read, null); |
|
} |
|
} |
|
}; |
|
})(this)); |
|
} catch (error) { |
|
error_launch = error; |
|
if (typeof callback === 'function') { |
|
return setImmediate(callback, error_launch, null); |
|
} |
|
} |
|
}; |
|
|
|
ExternalEditor.prototype.cleanup = function() { |
|
return this.removeTemporaryFile(); |
|
}; |
|
|
|
ExternalEditor.prototype.determineEditor = function() { |
|
var args, ed, editor; |
|
ed = /^win/.test(process.platform) ? 'notepad' : 'vim'; |
|
editor = process.env.VISUAL || process.env.EDITOR || ed; |
|
args = editor.split(/\s+/); |
|
this.editor.bin = args.shift(); |
|
return this.editor.args = args; |
|
}; |
|
|
|
ExternalEditor.prototype.createTemporaryFile = function() { |
|
var e; |
|
try { |
|
this.temp_file = Temp.tmpNameSync({}); |
|
return FS.writeFileSync(this.temp_file, this.text, { |
|
encoding: 'utf8' |
|
}); |
|
} catch (error) { |
|
e = error; |
|
throw new CreateFileError(e); |
|
} |
|
}; |
|
|
|
ExternalEditor.prototype.readTemporaryFile = function() { |
|
var buffer, e, encoding; |
|
try { |
|
buffer = FS.readFileSync(this.temp_file); |
|
if (!buffer.length) { |
|
return this.text = ''; |
|
} |
|
encoding = ChatDet.detect(buffer); |
|
return this.text = IConvLite.decode(buffer, encoding); |
|
} catch (error) { |
|
e = error; |
|
throw new ReadFileError(e); |
|
} |
|
}; |
|
|
|
ExternalEditor.prototype.removeTemporaryFile = function() { |
|
var e; |
|
try { |
|
return FS.unlinkSync(this.temp_file); |
|
} catch (error) { |
|
e = error; |
|
throw new RemoveFileError(e); |
|
} |
|
}; |
|
|
|
ExternalEditor.prototype.launchEditor = function() { |
|
var e, run; |
|
try { |
|
run = SpawnSync(this.editor.bin, this.editor.args.concat([this.temp_file]), { |
|
stdio: 'inherit' |
|
}); |
|
return this.last_exit_status = run.status; |
|
} catch (error) { |
|
e = error; |
|
throw new LaunchEditorError(e); |
|
} |
|
}; |
|
|
|
ExternalEditor.prototype.launchEditorAsync = function(callback) { |
|
var child_process, e; |
|
try { |
|
child_process = Spawn(this.editor.bin, this.editor.args.concat([this.temp_file]), { |
|
stdio: 'inherit' |
|
}); |
|
return child_process.on('exit', (function(_this) { |
|
return function(code) { |
|
_this.last_exit_status = code; |
|
if (typeof callback === 'function') { |
|
return callback(); |
|
} |
|
}; |
|
})(this)); |
|
} catch (error) { |
|
e = error; |
|
throw new LaunchEditorError(e); |
|
} |
|
}; |
|
|
|
return ExternalEditor; |
|
|
|
})(); |
|
|
|
module.exports = ExternalEditor; |
|
|
|
}).call(this);
|
|
|