Changeset 14277 for lang/python
- Timestamp:
- 06/20/08 07:06:24 (5 months ago)
- Location:
- lang/python/incsearch
- Files:
-
- 3 modified
-
include/DocDb.h (modified) (1 diff)
-
incsearch/indexer.py (modified) (3 diffs)
-
src/DocDb.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
lang/python/incsearch/include/DocDb.h
r14274 r14277 24 24 DocDbReader(const std::string& dbname); 25 25 ~DocDbReader(); 26 //検索関数 26 27 void find(const std::string& searchstr, std::vector<std::string>& answer); 28 //検索関数(排他しない版) 29 void find_dangerous(const std::string& searchstr, std::vector<std::string>& answer); 27 30 }; 28 31 -
lang/python/incsearch/incsearch/indexer.py
r14238 r14277 3 3 # Copyright (C) 2007 Ayukawa Hiroshi 4 4 import os.path 5 import re 6 import glob 7 from incsearch.db import DocDbWriter 5 8 6 def createindex(globber, extractor, outdirbase): 9 FUNC = re.compile(r'<tt id[^>]*>([^<]+)</tt>') 10 def extractor(cont): 11 scanner = FUNC.scanner(cont) 12 m = scanner.search() 13 while m: 14 yield dict(pos=m.start(), title=m.group(1), word=m.group(1)) 15 m = scanner.search() 16 17 def globber(pat, base=""): 18 for f in glob.glob(pat): 19 if f.startswith(base): 20 yield f[len(base):] 21 else: 22 yield f 23 24 def createindex(dbfile, globber, outdirbase, extractor=extractor): 25 u""" 26 extractor ファイル内の情報列を返す。dict(pos=出現文字位置, title=タイトル) 27 """ 28 db = DocDbWriter(dbfile) 7 29 for fname in globber: 8 30 #内容を読み込む 31 print "fname", fname 9 32 fp = file(fname) 10 33 whole = fp.read() … … 20 43 tagged = [] 21 44 pre = 0 22 for i, ipoint in enumerate(extractor(whole)): #TODO: ここで後でindex構築のためのデータ保存 45 for i, ipoint in enumerate(extractor(whole)): 46 ipoint.update({"fname": fname}) 47 db.put(ipoint["word"], "%s\t%d\t%s" % (fname, ipoint["pos"], ipoint["title"])) 23 48 nametag = "<a name='incsearch_%d'/>" % i 24 tagged.append(whole[pre:i ])49 tagged.append(whole[pre:ipoint["pos"]]) 25 50 tagged.append(nametag) 26 pre = i 51 pre = ipoint["pos"] 27 52 tagged.append(whole[pre:]) 28 53 gp = file(os.path.join(outdir, os.path.basename(fname)), "w") … … 32 57 33 58 def test(): 34 pass59 createindex("testdb", globber("data/lib/*"), "data/index") 35 60 36 61 def main(): -
lang/python/incsearch/src/DocDb.cpp
r14274 r14277 57 57 } 58 58 } 59 void DocDbReader::find_dangerous(const std::string& searchstr, std::vector<std::string>& answer){ 60 //一文字だと多いので何もしません。 61 if(searchstr.size() < 2) return; 62 63 try{ 64 //排他なし! 65 66 // カーソルを候補の先頭に置く 67 villa.curjump(searchstr.c_str(), searchstr.size()+1); 68 // カーソルを走査する 69 for(;;){ 70 char* key = villa.curkey(); 71 if(strstr(key, searchstr.c_str()) != key){ 72 free(key); 73 break; 74 } 75 char* val = villa.curval(); 76 std::string a = key; 77 a.append("\t"); 78 a.append(val); 79 answer.push_back(a); 80 free(key); 81 free(val); 82 villa.curnext(); 83 } 84 }catch(qdbm::Villa_error& e){ 85 if(e.code() != qdbm::Villa::ENOITEM) throw e; 86 } 87 } 59 88 60 89 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)