Spaces:
Build error
Build error
| import { ReactNode } from "react"; | |
| import EventLogger from "#/utils/event-logger"; | |
| /** | |
| * Decodes HTML entities in a string | |
| * @param text The text to decode | |
| * @returns The decoded text | |
| */ | |
| const decodeHtmlEntities = (text: string): string => { | |
| const textarea = document.createElement("textarea"); | |
| textarea.innerHTML = text; | |
| return textarea.value; | |
| }; | |
| /** | |
| * Checks if a path is likely a directory | |
| * @param path The full path | |
| * @returns True if the path is likely a directory | |
| */ | |
| const isLikelyDirectory = (path: string): boolean => { | |
| if (!path) return false; | |
| // Check if path already ends with a slash | |
| if (path.endsWith("/") || path.endsWith("\\")) return true; | |
| // Check if path has no extension (simple heuristic) | |
| const lastPart = path.split(/[/\\]/).pop() || ""; | |
| // If the last part has no dots, it's likely a directory | |
| return !lastPart.includes("."); | |
| }; | |
| /** | |
| * Extracts the filename from a path | |
| * @param path The full path | |
| * @returns The filename (last part of the path) | |
| */ | |
| const extractFilename = (path: string): string => { | |
| if (!path) return ""; | |
| // Handle both Unix and Windows paths | |
| const parts = path.split(/[/\\]/); | |
| const filename = parts[parts.length - 1]; | |
| // Add trailing slash for directories | |
| if (isLikelyDirectory(path) && !filename.endsWith("/")) { | |
| return `${filename}/`; | |
| } | |
| return filename; | |
| }; | |
| /** | |
| * Component that displays only the filename in the text but shows the full path on hover | |
| * Similar to MonoComponent but with path-specific functionality | |
| */ | |
| function PathComponent(props: { children?: ReactNode }) { | |
| const { children } = props; | |
| const processPath = (path: string) => { | |
| try { | |
| // First decode any HTML entities in the path | |
| const decodedPath = decodeHtmlEntities(path); | |
| // Extract the filename from the decoded path | |
| const filename = extractFilename(decodedPath); | |
| return ( | |
| <span className="font-mono" title={decodedPath}> | |
| {filename} | |
| </span> | |
| ); | |
| } catch (e) { | |
| // Just log the error without any message to avoid localization issues | |
| EventLogger.error(String(e)); | |
| return <span className="font-mono">{path}</span>; | |
| } | |
| }; | |
| if (Array.isArray(children)) { | |
| const processedChildren = children.map((child) => | |
| typeof child === "string" ? processPath(child) : child, | |
| ); | |
| return <strong className="font-mono">{processedChildren}</strong>; | |
| } | |
| if (typeof children === "string") { | |
| return <strong>{processPath(children)}</strong>; | |
| } | |
| return <strong className="font-mono">{children}</strong>; | |
| } | |
| export { PathComponent, isLikelyDirectory }; | |