From 5e50ad484cc0c8d92be9214e8d9ca9c81fc7f161 Mon Sep 17 00:00:00 2001 From: Than Ngo Date: Nov 10 2015 20:38:15 +0000 Subject: - backport patches to fix follow issues: angle brackets (< and >) not escaped in HTML formula alt text don't support longer key in bibtex math does not work in LaTeX with custom header and footer writeMemberNavIndex template calls static fixSpaces XML empty in python XML not documenting a class in python add option to build latex without timestamps --- diff --git a/doxygen-1.8.10-SOURCE_DATE_EPOCH.patch b/doxygen-1.8.10-SOURCE_DATE_EPOCH.patch new file mode 100644 index 0000000..2ed341b --- /dev/null +++ b/doxygen-1.8.10-SOURCE_DATE_EPOCH.patch @@ -0,0 +1,154 @@ +diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp +index 45ccef9..35b9bb8 100644 +--- a/qtools/qcstring.cpp ++++ b/qtools/qcstring.cpp +@@ -460,6 +460,12 @@ ulong QCString::toULong(bool *ok) const + return s.toULong(ok); + } + ++uint64 QCString::toUInt64(bool *ok) const ++{ ++ QString s(data()); ++ return s.toUInt64(ok); ++} ++ + QCString &QCString::setNum(short n) + { + return setNum((long)n); +diff --git a/qtools/qcstring.h b/qtools/qcstring.h +index d8ce074..4f15b18 100644 +--- a/qtools/qcstring.h ++++ b/qtools/qcstring.h +@@ -288,6 +288,7 @@ public: + uint toUInt( bool *ok=0 ) const; + long toLong( bool *ok=0 ) const; + ulong toULong( bool *ok=0 ) const; ++ uint64 toUInt64( bool *ok=0 ) const; + QCString &setNum(short n); + QCString &setNum(ushort n); + QCString &setNum(int n); +diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp +index f51c0d4..458fd53 100644 +--- a/qtools/qstring.cpp ++++ b/qtools/qstring.cpp +@@ -13935,6 +13935,60 @@ bye: + } + + /*! ++ Returns the string converted to an unsigned long ++ value. ++ ++ If \a ok is non-null, \a *ok is set to TRUE if there are no ++ conceivable errors, and FALSE if the string is not a number at all, ++ or if it has trailing garbage. ++*/ ++ ++uint64 QString::toUInt64( bool *ok, int base ) const ++{ ++ const QChar *p = unicode(); ++ uint64 val=0; ++ int l = length(); ++ const uint64 max_mult = 1844674407370955161ULL; // ULLONG_MAX/10, rounded down ++ bool is_ok = FALSE; ++ if ( !p ) ++ goto bye; ++ while ( l && p->isSpace() ) // skip leading space ++ l--,p++; ++ if ( *p == '+' ) ++ l--,p++; ++ ++ // NOTE: toULong() code is similar ++ if ( !l || !ok_in_base(*p,base) ) ++ goto bye; ++ while ( l && ok_in_base(*p,base) ) { ++ l--; ++ uint dv; ++ if ( p->isDigit() ) { ++ dv = p->digitValue(); ++ } else { ++ if ( *p >= 'a' && *p <= 'z' ) ++ dv = *p - 'a' + 10; ++ else ++ dv = *p - 'A' + 10; ++ } ++ if ( val > max_mult || (val == max_mult && dv > (ULLONG_MAX%base)) ) ++ goto bye; ++ val = base*val + dv; ++ p++; ++ } ++ ++ while ( l && p->isSpace() ) // skip trailing space ++ l--,p++; ++ if ( !l ) ++ is_ok = TRUE; ++bye: ++ if ( ok ) ++ *ok = is_ok; ++ return is_ok ? val : 0; ++} ++ ++ ++/*! + Returns the string converted to a short value. + + If \a ok is non-null, \a *ok is set to TRUE if there are no +diff --git a/qtools/qstring.h b/qtools/qstring.h +index a64fabf..df3873d 100644 +--- a/qtools/qstring.h ++++ b/qtools/qstring.h +@@ -463,6 +463,7 @@ public: + uint toUInt( bool *ok=0, int base=10 ) const; + long toLong( bool *ok=0, int base=10 ) const; + ulong toULong( bool *ok=0, int base=10 ) const; ++ uint64 toUInt64( bool *ok=0, int base=10 ) const; + float toFloat( bool *ok=0 ) const; + double toDouble( bool *ok=0 ) const; + +diff --git a/src/util.cpp b/src/util.cpp +index d367c40..db6a19c 100644 +--- a/src/util.cpp ++++ b/src/util.cpp +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include "md5.h" + +@@ -2472,6 +2473,35 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode) + QCString dateToString(bool includeTime) + { + QDateTime current = QDateTime::currentDateTime(); ++ QCString sourceDateEpoch = portable_getenv("SOURCE_DATE_EPOCH"); ++ if (!sourceDateEpoch.isEmpty()) ++ { ++ bool ok; ++ uint64 epoch = sourceDateEpoch.toUInt64(&ok); ++ if (!ok) ++ { ++ static bool warnedOnce=FALSE; ++ if (!warnedOnce) ++ { ++ warn_uncond("Environment variable SOURCE_DATE_EPOCH does not contain a valid number; value is '%s'\n", ++ sourceDateEpoch.data()); ++ warnedOnce=TRUE; ++ } ++ } ++ else if (epoch>UINT_MAX) ++ { ++ static bool warnedOnce=FALSE; ++ if (!warnedOnce) ++ { ++ warn_uncond("Environment variable SOURCE_DATA_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch); ++ warnedOnce=TRUE; ++ } ++ } ++ else // all ok, replace current time with epoch value ++ { ++ current.setTime_t((ulong)epoch); // TODO: add support for 64bit epoch value ++ } ++ } + return theTranslator->trDateTime(current.date().year(), + current.date().month(), + current.date().day(), diff --git a/doxygen-1.8.10-angle-bracket.patch b/doxygen-1.8.10-angle-bracket.patch new file mode 100644 index 0000000..ab748d0 --- /dev/null +++ b/doxygen-1.8.10-angle-bracket.patch @@ -0,0 +1,42 @@ +diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp +index 99d6fdd..d8913e1 100644 +--- a/src/htmldocvisitor.cpp ++++ b/src/htmldocvisitor.cpp +@@ -1902,6 +1902,8 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str) + { + case '&': m_t << "&"; break; + case '"': m_t << """; break; ++ case '<': m_t << "<"; break; ++ case '>': m_t << ">"; break; + // For SGML compliance, and given the SGML declaration for HTML syntax, + // it's enough to replace these two, provided that the declaration + // for the HTML version we generate (and as supported by the browser) +diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp +index d8913e1..0ce4030 100644 +--- a/src/htmldocvisitor.cpp ++++ b/src/htmldocvisitor.cpp +@@ -1904,24 +1904,6 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str) + case '"': m_t << """; break; + case '<': m_t << "<"; break; + case '>': m_t << ">"; break; +- // For SGML compliance, and given the SGML declaration for HTML syntax, +- // it's enough to replace these two, provided that the declaration +- // for the HTML version we generate (and as supported by the browser) +- // specifies that all the other symbols used in rawVal are +- // within the right character class (i.e., they're not +- // some multinational weird characters not in the BASESET). +- // We assume that 1) the browser will support whatever is remaining +- // in the formula and 2) the TeX formulae are generally governed +- // by even stricter character restrictions so it should be enough. +- // +- // On some incompliant browsers, additional translation of +- // '>' and '<' into ">" and "<", respectively, might be needed; +- // but I'm unaware of particular modern (last 4 years) versions +- // with such problems, so let's not do it for performance. +- // Also, some brousers will (wrongly) not process the entity references +- // inside the attribute value and show the &...; form instead, +- // so we won't create entites unless necessary to minimize clutter there. +- // --vassilii + default: m_t << c; + } + } diff --git a/doxygen-1.8.10-bibtex.patch b/doxygen-1.8.10-bibtex.patch new file mode 100644 index 0000000..7bfdc51 --- /dev/null +++ b/doxygen-1.8.10-bibtex.patch @@ -0,0 +1,46 @@ +diff --git a/src/commentscan.l b/src/commentscan.l +index 3546277..406d966 100644 +--- a/src/commentscan.l ++++ b/src/commentscan.l +@@ -920,7 +920,7 @@ FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#] + FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"") + ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* + LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* +-CITESCHAR [a-z_A-Z\x80-\xFF] ++CITESCHAR [a-z_A-Z0-9\x80-\xFF] + CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]* + CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)* + SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?) +diff --git a/src/doctokenizer.l b/src/doctokenizer.l +index 31d583c..efc058a 100644 +--- a/src/doctokenizer.l ++++ b/src/doctokenizer.l +@@ -334,7 +334,7 @@ BLANK [ \t\r] + ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* + LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* + PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+ +-CITESCHAR [a-z_A-Z\x80-\xFF] ++CITESCHAR [a-z_A-Z0-9\x80-\xFF] + CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]* + CITEID {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)* + MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ +diff --git a/src/cite.cpp b/src/cite.cpp +index 2ea6300..3125f35 100644 +--- a/src/cite.cpp ++++ b/src/cite.cpp +@@ -226,13 +226,13 @@ void CiteDict::generatePage() const + else if (insideBib) doc+=line+"\n"; + int i; + // determine text to use at the location of the @cite command +- if (insideBib && (i=line.find("["); + int k=line.find("]"); + if (j!=-1 && k!=-1) + { +- QCString label = line.mid(i+17,j-i-17); ++ QCString label = line.mid(i+14,j-i-14); + QCString number = line.mid(j+2,k-j-1); + CiteInfo *ci = m_entries.find(label); + //printf("label='%s' number='%s' => %p\n",label.data(),number.data(),ci); diff --git a/doxygen-1.8.10-fixspace.patch b/doxygen-1.8.10-fixspace.patch new file mode 100644 index 0000000..f3259fb --- /dev/null +++ b/doxygen-1.8.10-fixspace.patch @@ -0,0 +1,27 @@ +diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp +index a2dd473..dadbb4f 100644 +--- a/src/htmlgen.cpp ++++ b/src/htmlgen.cpp +@@ -1952,11 +1952,6 @@ static void endQuickIndexItem(FTextStream &t,const char *l) + t << "\n"; + } + +-static QCString fixSpaces(const QCString &s) +-{ +- return substitute(s," "," "); +-} +- + static bool quickLinkVisible(LayoutNavEntry::Kind kind) + { + static bool showFiles = Config_getBool("SHOW_FILES"); +diff --git a/src/index.h b/src/index.h +index 150d23f..ace3614 100644 +--- a/src/index.h ++++ b/src/index.h +@@ -284,5 +284,6 @@ void initNamespaceMemberIndices(); + void addClassMemberNameToIndex(MemberDef *md); + void addFileMemberNameToIndex(MemberDef *md); + void addNamespaceMemberNameToIndex(MemberDef *md); ++QCString fixSpaces(const QCString &s); + + #endif diff --git a/doxygen-1.8.10-latex.patch b/doxygen-1.8.10-latex.patch new file mode 100644 index 0000000..35ab52b --- /dev/null +++ b/doxygen-1.8.10-latex.patch @@ -0,0 +1,32 @@ +diff --git a/src/formula.cpp b/src/formula.cpp +index ad37782..182ddaa 100644 +--- a/src/formula.cpp ++++ b/src/formula.cpp +@@ -132,6 +132,7 @@ void FormulaList::generateBitmaps(const char *path) + { + err("Problems running dvips. Check your installation!\n"); + portable_sysTimerStop(); ++ QDir::setCurrent(oldDir); + return; + } + portable_sysTimerStop(); +@@ -192,6 +193,7 @@ void FormulaList::generateBitmaps(const char *path) + { + err("Problem running ghostscript %s %s. Check your installation!\n",portable_ghostScriptCommand(),gsArgs); + portable_sysTimerStop(); ++ QDir::setCurrent(oldDir); + return; + } + portable_sysTimerStop(); +diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp +index 7baaa3c..e10b638 100644 +--- a/src/rtfgen.cpp ++++ b/src/rtfgen.cpp +@@ -2590,6 +2590,7 @@ bool RTFGenerator::preProcessFileInplace(const char *path,const char *name) + if (!outf.open(IO_WriteOnly)) + { + err("Failed to open %s for writing!\n",combinedName.data()); ++ QDir::setCurrent(oldDir); + return FALSE; + } + FTextStream outt(&outf); diff --git a/doxygen-1.8.10-timestamp-latex.patch b/doxygen-1.8.10-timestamp-latex.patch new file mode 100644 index 0000000..49bfeb0 --- /dev/null +++ b/doxygen-1.8.10-timestamp-latex.patch @@ -0,0 +1,64 @@ +diff --git a/src/config.xml b/src/config.xml +index acbee8e..faad651 100644 +--- a/src/config.xml ++++ b/src/config.xml +@@ -2647,6 +2647,16 @@ or + ]]> + + ++ + + +