import { NextPage } from "next"; import Link from "next/link"; import type { BaseSyntheticEvent, MutableRefObject } from "react"; import styles from "../../../styles/Terminal/REPL/REPLHistory.module.css"; interface REPLHistoryParams { history: string[]; inputRef: MutableRefObject; } const REPLHistory: NextPage = ({history, inputRef}) => { const focusInput = () => {if (inputRef.current) inputRef.current.focus();}; const forceInput = (e: BaseSyntheticEvent) => { const command = (e.target as HTMLSpanElement).innerHTML; if (inputRef.current) { inputRef.current.value = command; // TODO // Fix this as this currently doesn't work inputRef.current.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", keyCode: 13, })); } return true; }; const makeLinks = (line: string) => { let idxStart = line.indexOf("#{"); let idxSep = line.indexOf("|", idxStart); let idxEnd = line.indexOf("}", idxSep); if (idxStart === -1 || idxSep === -1 || idxEnd === -1) return [line]; const result = []; while (idxStart !== -1 && idxSep !== -1 && idxEnd !== -1) { const linkText = line.substring(idxStart+2, idxSep); const linkHref = line.substring(idxSep+1, idxEnd); const isLocal = linkHref.startsWith("https://c0ntroller.de") || linkHref.startsWith("/") || linkHref.startsWith("#"); result.push(line.substring(0, idxStart)); result.push({linkText}); line = line.substring(idxEnd+1); idxStart = line.indexOf("#{"); idxSep = line.indexOf("|", idxStart); idxEnd = line.indexOf("}", idxSep); } // Its already cut off result.push(line); return result; }; const makeCommands = (line: string|JSX.Element) => { if (typeof line !== "string") return line; let idxStart = line.indexOf("%{"); let idxEnd = line.indexOf("}", idxStart); if (idxStart === -1 || idxEnd === -1) return line; const result = []; while (idxStart !== -1 && idxEnd !== -1) { const cmdText = line.substring(idxStart+2, idxEnd); result.push(line.substring(0, idxStart)); result.push({cmdText}); line = line.substring(idxEnd+1); idxStart = line.indexOf("%{"); idxEnd = line.indexOf("}", idxStart); } // Its already cut off result.push(line); return result; }; const parseLine = (line: string) => { if (line === "") return "\u00A0"; const resultLinks = makeLinks(line); const resultAll = resultLinks.map(makeCommands); return resultAll.flat(); }; return
{ history.map((value, idx) =>
{parseLine(value)}
) } {}
; }; export default REPLHistory;