httprequest 経由で js ファイルをロードし、結果のテキストから特定の文字列 (この場合はコメント) を解析しようとしていますが、正規表現に問題があります。
function SampleTest() {
this.test1 = function() {
/* :DOM <div id="sampleDIV">You loaded the sample div</div> */
};
this.test2 = function() {
/* :DOM <div>Second Div Loaded</div> */
}
}
別のスクリプトには、次の機能があります。
var getElementFromComment = function(obj) {
function getHTML(method) {
var httpRequest = new XMLHttpRequest();
httpRequest.open('GET', 'SampleTest.js', false);
httpRequest.send();
var response = httpRequest.responseText;
var re = new RegExp(method); //Not sure how to implement the regex
var result = response.match(re);
console.log(result);
}
for(var method in obj) {
getHTML(method);
}
}
var sampleTest = new SampleTest();
getElementFromComment(sampleTest);
最終結果は、渡された関数名に基づいて、SampleTest のそのコメントから HTML を抽出する必要があります。私の場合、すべての関数をループし、それぞれの html 文字列を次々に取得します。適切なアプローチは次のようになると思います。
- httprequest 経由で Javascript ファイルを取得 - 既に完了
- getHTML に渡された名前と一致する SampleTest 内の関数を見つけ、正規表現を介して関数全体を文字列として返します。
- 別の正規表現を使用して、関数文字列内から /* :DOM で始まり */ で終わる文字列を抽出します。簡単にするために 1 行しか使用していませんが、これは複数行のコメントにすることができます。
- そして最後に、* や :DOM などのすべてのゴミを html 文字列に置き換えます。
ファイルには複数の関数が含まれている可能性が高く、それぞれに独自のコメントがあるため、コメントをすぐにファイルで検索することはできません。これをすべてコンテキストに入れると、JavaScript 単体テスト用の HTML をその場でロードできるようにしたいので、これを行っています。この関数は最終的に単体テスト オブジェクト内のすべての関数をループし、HTML を取得して読み込み、関数を実行し、HTML を削除して、次の関数に移動します。
更新 受け入れられた回答ポスターからのすべての助けのおかげで、すべてを機能させることができました。ただし、純粋な HTML 文字列を取得できるように、複数行のコメントのサポートを追加したり、事後にすべての不要な文字を置き換えたりするなど、いくつかの調整を行う必要がありました。私の更新されたコードは以下のとおりです。
function getHTML(method, str) {
var commentMatch;
var re = new RegExp(method+'\\s*=\\s*function[^}]+\\*/'); //Not sure how to implement the regex
var fnMatch = str.match(re);
if(fnMatch) {
var fnEx = new RegExp('\/\*\s*:[^\s]+\s*(.*?|\n)\*\/', 'g');
commentMatch = fnMatch[0].match(fnEx);
var result = commentMatch[0].replace(/(\s*:DOM\s*)|(\*\/)|(\/\*)|(\*)/gm, '');
result = result.replace(/^\s*/gm, '');
if(commentMatch) {
return result;
}
}
}