ecomcon
ecomcon copied to clipboard
Enable Comments Conditionally
ecomcon: Enable Comments Conditionally
Douglas Crockford
Public Domain
Ecomcon is a filter that enables selected comments, making them executable. This makes it possible to put development, performance, and testing scaffolding into a source file. The scaffolding is removed by minification, but is activated by ecomcon. There are currently two implementations of ecomcon in C and JavaScript.
Ecomcon is a filter that takes a source file and looks for tagged comments in this form:
//tag stuff
The line comment starts at the beginning of the line. There can be no space between the '//' and the tag.
Ecomcon is given a list of the names of the tags that should be enabled.
The implementation in C obtains the input from 'stdin', and provides the result to 'stdout'. The tag list is taken from the command line. The command line can also include a '-comment' specification. Ecomcon will exit(1) if there is an error.
In JavaScript, it is available as the ecomcon function that takes a source string, an array of tags, and an optional array of comments. It will throw an exception if there is an error. If there is no error, it returns a string.
C command line example:
ecomcon -comment "Devel Edition." output es6 test enter exit
JavaScript example:
import ecomcon from "./ecomcon.js"; let output = ecomcon( input, ["es6", "test", "enter", "exit"], ["Devel Edition."] );
input:
// This is a sample file.
function Constructor(number) {
//enter log_enter("Constructor");
function private_method() {
//enter log_enter("private_method");
//nochange alert();
//exit log_exit("private_method");
}
//test this.private_method = private_method; //test this.priv = function () {
//enter log_enter("priv");
private_method();
//exit log_exit("priv");
}
//exit log_exit("Constructor");
}
//es6 export default Constructor; //legacy module.exports = Constructor;
output:
// Devel Edition. // This is a sample file.
function Constructor(number) {
log_enter("Constructor");
function private_method() {
log_enter("private_method");
log_exit("private_method");
}
this.private_method = private_method; this.priv = function () {
log_enter("priv");
private_method();
log_exit("priv");
}
log_exit("Constructor");
}