Invisible Comments

,

Tip of the month -

INVISIBLE COMMENTS - Now you see'em, Now you don't

If you've read any of my articles or downloaded any of my code you will quickly discover that I love using

client-side JavaScript. You'll also discover that I write almost as many comments as I write lines of code.

This is great for my colleagues at work. This stuff's hard enough to understand without good commenting.

I ran into a dilemma when I was told that I should not allow potential competitors to view my JavaScript

comments. If they wanted to figure the code out; make them work for it.

This was simple enough to do; so I

thought. I simply wrapped my comments in ASP script tags <%..comments..%> and put a ' in front of each

line to make the ASP interpreter think it was an ASP comment. The results were great, competitors could no

longer see my comments. An added advantage of this was that the comments no longer needed to be sent

to the clients browser! Check it out, smaller HTTP packets! This can make a big difference if you comment like I do!

Unfortunately, when I did this my color scheme in InterDev was thrown completely out of whack. You see I like to make all

my comments appear as white text on a green background. I thought to myself, what am I going to do? I can't

program without green comments!

Determined as I am, I finally found my solution. Wrap the ASP tags in a

JavaScript comment. So what I ended up with was, a JavaScript comment, wrapped by a ASP comment, wrapped

by another JavaScript comment. My color scheme works, my collages can see my comments, my competitors

need to work to figure out my code, and my boss is happy. Note: not all three layers are necessary to achieve my

results. I could just use ASP comments wrapped by JavaScript Comments. However, doing it with the three

layers allows you to do search and replaces on your JavaScript comments without getting them mixed up

with your real ASP comments.

While we're talking about comments, I just want to throw in something about Microsoft's new C# language.

If you've ever looked at any C# code, you may have seen comments done in XML format. We all like XML right?

This really hit me as a great idea. So....Why not implement this in your current ASP or VB code. There's no

reason why you can't. A comment is a comment. A XML comment is still a comment, but is there anything to

be gained by doing this? Well, it would make it really easy to write an VB add-in to document your code.

How about using XPATH to search all your code for certain functions or subroutines? What about shareware sites

where you have people searching for code to solve a particular problem. No more keeping a separate database with

keyword indexes. The source code has everything you need. Just for thoughts....

An example of Leon's JavaScript commenting

JavaScript Comments, wrapped by ASP comments, wrapped by JavaScript comments.

/*<%

'//<FUNCTION>display_book(whichone,tmpbookIndex)

'//<HEADER>

'//---------------------------display_book()--------------------------

'//

'// <CALLED BY> get_books(),vcr(),allbooks_onclick(),movebook(),Ddelete_onclick(),Spaste_onclick()

'//</CALLED BY>

'//

'// <INPUT> whichone - 1=saved book list 0=queried book list

'// tmpbookIndex - the books position in the list

'// </INPUT>

'//

'// <PURPOSE> Select the current book from the dom containing all books

'// query the book object and get the info to populate the form controls

'// update the listbox containing the IDs of all books in the dom

'//</PURPOSE>

'//

'// <OUTPUT> Xbooknumber - the current books position in the list

'// objXbook - an object containing all info on the current selected book

'//</OUTPUT>

'//

'// <DEVELOPER> Leon Platt</DEVELOPER>

'//

'// <DATE> Feb 18, 2000 </DATE>

'//</HEADER><CODE>

'//%<*/

function display_book(whichone,tmpbookIndex)

{

if (tmpbookIndex<1) return;

if (whichone==1) //Saved book list

{

Dbooknumber = tmpbookIndex;

//the position of a book in the DOM is always Dbooknumber - 1

objDbook= objDallbooks.childNodes.item(1).childNodes.item(Dbooknumber-1);

var DbookName= objDbook.selectSingleNode("FIELD[@gcolumnname='title']").text.toUpperCase();

/*<% '//display the book name%>*/

document.all.Dbookname.innerText=

DbookName;varDbookType=objDbook.selectSingleNode("FIELD[@gcolumnname='type']").text;

/*<% '//display type of book%>*/

document.frmFields.Dtype.value=

DbookType;varDbookWhen=objDbook.selectSingleNode("FIELD[@gcolumnname='pubdate']").text;

/*<% '//display when the book was published%>*/

document.frmFields.Dwhen.value=

DbookWhen;varDbookPrice=objDbook.selectSingleNode("FIELD[@gcolumnname='price']").text;

/*<% '//display the book price%>*/

document.frmFields.Dprice.value=

DbookPrice;varDbookSales=objDbook.selectSingleNode("FIELD[@gcolumnname='ytd_sales']").text;

/*<% '//display the books year to date sales%>*/

document.frmFields.Dsales.value=

DbookSales;varDbookid=objDbook.selectSingleNode("FIELD[@gcolumnname='title_id']").text;

/*<% '//display the book id%>*/

document.frmFields.Dtid.value=Dbookid;

/*<% '//display book xx of xx %>*/

document.all.Dbookid.innerText="[ "+Dbooknumber+" of "+Dnumberofbooks+" ]";

/*<% '//set the length of the list box to the number of books%> */

document.frmFields.Dallbooks.length=Dnumberofbooks;

/*<%'//get the notes about the book%> */

var Denglish = objDbook.selectSingleNode("FIELD[@gcolumnname='notes']").text;

/*<%'//display the books notes%>*/

document.all.Denglish.children(1).innerHTML=Denglish;

/*<%'//fill in the available books list box with the current books from the xml doc%>*/

for (i=

0;i<Dnumberofbooks;i++)

{document.frmFields.Dallbooks.options.text=objDallbooks.childNodes.item(1).childNodes.item(i).selectSingleNode("FIELD[@gcolumnname=

'title_id']").text;document.frmFields.Dallbooks.options.value=objDallbooks.childNodes.item(1).childNodes.item(i).selectSingleNode("FIELD[@gcolumnname='title_id']").text;

}

document.frmFields.Dallbooks.selectedIndex=Dbooknumber-1;

}

/*<%'//</CODE></FUNCTION>*/

Rate

Share

Share

Rate