ecomcon icon indicating copy to clipboard operation
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");

}

export default Constructor;

input, lightly minified:

function Constructor(number) { function private_method() { } this.priv = function () { private_method(); } }