Enable Comments Conditionally
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
README
demo.html
ecomcon.c
ecomcon.js

README

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." <input >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();
    }
}
----