Compare commits
	
		
			3 Commits
		
	
	
		
			a95f13943f
			...
			console
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d365dd4d25 | |||
| f168112294 | |||
| e7e8b78904 | 
| @@ -16,7 +16,7 @@ smart_punctuation = true | |||||||
| git = "https://git.filiprojek.cz/fr/website" | git = "https://git.filiprojek.cz/fr/website" | ||||||
| nav_items = [ | nav_items = [ | ||||||
| 	{name="Home",      path="/"}, | 	{name="Home",      path="/"}, | ||||||
| 	{name="About",     path="/about"}, | 	#{name="About",     path="/about"}, | ||||||
| 	{name="Projects",  path="/projects/"}, | 	#{name="Projects",  path="/projects/"}, | ||||||
| ] | ] | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								content/console.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								content/console.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | +++ | ||||||
|  | title = "Console" | ||||||
|  | template = "console.html" | ||||||
|  | +++ | ||||||
							
								
								
									
										5
									
								
								sass/console.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								sass/console.scss
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | .console { | ||||||
|  |   background: gray; | ||||||
|  |   width: 80vw; | ||||||
|  |   min-height: 20vh; | ||||||
|  | } | ||||||
							
								
								
									
										107
									
								
								static/js/console.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								static/js/console.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | |||||||
|  | const c = document.querySelector(".console") | ||||||
|  | const ps1 = "[fr@website ~]$ " | ||||||
|  | const motd = "Welcome to my website!<br>You can use `help` for more informations :)" | ||||||
|  | let line = ""; | ||||||
|  |  | ||||||
|  | function exec(command) { | ||||||
|  |   switch (command[0]) { | ||||||
|  |     case "help": | ||||||
|  |       line = "help<br>author<br>contact<br>clear<br>echo" | ||||||
|  |       break; | ||||||
|  |     case "author": | ||||||
|  |       line = "Filip Rojek, 2023" | ||||||
|  |       break | ||||||
|  |     case "contact": | ||||||
|  |       line = "Filip Rojek <<a href='mailto: filip@filiprojek.cz'>filip@filiprojek.cz</a>><br>web: <a href='https://filiprojek.cz' target='_blank'>www.filiprojek.cz</a><br>telegram: <a href='https://t.me/filiprojek' target='_blank'>@filiprojek</a>" | ||||||
|  |       break | ||||||
|  |     case "clear": | ||||||
|  |       write("000ctrll") | ||||||
|  |       return false | ||||||
|  |     case "echo": | ||||||
|  |       line = "" | ||||||
|  |       command.forEach((cmd, i) => { | ||||||
|  |         if (i === 0) return | ||||||
|  |         line += cmd + " " | ||||||
|  |       }); | ||||||
|  |       line = line.substring(0, line.length - 1) // remove last space | ||||||
|  |       break | ||||||
|  |     default: | ||||||
|  |       line = "frsh: " + command[0] + ": command not found" | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return line | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function write(key, payload) { | ||||||
|  |   switch(key) { | ||||||
|  |     case "Enter": | ||||||
|  |       command = c.lastChild.textContent.replace(ps1, "") | ||||||
|  |       command = command.split(" "); | ||||||
|  |       let out = exec(command) | ||||||
|  |       if(out !== false) { | ||||||
|  |         line = document.createElement("p") | ||||||
|  |         line.innerHTML += out | ||||||
|  |         line.innerHTML += "<br>" | ||||||
|  |         c.appendChild(line) | ||||||
|  |         line = document.createElement("p") | ||||||
|  |         line.innerHTML += ps1 | ||||||
|  |         c.appendChild(line) | ||||||
|  |       } | ||||||
|  |       command = "" | ||||||
|  |       break | ||||||
|  |     case "000ctrll": | ||||||
|  |       c.innerHTML = "" | ||||||
|  |       if(payload == motd) c.innerHTML = motd | ||||||
|  |       line = document.createElement("p") | ||||||
|  |       line.innerHTML += ps1 | ||||||
|  |       c.appendChild(line) | ||||||
|  |       break | ||||||
|  |     case "000backspace": | ||||||
|  |       if(c.lastChild.textContent.slice(0, -1) !== ps1.slice(0, -1)) { | ||||||
|  |         c.lastChild.innerHTML = c.lastChild.textContent.slice(0, -1) | ||||||
|  |       } | ||||||
|  |       break | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |       c.lastChild.innerHTML += key | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function customCtrlShortcuts(plusKey) { | ||||||
|  |   document.addEventListener("keydown", e => { | ||||||
|  |     if(e.ctrlKey && e.key == plusKey) { | ||||||
|  |       e.preventDefault() | ||||||
|  |       write("000ctrl"+plusKey) | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // On load init the terminal | ||||||
|  | window.addEventListener("load", () => { | ||||||
|  |   write("000ctrll", motd) | ||||||
|  |   if (navigator.userAgent.toLowerCase().includes("mobile")) { | ||||||
|  |     const mi = document.querySelector(".mobile-input") | ||||||
|  |     mi.style="opacity: 0; width: 0; height: 0" | ||||||
|  |     c.addEventListener("click", e => { | ||||||
|  |       mi.focus() | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | // Capture the keypress | ||||||
|  | window.addEventListener("keypress", e => { | ||||||
|  |   e.preventDefault() | ||||||
|  |   write(e.key) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | window.addEventListener("keydown", e => { | ||||||
|  |   if(e.key == "Backspace") { | ||||||
|  |     e.preventDefault() | ||||||
|  |     write("000backspace") | ||||||
|  |   } | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | // Register custom ctrl shortcuts | ||||||
|  | customCtrlShortcuts("l") // ctrl + l | ||||||
|  | customCtrlShortcuts("c") // ctrl + c | ||||||
							
								
								
									
										12
									
								
								templates/console.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								templates/console.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | {% extends "base.html" %} | ||||||
|  |  | ||||||
|  | {% block styles %} | ||||||
|  | 	<link rel="stylesheet" href="/console.css"> | ||||||
|  | {% endblock styles %} | ||||||
|  |  | ||||||
|  | {% block content %} | ||||||
|  | 	<section class="console content"  > | ||||||
|  | 	</section> | ||||||
|  | 	<textarea class="mobile-input" style="display: none" disabled autofocus></textarea> | ||||||
|  |   <script src="/js/console.js" defer></script> | ||||||
|  | {% endblock content %} | ||||||
		Reference in New Issue
	
	Block a user