📄 doxytag.l
字号:
/****************************************************************************** * * $Id: doxytag.l,v 1.27 2001/03/19 19:27:40 root Exp $ * * Copyright (C) 1997-2001 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */%{/* * includes */#include <stdio.h>#include <iostream.h>#include <assert.h>#include <ctype.h>#include "qtbc.h"#include <qstrlist.h>#include <qfileinfo.h>#include <qfile.h>#include <qdict.h>#include <qtextstream.h>#include <qdir.h> #include "version.h"#include "suffixtree.h"#include "searchindex.h"#include "logos.h"static QCString convertToXML(const char *s){ QCString result; if (s==0) return result; const char *p=s; char c; while ((c=*p++)) { switch (c) { case '<': result+="<"; break; case '>': result+=">"; break; case '&': result+="&"; break; case '\'': result+="'"; break; case '"': result+="""; break; default: result+=c; break; } } return result;} struct MemberDef{ QCString name; QCString anchor; QCString args;}; struct ClassDef{ QCString name; QStrList bases; QCString fileName; bool isFile; QList<MemberDef> memberList;}; QList<ClassDef> classList;QDict<ClassDef> classDict(1009);QList<ClassDef> fileList;QDict<ClassDef> fileDict(1009);static bool genTag;static bool genIndex;static QStrList bases;static QCString inputString;static int inputPosition;static QCString yyFileName;static int yyLineNr;static QCString classFile;static QCString memberRef;static QCString memberName;static QCString memberArgs;static QCString className;static QCString docBaseLink;static QCString docAnchor;static QCString docRefName;static bool nameBug;static SearchIndex searchIndex;#define YY_NEVER_INTERACTIVE 1/* ----------------------------------------------------------------- */#undef YY_INPUT#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);static int yyread(char *buf,int max_size){ int c=0; while( c < max_size && inputString[inputPosition] ) { *buf = inputString[inputPosition++] ; c++; buf++; } return c;}static void addClass(const char *clName){ if (classDict[clName]==0) { ClassDef *cd=new ClassDef; cd->name=clName; cd->fileName=yyFileName; cd->isFile=FALSE; classList.append(cd); classDict.insert(clName,cd); }}static void addFile(const char *fName){ if (classDict[fName]==0) { ClassDef *fd=new ClassDef; fd->name=fName; fd->fileName=yyFileName; fd->isFile=TRUE; classList.append(fd); classDict.insert(fName,fd); }}static void addBases(const char *clName){ ClassDef *cd=0; if (clName && (cd=classDict[clName])) cd->bases=bases;}static void addMember(const char *memName,const char *memRef,const char *memArgs){ ClassDef *cd=classList.last(); MemberDef *md; md=new MemberDef; md->name=memName; md->anchor=memRef; md->args=memArgs; cd->memberList.append(md);}static void addReference(){ //printf("addReference() key: %s ref:%s\n", // docRefName.data(),(docBaseLink+"#"+docAnchor).data()); if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty()) { if (!docAnchor.isEmpty()) searchIndex.addReference(docRefName,docBaseLink); else searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor); searchIndex.addWord(docRefName,docRefName,TRUE); }}QCString unhtmlify(const char *str){ QCString result; const char *p=str; char c; while ((c=*p)!='\0') { if (c!='&') { result+=c; p++; } else { if (strncmp(p,"&",5)==0) { result+='&'; p+=5; } else if (strncmp(p,"<",4)==0) { result+='<'; p+=4; } else if (strncmp(p,">",4)==0) { result+='>'; p+=4; } else /* should not happen */ { result+='&'; p++; } } } return result;}%}%x Start%x SearchClassFile%x ReadClassFile%x CheckClassName%x ReadClassName%x SearchMemberRef%x ReadMemberRef%x SearchMemberName%x ReadMemberName%x ReadOperator%x SearchBaseClasses%x ReadBaseClass%x SearchRefName%x ReadRefName%x SearchArgs%x ReadArgs%x SearchWords%x SkipHTMLTag%x CheckConstructor%x SkipPreformated%%<Start>^"<li>" { BEGIN( SearchClassFile ); } <Start>^"<td"[^\n]*"<h1 align=center>" | // Qt-3.x.x+<Start>^"<h1 align=center>" { // Qt variant BEGIN( ReadClassName ); }<Start>^("<hr>")?"<h1>" { // Doxygen variant BEGIN( ReadClassName ); }<Start>^"Inherits " { //printf("Inherits found\n"); BEGIN( SearchBaseClasses ); }<Start>^"<h3 class=\"fn\">"/[a-z_A-Z0-9] { // needed due to inconsistency in the Qt docs BEGIN( CheckConstructor ); }<Start>"<pre>" { BEGIN( SkipPreformated ); }<Start>"<a name=\"" { BEGIN( SearchWords ); }<Start>"<" { BEGIN( SkipHTMLTag ); }<Start>"&"[a-zA-Z]+";"<Start,SkipPreformated>[a-z_A-Z][a-z_A-Z0-9]* { //printf("tag: %s#%s ref: %s word: `%s'\n", // docBaseLink.data(),docAnchor.data(), // docRefName.data(),yytext); if (genIndex && !docRefName.isEmpty() && yyleng>2) searchIndex.addWord(docRefName, yytext,FALSE ); }<SkipPreformated>"</pre>" { BEGIN( Start ); }<SkipPreformated>[^\<\n]+ <CheckConstructor>[a-z_A-Z0-9~:]+ { QCString s=yytext; if (s.find("::")!=-1) { docRefName=yytext; addReference(); nameBug=TRUE; } else { nameBug=FALSE; } BEGIN( Start ); }<SearchWords>[a-z_A-Z0-9]+ { docAnchor = yytext; if (docAnchor=="details" || docAnchor=="_details") { docRefName=className.copy(); addReference(); BEGIN( Start ); } else { BEGIN( SearchRefName ); } }<SearchRefName>"\" doxytag=\"" { BEGIN( ReadRefName ); }<SearchRefName>"\"></a><a" { // HACK: avoid finding links in code fragments BEGIN( Start ); }<SearchRefName>"\"></a>" { // HACK: deal with Qt code if (nameBug) BEGIN( Start ); else BEGIN( ReadRefName ); }<ReadRefName>[a-z_A-Z0-9:\.\+\-]*"operator"[ \t]*("new"|"delete"|("&"("&"|"=")*)|(">"(">"|"=")*)|("<"("<"|"=")*)|("->"[*]*)|[+\-*%/|~!=,\^]|[+\-*%/\^!|~=\[(][=|+\-\])]) { // hmm, looks impressive :-) docRefName=unhtmlify(yytext); addReference(); BEGIN( Start ); }<ReadRefName>[a-z_A-Z0-9~:\.\+\-]+ { //printf("ReadRef=%s\n",yytext); docRefName=yytext; addReference(); BEGIN( Start ); }<SearchBaseClasses>"<a "[a-z_A-Z0-9 .:\=\"\-\+\/\@]+">" { //printf("Search %s\n",yytext); BEGIN( ReadBaseClass ); } <SearchBaseClasses>\n { addBases(className); BEGIN( Start ); }<ReadBaseClass>[a-z_A-Z0-9]+ { bases.append(yytext); BEGIN( SearchBaseClasses ); }<SearchClassFile>"<a class=\"el\" href=\"" { BEGIN( ReadClassFile ); }<SearchClassFile>"<a href=\"" { BEGIN( ReadClassFile ); }<ReadClassName>[a-z_A-Z0-9:\.\-\+]+ { className=yytext; BEGIN( CheckClassName); }<CheckClassName>"Class Reference" { //printf("className=%s\n",className.data()); addClass(className); BEGIN( Start ); }<CheckClassName>"File Reference" {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -