ちょっと必要になったので、 タグや空白を無視して、ある文字列の中から、 指定した文字列がマッチする範囲を計算するJavaScript を書いてみました。

   1  /* (C) Genki Takiuchi. New BSD License */
   2  var findSelection = function(html, sel){
   3    var chars = html.split(''), sels = sel.split('');
   4    var start = 0, end = 0, step = 0, tag = false;
   5    var cur = function(){return chars[end]};
   6    var parse = function(){
   7      switch(cur()){
   8      case '>': if(tag) tag = false; return go();
   9      case '<': if(!tag) tag = true; return go();
  10      case '\n': return go();
  11      case ' ': return go();
  12      case '\t': return go();
  13      default: return tag ? in_tag() : out_tag();
  14      }
  15    };
  16    var go = function(){return(chars[end++] ? parse:reject)()};
  17    var in_tag = function(){return go()};
  18    var out_tag = function(){
  19      return(cur() == go_sel() ? match:not_match)()
  20    };
  21    var not_match = function(){step = 0; return go()};
  22    var match = function(){
  23      if(step == 1) start = end;
  24      return(sels[step] ? go:accept)()
  25    };
  26    var accept = function(){return [start, end + 1]}
  27    var reject = function(){return [0, 0]};
  28    var go_sel = function(){
  29      var s = sels[step++];
  30      return white_space(s) ? go_sel() : s
  31    };
  32    var white_space = function(c){
  33      return c && c.match(/[\s\n]/)
  34    };
  35    return parse();
  36  };

使い方は、こんな感じ。

   1  >> findSelection('hello, <b>world</b>!', 'llo, world')
   2  [2, 15]

選択範囲を取得して、選択している領域をRangeを求めるために作りました。 selに指定した文字列にマッチする箇所が複数ある場合は、 最初にマッチした場所のRangeを返します。

posted by Png genki on Sun 9 Mar 2008 at 10:54
Contents
タグや空白を無視して文字列がマッチする範囲を求めるJavaScript
Comments
瀧内元気: MacOS版は以下にあります * [genki/ViMouse](https://githu... '23-1
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ