Skip to content

Commit b955457

Browse files
authored
Merge pull request #1509 from Maffooch/reports
Add table of contents to HTML/Asciidoc reports
2 parents f5146df + d5dda57 commit b955457

File tree

8 files changed

+717
-3
lines changed

8 files changed

+717
-3
lines changed

dojo/templates/dojo/asciidoc_report.html

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,14 @@ <h2>= {{ endpoint }} =</h2>
2424
{% endif %}
2525
Generated By {{ user.get_full_name }} &lt;{{ request.user.email }}&gt;<br>
2626
Generated On {% now "SHORT_DATE_FORMAT" %}<br>
27-
{% if include_table_of_contents %}
28-
:toc:
27+
{% if include_table_of_contents%}
28+
<div class="row">
29+
<div class="col-lg-12" id="toc">
30+
<h3 id="table_of_contents">Table of Contents for {{ product.name }}</h3>
31+
</div>
32+
</div>
33+
34+
<div id="contents">
2935
{% endif %}
3036
{% if include_executive_summary and not endpoint %}
3137
<br>
@@ -485,5 +491,77 @@ <h5>==== Finding {{ find.id }}: {{ find.title | nice_title }} {% if find.mitigat
485491
{% endfor %}
486492
{% endfor %}
487493
{% endif %}
494+
{% if include_table_of_contents %}
495+
</div>
496+
{% endif %}
497+
{% endblock %}
498+
{% block postscript %}
499+
<script type="text/javascript">
500+
501+
window.onload = function () {
502+
var toc = "";
503+
var level = 3;
504+
505+
// Handle all elements exclusive of tags
506+
document.getElementById("contents").innerHTML =
507+
document.getElementById("contents").innerHTML.replace(
508+
/<h([\d])([^<]*)>([^<]+)<\/h([\d])>/gi,
509+
function (str, openLevel, id, titleText, closeLevel) {
510+
console.log(titleText)
511+
if (openLevel != closeLevel || openLevel > 5) {
512+
return str;
513+
}
514+
515+
if (openLevel > level) {
516+
toc += (new Array(openLevel - level + 1)).join("<ul>");
517+
} else if (openLevel < level) {
518+
toc += (new Array(level - openLevel + 1)).join("</ul>");
519+
}
520+
521+
level = parseInt(openLevel);
522+
var anchor = titleText.trim().replace(/ /g, "_");
523+
524+
toc += "<li><a style=\"font-size:" + (140 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
525+
titleText.replace(/=/g, "") + "</a></li>";
526+
527+
return "<a style=\"color:black;\" name=\"" + anchor + "\"><h" + openLevel + "" + id + ">"
528+
+ titleText + "</h" + closeLevel + "></a>";
529+
}
530+
);
531+
532+
// Handle findings with tags
533+
document.getElementById("contents").innerHTML =
534+
document.getElementById("contents").innerHTML.replace(
535+
/<h([\d])([^<]*)>([^<]+)<sup>([^<]+)<\/sup>([^<]*)<\/h([\d])>/gi,
536+
function (str, openLevel, id, titleText, tags, junk, closeLevel) {
537+
if (openLevel != closeLevel || openLevel > 5) {
538+
return str;
539+
}
540+
541+
if (openLevel > level) {
542+
toc += (new Array(openLevel - level + 1)).join("<ul>");
543+
} else if (openLevel < level) {
544+
toc += (new Array(level - openLevel + 1)).join("</ul>");
545+
}
546+
547+
level = parseInt(openLevel);
548+
var anchor = titleText.trim().replace(/ /g, "_");
549+
550+
toc += "<li><a style=\"font-size:" + (140 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
551+
titleText.replace(/=/g, "") + "<sup>" + tags + "</sup></a></li>";
552+
553+
return "<a style=\"color:black;\" name=\"" + anchor + "\"><h" + openLevel + "" + id + ">"
554+
+ titleText + "<sup>" + tags + "</sup></h" + closeLevel + "></a>";
555+
}
556+
);
557+
558+
if (level) {
559+
toc += (new Array(level + 1)).join("</ul>");
560+
}
561+
562+
document.getElementById("toc").innerHTML += toc;
563+
};
564+
565+
</script>
488566
{% endblock %}
489567

dojo/templates/dojo/endpoint_pdf_report.html

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@
77
{% load event_tags %}
88
{% block content %}
99
<div class="container">
10+
{% if include_table_of_contents%}
11+
<div class="row">
12+
<div class="col-lg-12" id="toc">
13+
<h3 id="table_of_contents">Table of Contents for {{ product.name }}</h3>
14+
</div>
15+
</div>
16+
17+
<div id="contents">
18+
{% endif %}
1019
{% if include_executive_summary %}
1120
<div class="row">
1221
<div class="col-lg-12">
@@ -316,6 +325,9 @@ <h6>Notes</h6>
316325
{% endfor %}
317326
</div>
318327
</div>
328+
{% if include_table_of_contents %}
329+
</div>
330+
{% endif %}
319331
</div> <!-- /container -->
320332
{% endblock %}
321333
{% block js %}
@@ -531,5 +543,84 @@ <h6>Notes</h6>
531543
}
532544
;
533545

546+
window.onload = function () {
547+
var toc = "";
548+
var level = 3;
549+
550+
// Handle all elements exclusive of tags
551+
document.getElementById("contents").innerHTML =
552+
document.getElementById("contents").innerHTML.replace(
553+
/<h([\d])([^<]*)>([^<]+)<\/h([\d])>/gi,
554+
function (str, openLevel, id, titleText, closeLevel) {
555+
if (openLevel != closeLevel || openLevel > 5) {
556+
return str;
557+
}
558+
559+
if (openLevel > level) {
560+
toc += (new Array(openLevel - level + 1)).join("<ul>");
561+
} else if (openLevel < level) {
562+
toc += (new Array(level - openLevel + 1)).join("</ul>");
563+
}
564+
565+
level = parseInt(openLevel);
566+
567+
var anchor = titleText.trim().replace(/ /g, "_");
568+
569+
if (['Info', 'Low', 'Medium', 'High', 'Critical'].indexOf(titleText) >= 0) {
570+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
571+
"<span class=\"label severity severity-" + titleText + "\">" + titleText + "</span></a></li>";
572+
}
573+
else {
574+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
575+
titleText + "</a></li>";
576+
}
577+
578+
579+
return "<a style=\"color:black;\" name=\"" + anchor + "\"><h" + openLevel + "" + id + ">"
580+
+ titleText + "</h" + closeLevel + "></a>";
581+
}
582+
);
583+
584+
// Handle findings with tags
585+
document.getElementById("contents").innerHTML =
586+
document.getElementById("contents").innerHTML.replace(
587+
/<h([\d])([^<]*)>([^<]+)<sup>([^<]+)<\/sup>([^<]*)<\/h([\d])>/gi,
588+
function (str, openLevel, id, titleText, tags, junk, closeLevel) {
589+
if (openLevel != closeLevel || openLevel > 5) {
590+
return str;
591+
}
592+
593+
if (openLevel > level) {
594+
toc += (new Array(openLevel - level + 1)).join("<ul>");
595+
} else if (openLevel < level) {
596+
toc += (new Array(level - openLevel + 1)).join("</ul>");
597+
}
598+
599+
level = parseInt(openLevel);
600+
601+
var anchor = titleText.trim().replace(/ /g, "_");
602+
603+
if (['Info', 'Low', 'Medium', 'High', 'Critical'].indexOf(titleText) >= 0) {
604+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
605+
"<span class=\"label severity severity-" + titleText + "\">" + titleText + "</span></a></li>";
606+
}
607+
else {
608+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
609+
titleText + "<sup>" + tags + "</sup></a></li>";
610+
}
611+
612+
613+
return "<a style=\"color:black;\" name=\"" + anchor + "\"><h" + openLevel + "" + id + ">"
614+
+ titleText + "<sup>" + tags + "</sup></h" + closeLevel + "></a>";
615+
}
616+
);
617+
618+
if (level) {
619+
toc += (new Array(level + 1)).join("</ul>");
620+
}
621+
622+
document.getElementById("toc").innerHTML += toc;
623+
};
624+
534625
</script>
535626
{% endblock %}

dojo/templates/dojo/engagement_pdf_report.html

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ <h3 id="product">Engagement Security Report for {{ engagement.product.name }}</h
1616
</p>
1717
</div>
1818
</div>
19+
{% if include_table_of_contents%}
20+
<div class="row">
21+
<div class="col-lg-12" id="toc">
22+
<h3 id="table_of_contents">Table of Contents for {{ product.name }}</h3>
23+
</div>
24+
</div>
25+
26+
<div id="contents">
27+
{% endif %}
1928
{% if include_executive_summary %}
2029
<div class="row">
2130
<div class="col-lg-12">
@@ -450,6 +459,9 @@ <h6>Notes</h6>
450459
{% endfor %}
451460
</div>
452461
</div>
462+
{% if include_table_of_contents %}
463+
</div>
464+
{% endif %}
453465
</div> <!-- /container -->
454466
{% endblock %}
455467
{% block js %}
@@ -739,5 +751,84 @@ <h6>Notes</h6>
739751
options);
740752
}
741753
{% endif %}
754+
755+
window.onload = function () {
756+
var toc = "";
757+
var level = 3;
758+
759+
// Handle all elements exclusive of tags
760+
document.getElementById("contents").innerHTML =
761+
document.getElementById("contents").innerHTML.replace(
762+
/<h([\d])([^<]*)>([^<]+)<\/h([\d])>/gi,
763+
function (str, openLevel, id, titleText, closeLevel) {
764+
if (openLevel != closeLevel || openLevel > 5) {
765+
return str;
766+
}
767+
768+
if (openLevel > level) {
769+
toc += (new Array(openLevel - level + 1)).join("<ul>");
770+
} else if (openLevel < level) {
771+
toc += (new Array(level - openLevel + 1)).join("</ul>");
772+
}
773+
774+
level = parseInt(openLevel);
775+
776+
var anchor = titleText.trim().replace(/ /g, "_");
777+
778+
if (['Info', 'Low', 'Medium', 'High', 'Critical'].indexOf(titleText) >= 0) {
779+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
780+
"<span class=\"label severity severity-" + titleText + "\">" + titleText + "</span></a></li>";
781+
}
782+
else {
783+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
784+
titleText + "</a></li>";
785+
}
786+
787+
788+
return "<a style=\"color:black;\" name=\"" + anchor + "\"><h" + openLevel + "" + id + ">"
789+
+ titleText + "</h" + closeLevel + "></a>";
790+
}
791+
);
792+
793+
// Handle findings with tags
794+
document.getElementById("contents").innerHTML =
795+
document.getElementById("contents").innerHTML.replace(
796+
/<h([\d])([^<]*)>([^<]+)<sup>([^<]+)<\/sup>([^<]*)<\/h([\d])>/gi,
797+
function (str, openLevel, id, titleText, tags, junk, closeLevel) {
798+
if (openLevel != closeLevel || openLevel > 5) {
799+
return str;
800+
}
801+
802+
if (openLevel > level) {
803+
toc += (new Array(openLevel - level + 1)).join("<ul>");
804+
} else if (openLevel < level) {
805+
toc += (new Array(level - openLevel + 1)).join("</ul>");
806+
}
807+
808+
level = parseInt(openLevel);
809+
810+
var anchor = titleText.trim().replace(/ /g, "_");
811+
812+
if (['Info', 'Low', 'Medium', 'High', 'Critical'].indexOf(titleText) >= 0) {
813+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
814+
"<span class=\"label severity severity-" + titleText + "\">" + titleText + "</span></a></li>";
815+
}
816+
else {
817+
toc += "<li><a style=\"font-size:" + (160 - (level * 7)) + "%; color:black;\" href=\"#" + anchor + "\">" +
818+
titleText + "<sup>" + tags + "</sup></a></li>";
819+
}
820+
821+
822+
return "<a style=\"color:black;\" name=\"" + anchor + "\"><h" + openLevel + "" + id + ">"
823+
+ titleText + "<sup>" + tags + "</sup></h" + closeLevel + "></a>";
824+
}
825+
);
826+
827+
if (level) {
828+
toc += (new Array(level + 1)).join("</ul>");
829+
}
830+
831+
document.getElementById("toc").innerHTML += toc;
832+
};
742833
</script>
743834
{% endblock %}

0 commit comments

Comments
 (0)