diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py
index 8e67ab77b..7a4dd84a1 100644
--- a/hacktricks-preprocessor.py
+++ b/hacktricks-preprocessor.py
@@ -69,6 +69,12 @@ def ref(matchobj):
return result
+def add_read_time(content):
+ regex = r'(# .*(?=\n))'
+ new_content = re.sub(regex, lambda x: x.group(0) + "\n\nReading time: {{ #reading_time }}", content)
+ return new_content
+
+
def iterate_chapters(sections):
if isinstance(sections, dict) and "PartTitle" in sections: # Not a chapter section
return
@@ -93,12 +99,12 @@ if __name__ == '__main__':
logger.debug(f"Context: {context}")
-
for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}")
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
+ new_content = add_read_time(new_content)
chapter['content'] = new_content
content = json.dumps(book)
diff --git a/src/README.md b/src/README.md
index 115959486..8e1025b92 100644
--- a/src/README.md
+++ b/src/README.md
@@ -1,12 +1,10 @@
# HackTricks Cloud
-Lesezeit: {{ #reading_time }}
-
{{#include ./banners/hacktricks-training.md}}
-_Hacktricks-Logos & Motion-Design von_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
+_Hacktricks Logos & Motion Design von_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
> [!TIP]
> Willkommen auf der Seite, auf der Sie jeden **Hacking-Trick/Technik/was auch immer im Zusammenhang mit CI/CD & Cloud** finden, den ich in **CTFs**, **realen** Lebensumgebungen, **Forschung** und **Lesen** von Forschungen und Nachrichten gelernt habe.
diff --git a/theme/css/chrome.css b/theme/css/chrome.css
index 17e541163..4fc0b2a71 100644
--- a/theme/css/chrome.css
+++ b/theme/css/chrome.css
@@ -182,6 +182,13 @@ body.sidebar-visible #menu-bar {
}
/* Languages Menu Popup */
+
+@media only screen and (max-width:799px) {
+ #menubar-languages-toggle span {
+ display: none !important;
+ }
+}
+
#menubar-languages-toggle {
position: relative;
}
@@ -243,6 +250,11 @@ html:not(.js) .left-buttons button {
cursor: pointer;
color: var(--fg);
}
+@media only screen and (max-width:799px) {
+ .menu-title {
+ font-size: 1.4rem;
+ }
+}
.menu-bar,
.menu-bar:visited,
@@ -632,6 +644,11 @@ ul#searchresults li a span.teaser em {
color: var(--sidebar-fg);
}
}
+@media only screen and (min-width:1440px) {
+ #sidebar-toggle{
+ display: none !important;
+ }
+}
@media only screen and (max-width:549px) {
.sidebar {
position: fixed;
diff --git a/theme/index.hbs b/theme/index.hbs
index 419bb6e7a..683ea99c1 100644
--- a/theme/index.hbs
+++ b/theme/index.hbs
@@ -176,10 +176,12 @@
diff --git a/theme/pagetoc.js b/theme/pagetoc.js
index 5962db9f3..a51ea29ae 100644
--- a/theme/pagetoc.js
+++ b/theme/pagetoc.js
@@ -1,68 +1,76 @@
-let scrollTimeout;
+let scrollTimeout
const listenActive = () => {
- const elems = document.querySelector(".pagetoc").children;
- [...elems].forEach(el => {
+ const elems = document.querySelector(".pagetoc").children
+ ;[...elems].forEach((el) => {
el.addEventListener("click", (event) => {
- clearTimeout(scrollTimeout);
- [...elems].forEach(el => el.classList.remove("active"));
- el.classList.add("active");
+ clearTimeout(scrollTimeout)
+ ;[...elems].forEach((el) => el.classList.remove("active"))
+ el.classList.add("active")
// Prevent scroll updates for a short period
scrollTimeout = setTimeout(() => {
- scrollTimeout = null;
- }, 100); // Adjust timing as needed
- });
- });
-};
+ scrollTimeout = null
+ }, 100) // Adjust timing as needed
+ })
+ })
+}
-const getPagetoc = () => document.querySelector(".pagetoc") || autoCreatePagetoc();
+const getPagetoc = () =>
+ document.querySelector(".pagetoc") || autoCreatePagetoc()
const autoCreatePagetoc = () => {
- const main = document.querySelector("#content > main");
+ const main = document.querySelector("#content > main")
const content = Object.assign(document.createElement("div"), {
- className: "content-wrap"
- });
- content.append(...main.childNodes);
- main.prepend(content);
- main.insertAdjacentHTML("afterbegin", '');
- return document.querySelector(".pagetoc");
-};
+ className: "content-wrap",
+ })
+ content.append(...main.childNodes)
+ main.prepend(content)
+ main.insertAdjacentHTML(
+ "afterbegin",
+ ''
+ )
+ return document.querySelector(".pagetoc")
+}
const updateFunction = () => {
- if (scrollTimeout) return; // Skip updates if within the cooldown period from a click
- const headers = [...document.getElementsByClassName("header")];
- const scrolledY = window.scrollY;
- let lastHeader = null;
+ if (scrollTimeout) return // Skip updates if within the cooldown period from a click
+ const headers = [...document.getElementsByClassName("header")]
+ const scrolledY = window.scrollY
+ let lastHeader = null
// Find the last header that is above the current scroll position
for (let i = headers.length - 1; i >= 0; i--) {
if (scrolledY >= headers[i].offsetTop) {
- lastHeader = headers[i];
- break;
+ lastHeader = headers[i]
+ break
}
}
- const pagetocLinks = [...document.querySelector(".pagetoc").children];
- pagetocLinks.forEach(link => link.classList.remove("active"));
+ const pagetocLinks = [...document.querySelector(".pagetoc").children]
+ pagetocLinks.forEach((link) => link.classList.remove("active"))
if (lastHeader) {
- const activeLink = pagetocLinks.find(link => lastHeader.href === link.href);
- if (activeLink) activeLink.classList.add("active");
+ const activeLink = pagetocLinks.find(
+ (link) => lastHeader.href === link.href
+ )
+ if (activeLink) activeLink.classList.add("active")
}
-};
+}
-window.addEventListener('load', () => {
- const pagetoc = getPagetoc();
- const headers = [...document.getElementsByClassName("header")];
- headers.forEach(header => {
+window.addEventListener("load", () => {
+ const pagetoc = getPagetoc()
+ const headers = [...document.getElementsByClassName("header")]
+ headers.forEach((header) => {
const link = Object.assign(document.createElement("a"), {
textContent: header.text,
href: header.href,
- className: `pagetoc-${header.parentElement.tagName}`
- });
- pagetoc.appendChild(link);
- });
- updateFunction();
- listenActive();
- window.addEventListener("scroll", updateFunction);
-});
-
+ className: `pagetoc-${header.parentElement.tagName}`,
+ })
+ if (header.parentElement.querySelectorAll("a").length === 2) {
+ link.textContent = header.parentElement.querySelectorAll("a")[1].text
+ }
+ pagetoc.appendChild(link)
+ })
+ updateFunction()
+ listenActive()
+ window.addEventListener("scroll", updateFunction)
+})