Doxygen の検索機能のフロントエンドは、search.php を使用して実装されています。私はphpの代わりにjavaを使用しています
* @author tyrone*
* TODO この生成された型コメントのテンプレートを変更するには、* ウィンドウ - 設定 - Java - コード スタイル - コード テンプレートに移動します
Doxygenを使用してソースコードドキュメントを生成するには、設定ファイルに検索オプションがあります:
#------------- ----- -------------------------------------- ----- -------
# 検索エンジンに関連する設定::追加#------------------------- -------- -------------------------------------- ------
SEARCHENGINE = YESYES の場合、ドキュメントの生成時に search.idx インデックス ファイルと search.php クエリ インターフェイスが生成されます。
search.phpは、クエリされる文字列を入力パラメータとして使用して、phpに実装されたクエリ関数search($file,$word,&$statsList)を呼び出します
このメソッドと、このメソッドによって呼び出される他のメソッドを次のように翻訳しました。 java 言語、次のように:
import java.io.FileInputStream; .util. StringTokenizer;
/**search.idx を読む*/
public クラス Search {
/**
* クエリ
* @param word
* @param statsList
* @return
*/
public Search(File fp){
String content="";
try{
BufferedInputStreamIn = new BufferedInputStream(new FileInputStream( fp ));
int len=In.available();
this.Content=new byte[len];
In.read(this.Content);
Scontent=new String(this.Content) ;
} catch(Exception ex){
ex.printStackTrace();
}
this.Scontent=new String(this.Content);
//this.Content=content.getBytes();
}
プライベート バイト[ ] コンテンツ;
private String Scontent;
private int Index;
private void setIndex(intindex){
this.Index=index;
}
private int getIndex(){
return this.Index;
}
private byte[] getContent(){
return this.Content;
}
private String getScontent(){
return this.Scontent;
}
/**&*/
public ArrayList Searching(String word,ArrayList statsList) {
this.setIndex(computeIndex(word));
TreeMap stat=new TreeMap();
int start=0;
int count=0;
byte[] buf=new byte[4] ;
if (this .getIndex()!=-1) // 有効なインデックスが見つかりました
int totalHi=0;
int totalFreqHi=0;
int totalFreqLo=0;
// 4 バイトのヘッダーを読み取ります
intindex=readInt(this.getIndex()*4+4);
//intindex=readInt(8,this.getIn());
if(index>0){// ハッシュキーに一致する単語が見つかりました
start=statsList.size ();
String w=readString(index);
while (w.length()!=0){
int statIdx = readInt(this.getIndex());
if (w.compareTo( word)>=0){
// (部分文字列として) 一致する単語が見つかりました
stat.put("word",word);
stat.put("match",w);
stat .put("index ",new Integer(statIdx));
if (w.length()==word.length())
stat.put("full","true");
else
stat.put ("full", "false");
statsList.add(stat);
}
w = readString(this.getIndex());
}
for (count=start;count
TreeMap statInfo = (TreeMap)statsList.get(count);
int multiplier = 1;
// 単語全体の一致には 2 倍の重みがあります
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2;
Integer inte=(Integer)statInfo.get("index");
int numDocs = readInt(inte.intValue());
TreeMap[] docInfo =new TreeMap[numDocs];
// ドキュメント情報の読み取り + 単語の出現頻度
for (int i=0;i
int idx=readInt(this.getIndex());
int freq=readInt(this.getIndex());
docInfo[i]=new TreeMap();
docInfo[i].put("idx",new Integer(idx));
docInfo[i].put("freq",new Integer(freq>>1) ));
docInfo[i].put("rank",new Double(0.0));
docInfo[i].put("hi",new Integer(freq&1));
if ((freq&1)>0 ) // 単語は優先度の高いもので出現します doc
{
totalHi++;
totalFreqHi+=freq*multiplier;
}
else // 単語は優先順位の低いもので出現します doc
{
totalFreqLo+=freq*multiplier;
}
}
// readドキュメントの名前と URL 情報
for (int i=0;i
Integer idx=(Integer)docInfo[i].get("idx");
docInfo[i].put( "name",readString(idx.intValue()));
docInfo[i].put("url",readString(this.getIndex()));
}
statInfo.put("docs",docInfo);
}
int totalFreq=(totalHi+1)*totalFreqLo +totalFreqHi;
for (count=start;count
TreeMap statInfo =(TreeMap)statsList.get(count);
int multiplier = 1;
// 単語全体の一致には 2 つの重みがあります
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2 ;
TreeMap[] docInfo=(TreeMap[])statInfo.get("docs");
for (int i=0;i
// それぞれの単語の頻度ランクを計算しますdoc
Integer inte=(Integer)docInfo[i].get("freq");
int freq=inte.intValue();
inte=(Integer)docInfo[i].get("hi");
if (inte.intValue()>0){
docInfo[i].put("rank",new Double((freq*multiplier+totalFreqLo)/totalFreq));
}else{
docInfo[i].put( "ランク",new Double((freq*multiplier)/totalFreq));
}
}
}
}
}
return statsList;
}
private int readInt(intindex){
byte[] buf1;
int b1,b2,b3,b4;
try{
b1=this.getContent()[index];
b2=this.getContent()[index+1];
b3=this.getContent()[index+ 2];
b4=this.getContent()[index+3];
/**苦労の末、Java で ASCII コードに変換されるバイトは 16 ビットであるのに対し、そこに格納される idx は 8 ビットであることがわかりました。*/
b1=b1&0xff;
b2=b2&0xff;
b3=b3&0xff;
b4=b4&0xff;
index= Index+4;
this.setIndex(index);
return (b1}catch(Exception ex){
}
return -1;
}
private String readString(intindex){
String result="";
byte[] re=new byte[60];
int i=0;
byte ind;
while ((ind=this.getContent()[index])!=0){
re[i]=ind;
if (i==59){
result=result+new String(re);
i=0 ;
}else{
i++;
}
index++;
}
result=result+new String(re,0,i);
this.setIndex(++index);
return result;
}
/**
*
* @param word
* @return
*/
private int computeIndex(String word)
{
int hi;
int lo;
if (word.length()// インデックスの上位文字
hi = word.charAt(0);
if (hi==0) return -1;
// インデックスの下位文字
lo =word.charAt(1);
if (lo==0) return -1;
// インデックスを返す
return hi*256+lo;
}
/**args[0]=search.idx, args[1]="word1+word2+..." では、statsList の結果を表示する方法は重要ではなくなりました。*/
public static void main(String[] args){
Search se=new Search(new File(args[ 0]));
StringTokenizer st = new StringTokenizer(args[1],"+");
ArrayList result=new ArrayList();
while (st.hasMoreTokens()){
result=se.Searching(st. nextToken(),result);
}
for(int i=0;i
TreeMap[] docs=(TreeMap [])tm.get("docs");
for (int l=0;l
System.out.println((String)docs[l].get("url"));
}
}
}
}