h(), simple_format(), strftime()

jTemplate を使うにあたって最低限JavaScript側で使いたくなる三つのメソッド。。最初の二つは実装した。

最後のstrftimeは、正直実装面倒くさいので、探したらあった。が、Array に対して for(var i in array) をしている部分があって、Array.prototype が汚染されていると使えないライブラリなのでパッチを作成した。作者に送、、、る方法がないんだけど*1

以下コードメモ

h と simple_format。ほとんど、ActionView::Helpers と同じ。tag メソッドがすごく微妙。

function h(str){
  return str.toString().replace(/\"/g,""")
  .replace(/</g,"&lt;")
  .replace(/>/g,"&gt;")
  .replace(/&/g,"&amp;");
}

function simple_format(str, html_options){
  var start_tag = tag("p", html_options, true);
  var text = str.toString().replace(/\r\n?/, "\n")
  .replace(/\n\n+/, "</p>\n\n" + start_tag)
  .replace(/([^\n]\n)(?=[^\n])/, '$1<br />')
  return start_tag + text + "</p>";
}

function tag(name, options, open){
  var dom = jQuery("<" + name + "/>")
  if( options ){ dom.attr(options); }
  var html = jQuery("<div/>").append(dom).html();
  if( open ){
    // remove close tag.
    return html.replace("</" + name + ">", "")
  }else{
    return html;
  }
}

で、strftime の方。 2行変えただけ。

74c74
< 		for ( var i in _check ) {
---
> 		for ( var i = 0 ; i < _check.length ; i ++ ) {
123c123
< 		for ( var i in _defs ) {
---
> 		for ( var i = 0 ; i < _defs.length ; i ++ ) {

*1:作者のページ、XHTMLがパースエラー、、ソース見てもそれらしきリンクないなぁ...