Skip to content

Commit 0c79c81

Browse files
committed
Handling of TIMESTAMP in html footer and header
In ITK: InsightSoftwareConsortium/ITK#5190 there has been a discussion about the use of `TIMESTAMP` in the html footer (and header) in respect to reproducibility (and creation of difference sets for documentation sites). When the date is replaced by the actual value all the html files are involved. I the ITK project a html string was used and its value was replaced by means of a JavaScript function during the load of the html page. This technique has now been implemented in doxygen as well.
1 parent 44f85e4 commit 0c79c81

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

src/htmlgen.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,32 @@ static void writeServerSearchBox(TextStream &t,const QCString &relPath,bool high
122122
}
123123
}
124124

125+
const char *replaceDatetime = "<span class=\"datetime\"></span>;";
126+
const char *replaceDate = "<span class=\"date\"></span>;";
127+
const char *replaceTime = "<span class=\"time\"></span>;";
128+
const char *replaceYear = "<span class=\"year\"></span>;";
129+
static void writeBuildDateJS(TextStream &t)
130+
{
131+
t << "$(function(){\n";
132+
t << "let elements = document.getElementsByClassName(\"datetime\");\n";
133+
t << "for (let i = 0; i < elements.length; i++) {\n";
134+
t << " elements.item(i).textContent = \"" << dateToString(DateTimeType::DateTime) << "\";\n";
135+
t << "}\n";
136+
t << "let elementsD= document.getElementsByClassName(\"date\");\n";
137+
t << "for (let i = 0; i < elementsD.length; i++) {\n";
138+
t << " elementsD.item(i).textContent = \"" << dateToString(DateTimeType::Date) << "\";\n";
139+
t << "}\n";
140+
t << "let elementsT = document.getElementsByClassName(\"time\");\n";
141+
t << "for (let i = 0; i < elementsT.length; i++) {\n";
142+
t << " elementsT.item(i).textContent = \"" << dateToString(DateTimeType::Time) << "\";\n";
143+
t << "}\n";
144+
t << "let elementsY = document.getElementsByClassName(\"year\");\n";
145+
t << "for (let i = 0; i < elementsY.length; i++) {\n";
146+
t << " elementsY.item(i).textContent = \"" << yearToString() << "\";\n";
147+
t << "}\n";
148+
t << "});\n";
149+
}
150+
125151
//------------------------------------------------------------------------
126152
/// Convert a set of LaTeX commands `\(re)newcommand` to a form readable by MathJax
127153
/// LaTeX syntax:
@@ -398,11 +424,11 @@ static QCString substituteHtmlKeywords(const QCString &file,
398424
{
399425
case TIMESTAMP_t::YES:
400426
case TIMESTAMP_t::DATETIME:
401-
generatedBy = theTranslator->trGeneratedAt(dateToString(DateTimeType::DateTime),
427+
generatedBy = theTranslator->trGeneratedAt(replaceDatetime,
402428
convertToHtml(Config_getString(PROJECT_NAME)));
403429
break;
404430
case TIMESTAMP_t::DATE:
405-
generatedBy = theTranslator->trGeneratedAt(dateToString(DateTimeType::Date),
431+
generatedBy = theTranslator->trGeneratedAt(replaceDate,
406432
convertToHtml(Config_getString(PROJECT_NAME)));
407433
break;
408434
case TIMESTAMP_t::NO:
@@ -592,6 +618,11 @@ static QCString substituteHtmlKeywords(const QCString &file,
592618
result = substituteKeywords(file,result,
593619
{
594620
// keyword value getter
621+
{ "$datetime", [&]() { return replaceDatetime; } },
622+
{ "$date", [&]() { return replaceDate; } },
623+
{ "$time", [&]() { return replaceTime; } },
624+
{ "$year", [&]() { return replaceYear; } },
625+
595626
{ "$navpath", [&]() { return navPath; } },
596627
{ "$stylesheet", [&]() { return cssFile; } },
597628
{ "$treeview", [&]() { return treeViewCssJs; } },
@@ -1286,6 +1317,15 @@ void HtmlGenerator::init()
12861317
}
12871318
}
12881319
}
1320+
1321+
{
1322+
std::ofstream f = Portable::openOutputStream(dname+"/build_date.js");
1323+
if (f.is_open())
1324+
{
1325+
TextStream t(&f);
1326+
writeBuildDateJS(t);
1327+
}
1328+
}
12891329
}
12901330

12911331
void HtmlGenerator::cleanup()

src/latexgen.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,11 @@ static QCString substituteLatexKeywords(const QCString &file,
871871
result = substituteKeywords(file,result,
872872
{
873873
// keyword value getter
874+
{ "$datetime", [&]() { return dateToString(DateTimeType::DateTime); } },
875+
{ "$date", [&]() { return dateToString(DateTimeType::Date); } },
876+
{ "$time", [&]() { return dateToString(DateTimeType::Time); } },
877+
{ "$year", [&]() { return yearToString(); } },
878+
874879
{ "$latexdocumentpre", [&]() { return theTranslator->latexDocumentPre(); } },
875880
{ "$latexdocumentpost", [&]() { return theTranslator->latexDocumentPost(); } },
876881
{ "$generatedby", [&]() { return generatedBy; } },

src/util.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3720,10 +3720,6 @@ QCString substituteKeywords(const QCString &file,const QCString &s,const QCStrin
37203720
{
37213721
// keyword value getter
37223722
{ "$title", [&]() { return !title.isEmpty() ? title : projName; } },
3723-
{ "$datetime", [&]() { return dateToString(DateTimeType::DateTime); } },
3724-
{ "$date", [&]() { return dateToString(DateTimeType::Date); } },
3725-
{ "$time", [&]() { return dateToString(DateTimeType::Time); } },
3726-
{ "$year", [&]() { return yearToString(); } },
37273723
{ "$doxygenversion", [&]() { return getDoxygenVersion(); } },
37283724
{ "$projectname", [&]() { return projName; } },
37293725
{ "$projectnumber", [&]() { return projNum; } },

templates/html/header.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<!--END FULL_SIDEBAR-->
1717
<script type="text/javascript" src="$relpath^jquery.js"></script>
1818
<script type="text/javascript" src="$relpath^dynsections.js"></script>
19+
<script type="text/javascript" src="$relpath^build_date.js"></script>
1920
<!--BEGIN COPY_CLIPBOARD-->
2021
<script type="text/javascript" src="$relpath^clipboard.js"></script>
2122
<!--END COPY_CLIPBOARD-->

0 commit comments

Comments
 (0)