📄 doxytag.l
字号:
//printf("className=%s\n",className.data()); addFile(className); BEGIN( Start ); }<CheckClassName>[a-z_A-Z0-9]+ { // not a class file className.resize(0); BEGIN( Start ); }<ReadClassFile>[a-z_A-Z0-9.\-\+]+ { classFile=yytext; BEGIN( SearchMemberRef ); }<SearchMemberRef,ReadClassFile>"#" { if (YY_START==ReadClassFile) { classFile=yyFileName; } BEGIN( ReadMemberRef ); }<ReadMemberRef>[a-z_A-Z0-9]+ { memberRef=yytext; BEGIN( SearchMemberName ); }<SearchMemberName>"<strong>"|"<b>" { // <strong> is for qt-1.44, <b> is for qt-2.00 BEGIN( ReadMemberName ); }<SearchMemberName>[a-z_A-Z~] { unput(*yytext); BEGIN( ReadMemberName ); }<ReadMemberName>"operator" { memberName="operator"; BEGIN( ReadOperator ); }<ReadOperator>[+\-*/%\^&|~!=()\[\]] { memberName+=*yytext; } <ReadOperator>"<" { memberName+="<"; }<ReadOperator>">" { memberName+=">"; }<ReadOperator>"new" { memberName+=" new"; }<ReadOperator>"delete" { memberName+=" delete"; }<ReadOperator>"<" { BEGIN( SearchArgs ); }<ReadMemberName>[a-z_A-Z0-9]+ { memberName=yytext; BEGIN( SearchArgs ); } <SearchArgs>"</a>" { //printf("SearchArg className=%s memberName=%s\n",className.data(),memberName.data()); if (!className.isEmpty() && !memberName.isEmpty()) BEGIN( ReadArgs ); else BEGIN( Start ); }<ReadArgs>"&" { memberArgs+="&"; }<ReadArgs>"<" { memberArgs+="<"; }<ReadArgs>">" { memberArgs+=">"; }<ReadArgs>" " { memberArgs+=" "; } /*<ReadArgs>[{}] { // handle enums memberArgs.resize(0); addMember(memberName,memberRef,memberArgs); if (*yytext=='}') BEGIN( Start ); else BEGIN( SearchClassFile ); } */<ReadArgs>"<"|"\n" { //printf("adding member %s\n",memberName.data()); memberArgs=memberArgs.stripWhiteSpace(); //if (newClass) //{ // newClass=FALSE; // addClass(className); //} addMember(memberName,memberRef,memberArgs); memberArgs.resize(0); if (*yytext=='<') BEGIN( SkipHTMLTag); else BEGIN( Start ); }<ReadArgs>. { memberArgs+=(*yytext)&0x7f; }<SkipHTMLTag>">" { BEGIN( Start ); }<SkipHTMLTag>[a-zA-Z]+ <*>.<*>\n { yyLineNr++; if (YY_START!=SkipHTMLTag) BEGIN( Start ); }%%/*@ ---------------------------------------------------------------------------- */void parse(QCString &s){ bases.clear(); nameBug = FALSE; //newClass = TRUE; inputString = s; inputPosition = 0; yyLineNr = 0; tagYYrestart( tagYYin ); BEGIN( Start ); tagYYlex(); //printf("Number of lines scanned: %d\n",yyLineNr);}void parseFile(QFileInfo &fi){ fprintf(stderr,"Parsing file %s...\n",fi.fileName().data()); QFile f; f.setName(fi.absFilePath()); if (f.open(IO_ReadOnly)) { yyFileName = fi.fileName(); className.resize(0); memberName.resize(0); //printf("Parsing file %s...\n",fi.fileName().data()); QCString input(fi.size()+1); docBaseLink=fi.fileName(); docRefName=fi.fileName().copy(); searchIndex.addReference(docRefName,docBaseLink); searchIndex.addWord(docRefName,docRefName,TRUE); f.readBlock(input.data(),fi.size()); input.at(fi.size())='\0'; parse(input); } else { fprintf(stderr,"Warning: Cannot open file %s\n",fi.fileName().data()); }}void parseFileOrDir(const char *fileName){ QFileInfo fi(fileName); if (fi.exists()) { if (fi.isFile()) { parseFile(fi); } else if (fi.isDir()) { QDir dir(fileName); dir.setFilter( QDir::Files ); dir.setNameFilter( "*.html" ); const QFileInfoList *list = dir.entryInfoList(); QFileInfoListIterator it( *list ); QFileInfo *cfi; for ( it.toFirst() ; (cfi=it.current()) ; ++it) { if (cfi->isFile()) { parseFile(*cfi); } } } } else { fprintf(stderr,"Warning: File %s does not exist\n",fileName); }}void usage(const char *name){ fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2001\n\n", versionString); fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n"); fprintf(stderr,"Usage: %s [-t tag_file] [-s index_file] [ html_file [html_file...] ]\n",name); fprintf(stderr,"Options:\n"); fprintf(stderr," -t <tag_file> Generate tag file <tag_file>.\n"); fprintf(stderr," -s <index_file> Generate search index <index_file>.\n\n"); fprintf(stderr,"If no HTML files are given all files in the current dir that\n" "have a .html extension are parsed.\n\n"); exit(1);}const char *getArg(int argc,char **argv,int &optind,const char c){ char *s=0; if (strlen(&argv[optind][2])>0) s=&argv[optind][2]; else if (optind+1<argc) s=argv[++optind]; else { fprintf(stderr,"option -%c requires an argument\n",c); exit(1); } return s;}int main(int argc,char **argv){ QCString tagName; QCString indexName; int optind=1; const char *arg; while (optind<argc && argv[optind][0]=='-') { switch(argv[optind][1]) { case 't': arg=getArg(argc,argv,optind,'t'); tagName=arg; break; case 's': arg=getArg(argc,argv,optind,'s'); indexName=arg; break; case 'h': case '?': usage(argv[0]); break; default: fprintf(stderr,"Unknown option -%c\n",argv[optind][1]); usage(argv[0]); } optind++; } genTag = !tagName.isEmpty(); genIndex = !indexName.isEmpty(); if (!genTag && !genIndex) { fprintf(stderr,"Nothing to do !\n\n"); usage(argv[0]); } int i; if (optind>=argc) { parseFileOrDir("."); } else { for (i=optind;i<argc;i++) { parseFileOrDir(argv[i]); } } if (genIndex) { //printf("Writing search index\n"); if (!searchIndex.saveIndex(indexName)) { fprintf(stderr,"Error: Could not write search index\n"); } QFileInfo fi(indexName); if (fi.exists()) { QCString dir=convertToQCString(fi.dir().absPath()); fi.setFile(dir+"/search.gif"); if (!fi.exists()) writeSearchButton(dir); fi.setFile(dir+"/doxygen.gif"); if (!fi.exists()) writeLogo(dir); fi.setFile(dir+"/search.cgi"); if (!fi.exists()) { QFile f; f.setName(dir+"/search.cgi"); if (f.open(IO_WriteOnly)) { QTextStream t(&f); t << "#!/bin/sh" << endl << "DOXYSEARCH=" << endl << "DOXYPATH=" << endl << "if [ -f $DOXYSEARCH ]" << endl << "then" << endl << " $DOXYSEARCH $DOXYPATH" << endl << "else" << endl << " echo \"Content-Type: text/html\"" << endl << " echo \"\"" << endl << " echo \"<H1>Error: $DOXYSEARCH not found. Check cgi script!\"" << endl << "fi" << endl; f.close(); } else { fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data()); } } } } if (genTag) { QFile f; f.setName(tagName); if (f.open(IO_WriteOnly)) { QTextStream t(&f); t << "<tagfile>" << endl; ClassDef *cd=classList.first(); while (cd) { t << " <compound kind=\""; if (cd->isFile) t << "file"; else t << "class"; t << "\">" << endl; t << " <name>" << convertToXML(cd->name) << "</name>" << endl; char *base=cd->bases.first(); while (base) { t << " <base>" << convertToXML(base) << "</base>" << endl; base=cd->bases.next(); } t << " <filename>" << convertToXML(cd->fileName) << "</filename>" << endl; MemberDef *md=cd->memberList.first(); while (md) { t << " <member kind=\"function\">" << endl; t << " <name>" << convertToXML(md->name) << "</name>" << endl; t << " <anchor>" << convertToXML(md->anchor) << "</anchor>" << endl; t << " <arglist>" << convertToXML(md->args) << "</arglist>" << endl; t << " </member>" << endl; md=cd->memberList.next(); } t << " </compound>" << endl; cd=classList.next(); } t << "</tagfile>" << endl; } else { fprintf(stderr,"Error: Could not write tag file %s\n",tagName.data()); } } return 0;}extern "C" {int tagYYwrap() { return 1 ; }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -