`
touchinsert
  • 浏览: 1329376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java实现读取Doxygen查询功能的索引文件。

阅读更多

Doxygen的Search功能的前端是使用search.php实现的。我使用java代替php,读取search.idx

用Doxygen生成源代码的文档需要配置文件,配置文件内有search选项:

#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = YES

如果YES,则在生成文档时会生成search.idx索引文件和search.php查询界面。

search.php会将要查询的字符串作为输入参数调用用php实现的查询function search($file,$word,&$statsList)

我将该方法以及该方法调用的其他方法翻译成java语言,如下:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.TreeMap;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
* @author tyrone
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Search {
/**读取search.idx*/
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 byte[] Content;

private String Scontent;

private int Index;

private void setIndex(int index){
this.Index=index;
}

private int getIndex(){
return this.Index;
}

private byte[] getContent(){
return this.Content;
}
private String getScontent(){
return this.Scontent;
}
/**
* 查询
* @param word
* @param statsList
* @return
*/
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) // found a valid index
{
int totalHi=0;
int totalFreqHi=0;
int totalFreqLo=0;

//read 4 bytes skip header
int index=readInt(this.getIndex()*4+4);
//int index=readInt(8,this.getIn());
if (index>0){// found words matching the hash key
start=statsList.size();
count=start;
String w=readString(index);
while (w.length()!=0){
int statIdx = readInt(this.getIndex());
if (w.compareTo(word)>=0){
// found word that matches (as substring)
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<statsList.size();count++)
{
TreeMap statInfo = (TreeMap)statsList.get(count);
int multiplier = 1;
// whole word matches have a double weight
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];
// read docs info + occurrence frequency of the word
for (int i=0;i<numDocs;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) // word occurs in high priority doc
{
totalHi++;
totalFreqHi+=freq*multiplier;
}
else // word occurs in low priority doc
{
totalFreqLo+=freq*multiplier;
}
}
// read name and url info for the doc
for (int i=0;i<numDocs;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<statsList.size();count++)
{
TreeMap statInfo =(TreeMap)statsList.get(count);
int multiplier = 1;
// whole word matches have a double weight
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2;
TreeMap[] docInfo=(TreeMap[])statInfo.get("docs");
for (int i=0;i<docInfo.length;i++)
{
// compute frequency rank of the word in each 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("rank",new Double((freq*multiplier)/totalFreq));
}
}
}
}
}
return statsList;
}

private int readInt(int index){

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的byte转化为ASCII码是16位,而idx存的是8位的。*/
b1=b1&0xff;
b2=b2&0xff;
b3=b3&0xff;
b4=b4&0xff;
index=index+4;
this.setIndex(index);
return (b1<<24)|(b2<<16)|(b3<<8)|(b4);
}catch(Exception ex){

}
return -1;
}
private String readString(int index){
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()<2) return -1;
// high char of the index
hi =word.charAt(0);
if (hi==0) return -1;
// low char of the index
lo =word.charAt(1);
if (lo==0) return -1;
// return index
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<result.size();i++){
TreeMap tm=(TreeMap)result.get(i);
TreeMap[] docs=(TreeMap[])tm.get("docs");
for (int l=0;l<docs.length;l++){
System.out.println((String)docs[l].get("name"));
System.out.println((String)docs[l].get("url"));
}
}
}
}

分享到:
评论

相关推荐

    利用Doxygen生成C++、Java文档

    【标题】:“利用Doxygen生成C++、Java文档” Doxygen是一款强大的开源文档生成工具,广泛应用于C++、Java等编程语言的项目中。它能够自动生成源代码的API文档,帮助开发者理解和使用代码库。Doxygen的强大在于它...

    doxygen Doxygen

    在运行Doxygen后,它会扫描指定的源代码目录,读取源码中的注释,并依据`Doxyfile`的配置生成文档。生成的HTML文档通常包括类索引、类层次结构、命名空间、文件、类成员、函数等详细信息。此外,Doxygen还能生成源...

    doxygen-1.8.0-setup

    【标签】"doxygen-1.8.0-setup"和"doxygen"强调了文件与Doxygen的关联,Doxygen是一个开源的文档生成系统,主要针对C++,但同时也支持其他编程语言如Java、C#、Python等。它通过解析源代码来自动提取类、函数、变量...

    自动文档生成doxygen1.5

    2. **类图和时序图**:Doxygen可以生成类关系图,展示类之间的继承、关联和实现关系,还支持生成程序流程的时序图。 3. **文件索引**:自动生成的文档包含了完整的文件索引,方便查找和定位代码。 4. **成员索引**:...

    doxygen官方手册1.8_中文手册1.6_doxygen使用详解.rar

    《doxygen官方手册1.8_中文手册1.6_doxygen使用详解.rar》是一个压缩包,包含关于doxygen的重要资源,包括《doxygen使用详解》、《doxygen中文手册v1.63》以及《doxygen_manual-1.8.13》三份PDF文档。这些资料是学习...

    doxygen manual

    doxygen会读取这些注释并转换为清晰的HTML文档,使得非开发人员也能轻松理解代码的功能和用法。 在《doxygen手册-1.7.2.pdf》中,详细介绍了doxygen的安装、配置和使用方法。手册首先会讲解如何安装doxygen,包括...

    DOXYGEN

    - **源代码解析**:DOXYGEN能够深入解析源代码,理解类、函数、变量、枚举等结构,同时处理头文件和实现文件间的包含关系。 - **注释解析**:它支持多样的注释风格,如Javadoc、Qt、Java、Doxygen等,使得程序员...

    doxygen v1.8.8

    HTMP CHM INDEX ENCODING:这里设置Doxygen生成的CHM索引文件的编码 以前是不能设置的 默认为UTF 8 而微软的编译器不能识别UTF 8编码的索引文件 所以最终造成左边目录导航栏乱码 我们设置它为GBK 这样Doxygen将为...

    doxygen的配置文件

    当初试的时候,配置文件和头文件同一目录,而且我只有头文件

    doxygen配置及使用手册

    Doxygen是一款强大的文档自动生成工具,能够从C、C++、Java等编程语言的源代码中提取文档信息,自动生成帮助文档、API资料等。这使得开发人员能够在编写代码的同时,通过标准的注释方式轻松地维护和创建高质量的技术...

    Doxygen代码注释规范.docx

    Doxygen 能将程序中的特定批注转换成为说明文件。 一、Doxygen 软件介绍 Doxygen 是一种文档生成工具,可以根据程序的结构生成参考手册。它可以依据程序本身的结构,将程序中按规范注释的批注经过处理生成一个纯粹...

    doxygen软件

    1. **源码解析**:Doxygen能够读取多种编程语言的源代码,包括C、C++、C#、Java、Python、Objective-C等,识别出类、函数、变量等元素,并解析它们之间的关系。 2. **注释支持**:Doxygen支持特殊的注释语法,如`/*...

    doxygen-1.8.3-setup

    1. **配置文件**:Doxygen的配置主要通过一个名为`Doxyfile`的配置文件进行,包含了各种选项,如输入文件、输出格式、注释样式等。用户可以根据需求修改这些设置。 2. **运行Doxygen**:执行Doxygen命令,指定配置...

    doxygen1.5.5 c++ 文档生成器

    3. **运行Doxygen**:在命令行中执行`doxygen Doxyfile`,Doxygen会读取配置文件并开始解析源码,生成文档。 4. **查看文档**:生成的文档可以在指定的输出目录中找到,通常包括HTML和CHM两种形式,通过浏览器或...

    Doxygen配置文件doxyfile(C/C++)

    Doxygen配置文件doxyfile(C/C++),博客中已详细介绍如何使用~欢迎大家一起学习、分享Doxygen的使用方法~

    doxygen源码Windows编译

    在IT领域,Doxygen是一款广泛使用的源代码文档生成工具,它能够从C++、C、Java、Python等语言的源代码中自动提取文档。本文将详细介绍如何在Windows环境下编译Doxygen的源码,以及涉及的相关工具bison和flex。 首先...

    代码注释规范之doxygen

    在使用Doxygen生成CHM文件时,可能会遇到左边树目录中文乱码的问题。为了解决这一问题,需要将CHM索引的编码类型修改为GB2312。在HTML的CHM_INDEX_ENCODING中输入GB2312即可完成修改。 在配置完成后,运行Doxygen...

    visualc++开发文档生成工具Doxygen教程参考.pdf

    Doxygen 教程参考 Doxygen 是一个程序文件生成工具,可将程序中的特定批注转换...Doxygen 是一个功能强大且易用的程序文件生成工具,对于程序设计师来说,使用 Doxygen 可以减少编写说明文件的工作量,提高工作效率。

    Doxygen代码注释规范

    "Doxygen代码注释规范" Doxygen是一种开源跨平台的...Doxygen是一种功能强大且灵活的文档生成工具,能够满足大型程序开发的需求。通过正确地配置和使用Doxygen,可以生成高质量的文档,从而提高开发效率和代码可读性。

    Doxygen安装文件及自己整理的教程

    Doxygen进行C++归档快速入门,教程见博客...包含自己整理的Doxygen归档快速入门教程一份,doxygen1.8.4安装文件,doxygen中文手册,graphviz2.30.1绘图安装文件和HtmlHelpWorkShop安装文件HHWorkshop。

Global site tag (gtag.js) - Google Analytics