import { useRef } from 'react' import { LangBadge } from './primitives' // Osnovna syntax tinting za čitljivost (nije full highlighter) function SyntaxTinted({ code }) { const tokens = code.split( /(\b(?:def|return|if|else|elif|for|while|import|from|class|in|not|and|or|True|False|None|self|function|const|let|var|public|private|static|void|int|string|bool|unsigned|include|struct|typedef)\b|"[^"]*"|'[^']*'|`[^`]*`|\/\/[^\n]*|#[^\n]*|\b\d+\b)/g ) return tokens.map((t, i) => { if (/^(def|return|if|else|elif|for|while|import|from|class|in|not|and|or|True|False|None|self|function|const|let|var|public|private|static|void|int|string|bool|unsigned|struct|typedef)$/.test(t)) return {t} if (/^["'`].*["'`]$/.test(t)) return {t} if (/^(#|\/\/)/.test(t)) return {t} if (/^\d+$/.test(t)) return {t} return {t} }) } export default function CodeEditor({ code, onChange, lang = 'Python', readOnly = false, height = 360, annotations = [], filename, }) { const scrollRef = useRef(null) const lines = (code || '').split('\n') const displayName = filename || ('submission.' + ( lang === 'Python' ? 'py' : lang === 'Java' ? 'java' : lang === 'JavaScript' ? 'js' : lang === 'C++' ? 'cpp' : lang === 'C' ? 'c' : 'txt' )) // Mapa linija na anotacije za brzo traženje const annotMap = {} for (const a of annotations) { annotMap[a.line] = a } return (
{/* ── Header ── */}
{displayName}
{annotations.length > 0 && ( {annotations.filter(a => a.tone === 'red').length} strong ·{' '} {annotations.filter(a => a.tone === 'amber').length} moderate )}
{/* ── Editor tijelo ── Jedan scroll container koji sadrži i broj linije i kod, tako da se uvijek pomiču zajedno. */} {readOnly ? (
{lines.map((line, idx) => { const lineNum = idx + 1 const ann = annotMap[lineNum] const isRed = ann?.tone === 'red' const isAmber = ann?.tone === 'amber' const bgColor = isRed ? 'rgba(239,68,68,0.10)' : isAmber ? 'rgba(245,158,11,0.08)' : 'transparent' const borderLeft = isRed ? '2px solid #EF4444' : isAmber ? '2px solid #F59E0B' : '2px solid transparent' return ( {/* Broj linije */} {/* Ikona oznake (samo za označene linije) */} {/* Kod */} {/* Tooltip poruka (prikazuje se desno ako postoji anotacija) */} {ann && ( )} ) })}
{lineNum} {ann ? '⚠' : ''} {ann.note}
) : ( // Edit mode — textarea s brojevima linija u sync
{/* Brojevi linija za edit mode — sinkronizirani scrollom */}
{lines.map((_, i) =>
{i + 1}
)}