2010-11-19 15 views
3

Ich bin auf der Suche nach einer Möglichkeit, JavaScript-Kommentare von einem (anderen) JavaScript-Code zugreifen. Ich plane, dies zu verwenden, um Hilfeinformationen auf niedriger Ebene für Elemente auf der Seite anzuzeigen, die verschiedene js-Funktionen aufrufen, ohne diese Informationen an mehreren Stellen zu duplizieren.Rufen Sie Javascript-Kommentare in JavaScript ab, oder wie analysiere ich js in js?

mypage.html:

... 
<script src="foo.js"></script> 
... 
<span onclick="foo(bar);">clickme</span> 
<span onclick="showhelpfor('foo');>?</span> 
... 

foo.js:

/** 
* This function does foo. 
* Call it with bar. Yadda yadda "groo". 
*/ 
function foo(x) 
{ 
    ... 
} 

ich mich heraus getElementsByTagName verwenden kann den Skript-Tag zu packen, dann laden Sie die Datei mit einem AJAX-Request auf die Ebene zu bekommen Textinhalt davon. Jedoch würde ich dann eine Möglichkeit brauchen, das Javascript auf zuverlässige Weise zu parsen (d. H. Nicht ein Haufen zusammengehakter Regexps), das die Charaktere bewahrt, die es einfach wegwerfen würde.

Ich dachte daran, einfach die Dokumentation nach der Funktion in eine js-Zeichenfolge zu schreiben, aber das ist peinlich und ich habe das Gefühl, dass ich Doxygen bekomme, um das hochzuholen.

function foo(x) { ... } 
foo.comment = "\ 
This functions does foo.\ 
Call it with bar. Yadda yadda \"groo\".\ 
"; 

Antwort

8

Sie könnten einen kleinen Parser erstellen, der nicht die komplette JS-Sprache analysiert, sondern nur String-Literale, ein- und mehrzeilige Kommentare und Funktionen.

Es gibt einen JS-Parser-Generator namens PEG.js, der das ziemlich einfach machen könnte. Die Grammatik könnte wie folgt aussehen:

{ 
var functions = {}; 
var buffer = ''; 
} 

start 
    = unit* {return functions;} 

unit 
    = func 
/string 
/multi_line_comment 
/single_line_comment 
/any_char 

func 
    = m:multi_line_comment spaces? "function" spaces id:identifier {functions[id] = m;} 
/"function" spaces id:identifier        {functions[id] = null;} 

multi_line_comment 
    = "/*" 
    (!{return buffer.match(/\*\//)} c:. {buffer += c;})*    
    { 
     var temp = buffer; 
     buffer = ''; 
     return "/*" + temp.replace(/\s+/g, ' '); 
    } 

single_line_comment 
    = "//" [^\r\n]* 

identifier 
    = a:([a-z]/[A-Z]/"_") b:([a-z]/[A-Z]/[0-9] /"_")* {return a + b.join("");} 

spaces 
    = [ \t\r\n]+ {return "";} 

string 
    = "\"" ("\\" ./[^"])* "\"" 
/"'" ("\\" ./[^'])* "'" 

any_char 
    = . 

Wenn Sie die folgende Quelle mit dem generierten Parser analysieren:

/** 
* This function does foo. 
* Call it with bar. Yadda yadda "groo". 
*/ 
function foo(x) 
{ 
    ... 
} 

var s = " /* ... */ function notAFunction() {} ... "; 

// function alsoNotAFunction() 
// { ... } 

function withoutMultiLineComment() { 
} 

var t = ' /* ... */ function notAFunction() {} ... '; 

/** 
* BAR! 
* Call it? 
*/ 





      function doc_way_above(x, y, z) { 
    ... 
} 

// function done(){}; 

die start() Funktion des Parsers gibt die folgende Karte:

{ 
    "foo": "/** * This function does foo. * Call it with bar. Yadda yadda \"groo\". */", 
    "withoutMultiLineComment": null, 
    "doc_way_above": "/** * BAR! * Call it? */" 
} 

Ich merke, es gibt einige Lücken zu füllen (wie this.id = function() { ... }), aber nach dem Lesen the docs from PEG.js ein bisschen, das sollte kein großes Problem sein (assumin Sie kennen ein bisschen Parsergeneratoren. Wenn es ein Problem ist, poste es zurück und ich füge es der Grammatik hinzu und erkläre etwas darüber, was in der Grammatik passiert.

Sie können sogar test the grammar online oben gepostet werden!

+0

Eek, das ist ein bisschen mehr beteiligt als ich gehofft hatte, aber es sieht so aus, als müsste es tun, was ich brauche. Vielen Dank! – Eric

0

Sie könnten eine eindeutige Zeichenfolge Kennung am Anfang eines jeden Kommentars, verwenden und dann eindeutige Kennung verwenden, dass man leicht einen regulären Ausdruck Handwerk könnte den Kommentar zu extrahieren.

Verwandte Themen