ejsのデバックについて

704 views
Skip to first unread message

hitomi kiguchi

unread,
Apr 10, 2013, 11:01:44 PM4/10/13
to hifive...@googlegroups.com
バグ報告・環境依存の問題の場合は、以下の項目をご記入ください。
 
--------------------------------------------------------------------
【hifiveのバージョン】1.1.3
【OS】CentOS 6
【ブラウザ(バージョン)】Firefox 20.0
--------------------------------------------------------------------
 木口と申します。
よろしくお願い致します。

ejsテンプレートデバックについて質問させてください。

ejsの書きぶりで苦労しております。
HPを参考にヘルパー(ejs_fulljslint.js)を入れてテンプレートを記述していますが
エラーの行番号が正しく出力されないケースがあり詰まり気味です。

「%」と「=」の間に不要なスペースが有る場合([% =  test %])

controller.js
 var list ={"hoge" : {"key1":"value1", "key2":"value2"}, "hige" : {"key1":"value1", "key2":"value2"} };
 
this.view.update('#list', 'list', { startStr:"START--", list: list, endStr:"END--"});

list.ejs
<script type="text/ejs" id="list">
[%= startStr %] <!-- -->
<br/>
[% $.each(list, function(key, val) { %]
    key
:[%= key %] <!-- -->
   
[% for(key in val) { %]
       
[%= key %][%= val[key] %] <!-- -->
   
[% } %]
   
<br/>
[% }); %]
<br/>
[%= endStr %] <!-- -->
</script>

①で不要なスペースが有る場合は、期待通りのメッセージ(下記)が表示されました。
 [WARN]16:36:47,520: テンプレートのコンパイルでエラーが発生しました。
 構文エラー: line:1 Expected an identifier and instead saw '='.(code=7010)

②③のループ内で不要なスペースが有る場合は、以下のようなメッセージが表示されました。
 [WARN]16:21:31,12: テンプレートのコンパイルでエラーが発生しました。
 構文エラー: line:4 Control character in string: .(code=7010)
 
 #③でもline4と表示される。(ループ内の処理が大きいとデバックしづらい。)
 #①とエラーが異なる。

④の一旦ループを通った後に、不要なスペースが有る場合は②③と同様のメッセージが表示されました。
 [WARN]16:38:55,613: テンプレートのコンパイルでエラーが発生しました。
 構文エラー: line:4 Control character in string: .(code=7010)

ループ内、ループを通った後のエラー行番号が正しく出力されないと思うのですがどうでしょうか?

simdy

unread,
Apr 19, 2013, 2:03:38 AM4/19/13
to hifive...@googlegroups.com
しもだです。
返信が遅くなりすみません。
 
ご指摘の件、こちらで確認してみました。
上記テンプレートのインデントは、タブを使っているでしょうか?
インデントにタブ文字を使用している(途中にタブ文字がある)状態で
構文エラーが発生すると、そのタブ文字がエラー扱いされているようです。
# ので、4行目 に Control Character=タブがある というエラーメッセージになる
 
空白文字だと、Expected...のメッセージが、行数1, 4, 6行目で正しく出ました。
 
構文エラーがない場合にはタブ文字が含まれていても問題ないので、
ejslintのチェックルーチンの問題のように思われます。
 
FWの機能障害ではないため対応優先度はやや低くなってしまいますが、
現象は確認できましたので課題として認識します。
 
 
ちなみに・・・、
今、functionの途中でコードを分断させていますが、
この使い方は(テンプレートとして)構造が複雑になりがちと思うので、
(エラーメッセージの問題がないとしても)気を付けてお使いいただければと。
# forやif文等標準の制御構造を使用するのを元々は想定しておりました。
 

2013年4月11日木曜日 12時01分44秒 UTC+9 hitomi kiguchi:

hitomi kiguchi

unread,
Apr 19, 2013, 8:27:10 AM4/19/13
to hifive...@googlegroups.com
木口です。
解答ありがとうございます。

>上記テンプレートのインデントは、タブを使っているでしょうか?
使っています。


>空白文字だと、Expected...のメッセージが、行数1, 4, 6行目で正しく出ました。
なんと。。インデントは空白を使用するようにします。

>今、functionの途中でコードを分断させていますが
すみません。この部分が理解できませんでした。
途中で分断するような書き方をしているつもりはないのですが。。

simdy

unread,
Apr 24, 2013, 7:01:34 AM4/24/13
to hifive...@googlegroups.com
しもだです。
返信が遅延気味ですみません。
 
>今、functionの途中でコードを分断させていますが
$.each()の引数に入れている関数の部分で、
コード部分とテンプレート部分が混ざっている、ということを意図していました。
 
[% $.each(list, function(key, val) { %]   //←関数の途中で%] でスクリプト部分がいったん終了
    key:[%= key %]                                 //←関数の中にテンプレート出力のコードが入ることになる

    [% for(key in val) { %]
        [%= key %][%= val[key] %] <!-- ③ -->
    [% } %]
    <br/>
[% }); %]
ifやforなど制御構造ではよくありますが、
関数呼び出しは[%= %]のブロック内で閉じて行われる([%= doSomething(param) %])のが
大半かな、と思い書きました。
(というか、関数コードの途中でテンプレート部分が混ざっても正しく動くのは知りませんでした…)
 

2013年4月19日金曜日 21時27分10秒 UTC+9 hitomi kiguchi:
Reply all
Reply to author
Forward
0 new messages